@tailor-platform/sdk 2.34.0 → 2.35.0

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.
Files changed (30) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/{application-CwpOIOTt.mjs → application-Bj2MtL-d.mjs} +1 -1
  3. package/dist/{application-Nce5z46R.mjs → application-DIsQSnj3.mjs} +25 -25
  4. package/dist/application-DIsQSnj3.mjs.map +1 -0
  5. package/dist/cli/commands/deploy/tailordb/migration-validation.d.mts +1 -2
  6. package/dist/cli/commands/tailordb/migrate/generate.d.mts +1 -1
  7. package/dist/cli/lib.mjs +1 -1
  8. package/dist/cli/lib.mjs.map +1 -1
  9. package/dist/cli/main.mjs +37 -37
  10. package/dist/cli/main.mjs.map +1 -1
  11. package/dist/cli/services/application.d.mts +1 -0
  12. package/dist/cli/services/function-bundle.d.mts +1 -0
  13. package/dist/cli/shared/sdk-builder-pure-plugin.d.mts +1 -0
  14. package/dist/completion/zsh-worker.zsh +4 -4
  15. package/dist/{kysely-type-DxyIWXc6.mjs → kysely-type-B0ri1-Xs.mjs} +9 -7
  16. package/dist/kysely-type-B0ri1-Xs.mjs.map +1 -0
  17. package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
  18. package/dist/{register-ts-hook-CtWJL3EO.mjs → register-ts-hook-CQ7shKO5.mjs} +59 -58
  19. package/dist/register-ts-hook-CQ7shKO5.mjs.map +1 -0
  20. package/docs/cli/tailordb.md +8 -6
  21. package/docs/cli-reference.md +1 -1
  22. package/docs/configuration.md +2 -0
  23. package/docs/services/tailordb/index.md +4 -0
  24. package/docs/services/tailordb/migration.md +12 -7
  25. package/docs/testing.md +2 -2
  26. package/package.json +1 -1
  27. package/dist/application-Nce5z46R.mjs.map +0 -1
  28. package/dist/cli/commands/tailordb/migrate/remote-state.d.mts +0 -1
  29. package/dist/kysely-type-DxyIWXc6.mjs.map +0 -1
  30. package/dist/register-ts-hook-CtWJL3EO.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import{r as e}from"./date-CgP7gMG_.mjs";import{n as t}from"./brand-C8nMKhJC.mjs";import{a as n,i as r,n as i,o as a}from"./wait-point-registry-B-ESkTZX.mjs";import{t as o}from"./assert-WeXvmG4j.mjs";import{A as s,C as c,D as l,E as u,O as d,S as f,T as p,_ as m,a as h,c as g,d as _,f as v,g as y,h as b,l as x,m as S,n as C,o as w,p as T,s as E,t as D,u as O,w as k,x as A}from"./service-eeXdVrDK.mjs";import{_ as j,a as M,f as N,i as P,t as F,y as ee}from"./errors-BXmGBX-7.mjs";import{n as te,t as ne}from"./es-builtins-SfvXRVoG.mjs";import{n as re,r as ie,t as ae}from"./node-builtins-DYfhPBnz.mjs";import{t as I}from"./multiline-EyzjEwn9.mjs";import{t as oe}from"./user-agent-vdHYF3QL.mjs";import{r as se,t as ce}from"./guards-CiFVxoXR.mjs";import{t as le}from"./type-source--ZNcV8RJ.mjs";import{createRequire as ue}from"node:module";import*as L from"pathe";import{resolve as de}from"pathe";import{resolveTSConfig as fe}from"pkg-types";import{z as R}from"zod";import{create as pe}from"@bufbuild/protobuf";import*as z from"node:fs";import{readFileSync as me}from"node:fs";import{MethodOptions_IdempotencyLevel as he}from"@bufbuild/protobuf/wkt";import{Code as B,ConnectError as V,createClient as ge}from"@connectrpc/connect";import{OAuth2Client as _e}from"@badgateway/oauth2-client";import ve from"p-limit";import*as ye from"node:crypto";import{createHash as be}from"node:crypto";import*as xe from"node:os";import*as Se from"rolldown";import{parseSync as H}from"oxc-parser";import{createPathsMatcher as Ce,getTsconfig as we}from"get-tsconfig";import{matchesGlob as Te}from"node:path/posix";import*as U from"inflection";function isForbiddenGlobal(e){return te.has(e)}const Ee=[`DEBUG`,`INFO`,`WARN`,`ERROR`,`SILENT`];function isLogLevel(e){return Ee.includes(e)}const De=/^\d*[1-9]\d*$/;function parsePositiveInt(e){if(e===void 0)return;let t=e.trim();if(!De.test(t))return;let n=Number.parseInt(t,10);return Number.isSafeInteger(n)?n:void 0}function resolveApplyConcurrency(){return parsePositiveInt(process.env.TAILOR_APPLY_CONCURRENCY)??16}function createApplyLimiter(){return ve(resolveApplyConcurrency())}function byName(e,t){return e.name<t.name?-1:+(e.name>t.name)}const Oe=`https://api.tailor.tech`,ke=`/.well-known/oauth-authorization-server/oauth2/platform`,Ae=3e4,je=/* @__PURE__ */ new Map;function getEnvPlatformUrl(){return process.env.TAILOR_PLATFORM_URL??process.env.PLATFORM_URL}function getEnvOAuth2ClientId(){return process.env.TAILOR_PLATFORM_OAUTH2_CLIENT_ID??process.env.PLATFORM_OAUTH2_CLIENT_ID}function normalizeBaseUrl(e){let t=new URL(e);return t.hash=``,t.search=``,t.toString().replace(/\/$/,``)}function getEffectivePlatformConfig(e={}){let t=e.platformUrl??getEnvPlatformUrl(),n=e.oauth2ClientId??getEnvOAuth2ClientId(),r=e.consoleUrl??process.env.TAILOR_PLATFORM_CONSOLE_URL,i={...t?{platformUrl:t}:{},...n?{oauth2ClientId:n}:{},...r?{consoleUrl:r}:{}};return Object.keys(i).length>0?i:void 0}function rememberPlatformConfigForToken(e,t){let n=getEffectivePlatformConfig(t);n?je.set(e,n):je.delete(e)}function getPlatformConfigForToken(e){return je.get(e)}function getPlatformBaseUrl(e={}){return normalizeBaseUrl(e.platformUrl??getEnvPlatformUrl()??`https://api.tailor.tech`)}function isDefaultPlatform(e){return getPlatformBaseUrl(e)===normalizeBaseUrl(Oe)}function getOAuth2ClientId(e={}){return e.oauth2ClientId??getEnvOAuth2ClientId()??`cpoc_0Iudir72fqSpqC6GQ58ri1cLAqcq5vJl`}function inferConsoleBaseUrl(e){let t=new URL(e);return t.hostname.startsWith(`api.`)?(t.hostname=t.hostname.replace(/^api\./,`console.`),normalizeBaseUrl(t.toString())):`https://console.tailor.tech`}function getConsoleBaseUrl(e={}){if(e.consoleUrl)return normalizeBaseUrl(e.consoleUrl);if(e.platformUrl){let t=inferConsoleBaseUrl(e.platformUrl);if(t!==`https://console.tailor.tech`)return t}return process.env.TAILOR_PLATFORM_CONSOLE_URL?normalizeBaseUrl(process.env.TAILOR_PLATFORM_CONSOLE_URL):inferConsoleBaseUrl(getPlatformBaseUrl(e))}function initOAuth2Client(e){return new _e({clientId:getOAuth2ClientId(e),server:getPlatformBaseUrl(e),discoveryEndpoint:ke,fetch:(e,t)=>fetch(e,{...t,signal:AbortSignal.any([...t?.signal?[t.signal]:[],AbortSignal.timeout(Ae)])})})}const Me=/* @__PURE__ */ new Map;function registerAccessTokenSource(e,t){Me.set(e,t)}function findAccessTokenSource(e){return Me.get(e)}async function initOperatorClient(e,t){let n=t??getPlatformConfigForToken(e),[{createTracingInterceptor:r},{OperatorService:i}]=await Promise.all([import(`./interceptor-DQg3cR_9.mjs`),import(`./service_pb-CsJKokDl.mjs`)]),a=findAccessTokenSource(e)??{current:async()=>e,replaceRejected:async()=>void 0},o=[await userAgentInterceptor(),await bearerTokenInterceptor(a),retryInterceptor(),errorHandlingInterceptor(),r(),concurrencyLimitInterceptor()],s=getPlatformBaseUrl(n),c=createPooledStreamTransport(await createTransport(s,o),()=>createTransport(s,o),4);return ge(i,c)}async function createTransport(e,t){let{createConnectTransport:n}=await import(`@connectrpc/connect-node`);return n({httpVersion:`2`,baseUrl:e,interceptors:t})}const Ne=/* @__PURE__ */ new Set([`CreateFunctionRegistry`,`UpdateFunctionRegistry`,`UploadFile`]);function createPooledStreamTransport(e,t,n){if(!Number.isInteger(n)||n<1)throw Error(`createPooledStreamTransport: maxConnections must be a positive integer, got ${n}`);let r=[e],i=[0],a=[],o=0;function acquireTransportIndex(e,s){return new Promise((c,l)=>{let u=!1,d;function cleanup(){u=!0,clearTimeout(d),e?.removeEventListener(`abort`,onAbort);let t=a.indexOf(attempt);t!==-1&&a.splice(t,1)}function onAbort(){cleanup(),l(V.from(e?.reason,B.Canceled))}function onTimeout(){cleanup(),l(new V(`the operation timed out`,B.DeadlineExceeded))}function claim(e){u?release(e):(cleanup(),c(e))}function attempt(){let e=i.pop();e===void 0?r.length+o<n?(o++,t().then(e=>{o--;let t=r.length;r.push(e),claim(t)},e=>{o--,cleanup(),l(e instanceof Error?e:Error(String(e))),wakeOneWaiter()})):a.push(attempt):claim(e)}if(e?.aborted)onAbort();else{if(e?.addEventListener(`abort`,onAbort,{once:!0}),s!==void 0){let e=s-performance.now();if(e<=0){onTimeout();return}d=setTimeout(onTimeout,e)}attempt()}})}function wakeOneWaiter(){a.shift()?.()}function release(e){i.push(e),wakeOneWaiter()}return{unary(t,n,r,i,a,o){return e.unary(t,n,r,i,a,o)},async stream(t,n,i,a,o,s){if(!Ne.has(t.name))return e.stream(t,n,i,a,o,s);let c=i!==void 0&&i>0?performance.now()+i:void 0,l=await acquireTransportIndex(n,c),u=r[l],d;try{if(n?.aborted)throw V.from(n.reason,B.Canceled);let e=c===void 0?i:Math.ceil(c-performance.now());if(c!==void 0&&e!==void 0&&e<=0)throw new V(`the operation timed out`,B.DeadlineExceeded);d=await u.stream(t,n,e,a,o,s)}catch(e){throw release(l),e}return{...d,message:releaseAfter(d.message,()=>release(l))}}}}async function*releaseAfter(e,t){try{yield*e}finally{t()}}async function userAgentInterceptor(){let e=await oe();return t=>async n=>(n.header.set(`User-Agent`,e),await t(n))}async function bearerTokenInterceptor(e){return t=>async n=>{let r=await currentAccessToken(e);n.header.set(`Authorization`,`Bearer ${r}`);try{return await t(n)}catch(i){if(n.stream||!(i instanceof V)||i.code!==B.Unauthenticated)throw i;let a=await e.replaceRejected(r).catch(e=>{N.debug(`Could not replace the rejected access token: ${String(e)}`)});if(!a||a===r)throw i;return n.header.set(`Authorization`,`Bearer ${a}`),await t(n)}}}async function currentAccessToken(e){try{return await e.current()}catch(e){throw s(new V(e instanceof Error?e.message:String(e),B.Unauthenticated,void 0,void 0,e),{...M(e)&&e.code?{code:e.code}:{},...M(e)&&e.suggestion?{suggestion:e.suggestion}:{},causes:{authentication:e}})}}function retryInterceptor(){return e=>async t=>{if(t.stream)return await e(t);let n;for(let r=0;r<Fe;r++){r>0&&await waitRetryBackoff(r);try{return await e(t)}catch(e){if(isRetrySafeCreateAlreadyExists(e,t.method.name)){if(r>0)return N.debug(`retry: ${t.method.name} returned AlreadyExists on attempt ${r+1}; treating as success (prior attempt likely committed)`),synthesizeEmptyUnaryResponse(t);let{reportCrash:n}=await import(`./crashreport-WsYAWARW.mjs`);await n(e,`handledError`)}if(!Ie.has(t.method.name)&&isRetirable(e,t.method.idempotency)){n=e,N.debug(`retry: ${t.method.name} attempt ${r+1} failed with ${retryErrorCodeName(e)}; retrying`);continue}throw e}}throw n}}function concurrencyLimitInterceptor(){let e=createApplyLimiter();return t=>async n=>n.stream?await t(n):await e(()=>t(n))}function retryErrorCodeName(e){return e instanceof V?B[e.code]:isTransportDisconnectError(e)?e.code:`unknown`}const Pe=/* @__PURE__ */ new Set([`CreateAIGateway`,`CreateApplication`,`CreateAuthConnection`,`CreateAuthHook`,`CreateAuthIDPConfig`,`CreateAuthMachineUser`,`CreateAuthOAuth2Client`,`CreateAuthSCIMConfig`,`CreateAuthSCIMResource`,`CreateAuthService`,`CreateExecutorExecutor`,`CreateIdPService`,`CreatePipelineResolver`,`CreatePipelineService`,`CreateSecretManagerSecret`,`CreateSecretManagerVault`,`CreateStaticWebsite`,`CreateTailorDBGQLPermission`,`CreateTailorDBService`,`CreateTailorDBType`,`CreateTenantConfig`,`CreateUserProfileConfig`,`CreateWorkflow`,`CreateWorkflowJobFunctionExecutionPolicy`]);function isRetrySafeCreateAlreadyExists(e,t){return e instanceof V&&e.code===B.AlreadyExists&&Pe.has(t)}function synthesizeEmptyUnaryResponse(e){return{stream:!1,service:e.service,method:e.method,header:new Headers,message:pe(e.method.output),trailer:new Headers}}const Fe=3,Ie=/* @__PURE__ */ new Set([`CloneApplicationData`,`CreateWorkspace`,`StartWorkflow`]);function waitRetryBackoff(e){let t=500*2**(e-1)*(1+.1*(Math.random()*2-1));return new Promise(e=>setTimeout(e,t))}const Le=/* @__PURE__ */ new Set([`ERR_STREAM_PREMATURE_CLOSE`,`ECONNRESET`,`ETIMEDOUT`,`EPIPE`]);function isTransportDisconnectError(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&Le.has(e.code)}function isRetirable(e,t){let n=t===he.NO_SIDE_EFFECTS||t===he.IDEMPOTENT;if(!(e instanceof V))return isTransportDisconnectError(e)&&n;switch(e.code){case B.ResourceExhausted:case B.Unavailable:return!0;case B.Aborted:case B.Internal:return n;default:return!1}}function errorHandlingInterceptor(){return e=>async t=>{try{return await e(t)}catch(e){if(e instanceof V){let{operation:n,resourceType:r}=parseMethodName(t.method.name),i=requestIdentifiers(t.message,t.method.name),a=Object.entries(i).map(([e,t])=>`${e}: ${t}`),o=a.length===0?``:` (${a.join(`, `)})`;throw s(new V(`Failed to ${n} ${r}${o}: ${e.rawMessage}`,e.code,e.metadata),{context:{method:t.method.name,identifiers:i}})}throw isTransportDisconnectError(e)?s(e,{code:`TRANSPORT_DISCONNECTED`,suggestion:`Check network connectivity and platform availability. A write may already have completed; inspect the current resource state before retrying.`,context:{method:t.method.name,transportCode:e.code,identifiers:requestIdentifiers(t.message,t.method.name)}}):e}}}function parseMethodName(e){let t=e.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);if(!t)return{operation:`perform`,resourceType:`resource`};let[,n,r]=t;return{operation:n.toLowerCase(),resourceType:r}}const Re=/* @__PURE__ */ new Set([`name`,`id`]),ze=[`Name`,`Id`,`Namespace`],Be=`name`,Ve={GetMetadata:[`trn`],SetMetadata:[`trn`],AddCustomDomain:[`domain`],GetCustomDomain:[`domain`],RemoveCustomDomain:[`domain`],RequestCustomDomainTransfer:[`domain`],CancelCustomDomainTransfer:[`domain`],AcceptCustomDomainTransfer:[`domain`],GetCustomDomainTransfer:[`domain`],CreateWorkflowJobFunctionExecutionPolicy:[`executionPolicyKey`],UpdateWorkflowJobFunctionExecutionPolicy:[`executionPolicyKey`],GetWorkflowJobFunctionExecutionPolicyByKey:[`executionPolicyKey`]};function isIdentityKey(e,t){return e.startsWith(`$`)?!1:Re.has(e)||ze.some(t=>e.endsWith(t))||(Ve[t]?.includes(e)??!1)}function requestIdentifiers(e,t){if(typeof e!=`object`||!e)return{};let n={};for(let[r,i]of Object.entries(e))if(typeof i==`string`&&i!==``&&isIdentityKey(r,t))n[r]=i;else if(!r.startsWith(`$`)&&typeof i==`object`&&i&&!Array.isArray(i)&&typeof i.$typeName==`string`){let e=i[Be];typeof e==`string`&&e!==``&&(n[`${r}.${Be}`]=e)}return n}const W=1e3;async function fetchAll(e){let t=[],n=``;for(;;){let[r,i]=await e(n,W);if(t.push(...r),!i)break;n=i}return t}function isNotFoundError(e){return e instanceof V&&e.code===B.NotFound}async function fetchAllTolerant(e){return await fetchAll(async(t,n)=>{try{return await e(t,n)}catch(e){if(isNotFoundError(e))return[[],``];throw e}})}async function getOrNull(e){try{return await e()}catch(e){if(isNotFoundError(e))return;throw e}}async function fetchPaged(e,t){let n=t?.limit,r=n===void 0||n===0,i=[],a=``;for(;;){let t=r?W:Math.min(n-i.length,W);if(!r&&t<=0)break;let[o,s]=await e(a,t);if(i.push(...o),!r&&i.length>=n||!s)break;a=s}return!r&&i.length>n?i.slice(0,n):i}async function fetchUserInfo(e,t){let n=new URL(`/auth/platform/userinfo`,getPlatformBaseUrl(t)).href,r=await fetch(n,{headers:{Authorization:`Bearer ${e}`,"User-Agent":await oe()},signal:AbortSignal.timeout(Ae)});if(!r.ok)throw Error(`Failed to fetch user info: ${r.statusText}`);let i=await r.json(),a=R.object({sub:R.string(),email:R.string()}).safeParse(i);if(!a.success)throw p(`user info response`,a.error);return a.data}const G=/:url(\/.*)?$/;function hasStaticWebsiteUrlPlaceholder(e){return typeof e==`string`&&G.test(e)}function staticWebsiteNameFromPlaceholder(e){let t=e.match(G);return t?.index===void 0?e:e.substring(0,t.index)}async function resolveStaticWebsiteUrls(e,t,n,r,i={}){if(!n)return[];let{expectedLocalNames:a,keepUnresolved:o=!1,failOnUnexpectedError:s=!1}=i,unresolved=e=>o?[e]:[],c=o?`Leaving the ${r} value unresolved.`:`Excluding from ${r}.`,l=i.siteLookupCache??/* @__PURE__ */ new Map,lookupSite=n=>{let r=l.get(n);return r||(r=e.getStaticWebsite({workspaceId:t,name:n}),l.set(n,r)),r};return(await Promise.all(n.map(async e=>{let t=e.match(G);if(t&&t.index!==void 0){let n=e.substring(0,t.index),i=t[1]||``;try{let t=await lookupSite(n);if(t.staticwebsite?.url)return[t.staticwebsite.url+i];if(!a?.has(n)&&s)throw F({code:`STATIC_WEBSITE_URL_NOT_ASSIGNED`,message:`Static website "${n}" exists but has no URL assigned yet.`,suggestion:`Re-run the deploy once the static website's URL is available.`});return N.warn(`Static website "${n}" has no URL assigned yet. ${c}`),unresolved(e)}catch(t){if(isNotFoundError(t)){if(a?.has(n))return[e]}else if(s)throw t;return N.warn(`Static website "${n}" not found for ${r} configuration. ${c}`),unresolved(e)}}return[e]}))).flat()}async function resolveStaticWebsiteUrlsInEnv(e,t,n,r={}){if(!n||!Object.values(n).some(hasStaticWebsiteUrlPlaceholder))return n??{};let i=/* @__PURE__ */ new Map,a=await Promise.all(Object.entries(n).map(async([n,a])=>{if(!hasStaticWebsiteUrlPlaceholder(a))return[n,a];let[o]=await resolveStaticWebsiteUrls(e,t,[a],`env "${n}"`,{...r,keepUnresolved:!0,failOnUnexpectedError:!0,siteLookupCache:i});return[n,o??a]})),o=Object.fromEntries(a);return warnUnresolvedEnvPlaceholders(o,r.expectedLocalNames),o}function warnUnresolvedEnvPlaceholders(e,t){for(let[n,r]of Object.entries(e)){if(!hasStaticWebsiteUrlPlaceholder(r))continue;let e=r.slice(0,r.search(G));t?.has(e)?N.warn(`env "${n}" keeps the unresolved value "${r}" for now because static website "${e}" isn't available yet; this deploy rebuilds automatically once it is, to inject the real URL.`):N.warn(`env "${n}" keeps the unresolved value "${r}". The literal pattern is passed to your code at runtime.`)}}async function fetchMachineUserToken(e,t,n){N.registerSecret(n);let r=new URL(`/oauth2/token`,e).href,i=new URLSearchParams;i.append(`grant_type`,`client_credentials`),i.append(`client_id`,t),i.append(`client_secret`,n);let a={method:`POST`,headers:{"User-Agent":await oe(),"Content-Type":`application/x-www-form-urlencoded`},body:i},o=await withConnectTimeoutRetry(`machine user token request`,()=>fetch(r,a));if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`Failed to fetch machine user token: ${o.status} ${o.statusText} ${e.slice(0,500)}`)}let s=await o.json(),c=R.object({token_type:R.string(),access_token:R.string(),expires_in:R.number()}).safeParse(s);if(!c.success)throw p(`machine user token response`,c.error);return N.registerSecret(c.data.access_token),c.data}function isUndiciConnectTimeout(e){if(!(e instanceof TypeError))return!1;let t=e.cause;return t instanceof Error&&`code`in t&&t.code===`UND_ERR_CONNECT_TIMEOUT`}async function withConnectTimeoutRetry(e,t){for(let n=1;;n++)try{return await t()}catch(t){if(!isUndiciConnectTimeout(t)||n>=3)throw t;N.debug(`retry: ${e} attempt ${n} failed with UND_ERR_CONNECT_TIMEOUT; retrying`),await waitRetryBackoff(n)}}async function fetchPlatformMachineUserToken(e,t,n){N.registerSecret(t);let r=getPlatformBaseUrl(n),i=await withConnectTimeoutRetry(`platform machine user token request`,()=>new _e({clientId:e,clientSecret:t,server:r,discoveryEndpoint:ke}).clientCredentials());return N.registerSecret(i.accessToken),i.refreshToken&&N.registerSecret(i.refreshToken),i}async function closeConnectionPool(){let e=globalThis,t=e[Symbol.for(`undici.globalDispatcher.2`)]??e[Symbol.for(`undici.globalDispatcher.1`)];typeof t?.close==`function`&&await t.close()}function getPluginImportBaseDirs(e){return e?[L.dirname(e)]:[process.cwd()]}function resolveRelativePluginImportPath(e,t){if(!e.startsWith(`.`))return null;for(let n of t){let t=L.resolve(n,e);if(z.existsSync(t))return t}return null}function generatePluginExecutorFiles(e,t,n,r,i){if(e.length===0)return[];let a=[],o=getPluginImportBaseDirs(i);for(let i of e){let e=generateSingleExecutorFile(i,t,n,r,o);a.push(e);let s=L.relative(process.cwd(),e);N.log(` Plugin Executor File: ${j.success(s)} from plugin ${j.info(i.pluginId)}`)}return a}function generateSingleExecutorFile(e,t,n,r,i=[]){let a=sanitizePluginId$1(e.pluginId),o=L.join(t,a,`executors`);z.mkdirSync(o,{recursive:!0});let s=sanitizeExecutorFileName(e.executor.name),c=L.join(o,`${s}.ts`),l;return l=se(e.executor)?generateExecutorFileContentNew(e,e.executor,t,n,r,i):generateExecutorFileContentLegacy(e.executor),z.writeFileSync(c,l),c}function generateExecutorFileContentNew(e,t,n,r,i,a=[]){let{resolve:o,context:s}=t,c=sanitizePluginId$1(e.pluginId),l=L.join(n,c,`executors`),u=resolveExecutorImportPath(o,e.pluginImportPath,l,a),d=collectTableImports(s,n,e.pluginId,r,i),f=[];for(let[,e]of d)f.push(`import { ${e.variableName} } from "${e.importPath}";`);let p=generateContextCode(s,d);return I`
1
+ import{r as e}from"./date-CgP7gMG_.mjs";import{n as t}from"./brand-C8nMKhJC.mjs";import{a as n,i as r,n as i,o as a}from"./wait-point-registry-B-ESkTZX.mjs";import{t as o}from"./assert-WeXvmG4j.mjs";import{A as s,C as c,D as l,E as u,O as d,S as f,T as p,_ as m,a as h,c as g,d as _,f as v,g as y,h as b,l as x,m as S,n as C,o as w,p as T,s as E,t as D,u as O,w as k,x as A}from"./service-eeXdVrDK.mjs";import{_ as j,a as M,f as N,i as P,t as F,y as ee}from"./errors-BXmGBX-7.mjs";import{n as te,t as ne}from"./es-builtins-SfvXRVoG.mjs";import{n as re,r as ie,t as ae}from"./node-builtins-DYfhPBnz.mjs";import{t as I}from"./multiline-EyzjEwn9.mjs";import{t as oe}from"./user-agent-vdHYF3QL.mjs";import{r as se,t as ce}from"./guards-CiFVxoXR.mjs";import{t as le}from"./type-source--ZNcV8RJ.mjs";import{createRequire as ue}from"node:module";import*as L from"pathe";import{resolve as de}from"pathe";import{resolveTSConfig as fe}from"pkg-types";import{z as R}from"zod";import{create as pe}from"@bufbuild/protobuf";import*as z from"node:fs";import{readFileSync as me}from"node:fs";import{MethodOptions_IdempotencyLevel as he}from"@bufbuild/protobuf/wkt";import{Code as B,ConnectError as V,createClient as ge}from"@connectrpc/connect";import{OAuth2Client as _e}from"@badgateway/oauth2-client";import ve from"p-limit";import*as ye from"node:crypto";import{createHash as be}from"node:crypto";import*as xe from"node:os";import*as Se from"rolldown";import{RolldownMagicString as Ce}from"rolldown";import{parseSync as H}from"oxc-parser";import{createPathsMatcher as we,getTsconfig as Te}from"get-tsconfig";import{matchesGlob as Ee}from"node:path/posix";import*as U from"inflection";function isForbiddenGlobal(e){return te.has(e)}const De=[`DEBUG`,`INFO`,`WARN`,`ERROR`,`SILENT`];function isLogLevel(e){return De.includes(e)}const Oe=/^\d*[1-9]\d*$/;function parsePositiveInt(e){if(e===void 0)return;let t=e.trim();if(!Oe.test(t))return;let n=Number.parseInt(t,10);return Number.isSafeInteger(n)?n:void 0}function resolveApplyConcurrency(){return parsePositiveInt(process.env.TAILOR_APPLY_CONCURRENCY)??16}function createApplyLimiter(){return ve(resolveApplyConcurrency())}function byName(e,t){return e.name<t.name?-1:+(e.name>t.name)}const ke=`https://api.tailor.tech`,Ae=`/.well-known/oauth-authorization-server/oauth2/platform`,je=3e4,Me=/* @__PURE__ */ new Map;function getEnvPlatformUrl(){return process.env.TAILOR_PLATFORM_URL??process.env.PLATFORM_URL}function getEnvOAuth2ClientId(){return process.env.TAILOR_PLATFORM_OAUTH2_CLIENT_ID??process.env.PLATFORM_OAUTH2_CLIENT_ID}function normalizeBaseUrl(e){let t=new URL(e);return t.hash=``,t.search=``,t.toString().replace(/\/$/,``)}function getEffectivePlatformConfig(e={}){let t=e.platformUrl??getEnvPlatformUrl(),n=e.oauth2ClientId??getEnvOAuth2ClientId(),r=e.consoleUrl??process.env.TAILOR_PLATFORM_CONSOLE_URL,i={...t?{platformUrl:t}:{},...n?{oauth2ClientId:n}:{},...r?{consoleUrl:r}:{}};return Object.keys(i).length>0?i:void 0}function rememberPlatformConfigForToken(e,t){let n=getEffectivePlatformConfig(t);n?Me.set(e,n):Me.delete(e)}function getPlatformConfigForToken(e){return Me.get(e)}function getPlatformBaseUrl(e={}){return normalizeBaseUrl(e.platformUrl??getEnvPlatformUrl()??`https://api.tailor.tech`)}function isDefaultPlatform(e){return getPlatformBaseUrl(e)===normalizeBaseUrl(ke)}function getOAuth2ClientId(e={}){return e.oauth2ClientId??getEnvOAuth2ClientId()??`cpoc_0Iudir72fqSpqC6GQ58ri1cLAqcq5vJl`}function inferConsoleBaseUrl(e){let t=new URL(e);return t.hostname.startsWith(`api.`)?(t.hostname=t.hostname.replace(/^api\./,`console.`),normalizeBaseUrl(t.toString())):`https://console.tailor.tech`}function getConsoleBaseUrl(e={}){if(e.consoleUrl)return normalizeBaseUrl(e.consoleUrl);if(e.platformUrl){let t=inferConsoleBaseUrl(e.platformUrl);if(t!==`https://console.tailor.tech`)return t}return process.env.TAILOR_PLATFORM_CONSOLE_URL?normalizeBaseUrl(process.env.TAILOR_PLATFORM_CONSOLE_URL):inferConsoleBaseUrl(getPlatformBaseUrl(e))}function initOAuth2Client(e){return new _e({clientId:getOAuth2ClientId(e),server:getPlatformBaseUrl(e),discoveryEndpoint:Ae,fetch:(e,t)=>fetch(e,{...t,signal:AbortSignal.any([...t?.signal?[t.signal]:[],AbortSignal.timeout(je)])})})}const Ne=/* @__PURE__ */ new Map;function registerAccessTokenSource(e,t){Ne.set(e,t)}function findAccessTokenSource(e){return Ne.get(e)}async function initOperatorClient(e,t){let n=t??getPlatformConfigForToken(e),[{createTracingInterceptor:r},{OperatorService:i}]=await Promise.all([import(`./interceptor-DQg3cR_9.mjs`),import(`./service_pb-CsJKokDl.mjs`)]),a=findAccessTokenSource(e)??{current:async()=>e,replaceRejected:async()=>void 0},o=[await userAgentInterceptor(),await bearerTokenInterceptor(a),retryInterceptor(),errorHandlingInterceptor(),r(),concurrencyLimitInterceptor()],s=getPlatformBaseUrl(n),c=createPooledStreamTransport(await createTransport(s,o),()=>createTransport(s,o),4);return ge(i,c)}async function createTransport(e,t){let{createConnectTransport:n}=await import(`@connectrpc/connect-node`);return n({httpVersion:`2`,baseUrl:e,interceptors:t})}const Pe=/* @__PURE__ */ new Set([`CreateFunctionRegistry`,`UpdateFunctionRegistry`,`UploadFile`]);function createPooledStreamTransport(e,t,n){if(!Number.isInteger(n)||n<1)throw Error(`createPooledStreamTransport: maxConnections must be a positive integer, got ${n}`);let r=[e],i=[0],a=[],o=0;function acquireTransportIndex(e,s){return new Promise((c,l)=>{let u=!1,d;function cleanup(){u=!0,clearTimeout(d),e?.removeEventListener(`abort`,onAbort);let t=a.indexOf(attempt);t!==-1&&a.splice(t,1)}function onAbort(){cleanup(),l(V.from(e?.reason,B.Canceled))}function onTimeout(){cleanup(),l(new V(`the operation timed out`,B.DeadlineExceeded))}function claim(e){u?release(e):(cleanup(),c(e))}function attempt(){let e=i.pop();e===void 0?r.length+o<n?(o++,t().then(e=>{o--;let t=r.length;r.push(e),claim(t)},e=>{o--,cleanup(),l(e instanceof Error?e:Error(String(e))),wakeOneWaiter()})):a.push(attempt):claim(e)}if(e?.aborted)onAbort();else{if(e?.addEventListener(`abort`,onAbort,{once:!0}),s!==void 0){let e=s-performance.now();if(e<=0){onTimeout();return}d=setTimeout(onTimeout,e)}attempt()}})}function wakeOneWaiter(){a.shift()?.()}function release(e){i.push(e),wakeOneWaiter()}return{unary(t,n,r,i,a,o){return e.unary(t,n,r,i,a,o)},async stream(t,n,i,a,o,s){if(!Pe.has(t.name))return e.stream(t,n,i,a,o,s);let c=i!==void 0&&i>0?performance.now()+i:void 0,l=await acquireTransportIndex(n,c),u=r[l],d;try{if(n?.aborted)throw V.from(n.reason,B.Canceled);let e=c===void 0?i:Math.ceil(c-performance.now());if(c!==void 0&&e!==void 0&&e<=0)throw new V(`the operation timed out`,B.DeadlineExceeded);d=await u.stream(t,n,e,a,o,s)}catch(e){throw release(l),e}return{...d,message:releaseAfter(d.message,()=>release(l))}}}}async function*releaseAfter(e,t){try{yield*e}finally{t()}}async function userAgentInterceptor(){let e=await oe();return t=>async n=>(n.header.set(`User-Agent`,e),await t(n))}async function bearerTokenInterceptor(e){return t=>async n=>{let r=await currentAccessToken(e);n.header.set(`Authorization`,`Bearer ${r}`);try{return await t(n)}catch(i){if(n.stream||!(i instanceof V)||i.code!==B.Unauthenticated)throw i;let a=await e.replaceRejected(r).catch(e=>{N.debug(`Could not replace the rejected access token: ${String(e)}`)});if(!a||a===r)throw i;return n.header.set(`Authorization`,`Bearer ${a}`),await t(n)}}}async function currentAccessToken(e){try{return await e.current()}catch(e){throw s(new V(e instanceof Error?e.message:String(e),B.Unauthenticated,void 0,void 0,e),{...M(e)&&e.code?{code:e.code}:{},...M(e)&&e.suggestion?{suggestion:e.suggestion}:{},causes:{authentication:e}})}}function retryInterceptor(){return e=>async t=>{if(t.stream)return await e(t);let n;for(let r=0;r<Ie;r++){r>0&&await waitRetryBackoff(r);try{return await e(t)}catch(e){if(isRetrySafeCreateAlreadyExists(e,t.method.name)){if(r>0)return N.debug(`retry: ${t.method.name} returned AlreadyExists on attempt ${r+1}; treating as success (prior attempt likely committed)`),synthesizeEmptyUnaryResponse(t);let{reportCrash:n}=await import(`./crashreport-WsYAWARW.mjs`);await n(e,`handledError`)}if(!Le.has(t.method.name)&&isRetirable(e,t.method.idempotency)){n=e,N.debug(`retry: ${t.method.name} attempt ${r+1} failed with ${retryErrorCodeName(e)}; retrying`);continue}throw e}}throw n}}function concurrencyLimitInterceptor(){let e=createApplyLimiter();return t=>async n=>n.stream?await t(n):await e(()=>t(n))}function retryErrorCodeName(e){return e instanceof V?B[e.code]:isTransportDisconnectError(e)?e.code:`unknown`}const Fe=/* @__PURE__ */ new Set([`CreateAIGateway`,`CreateApplication`,`CreateAuthConnection`,`CreateAuthHook`,`CreateAuthIDPConfig`,`CreateAuthMachineUser`,`CreateAuthOAuth2Client`,`CreateAuthSCIMConfig`,`CreateAuthSCIMResource`,`CreateAuthService`,`CreateExecutorExecutor`,`CreateIdPService`,`CreatePipelineResolver`,`CreatePipelineService`,`CreateSecretManagerSecret`,`CreateSecretManagerVault`,`CreateStaticWebsite`,`CreateTailorDBGQLPermission`,`CreateTailorDBService`,`CreateTailorDBType`,`CreateTenantConfig`,`CreateUserProfileConfig`,`CreateWorkflow`,`CreateWorkflowJobFunctionExecutionPolicy`]);function isRetrySafeCreateAlreadyExists(e,t){return e instanceof V&&e.code===B.AlreadyExists&&Fe.has(t)}function synthesizeEmptyUnaryResponse(e){return{stream:!1,service:e.service,method:e.method,header:new Headers,message:pe(e.method.output),trailer:new Headers}}const Ie=3,Le=/* @__PURE__ */ new Set([`CloneApplicationData`,`CreateWorkspace`,`StartWorkflow`]);function waitRetryBackoff(e){let t=500*2**(e-1)*(1+.1*(Math.random()*2-1));return new Promise(e=>setTimeout(e,t))}const Re=/* @__PURE__ */ new Set([`ERR_STREAM_PREMATURE_CLOSE`,`ECONNRESET`,`ETIMEDOUT`,`EPIPE`]);function isTransportDisconnectError(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&Re.has(e.code)}function isRetirable(e,t){let n=t===he.NO_SIDE_EFFECTS||t===he.IDEMPOTENT;if(!(e instanceof V))return isTransportDisconnectError(e)&&n;switch(e.code){case B.ResourceExhausted:case B.Unavailable:return!0;case B.Aborted:case B.Internal:return n;default:return!1}}function errorHandlingInterceptor(){return e=>async t=>{try{return await e(t)}catch(e){if(e instanceof V){let{operation:n,resourceType:r}=parseMethodName(t.method.name),i=requestIdentifiers(t.message,t.method.name),a=Object.entries(i).map(([e,t])=>`${e}: ${t}`),o=a.length===0?``:` (${a.join(`, `)})`;throw s(new V(`Failed to ${n} ${r}${o}: ${e.rawMessage}`,e.code,e.metadata),{context:{method:t.method.name,identifiers:i}})}throw isTransportDisconnectError(e)?s(e,{code:`TRANSPORT_DISCONNECTED`,suggestion:`Check network connectivity and platform availability. A write may already have completed; inspect the current resource state before retrying.`,context:{method:t.method.name,transportCode:e.code,identifiers:requestIdentifiers(t.message,t.method.name)}}):e}}}function parseMethodName(e){let t=e.match(/^(Create|Update|Delete|Set|List|Get)(.+)$/);if(!t)return{operation:`perform`,resourceType:`resource`};let[,n,r]=t;return{operation:n.toLowerCase(),resourceType:r}}const ze=/* @__PURE__ */ new Set([`name`,`id`]),Be=[`Name`,`Id`,`Namespace`],Ve=`name`,He={GetMetadata:[`trn`],SetMetadata:[`trn`],AddCustomDomain:[`domain`],GetCustomDomain:[`domain`],RemoveCustomDomain:[`domain`],RequestCustomDomainTransfer:[`domain`],CancelCustomDomainTransfer:[`domain`],AcceptCustomDomainTransfer:[`domain`],GetCustomDomainTransfer:[`domain`],CreateWorkflowJobFunctionExecutionPolicy:[`executionPolicyKey`],UpdateWorkflowJobFunctionExecutionPolicy:[`executionPolicyKey`],GetWorkflowJobFunctionExecutionPolicyByKey:[`executionPolicyKey`]};function isIdentityKey(e,t){return e.startsWith(`$`)?!1:ze.has(e)||Be.some(t=>e.endsWith(t))||(He[t]?.includes(e)??!1)}function requestIdentifiers(e,t){if(typeof e!=`object`||!e)return{};let n={};for(let[r,i]of Object.entries(e))if(typeof i==`string`&&i!==``&&isIdentityKey(r,t))n[r]=i;else if(!r.startsWith(`$`)&&typeof i==`object`&&i&&!Array.isArray(i)&&typeof i.$typeName==`string`){let e=i[Ve];typeof e==`string`&&e!==``&&(n[`${r}.${Ve}`]=e)}return n}const Ue=1e3;async function fetchAll(e){let t=[],n=``;for(;;){let[r,i]=await e(n,Ue);if(t.push(...r),!i)break;n=i}return t}function isNotFoundError(e){return e instanceof V&&e.code===B.NotFound}async function fetchAllTolerant(e){return await fetchAll(async(t,n)=>{try{return await e(t,n)}catch(e){if(isNotFoundError(e))return[[],``];throw e}})}async function getOrNull(e){try{return await e()}catch(e){if(isNotFoundError(e))return;throw e}}async function fetchPaged(e,t){let n=t?.limit,r=n===void 0||n===0,i=[],a=``;for(;;){let t=r?Ue:Math.min(n-i.length,Ue);if(!r&&t<=0)break;let[o,s]=await e(a,t);if(i.push(...o),!r&&i.length>=n||!s)break;a=s}return!r&&i.length>n?i.slice(0,n):i}async function fetchUserInfo(e,t){let n=new URL(`/auth/platform/userinfo`,getPlatformBaseUrl(t)).href,r=await fetch(n,{headers:{Authorization:`Bearer ${e}`,"User-Agent":await oe()},signal:AbortSignal.timeout(je)});if(!r.ok)throw Error(`Failed to fetch user info: ${r.statusText}`);let i=await r.json(),a=R.object({sub:R.string(),email:R.string()}).safeParse(i);if(!a.success)throw p(`user info response`,a.error);return a.data}const W=/:url(\/.*)?$/;function hasStaticWebsiteUrlPlaceholder(e){return typeof e==`string`&&W.test(e)}function staticWebsiteNameFromPlaceholder(e){let t=e.match(W);return t?.index===void 0?e:e.substring(0,t.index)}async function resolveStaticWebsiteUrls(e,t,n,r,i={}){if(!n)return[];let{expectedLocalNames:a,keepUnresolved:o=!1,failOnUnexpectedError:s=!1}=i,unresolved=e=>o?[e]:[],c=o?`Leaving the ${r} value unresolved.`:`Excluding from ${r}.`,l=i.siteLookupCache??/* @__PURE__ */ new Map,lookupSite=n=>{let r=l.get(n);return r||(r=e.getStaticWebsite({workspaceId:t,name:n}),l.set(n,r)),r};return(await Promise.all(n.map(async e=>{let t=e.match(W);if(t&&t.index!==void 0){let n=e.substring(0,t.index),i=t[1]||``;try{let t=await lookupSite(n);if(t.staticwebsite?.url)return[t.staticwebsite.url+i];if(!a?.has(n)&&s)throw F({code:`STATIC_WEBSITE_URL_NOT_ASSIGNED`,message:`Static website "${n}" exists but has no URL assigned yet.`,suggestion:`Re-run the deploy once the static website's URL is available.`});return N.warn(`Static website "${n}" has no URL assigned yet. ${c}`),unresolved(e)}catch(t){if(isNotFoundError(t)){if(a?.has(n))return[e]}else if(s)throw t;return N.warn(`Static website "${n}" not found for ${r} configuration. ${c}`),unresolved(e)}}return[e]}))).flat()}async function resolveStaticWebsiteUrlsInEnv(e,t,n,r={}){if(!n||!Object.values(n).some(hasStaticWebsiteUrlPlaceholder))return n??{};let i=/* @__PURE__ */ new Map,a=await Promise.all(Object.entries(n).map(async([n,a])=>{if(!hasStaticWebsiteUrlPlaceholder(a))return[n,a];let[o]=await resolveStaticWebsiteUrls(e,t,[a],`env "${n}"`,{...r,keepUnresolved:!0,failOnUnexpectedError:!0,siteLookupCache:i});return[n,o??a]})),o=Object.fromEntries(a);return warnUnresolvedEnvPlaceholders(o,r.expectedLocalNames),o}function warnUnresolvedEnvPlaceholders(e,t){for(let[n,r]of Object.entries(e)){if(!hasStaticWebsiteUrlPlaceholder(r))continue;let e=r.slice(0,r.search(W));t?.has(e)?N.warn(`env "${n}" keeps the unresolved value "${r}" for now because static website "${e}" isn't available yet; this deploy rebuilds automatically once it is, to inject the real URL.`):N.warn(`env "${n}" keeps the unresolved value "${r}". The literal pattern is passed to your code at runtime.`)}}async function fetchMachineUserToken(e,t,n){N.registerSecret(n);let r=new URL(`/oauth2/token`,e).href,i=new URLSearchParams;i.append(`grant_type`,`client_credentials`),i.append(`client_id`,t),i.append(`client_secret`,n);let a={method:`POST`,headers:{"User-Agent":await oe(),"Content-Type":`application/x-www-form-urlencoded`},body:i},o=await withConnectTimeoutRetry(`machine user token request`,()=>fetch(r,a));if(!o.ok){let e=await o.text().catch(()=>``);throw Error(`Failed to fetch machine user token: ${o.status} ${o.statusText} ${e.slice(0,500)}`)}let s=await o.json(),c=R.object({token_type:R.string(),access_token:R.string(),expires_in:R.number()}).safeParse(s);if(!c.success)throw p(`machine user token response`,c.error);return N.registerSecret(c.data.access_token),c.data}function isUndiciConnectTimeout(e){if(!(e instanceof TypeError))return!1;let t=e.cause;return t instanceof Error&&`code`in t&&t.code===`UND_ERR_CONNECT_TIMEOUT`}async function withConnectTimeoutRetry(e,t){for(let n=1;;n++)try{return await t()}catch(t){if(!isUndiciConnectTimeout(t)||n>=3)throw t;N.debug(`retry: ${e} attempt ${n} failed with UND_ERR_CONNECT_TIMEOUT; retrying`),await waitRetryBackoff(n)}}async function fetchPlatformMachineUserToken(e,t,n){N.registerSecret(t);let r=getPlatformBaseUrl(n),i=await withConnectTimeoutRetry(`platform machine user token request`,()=>new _e({clientId:e,clientSecret:t,server:r,discoveryEndpoint:Ae}).clientCredentials());return N.registerSecret(i.accessToken),i.refreshToken&&N.registerSecret(i.refreshToken),i}async function closeConnectionPool(){let e=globalThis,t=e[Symbol.for(`undici.globalDispatcher.2`)]??e[Symbol.for(`undici.globalDispatcher.1`)];typeof t?.close==`function`&&await t.close()}function getPluginImportBaseDirs(e){return e?[L.dirname(e)]:[process.cwd()]}function resolveRelativePluginImportPath(e,t){if(!e.startsWith(`.`))return null;for(let n of t){let t=L.resolve(n,e);if(z.existsSync(t))return t}return null}function generatePluginExecutorFiles(e,t,n,r,i){if(e.length===0)return[];let a=[],o=getPluginImportBaseDirs(i);for(let i of e){let e=generateSingleExecutorFile(i,t,n,r,o);a.push(e);let s=L.relative(process.cwd(),e);N.log(` Plugin Executor File: ${j.success(s)} from plugin ${j.info(i.pluginId)}`)}return a}function generateSingleExecutorFile(e,t,n,r,i=[]){let a=sanitizePluginId$1(e.pluginId),o=L.join(t,a,`executors`);z.mkdirSync(o,{recursive:!0});let s=sanitizeExecutorFileName(e.executor.name),c=L.join(o,`${s}.ts`),l;return l=se(e.executor)?generateExecutorFileContentNew(e,e.executor,t,n,r,i):generateExecutorFileContentLegacy(e.executor),z.writeFileSync(c,l),c}function generateExecutorFileContentNew(e,t,n,r,i,a=[]){let{resolve:o,context:s}=t,c=sanitizePluginId$1(e.pluginId),l=L.join(n,c,`executors`),u=resolveExecutorImportPath(o,e.pluginImportPath,l,a),d=collectTableImports(s,n,e.pluginId,r,i),f=[];for(let[,e]of d)f.push(`import { ${e.variableName} } from "${e.importPath}";`);let p=generateContextCode(s,d);return I`
2
2
  /**
3
3
  * Auto-generated executor by plugin: ${e.pluginId}
4
4
  * DO NOT EDIT - This file is generated by @tailor-platform/sdk
@@ -49,7 +49,7 @@ import{r as e}from"./date-CgP7gMG_.mjs";import{n as t}from"./brand-C8nMKhJC.mjs"
49
49
  }`;case`workflow`:return`{
50
50
  kind: "workflow",
51
51
  workflowName: ${JSON.stringify(e.workflowName)},
52
- }`;default:throw P(`Unknown operation kind: ${e.kind}`)}}function escapeTemplateLiteral(e){return e.replace(/\\/g,`\\\\`).replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}const He=ue(import.meta.url);function resolveExecutorImportPath(e,t,n,r){let i=extractDynamicImportSpecifier(e);if(!i.startsWith(`.`))return i;let a=resolvePluginBaseDir(t,r);if(!a)throw F({code:`PLUGIN_IMPORT_UNRESOLVED`,message:`Unable to resolve plugin import base for "${t}".`,details:`Tried base dirs: ${r.join(`, `)||`(none)`}.`,suggestion:`Use an absolute import specifier in resolve(), or ensure the plugin path is resolvable.`});let o=L.resolve(a,i),s=L.relative(n,o).replace(/\\/g,`/`);return s=stripSourceExtension(s),s.startsWith(`.`)||(s=`./${s}`),s}function extractDynamicImportSpecifier(e){let t=e.toString().match(/import\s*\(\s*["']([^"']+)["']\s*\)/);if(!t)throw F({code:`PLUGIN_RESOLVE_INVALID`,message:'resolve() must return a dynamic import, e.g. `async () => await import("./executors/on-create")`.'});return o(t[1],`dynamic import specifier capture group missing`)}function resolvePluginBaseDir(e,t){if(e.startsWith(`.`)){let n=resolveRelativePluginImportPath(e,t)??L.resolve(t[0]??process.cwd(),e);return z.existsSync(n)?z.statSync(n).isDirectory()?n:L.dirname(n):L.extname(n)?L.dirname(n):n}for(let n of t)try{let t=He.resolve(e,{paths:[n]});return L.dirname(t)}catch{continue}return null}function stripSourceExtension(e){return e.replace(/\.(ts|tsx)$/,``)}function sanitizePluginId$1(e){return e.replace(/^@/,``).replace(/\//g,`-`)}function sanitizeExecutorFileName(e){let t=L.basename(e).replace(/\.[^/.]+$/,``).replace(/[^a-zA-Z0-9_-]/g,`-`);if(!t)throw F({code:`PLUGIN_EXECUTOR_NAME_INVALID`,message:`Invalid executor name: "${e}"`});return t}function toCamelCase$1(e){let t=e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``);return t.charAt(0).toLowerCase()+t.slice(1)}function toKebabCase$1(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function isFieldDefinition(e){return typeof e==`object`&&!!e}function generatePluginTableFiles(e,t){let n=/* @__PURE__ */ new Map,r=[];if(e.length===0)return{tableFilePaths:n,generatedFiles:r};let i=/* @__PURE__ */ new Map;for(let a of e){let e=i.get(a.table.name);if(e)throw F({code:`PLUGIN_TABLE_NAME_DUPLICATE`,message:`Duplicate plugin-generated table name "${a.table.name}" detected. First: plugin "${e.pluginId}" (kind: "${e.kind}", source: "${e.sourceTableName}"), Second: plugin "${a.pluginId}" (kind: "${a.kind}", source: "${a.sourceTableName}"). Plugin-generated table names must be unique.`});i.set(a.table.name,a);let o=sanitizePluginId(a.pluginId),s=L.join(t,o,`types`);z.mkdirSync(s,{recursive:!0});let c=`${toKebabCase(a.table.name)}.ts`,l=L.join(s,c),u=generateTableFileContent(a);z.writeFileSync(l,u),r.push(l);let d=L.relative(t,l);n.set(a.table.name,d);let f=L.relative(process.cwd(),l);N.log(` Plugin Table File: ${j.success(f)} (${j.dim(a.kind)}) from plugin ${j.info(a.pluginId)}`)}return{tableFilePaths:n,generatedFiles:r}}function generateTableFileContent(e){let{table:t,pluginId:n,sourceTableName:r,kind:i}=e,a=toCamelCase(t.name),o=generateFieldsCode(t);return I`
52
+ }`;default:throw P(`Unknown operation kind: ${e.kind}`)}}function escapeTemplateLiteral(e){return e.replace(/\\/g,`\\\\`).replace(/`/g,"\\`").replace(/\$\{/g,"\\${")}const We=ue(import.meta.url);function resolveExecutorImportPath(e,t,n,r){let i=extractDynamicImportSpecifier(e);if(!i.startsWith(`.`))return i;let a=resolvePluginBaseDir(t,r);if(!a)throw F({code:`PLUGIN_IMPORT_UNRESOLVED`,message:`Unable to resolve plugin import base for "${t}".`,details:`Tried base dirs: ${r.join(`, `)||`(none)`}.`,suggestion:`Use an absolute import specifier in resolve(), or ensure the plugin path is resolvable.`});let o=L.resolve(a,i),s=L.relative(n,o).replace(/\\/g,`/`);return s=stripSourceExtension(s),s.startsWith(`.`)||(s=`./${s}`),s}function extractDynamicImportSpecifier(e){let t=e.toString().match(/import\s*\(\s*["']([^"']+)["']\s*\)/);if(!t)throw F({code:`PLUGIN_RESOLVE_INVALID`,message:'resolve() must return a dynamic import, e.g. `async () => await import("./executors/on-create")`.'});return o(t[1],`dynamic import specifier capture group missing`)}function resolvePluginBaseDir(e,t){if(e.startsWith(`.`)){let n=resolveRelativePluginImportPath(e,t)??L.resolve(t[0]??process.cwd(),e);return z.existsSync(n)?z.statSync(n).isDirectory()?n:L.dirname(n):L.extname(n)?L.dirname(n):n}for(let n of t)try{let t=We.resolve(e,{paths:[n]});return L.dirname(t)}catch{continue}return null}function stripSourceExtension(e){return e.replace(/\.(ts|tsx)$/,``)}function sanitizePluginId$1(e){return e.replace(/^@/,``).replace(/\//g,`-`)}function sanitizeExecutorFileName(e){let t=L.basename(e).replace(/\.[^/.]+$/,``).replace(/[^a-zA-Z0-9_-]/g,`-`);if(!t)throw F({code:`PLUGIN_EXECUTOR_NAME_INVALID`,message:`Invalid executor name: "${e}"`});return t}function toCamelCase$1(e){let t=e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``);return t.charAt(0).toLowerCase()+t.slice(1)}function toKebabCase$1(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function isFieldDefinition(e){return typeof e==`object`&&!!e}function generatePluginTableFiles(e,t){let n=/* @__PURE__ */ new Map,r=[];if(e.length===0)return{tableFilePaths:n,generatedFiles:r};let i=/* @__PURE__ */ new Map;for(let a of e){let e=i.get(a.table.name);if(e)throw F({code:`PLUGIN_TABLE_NAME_DUPLICATE`,message:`Duplicate plugin-generated table name "${a.table.name}" detected. First: plugin "${e.pluginId}" (kind: "${e.kind}", source: "${e.sourceTableName}"), Second: plugin "${a.pluginId}" (kind: "${a.kind}", source: "${a.sourceTableName}"). Plugin-generated table names must be unique.`});i.set(a.table.name,a);let o=sanitizePluginId(a.pluginId),s=L.join(t,o,`types`);z.mkdirSync(s,{recursive:!0});let c=`${toKebabCase(a.table.name)}.ts`,l=L.join(s,c),u=generateTableFileContent(a);z.writeFileSync(l,u),r.push(l);let d=L.relative(t,l);n.set(a.table.name,d);let f=L.relative(process.cwd(),l);N.log(` Plugin Table File: ${j.success(f)} (${j.dim(a.kind)}) from plugin ${j.info(a.pluginId)}`)}return{tableFilePaths:n,generatedFiles:r}}function generateTableFileContent(e){let{table:t,pluginId:n,sourceTableName:r,kind:i}=e,a=toCamelCase(t.name),o=generateFieldsCode(t);return I`
53
53
  /**
54
54
  * Auto-generated table by plugin: ${n}
55
55
  * Source: ${r}
@@ -63,21 +63,21 @@ import{r as e}from"./date-CgP7gMG_.mjs";import{n as t}from"./brand-C8nMKhJC.mjs"
63
63
 
64
64
  export type ${t.name} = typeof ${a};
65
65
  `}function generateFieldsCode(e){let t=[];for(let[n,r]of Object.entries(e.fields)){if(!isFieldDefinition(r))continue;let e=generateSingleFieldCode(r);e&&t.push(` ${n}: ${e}`)}return`{\n${t.join(`,
66
- `)},\n}`}const Ue={string:`string`,integer:`int`,float:`float`,boolean:`bool`,uuid:`uuid`,datetime:`datetime`,date:`date`,time:`time`,enum:`enum`,nested:`nested`};function generateSingleFieldCode(e){let t=e.type;if(!t)return null;let n=Ue[t]??t,r=e._metadata??e.metadata??{},i=[];r.required===!1&&i.push(`optional: true`);let a=i.length>0?`{ ${i.join(`, `)} }`:``;if(t===`enum`){let e=r.allowedValues,t=[];Array.isArray(e)&&(t=e.map(e=>e.value));let n=`db.enum(${JSON.stringify(t)}${a?`, ${a}`:``})`;return r.index&&(n+=`.index()`),r.unique&&(n+=`.unique()`),r.description&&(n+=`.description(${JSON.stringify(r.description)})`),n}let o=`db.${n}(${a})`;return r.index&&(o+=`.index()`),r.unique&&(o+=`.unique()`),r.description&&(o+=`.description(${JSON.stringify(r.description)})`),o}function sanitizePluginId(e){return e.replace(/^@/,``).replace(/\//g,`-`)}function toKebabCase(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function toCamelCase(e){let t=e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``);return t.charAt(0).toLowerCase()+t.slice(1)}function createDepCollectorPlugin(){let e=/* @__PURE__ */ new Set,t={name:`cache-dep-collector`,load:{filter:{id:{include:[/\.[^/]+$/]}},handler(t){return!t.includes(`node_modules`)&&!t.endsWith(`.entry.js`)&&e.add(t),null}}};function getResult(){return Array.from(e).toSorted()}return{plugin:t,getResult}}function hashContent(e){return ye.createHash(`sha256`).update(e,`utf-8`).digest(`hex`)}function hashFile(e){let t=z.readFileSync(e);return ye.createHash(`sha256`).update(t).digest(`hex`)}function hashFiles(e){return hashContent(e.toSorted().map(e=>hashFileOrMissing(e)).join(``))}function hashFileOrMissing(e){try{return hashFile(e)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return`<missing>`;throw e}}function buildCacheKey(e,t,n){return n?`${e}:${n}:${t}`:`${e}:${t}`}function combineHash(e,t){return t?hashContent(e+t):e}function computeBundlerContextHash(e){let{sourceFile:t,extraContext:n,tsconfig:r,inlineSourcemap:i,inlineSourcemapDependencySources:a,inlineSourcemapProjectSources:o,bundleLogLevel:s,bundleTreeshake:c,prefix:l}=e,u=Object.entries(c??{}).filter(([,e])=>e!==void 0).toSorted(([e],[t])=>e.localeCompare(t));return hashContent((l??``)+L.resolve(t)+n+(r?hashFile(r):``)+String(i??!1)+dependencySourcesKey(a)+projectSourcesKey(o)+(s??``)+(u.length>0?JSON.stringify(u):``))}function dependencySourcesKey(e){return Array.isArray(e)?e.length===0?`false`:JSON.stringify([...new Set(e)].toSorted()):String(e??!1)}function projectSourcesKey(e){return!e?.include&&!e?.exclude?``:JSON.stringify([e.root??null,e.include??null,e.exclude??null])}async function withCache(e){let{cache:t,kind:n,namespace:r,name:i,sourceFile:a,contextHash:o,build:s}=e;if(!t)return await s([],()=>{});let c=t.tryRestore({kind:n,namespace:r,name:i,contextHash:o});if(c!==void 0)return N.debug(` ${j.dim(`cached`)}: ${i}`),c;let l=/* @__PURE__ */ new Set,{plugin:u,getResult:d}=createDepCollectorPlugin(),f=await s([u],e=>l.add(e));return t.save({kind:n,namespace:r,name:i,sourceFile:a,content:f.code,packageRuntimeGlobals:f.packageRuntimeGlobals,dependencyPaths:[...d(),...l],contextHash:o}),f}function createBundleCache(e){function tryRestore(t){let n=buildCacheKey(t.kind,t.name,t.namespace),r=e.getEntry(n);if(!r)return;let i;try{i=combineHash(hashFiles(r.dependencyPaths),t.contextHash)}catch{return}if(i!==r.inputHash)return;let a=e.restoreBundleContent(n),o=r.outputFiles.find(e=>e.outputPath===n);if(a!==void 0&&o&&hashContent(a)===o.contentHash)return{code:a,packageRuntimeGlobals:r.packageRuntimeGlobals??{}}}function save(t){let{kind:n,namespace:r,name:i,sourceFile:a,content:o,packageRuntimeGlobals:s,dependencyPaths:c,contextHash:l}=t,u=buildCacheKey(n,i,r),d=c.includes(a)?c:[a,...c],f;try{f=combineHash(hashFiles(d),l)}catch{return}let p=hashContent(o);e.storeBundleContent(u,o),e.setEntry(u,{kind:`bundle`,inputHash:f,dependencyPaths:d,outputFiles:[{outputPath:u,contentHash:p}],...s&&Object.keys(s).length>0?{packageRuntimeGlobals:s}:{},createdAt:(/* @__PURE__ */ new Date()).toISOString()})}return{tryRestore,save}}function getModuleExportName(e){if(!e||typeof e!=`object`)return;let t=e;return t.name?t.name:typeof t.value==`string`?t.value:void 0}function isTailorSdkSource(e){return/^@tailor-platform\/sdk(\/|$)/.test(e)}function getImportSource(e){if(!e)return null;if(e.type===`ImportExpression`){let t=e.source;if(t.type===`Literal`&&typeof t.value==`string`)return t.value}if(e.type===`CallExpression`){let t=e;if(t.callee.type===`Identifier`&&t.callee.name===`require`){let e=t.arguments[0];if(e&&`type`in e&&e.type===`Literal`&&`value`in e&&typeof e.value==`string`)return e.value}}return null}function argumentSourceText(e,t){if(e&&typeof e==`object`&&`start`in e&&`end`in e)return t.slice(e.start,e.end)}function getStartCallInfo(e,t){if(!e||typeof e!=`object`||e.type!==`CallExpression`)return null;let n=e,r=n.callee;if(r.type!==`MemberExpression`)return null;let i=r;return i.computed||i.property.name!==`start`||i.object.type!==`Identifier`?null:{identifierName:i.object.name,callRange:{start:n.start,end:n.end},argsText:argumentSourceText(n.arguments[0],t)??``,optionsText:argumentSourceText(n.arguments[1],t)}}function getNamespaceStartCallInfo(e,t){if(!e||typeof e!=`object`||e.type!==`CallExpression`)return null;let n=e,r=n.callee;if(r.type!==`MemberExpression`||r.computed||r.property.name!==`start`)return null;let i=r.object;if(i.type!==`MemberExpression`)return null;let a=i.object;if(a.type!==`Identifier`)return null;let o=i.property,s=i.computed?typeof o.value==`string`?o.value:void 0:o.name;return s===void 0?null:{identifierName:a.name,memberName:s,calleeText:t.slice(r.start,r.end),callRange:{start:n.start,end:n.end},argsText:argumentSourceText(n.arguments[0],t)??``,optionsText:argumentSourceText(n.arguments[1],t)}}function unwrapAwait(e){return e?.type===`AwaitExpression`?e.argument:e}function isStringLiteral(e){return e?.type===`Literal`&&typeof e.value==`string`}function isFunctionExpression(e){return e?.type===`ArrowFunctionExpression`||e?.type===`FunctionExpression`}function findProperty(e,t){for(let n of e)if(n.type===`Property`){let e=n;if((e.key.type===`Identifier`?e.key.name:e.key.type===`Literal`?e.key.value:null)===t)return{key:e.key,value:e.value,start:e.start,end:e.end}}return null}function applyReplacements(e,t){let n=t.toSorted((e,t)=>t.start-e.start);for(let e=0;e+1<n.length;e++){let t=o(n[e],`replacement missing at index ${e}`),r=o(n[e+1],`replacement missing at index ${e+1}`);if(r.end>t.start)throw Error(`applyReplacements: overlapping replacement ranges [${r.start}, ${r.end}) and [${t.start}, ${t.end})`)}let r=e;for(let e of n)r=r.slice(0,e.start)+e.text+r.slice(e.end);return r}function findStatementEnd(e,t){let n=t;for(;n<e.length&&(e[n]===`;`||e[n]===` `||e[n]===` `);)n++;return n<e.length&&e[n]===`
67
- `&&n++,n}function collectSdkBindings(e,t){let n=/* @__PURE__ */ new Set;function walk(e){if(!e||typeof e!=`object`)return;let r=e.type;if(r===`ImportDeclaration`){let r=e,i=r.source.value;if(typeof i==`string`&&isTailorSdkSource(i)){for(let e of r.specifiers)if(e.type===`ImportSpecifier`){let r=e;(r.imported.type===`Identifier`?r.imported.name:r.imported.value)===t&&n.add(r.local.name)}else if(e.type===`ImportDefaultSpecifier`||e.type===`ImportNamespaceSpecifier`){let t=e;n.add(`__namespace__:${t.local.name}`)}}}if(r===`VariableDeclaration`){let r=e;for(let e of r.declarations){let r=getImportSource(unwrapAwait(e.init));if(r&&isTailorSdkSource(r)){let r=e.id;if(r.type===`Identifier`)n.add(`__namespace__:${r.name}`);else if(r.type===`ObjectPattern`){let e=r;for(let r of e.properties)if(r.type===`Property`){let e=r,i=e.key.type===`Identifier`?e.key.name:e.key.value;if(i===t){let t=e.value.type===`Identifier`?e.value.name:i;n.add(t)}}}}}}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}return walk(e),n}function isSdkFunctionCall(e,t,n){if(e.type!==`CallExpression`)return!1;let r=e.callee;if(r.type===`Identifier`){let e=r;return t.has(e.name)}if(r.type===`MemberExpression`){let e=r;if(!e.computed){let r=e.object,i=e.property;if(r.type===`Identifier`&&t.has(`__namespace__:${r.name}`)&&i.name===n)return!0}}return!1}function findAllJobs(e,t){let n=[],r=collectSdkBindings(e,`createWorkflowJob`);function walk(e,t=[]){if(!e||typeof e!=`object`)return;if(isSdkFunctionCall(e,r,`createWorkflowJob`)){let r=e.arguments,i=r[0];if(r.length>=1&&i?.type===`ObjectExpression`){let e=o(i,`createWorkflowJob first argument missing`),r=findProperty(e.properties,`name`),a=findProperty(e.properties,`body`);if(r&&isStringLiteral(r.value)&&a&&isFunctionExpression(a.value)){let e,i;for(let n=t.length-1;n>=0;n--){let r=o(t[n],`parent at index ${n} missing`);if(r.type===`VariableDeclarator`){let e=r;e.id?.type===`Identifier`&&(i=e.id.name)}(r.type===`ExportNamedDeclaration`||r.type===`VariableDeclaration`)&&(e={start:r.start,end:r.end})}n.push({name:r.value.value,exportName:i,nameRange:{start:r.start,end:r.end},bodyValueRange:{start:a.value.start,end:a.value.end},statementRange:e})}}}let i=[...t,e];for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e,i)):n&&typeof n==`object`&&walk(n,i)}}return walk(e),n}function findAllWorkflows(e,t){let n=[],r=collectSdkBindings(e,`createWorkflow`);function walk(e,t=[]){if(!e||typeof e!=`object`)return;if(isSdkFunctionCall(e,r,`createWorkflow`)){let r=e.arguments,i=r[0];if(r.length>=1&&i?.type===`ObjectExpression`){let e=findProperty(o(i,`createWorkflow first argument missing`).properties,`name`);if(e&&isStringLiteral(e.value)){let r,i=!1;for(let e=t.length-1;e>=0;e--){let n=o(t[e],`parent at index ${e} missing`);if(n.type===`VariableDeclarator`){let e=n;if(e.id?.type===`Identifier`){r=e.id.name;break}}n.type===`ExportDefaultDeclaration`&&(i=!0)}n.push({name:e.value.value,exportName:r,isDefaultExport:i})}}}let i=[...t,e];for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e,i)):n&&typeof n==`object`&&walk(n,i)}}return walk(e),n}function createTsconfigLookupCache(){return{tsconfigCache:/* @__PURE__ */ new Map,contextCache:/* @__PURE__ */ new Map}}function createTsconfigPathsPlugin(e={}){let{tsconfigCache:t,contextCache:n}=e.cache??createTsconfigLookupCache();return{name:`tailor-tsconfig-paths`,resolveId:{order:`post`,async handler(r,i){if(!i||r.startsWith(`.`)||r.startsWith(`/`)||r.startsWith(`\0`))return null;let a=i.startsWith(`\0`)?e.virtualEntrySourceFile:i;if(!a)return null;let o=getResolutionContext(L.dirname(a),t,n,e.onTsconfigRead);if(!o)return null;let s=o.matcher(r);if(s.length===0||await this.resolve(r,i,{skipSelf:!0}))return null;for(let e of s){let t=await this.resolve(e,i,{skipSelf:!0});if(t)return t}return null}}}}function matchTsconfigPaths(e,t,n){return getResolutionContext(t,n.tsconfigCache,n.contextCache)?.matcher(e)??[]}function getResolutionContext(e,t,n,r){let i=n.get(e);if(i!==void 0)return reportTsconfigDependencies(t,r),i;let a=we(e,`tsconfig.json`,t);reportTsconfigDependencies(t,r);let o=a?.config.compilerOptions?.paths,s=o&&Object.keys(o).length>0?Ce(a):null,c=s?{matcher:s}:null;return n.set(e,c),c}function reportTsconfigDependencies(e,t){if(!t)return;let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set;for(let[t,i]of e){let e=dependencyPathFromCacheKey(t);e&&(t.startsWith(`statSync:`)&&isDirectoryStat(i)?n.add(e):r.add(e))}for(let e of r)n.has(e)||t(e)}function dependencyPathFromCacheKey(e){if(e.startsWith(`readFileSync:`)&&e.endsWith(`:utf8`))return e.slice(13,-5);for(let t of[`existsSync:`,`statSync:`])if(e.startsWith(t))return e.slice(t.length)}function isDirectoryStat(e){return typeof e==`object`&&!!e&&`isDirectory`in e&&typeof e.isDirectory==`function`&&e.isDirectory()}function normalizeFilePath(e){return L.resolve(e.replace(/[?#].*$/,``)).replace(/\.(ts|mts|cts|js|mjs|cjs)$/,``)}function createModuleBindings(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map;for(let e of findAllWorkflows(t,n)){let t={kind:`workflow`,name:e.name};e.exportName&&r.set(e.exportName,t),e.isDefaultExport&&i.set(`default`,t)}for(let e of findAllJobs(t,n))e.exportName&&r.set(e.exportName,{kind:`job`,name:e.name});for(let e of t.body){if(e.type===`ExportDefaultDeclaration`){let t=e.declaration;if(t?.type===`Identifier`){let e=r.get(t.name);e&&i.set(`default`,e)}continue}if(e.type!==`ExportNamedDeclaration`)continue;let t=e.declaration;if(t?.type===`VariableDeclaration`)for(let e of t.declarations){let t=e.id;if(t?.type!==`Identifier`)continue;let n=t.name,a=r.get(n);a&&i.set(n,a)}if(!e.source)for(let t of e.specifiers??[]){let e=getModuleExportName(t.local),n=getModuleExportName(t.exported);if(!e||!n)continue;let a=r.get(e);a&&i.set(n,a)}}return{sourceFile:e,localBindings:r,exports:i}}async function buildStartContext(e,t,n=process.cwd(),r=[],i=createTsconfigLookupCache()){let a=/* @__PURE__ */ new Map;if(!e)return{modules:a,authNamespace:t,tsconfigCache:i};for(let t of m(e,n))try{let e=await z.promises.readFile(t,`utf-8`),{program:n,errors:r}=H(t,e);if(r.length>0){N.warn(`Failed to parse workflow file ${t}: ${r.map(e=>e.message).join(`; `)}`,{mode:`stream`});continue}a.set(normalizeFilePath(t),createModuleBindings(t,n,e))}catch(e){let n=e instanceof Error?e.message:String(e);N.warn(`Failed to process workflow file ${t}: ${n}`,{mode:`stream`})}for(let{workflow:e,sourceFile:t}of r)a.get(normalizeFilePath(t))?.exports.set(`default`,{kind:`workflow`,name:e.name});return{modules:a,authNamespace:t,tsconfigCache:i}}function sortedTargets(e){return[...e].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.kind,t.name])}function serializeStartContext(e){if(!e)return``;let t=[...e.modules].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,sortedTargets(t.localBindings),sortedTargets(t.exports)]);return JSON.stringify(t)+(e.authNamespace??``)}const We=/\.start(?:\s|\/\*[\s\S]*?\*\/|\/\/[^\n]*\n)*\(/;function hasStartCall(e){return We.test(e)}const Ge=`__tailor_normalizeStartOptions`;function buildNormalizerHelperSource(e){return`const ${Ge} = (o) => { if (!o) return o; const { invoker, ...rest } = o; return typeof invoker === "string" ? { ...rest, authInvoker: { namespace: ${JSON.stringify(e)}, machineUserName: invoker } } : typeof invoker === "object" ? { ...rest, authInvoker: invoker } : o; };\n`}function collectBindingNames(e,t){if(e&&typeof e==`object`)switch(e.type){case`Identifier`:t.add(e.name);return;case`ObjectPattern`:for(let n of e.properties)collectBindingNames(n.type===`RestElement`?n.argument:n.value,t);return;case`ArrayPattern`:for(let n of e.elements)collectBindingNames(n,t);return;case`AssignmentPattern`:collectBindingNames(e.left,t);return;case`RestElement`:collectBindingNames(e.argument,t);return;case`TSParameterProperty`:collectBindingNames(e.parameter,t)}}function declarationNode(e){return e.type===`ExportNamedDeclaration`||e.type===`ExportDefaultDeclaration`?e.declaration:e}function collectBlockBindings(e,t){for(let n of e){let e=declarationNode(n);if(e){if(e.type===`VariableDeclaration`){if(e.kind===`var`)continue;for(let n of e.declarations)collectBindingNames(n.id,t)}else(e.type===`FunctionDeclaration`||e.type===`ClassDeclaration`)&&collectBindingNames(e.id,t)}}}function collectFunctionVarBindings(e,t){function walk(n){if(n&&typeof n==`object`&&(n===e||n.type!==`FunctionDeclaration`&&n.type!==`FunctionExpression`&&n.type!==`ArrowFunctionExpression`&&n.type!==`StaticBlock`)){if(n.type===`VariableDeclaration`&&n.kind===`var`)for(let e of n.declarations)collectBindingNames(e.id,t);for(let e of Object.keys(n)){if(e===`parent`)continue;let t=n[e];if(Array.isArray(t))for(let e of t)walk(e);else t&&typeof t==`object`&&walk(t)}}}walk(e)}function collectScopeBindings(e){let t=/* @__PURE__ */ new Set;if(e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`){collectBindingNames(e.id,t);for(let n of e.params)collectBindingNames(n,t);return collectFunctionVarBindings(e,t),t}if(e.type===`BlockStatement`)return collectBlockBindings(e.body,t),t;if(e.type===`CatchClause`)return collectBindingNames(e.param,t),t;if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`){let n=e.init??e.left;if(n?.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations)collectBindingNames(e.id,t);return t}}function addShadowedBindings(e,t,n){if(!t)return e;let r=[...t].filter(e=>n.has(e));return r.length===0?e:/* @__PURE__ */ new Set([...e,...r])}function walkBindingAware(e,t,n){function walk(e,r,i,a){if(!e||typeof e!=`object`||e.type===`ImportDeclaration`)return;let o=e.type===`Program`?r:addShadowedBindings(r,collectScopeBindings(e),t);n(e,o,i,a);for(let t of Object.keys(e)){if(t===`parent`)continue;let n=e[t];if(Array.isArray(n))for(let r of n)walk(r,o,e,t);else n&&typeof n==`object`&&walk(n,o,e,t)}}walk(e,/* @__PURE__ */ new Set)}function findModule(e,t){let n=normalizeFilePath(t);return e.modules.get(n)??e.modules.get(L.join(n,`index`))}function resolveImport(e,t,n,r){let i=L.dirname(t.replace(/[?#].*$/,``));if(n.startsWith(`.`))return findModule(e,L.resolve(i,n));for(let t of matchTsconfigPaths(n,i,r)){let n=findModule(e,t);if(n)return n}}function collectLocalTargets(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map,o=t.modules.get(normalizeFilePath(n));if(o)for(let[e,t]of o.localBindings)r.set(e,t);let s=t.tsconfigCache??createTsconfigLookupCache();for(let o of e.body){if(o.type!==`ImportDeclaration`||o.importKind===`type`)continue;let e=o.source.value;if(typeof e!=`string`)continue;let c=resolveImport(t,n,e,s);if(c)for(let t of o.specifiers){if(t.type===`ImportNamespaceSpecifier`){a.set(t.local.name,{importSource:e,module:c});continue}if(t.type===`ImportSpecifier`&&t.importKind===`type`)continue;let n=t.type===`ImportDefaultSpecifier`?`default`:getModuleExportName(t.imported);if(!n)continue;let o=c.exports.get(n);o?r.set(t.local.name,o):i.set(t.local.name,{importSource:e,importedName:n})}}return{targets:r,undetectableImports:i,namespaceImports:a}}function undetectableStartCallError(e,t,{importSource:n,importedName:r}){let i=r==="default"?`default export`:`export "${r}"`;return/* @__PURE__ */ Error(`${e}() in ${t} cannot be rewritten: "${n}" is a workflow file, but its ${i} is not a workflow or job the build can detect. The build rewrites .start() on the file's default-exported workflow (including one returned from a helper function) and on workflows and jobs created in that file with createWorkflow({ name: "..." }) or createWorkflowJob({ name: "...", body }) using a literal name; any other .start() would fail at runtime after deploy.`)}function assertNoUndetectableStartCalls(e,t,{undetectableImports:n,namespaceImports:r},i){walkBindingAware(e,/* @__PURE__ */ new Set([...n.keys(),...r.keys()]),(e,a)=>{let o=getNamespaceStartCallInfo(e,t);if(o&&!a.has(o.identifierName)){let e=r.get(o.identifierName);if(e&&!e.module.exports.has(o.memberName))throw undetectableStartCallError(o.calleeText,i,{importSource:e.importSource,importedName:o.memberName})}let s=getStartCallInfo(e,t);if(!s||a.has(s.identifierName))return;let c=n.get(s.identifierName);if(c)throw undetectableStartCallError(`${s.identifierName}.start`,i,c)})}function detectStartCallsWithTargets(e,t,{targets:n,namespaceImports:r}){let i=[];return walkBindingAware(e,/* @__PURE__ */ new Set([...n.keys(),...r.keys()]),(e,a)=>{let o=getNamespaceStartCallInfo(e,t);if(o&&!a.has(o.identifierName)){let e=r.get(o.identifierName)?.module.exports.get(o.memberName);if(e){let{memberName:t,calleeText:n,...r}=o;i.push({...r,kind:e.kind,targetName:e.name})}return}let s=getStartCallInfo(e,t);if(!s||a.has(s.identifierName))return;let c=n.get(s.identifierName);c&&i.push({...s,kind:c.kind,targetName:c.name})}),i}function detectResolvedStartCalls(e,t,n,r){return detectStartCallsWithTargets(e,t,collectLocalTargets(e,n,r))}function transformStartCalls(e,t,n){let{program:r}=H(`input.ts`,e),i=collectLocalTargets(r,t,n);assertNoUndetectableStartCalls(r,e,i,n);let{authNamespace:a}=t,o=detectStartCallsWithTargets(r,e,i),s=[],c=o.filter(e=>{let t=o.find(t=>t!==e&&t.callRange.start<=e.callRange.start&&e.callRange.end<=t.callRange.end);return!t||(s.push({call:e,parent:t}),!1)});for(let{call:e,parent:t}of s)N.warn(`Nested start call "${e.identifierName}.start(...)" inside "${t.identifierName}.start(...)" cannot be converted. Move it to a separate statement and pass the result instead.`);let l=[],u=!1;for(let e of c){let t;if(e.kind===`workflow`){let n=``;e.optionsText!==void 0&&(a?(n=`, ${Ge}(${e.optionsText})`,u=!0):n=`, ${e.optionsText}`),t=`tailor.workflow.startWorkflow(${JSON.stringify(e.targetName)}, ${e.argsText||`undefined`}${n})`}else{let n=e.optionsText===void 0?``:`, ${e.optionsText}`;t=`tailor.workflow.execJobFunction(${JSON.stringify(e.targetName)}, ${e.argsText||`undefined`}${n})`}l.push({start:e.callRange.start,end:e.callRange.end,text:t})}let d=applyReplacements(e,l);return u&&a?buildNormalizerHelperSource(a)+d:d}function createStartTransformPlugin(e){if(e&&e.modules.size!==0)return{name:`start-transform`,transform:{filter:{id:{include:[/\.(ts|mts|cts|js|mjs|cjs)$/]}},handler(t,n){return hasStartCall(t)?{code:transformStartCalls(t,e,n)}:null}}}}function createBundleLog(e={}){let t=/* @__PURE__ */ new Map;return{options:{logLevel:`warn`,onLog:(e,n)=>{n.code===`UNRESOLVED_IMPORT`&&t.set(JSON.stringify([n.exporter,n.id]),n)}},assertAllResolved(){if(t.size>0)throw unresolvedImportError([...t.values()],e.tsconfig)}}}function unresolvedImportError(e,t){let n=e.map(formatUnresolvedImport),r=n.length===1?`Could not resolve ${n[0]}.`:`Could not resolve ${n.length} imports.`,i=n.length===1?void 0:n.map(e=>`- ${e}`).join(`
66
+ `)},\n}`}const Ge={string:`string`,integer:`int`,float:`float`,boolean:`bool`,uuid:`uuid`,datetime:`datetime`,date:`date`,time:`time`,enum:`enum`,nested:`nested`};function generateSingleFieldCode(e){let t=e.type;if(!t)return null;let n=Ge[t]??t,r=e._metadata??e.metadata??{},i=[];r.required===!1&&i.push(`optional: true`);let a=i.length>0?`{ ${i.join(`, `)} }`:``;if(t===`enum`){let e=r.allowedValues,t=[];Array.isArray(e)&&(t=e.map(e=>e.value));let n=`db.enum(${JSON.stringify(t)}${a?`, ${a}`:``})`;return r.index&&(n+=`.index()`),r.unique&&(n+=`.unique()`),r.description&&(n+=`.description(${JSON.stringify(r.description)})`),n}let o=`db.${n}(${a})`;return r.index&&(o+=`.index()`),r.unique&&(o+=`.unique()`),r.description&&(o+=`.description(${JSON.stringify(r.description)})`),o}function sanitizePluginId(e){return e.replace(/^@/,``).replace(/\//g,`-`)}function toKebabCase(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_]+/g,`-`).toLowerCase()}function toCamelCase(e){let t=e.replace(/[-_\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``);return t.charAt(0).toLowerCase()+t.slice(1)}function createDepCollectorPlugin(){let e=/* @__PURE__ */ new Set,t={name:`cache-dep-collector`,load:{filter:{id:{include:[/\.[^/]+$/]}},handler(t){return!t.includes(`node_modules`)&&!t.endsWith(`.entry.js`)&&e.add(t),null}}};function getResult(){return Array.from(e).toSorted()}return{plugin:t,getResult}}function hashContent(e){return ye.createHash(`sha256`).update(e,`utf-8`).digest(`hex`)}function hashFile(e){let t=z.readFileSync(e);return ye.createHash(`sha256`).update(t).digest(`hex`)}function hashFiles(e){return hashContent(e.toSorted().map(e=>hashFileOrMissing(e)).join(``))}function hashFileOrMissing(e){try{return hashFile(e)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return`<missing>`;throw e}}function buildCacheKey(e,t,n){return n?`${e}:${n}:${t}`:`${e}:${t}`}function combineHash(e,t){return t?hashContent(e+t):e}function computeBundlerContextHash(e){let{sourceFile:t,extraContext:n,tsconfig:r,inlineSourcemap:i,inlineSourcemapDependencySources:a,inlineSourcemapProjectSources:o,bundleLogLevel:s,bundleTreeshake:c,prefix:l}=e,u=Object.entries(c??{}).filter(([,e])=>e!==void 0).toSorted(([e],[t])=>e.localeCompare(t));return hashContent((l??``)+L.resolve(t)+n+(r?hashFile(r):``)+String(i??!1)+dependencySourcesKey(a)+projectSourcesKey(o)+(s??``)+(u.length>0?JSON.stringify(u):``))}function dependencySourcesKey(e){return Array.isArray(e)?e.length===0?`false`:JSON.stringify([...new Set(e)].toSorted()):String(e??!1)}function projectSourcesKey(e){return!e?.include&&!e?.exclude?``:JSON.stringify([e.root??null,e.include??null,e.exclude??null])}async function withCache(e){let{cache:t,kind:n,namespace:r,name:i,sourceFile:a,contextHash:o,build:s}=e;if(!t)return await s([],()=>{});let c=t.tryRestore({kind:n,namespace:r,name:i,contextHash:o});if(c!==void 0)return N.debug(` ${j.dim(`cached`)}: ${i}`),c;let l=/* @__PURE__ */ new Set,{plugin:u,getResult:d}=createDepCollectorPlugin(),f=await s([u],e=>l.add(e));return t.save({kind:n,namespace:r,name:i,sourceFile:a,content:f.code,packageRuntimeGlobals:f.packageRuntimeGlobals,dependencyPaths:[...d(),...l],contextHash:o}),f}function createBundleCache(e){function tryRestore(t){let n=buildCacheKey(t.kind,t.name,t.namespace),r=e.getEntry(n);if(!r)return;let i;try{i=combineHash(hashFiles(r.dependencyPaths),t.contextHash)}catch{return}if(i!==r.inputHash)return;let a=e.restoreBundleContent(n),o=r.outputFiles.find(e=>e.outputPath===n);if(a!==void 0&&o&&hashContent(a)===o.contentHash)return{code:a,packageRuntimeGlobals:r.packageRuntimeGlobals??{}}}function save(t){let{kind:n,namespace:r,name:i,sourceFile:a,content:o,packageRuntimeGlobals:s,dependencyPaths:c,contextHash:l}=t,u=buildCacheKey(n,i,r),d=c.includes(a)?c:[a,...c],f;try{f=combineHash(hashFiles(d),l)}catch{return}let p=hashContent(o);e.storeBundleContent(u,o),e.setEntry(u,{kind:`bundle`,inputHash:f,dependencyPaths:d,outputFiles:[{outputPath:u,contentHash:p}],...s&&Object.keys(s).length>0?{packageRuntimeGlobals:s}:{},createdAt:(/* @__PURE__ */ new Date()).toISOString()})}return{tryRestore,save}}function collectBindingNames(e,t){if(e&&typeof e==`object`)switch(e.type){case`Identifier`:t.add(e.name);return;case`ObjectPattern`:for(let n of e.properties)collectBindingNames(n.type===`RestElement`?n.argument:n.value,t);return;case`ArrayPattern`:for(let n of e.elements)collectBindingNames(n,t);return;case`AssignmentPattern`:collectBindingNames(e.left,t);return;case`RestElement`:collectBindingNames(e.argument,t);return;case`TSParameterProperty`:collectBindingNames(e.parameter,t)}}function declarationNode(e){return e.type===`ExportNamedDeclaration`||e.type===`ExportDefaultDeclaration`?e.declaration:e}function collectBlockBindings(e,t){for(let n of e){let e=declarationNode(n);if(e){if(e.type===`VariableDeclaration`){if(e.kind===`var`)continue;for(let n of e.declarations)collectBindingNames(n.id,t)}else(e.type===`FunctionDeclaration`||e.type===`ClassDeclaration`||e.type===`TSEnumDeclaration`||e.type===`TSModuleDeclaration`||e.type===`TSImportEqualsDeclaration`)&&collectBindingNames(e.id,t)}}}function collectFunctionVarBindings(e,t){function walk(n){if(n&&typeof n==`object`&&(n===e||n.type!==`FunctionDeclaration`&&n.type!==`FunctionExpression`&&n.type!==`ArrowFunctionExpression`&&n.type!==`StaticBlock`)){if(n.type===`VariableDeclaration`&&n.kind===`var`)for(let e of n.declarations)collectBindingNames(e.id,t);for(let e of Object.keys(n)){if(e===`parent`)continue;let t=n[e];if(Array.isArray(t))for(let e of t)walk(e);else t&&typeof t==`object`&&walk(t)}}}walk(e)}function collectScopeBindings(e){let t=/* @__PURE__ */ new Set;if(e.type===`FunctionDeclaration`||e.type===`FunctionExpression`||e.type===`ArrowFunctionExpression`){collectBindingNames(e.id,t);for(let n of e.params)collectBindingNames(n,t);return collectFunctionVarBindings(e,t),t}if(e.type===`BlockStatement`)return collectBlockBindings(e.body,t),t;if(e.type===`StaticBlock`||e.type===`TSModuleBlock`)return collectBlockBindings(e.body,t),collectFunctionVarBindings(e,t),t;if(e.type===`SwitchStatement`){let n=e.cases;return collectBlockBindings(n.flatMap(e=>e.consequent),t),t}if(e.type===`ClassExpression`)return collectBindingNames(e.id,t),t;if(e.type===`CatchClause`)return collectBindingNames(e.param,t),t;if(e.type===`ForStatement`||e.type===`ForInStatement`||e.type===`ForOfStatement`){let n=e.init??e.left;if(n?.type===`VariableDeclaration`&&n.kind!==`var`)for(let e of n.declarations)collectBindingNames(e.id,t);return t}}function addShadowedBindings(e,t,n){if(!t)return e;let r=[...t].filter(e=>n.has(e));return r.length===0?e:/* @__PURE__ */ new Set([...e,...r])}function walkBindingAware(e,t,n){function walk(e,r,i,a){if(!e||typeof e!=`object`||e.type===`ImportDeclaration`)return;let o=e.type===`Program`?r:addShadowedBindings(r,collectScopeBindings(e),t);n(e,o,i,a);for(let t of Object.keys(e)){if(t===`parent`)continue;let n=e[t];if(Array.isArray(n))for(let r of n)walk(r,o,e,t);else n&&typeof n==`object`&&walk(n,o,e,t)}}walk(e,/* @__PURE__ */ new Set)}function getModuleExportName(e){if(!e||typeof e!=`object`)return;let t=e;return t.name?t.name:typeof t.value==`string`?t.value:void 0}function isTailorSdkSource(e){return/^@tailor-platform\/sdk(\/|$)/.test(e)}function getImportSource(e){if(!e)return null;if(e.type===`ImportExpression`){let t=e.source;if(t.type===`Literal`&&typeof t.value==`string`)return t.value}if(e.type===`CallExpression`){let t=e;if(t.callee.type===`Identifier`&&t.callee.name===`require`){let e=t.arguments[0];if(e&&`type`in e&&e.type===`Literal`&&`value`in e&&typeof e.value==`string`)return e.value}}return null}function argumentSourceText(e,t){if(e&&typeof e==`object`&&`start`in e&&`end`in e)return t.slice(e.start,e.end)}function getStartCallInfo(e,t){if(!e||typeof e!=`object`||e.type!==`CallExpression`)return null;let n=e,r=n.callee;if(r.type!==`MemberExpression`)return null;let i=r;return i.computed||i.property.name!==`start`||i.object.type!==`Identifier`?null:{identifierName:i.object.name,callRange:{start:n.start,end:n.end},argsText:argumentSourceText(n.arguments[0],t)??``,optionsText:argumentSourceText(n.arguments[1],t)}}function getNamespaceStartCallInfo(e,t){if(!e||typeof e!=`object`||e.type!==`CallExpression`)return null;let n=e,r=n.callee;if(r.type!==`MemberExpression`||r.computed||r.property.name!==`start`)return null;let i=r.object;if(i.type!==`MemberExpression`)return null;let a=i.object;if(a.type!==`Identifier`)return null;let o=i.property,s=i.computed?typeof o.value==`string`?o.value:void 0:o.name;return s===void 0?null:{identifierName:a.name,memberName:s,calleeText:t.slice(r.start,r.end),callRange:{start:n.start,end:n.end},argsText:argumentSourceText(n.arguments[0],t)??``,optionsText:argumentSourceText(n.arguments[1],t)}}function unwrapAwait(e){return e?.type===`AwaitExpression`?e.argument:e}function isStringLiteral(e){return e?.type===`Literal`&&typeof e.value==`string`}function isFunctionExpression(e){return e?.type===`ArrowFunctionExpression`||e?.type===`FunctionExpression`}function findProperty(e,t){for(let n of e)if(n.type===`Property`){let e=n;if((e.key.type===`Identifier`?e.key.name:e.key.type===`Literal`?e.key.value:null)===t)return{key:e.key,value:e.value,start:e.start,end:e.end}}return null}function applyReplacements(e,t){let n=t.toSorted((e,t)=>t.start-e.start);for(let e=0;e+1<n.length;e++){let t=o(n[e],`replacement missing at index ${e}`),r=o(n[e+1],`replacement missing at index ${e+1}`);if(r.end>t.start)throw Error(`applyReplacements: overlapping replacement ranges [${r.start}, ${r.end}) and [${t.start}, ${t.end})`)}let r=e;for(let e of n)r=r.slice(0,e.start)+e.text+r.slice(e.end);return r}function findStatementEnd(e,t){let n=t;for(;n<e.length&&(e[n]===`;`||e[n]===` `||e[n]===` `);)n++;return n<e.length&&e[n]===`
67
+ `&&n++,n}function collectSdkBindings(e,t){let n=/* @__PURE__ */ new Set;function walk(e){if(!e||typeof e!=`object`)return;let r=e.type;if(r===`ImportDeclaration`){let r=e,i=r.source.value;if(typeof i==`string`&&isTailorSdkSource(i)){for(let e of r.specifiers)if(e.type===`ImportSpecifier`){let r=e;(r.imported.type===`Identifier`?r.imported.name:r.imported.value)===t&&n.add(r.local.name)}else if(e.type===`ImportDefaultSpecifier`||e.type===`ImportNamespaceSpecifier`){let t=e;n.add(`__namespace__:${t.local.name}`)}}}if(r===`VariableDeclaration`){let r=e;for(let e of r.declarations){let r=getImportSource(unwrapAwait(e.init));if(r&&isTailorSdkSource(r)){let r=e.id;if(r.type===`Identifier`)n.add(`__namespace__:${r.name}`);else if(r.type===`ObjectPattern`){let e=r;for(let r of e.properties)if(r.type===`Property`){let e=r,i=e.key.type===`Identifier`?e.key.name:e.key.value;if(i===t){let t=e.value.type===`Identifier`?e.value.name:i;n.add(t)}}}}}}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}return walk(e),n}function isSdkFunctionCall(e,t,n){if(e.type!==`CallExpression`)return!1;let r=e.callee;if(r.type===`Identifier`){let e=r;return t.has(e.name)}if(r.type===`MemberExpression`){let e=r;if(!e.computed){let r=e.object,i=e.property;if(r.type===`Identifier`&&t.has(`__namespace__:${r.name}`)&&i.name===n)return!0}}return!1}function findAllJobs(e,t){let n=[],r=collectSdkBindings(e,`createWorkflowJob`);function walk(e,t=[]){if(!e||typeof e!=`object`)return;if(isSdkFunctionCall(e,r,`createWorkflowJob`)){let r=e.arguments,i=r[0];if(r.length>=1&&i?.type===`ObjectExpression`){let e=o(i,`createWorkflowJob first argument missing`),r=findProperty(e.properties,`name`),a=findProperty(e.properties,`body`);if(r&&isStringLiteral(r.value)&&a&&isFunctionExpression(a.value)){let e,i;for(let n=t.length-1;n>=0;n--){let r=o(t[n],`parent at index ${n} missing`);if(r.type===`VariableDeclarator`){let e=r;e.id?.type===`Identifier`&&(i=e.id.name)}(r.type===`ExportNamedDeclaration`||r.type===`VariableDeclaration`)&&(e={start:r.start,end:r.end})}n.push({name:r.value.value,exportName:i,nameRange:{start:r.start,end:r.end},bodyValueRange:{start:a.value.start,end:a.value.end},statementRange:e})}}}let i=[...t,e];for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e,i)):n&&typeof n==`object`&&walk(n,i)}}return walk(e),n}function findAllWorkflows(e,t){let n=[],r=collectSdkBindings(e,`createWorkflow`);function walk(e,t=[]){if(!e||typeof e!=`object`)return;if(isSdkFunctionCall(e,r,`createWorkflow`)){let r=e.arguments,i=r[0];if(r.length>=1&&i?.type===`ObjectExpression`){let e=findProperty(o(i,`createWorkflow first argument missing`).properties,`name`);if(e&&isStringLiteral(e.value)){let r,i=!1;for(let e=t.length-1;e>=0;e--){let n=o(t[e],`parent at index ${e} missing`);if(n.type===`VariableDeclarator`){let e=n;if(e.id?.type===`Identifier`){r=e.id.name;break}}n.type===`ExportDefaultDeclaration`&&(i=!0)}n.push({name:e.value.value,exportName:r,isDefaultExport:i})}}}let i=[...t,e];for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e,i)):n&&typeof n==`object`&&walk(n,i)}}return walk(e),n}function createTsconfigLookupCache(){return{tsconfigCache:/* @__PURE__ */ new Map,contextCache:/* @__PURE__ */ new Map}}function createTsconfigPathsPlugin(e={}){let{tsconfigCache:t,contextCache:n}=e.cache??createTsconfigLookupCache();return{name:`tailor-tsconfig-paths`,resolveId:{order:`post`,async handler(r,i){if(!i||r.startsWith(`.`)||r.startsWith(`/`)||r.startsWith(`\0`))return null;let a=i.startsWith(`\0`)?e.virtualEntrySourceFile:i;if(!a)return null;let o=getResolutionContext(L.dirname(a),t,n,e.onTsconfigRead);if(!o)return null;let s=o.matcher(r);if(s.length===0||await this.resolve(r,i,{skipSelf:!0}))return null;for(let e of s){let t=await this.resolve(e,i,{skipSelf:!0});if(t)return t}return null}}}}function matchTsconfigPaths(e,t,n){return getResolutionContext(t,n.tsconfigCache,n.contextCache)?.matcher(e)??[]}function getResolutionContext(e,t,n,r){let i=n.get(e);if(i!==void 0)return reportTsconfigDependencies(t,r),i;let a=Te(e,`tsconfig.json`,t);reportTsconfigDependencies(t,r);let o=a?.config.compilerOptions?.paths,s=o&&Object.keys(o).length>0?we(a):null,c=s?{matcher:s}:null;return n.set(e,c),c}function reportTsconfigDependencies(e,t){if(!t)return;let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set;for(let[t,i]of e){let e=dependencyPathFromCacheKey(t);e&&(t.startsWith(`statSync:`)&&isDirectoryStat(i)?n.add(e):r.add(e))}for(let e of r)n.has(e)||t(e)}function dependencyPathFromCacheKey(e){if(e.startsWith(`readFileSync:`)&&e.endsWith(`:utf8`))return e.slice(13,-5);for(let t of[`existsSync:`,`statSync:`])if(e.startsWith(t))return e.slice(t.length)}function isDirectoryStat(e){return typeof e==`object`&&!!e&&`isDirectory`in e&&typeof e.isDirectory==`function`&&e.isDirectory()}function normalizeFilePath(e){return L.resolve(e.replace(/[?#].*$/,``)).replace(/\.(ts|mts|cts|js|mjs|cjs)$/,``)}function createModuleBindings(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map;for(let e of findAllWorkflows(t,n)){let t={kind:`workflow`,name:e.name};e.exportName&&r.set(e.exportName,t),e.isDefaultExport&&i.set(`default`,t)}for(let e of findAllJobs(t,n))e.exportName&&r.set(e.exportName,{kind:`job`,name:e.name});for(let e of t.body){if(e.type===`ExportDefaultDeclaration`){let t=e.declaration;if(t?.type===`Identifier`){let e=r.get(t.name);e&&i.set(`default`,e)}continue}if(e.type!==`ExportNamedDeclaration`)continue;let t=e.declaration;if(t?.type===`VariableDeclaration`)for(let e of t.declarations){let t=e.id;if(t?.type!==`Identifier`)continue;let n=t.name,a=r.get(n);a&&i.set(n,a)}if(!e.source)for(let t of e.specifiers??[]){let e=getModuleExportName(t.local),n=getModuleExportName(t.exported);if(!e||!n)continue;let a=r.get(e);a&&i.set(n,a)}}return{sourceFile:e,localBindings:r,exports:i}}async function buildStartContext(e,t,n=process.cwd(),r=[],i=createTsconfigLookupCache()){let a=/* @__PURE__ */ new Map;if(!e)return{modules:a,authNamespace:t,tsconfigCache:i};for(let t of m(e,n))try{let e=await z.promises.readFile(t,`utf-8`),{program:n,errors:r}=H(t,e);if(r.length>0){N.warn(`Failed to parse workflow file ${t}: ${r.map(e=>e.message).join(`; `)}`,{mode:`stream`});continue}a.set(normalizeFilePath(t),createModuleBindings(t,n,e))}catch(e){let n=e instanceof Error?e.message:String(e);N.warn(`Failed to process workflow file ${t}: ${n}`,{mode:`stream`})}for(let{workflow:e,sourceFile:t}of r)a.get(normalizeFilePath(t))?.exports.set(`default`,{kind:`workflow`,name:e.name});return{modules:a,authNamespace:t,tsconfigCache:i}}function sortedTargets(e){return[...e].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.kind,t.name])}function serializeStartContext(e){if(!e)return``;let t=[...e.modules].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,sortedTargets(t.localBindings),sortedTargets(t.exports)]);return JSON.stringify(t)+(e.authNamespace??``)}const Ke=/\.start(?:\s|\/\*[\s\S]*?\*\/|\/\/[^\n]*\n)*\(/;function hasStartCall(e){return Ke.test(e)}const qe=`__tailor_normalizeStartOptions`;function buildNormalizerHelperSource(e){return`const ${qe} = (o) => { if (!o) return o; const { invoker, ...rest } = o; return typeof invoker === "string" ? { ...rest, authInvoker: { namespace: ${JSON.stringify(e)}, machineUserName: invoker } } : typeof invoker === "object" ? { ...rest, authInvoker: invoker } : o; };\n`}function findModule(e,t){let n=normalizeFilePath(t);return e.modules.get(n)??e.modules.get(L.join(n,`index`))}function resolveImport(e,t,n,r){let i=L.dirname(t.replace(/[?#].*$/,``));if(n.startsWith(`.`))return findModule(e,L.resolve(i,n));for(let t of matchTsconfigPaths(n,i,r)){let n=findModule(e,t);if(n)return n}}function collectLocalTargets(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map,o=t.modules.get(normalizeFilePath(n));if(o)for(let[e,t]of o.localBindings)r.set(e,t);let s=t.tsconfigCache??createTsconfigLookupCache();for(let o of e.body){if(o.type!==`ImportDeclaration`||o.importKind===`type`)continue;let e=o.source.value;if(typeof e!=`string`)continue;let c=resolveImport(t,n,e,s);if(c)for(let t of o.specifiers){if(t.type===`ImportNamespaceSpecifier`){a.set(t.local.name,{importSource:e,module:c});continue}if(t.type===`ImportSpecifier`&&t.importKind===`type`)continue;let n=t.type===`ImportDefaultSpecifier`?`default`:getModuleExportName(t.imported);if(!n)continue;let o=c.exports.get(n);o?r.set(t.local.name,o):i.set(t.local.name,{importSource:e,importedName:n})}}return{targets:r,undetectableImports:i,namespaceImports:a}}function undetectableStartCallError(e,t,{importSource:n,importedName:r}){let i=r==="default"?`default export`:`export "${r}"`;return/* @__PURE__ */ Error(`${e}() in ${t} cannot be rewritten: "${n}" is a workflow file, but its ${i} is not a workflow or job the build can detect. The build rewrites .start() on the file's default-exported workflow (including one returned from a helper function) and on workflows and jobs created in that file with createWorkflow({ name: "..." }) or createWorkflowJob({ name: "...", body }) using a literal name; any other .start() would fail at runtime after deploy.`)}function assertNoUndetectableStartCalls(e,t,{undetectableImports:n,namespaceImports:r},i){walkBindingAware(e,/* @__PURE__ */ new Set([...n.keys(),...r.keys()]),(e,a)=>{let o=getNamespaceStartCallInfo(e,t);if(o&&!a.has(o.identifierName)){let e=r.get(o.identifierName);if(e&&!e.module.exports.has(o.memberName))throw undetectableStartCallError(o.calleeText,i,{importSource:e.importSource,importedName:o.memberName})}let s=getStartCallInfo(e,t);if(!s||a.has(s.identifierName))return;let c=n.get(s.identifierName);if(c)throw undetectableStartCallError(`${s.identifierName}.start`,i,c)})}function detectStartCallsWithTargets(e,t,{targets:n,namespaceImports:r}){let i=[];return walkBindingAware(e,/* @__PURE__ */ new Set([...n.keys(),...r.keys()]),(e,a)=>{let o=getNamespaceStartCallInfo(e,t);if(o&&!a.has(o.identifierName)){let e=r.get(o.identifierName)?.module.exports.get(o.memberName);if(e){let{memberName:t,calleeText:n,...r}=o;i.push({...r,kind:e.kind,targetName:e.name})}return}let s=getStartCallInfo(e,t);if(!s||a.has(s.identifierName))return;let c=n.get(s.identifierName);c&&i.push({...s,kind:c.kind,targetName:c.name})}),i}function detectResolvedStartCalls(e,t,n,r){return detectStartCallsWithTargets(e,t,collectLocalTargets(e,n,r))}function transformStartCalls(e,t,n){let{program:r}=H(`input.ts`,e),i=collectLocalTargets(r,t,n);assertNoUndetectableStartCalls(r,e,i,n);let{authNamespace:a}=t,o=detectStartCallsWithTargets(r,e,i),s=[],c=o.filter(e=>{let t=o.find(t=>t!==e&&t.callRange.start<=e.callRange.start&&e.callRange.end<=t.callRange.end);return!t||(s.push({call:e,parent:t}),!1)});for(let{call:e,parent:t}of s)N.warn(`Nested start call "${e.identifierName}.start(...)" inside "${t.identifierName}.start(...)" cannot be converted. Move it to a separate statement and pass the result instead.`);let l=[],u=!1;for(let e of c){let t;if(e.kind===`workflow`){let n=``;e.optionsText!==void 0&&(a?(n=`, ${qe}(${e.optionsText})`,u=!0):n=`, ${e.optionsText}`),t=`tailor.workflow.startWorkflow(${JSON.stringify(e.targetName)}, ${e.argsText||`undefined`}${n})`}else{let n=e.optionsText===void 0?``:`, ${e.optionsText}`;t=`tailor.workflow.execJobFunction(${JSON.stringify(e.targetName)}, ${e.argsText||`undefined`}${n})`}l.push({start:e.callRange.start,end:e.callRange.end,text:t})}let d=applyReplacements(e,l);return u&&a?buildNormalizerHelperSource(a)+d:d}function createStartTransformPlugin(e){if(e&&e.modules.size!==0)return{name:`start-transform`,transform:{filter:{id:{include:[/\.(ts|mts|cts|js|mjs|cjs)$/]}},handler(t,n){return hasStartCall(t)?{code:transformStartCalls(t,e,n)}:null}}}}function createBundleLog(e={}){let t=/* @__PURE__ */ new Map;return{options:{logLevel:`warn`,onLog:(e,n)=>{n.code===`UNRESOLVED_IMPORT`&&t.set(JSON.stringify([n.exporter,n.id]),n)}},assertAllResolved(){if(t.size>0)throw unresolvedImportError([...t.values()],e.tsconfig)}}}function unresolvedImportError(e,t){let n=e.map(formatUnresolvedImport),r=n.length===1?`Could not resolve ${n[0]}.`:`Could not resolve ${n.length} imports.`,i=n.length===1?void 0:n.map(e=>`- ${e}`).join(`
68
68
  `),a=unresolvedImportSuggestion(e,t);return F({code:`UNRESOLVED_IMPORT`,message:r,details:i,suggestion:a})}function unresolvedImportSuggestion(e,t){let n=e.map(e=>e.exporter).filter(e=>e!==void 0).filter(ie).map(re),r=e.some(e=>e.exporter===void 0||!ie(e.exporter)),i=t?`Check that each import path is correct, and that a \`compilerOptions.paths\` entry covering it is declared in the importing file's own tsconfig.json or an ancestor. The build used "${t}".`:"No tsconfig.json was found, so `compilerOptions.paths` aliases were not applied. Add a tsconfig.json declaring the aliases these files import.";return[.../* @__PURE__ */ new Set([...n,...r?[i]:[]])].join(`
69
- `)}function formatUnresolvedImport(e){let t=e.exporter??`an imported module`,n=e.id?.startsWith(`\0`)?`a generated entry (${e.id.slice(1)})`:e.id&&`"${e.id}"`;return`"${t}"${n?` imported from ${n}`:``}`}const Ke=[`console.info`,`console.table`,`console.dir`,`console.dirxml`,`console.count`,`console.countReset`,`console.time`,`console.timeLog`,`console.timeEnd`,`console.group`,`console.groupCollapsed`,`console.groupEnd`,`console.clear`],K=[`console.debug`,`console.log`,`console.trace`],qe=[`console.warn`],Je=[`console.error`],q=[`globalThis.tailor.logger.debug`],Ye=[`globalThis.tailor.logger.info`],Xe=[`globalThis.tailor.logger.warn`],Ze=[`globalThis.tailor.logger.error`],Qe={DEBUG:[],INFO:[...K,...q],WARN:[...K,...Ke,...q,...Ye],ERROR:[...K,...Ke,...qe,...q,...Ye,...Xe],SILENT:[...K,...Ke,...qe,...Je,...q,...Ye,...Xe,...Ze]};function normalizeBundleLogLevel(e){let t=e.trim().toUpperCase();return isLogLevel(t)?t:void 0}function resolveBundleLogLevel(e){if(e===void 0)return`DEBUG`;let t=normalizeBundleLogLevel(e);if(t)return t;throw Error(`Invalid logLevel "${e}". Expected one of: ${Ee.join(`, `)}`)}function manualPureFunctionsForLogLevel(e){return Qe[e]}function createLogLevelTreeshakeOptions(e){let t=manualPureFunctionsForLogLevel(e);return t.length>0?{manualPureFunctions:t}:{}}const $e=/* @__PURE__ */ new Set([`typeAnnotation`,`typeParameters`,`returnType`,`superTypeArguments`,`typeArguments`]);function collectBindingsFromPattern(e,t){switch(e.type){case`Identifier`:t.add(e.name);break;case`ObjectPattern`:for(let n of e.properties)n.type===`RestElement`?collectBindingsFromPattern(n.argument,t):collectBindingsFromPattern(n.value,t);break;case`ArrayPattern`:for(let n of e.elements)n&&(n.type===`RestElement`?collectBindingsFromPattern(n.argument,t):collectBindingsFromPattern(n,t));break;case`AssignmentPattern`:collectBindingsFromPattern(e.left,t)}}function isBindingPattern(e){return e.type!==`TSParameterProperty`}function isBoundInScope(e,t){for(let n=e;n;n=n.parent)if(n.bindings.has(t))return!0;return!1}function staticStringValue(e){if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0&&e.quasis.length===1)return e.quasis[0]?.value.cooked??void 0}function compareStrings(e,t,n){switch(e){case`===`:case`==`:return t===n;case`!==`:case`!=`:return t!==n;case`<`:return t<n;case`>`:return t>n;default:return}}function typeofComparison(e){if(e.type!==`BinaryExpression`)return;let{left:t,right:n,operator:r}=e,[i,a]=t.type===`UnaryExpression`&&t.operator===`typeof`&&t.argument.type===`Identifier`?[t,n]:n.type===`UnaryExpression`&&n.operator===`typeof`&&n.argument.type===`Identifier`?[n,t]:[void 0,void 0];if(!i)return;let o=staticStringValue(a);if(o===void 0)return;let s=i===t?compareStrings(r,`undefined`,o):compareStrings(r,o,`undefined`);if(s!==void 0)return{name:i.argument.name,isTrueWhenUndeclared:s}}const et={falseWhenUndeclared:[],trueWhenUndeclared:[]},J=/* @__PURE__ */ new Set;function typeofGuards(e){if(e.type===`ParenthesizedExpression`)return typeofGuards(e.expression);if(e.type===`LogicalExpression`){let t=typeofGuards(e.left),n=typeofGuards(e.right);switch(e.operator){case`&&`:return{falseWhenUndeclared:[...t.falseWhenUndeclared,...n.falseWhenUndeclared],trueWhenUndeclared:[]};case`||`:return{falseWhenUndeclared:[],trueWhenUndeclared:[...t.trueWhenUndeclared,...n.trueWhenUndeclared]};default:return et}}let t=typeofComparison(e);return t?t.isTrueWhenUndeclared?{falseWhenUndeclared:[],trueWhenUndeclared:[t.name]}:{falseWhenUndeclared:[t.name],trueWhenUndeclared:[]}:et}function alwaysExits(e){switch(e.type){case`ReturnStatement`:case`ThrowStatement`:case`BreakStatement`:case`ContinueStatement`:return!0;case`BlockStatement`:{let t=e.body.at(-1);return t!==void 0&&alwaysExits(t)}default:return!1}}function findUndefinedReferences(e,t){let{program:n,errors:r}=H(`_.js`,e);if(r.length>0){let e=r.map(e=>` - ${e.message}`).join(`
70
- `);throw Error(`Failed to parse code for free-variable analysis.\nParse errors:\n${e}`)}let i=[],a={bindings:/* @__PURE__ */ new Set,parent:null},o=J,guardsOf=e=>t?.includeGuardedReferences?et:typeofGuards(e),walkWithGuardedNames=(e,t)=>{let n=o;o=t,walk(e),o=n},guardedNamesWith=e=>e.length>0?/* @__PURE__ */ new Set([...o,...e]):o,walkGuarded=(e,t)=>walkWithGuardedNames(e,guardedNamesWith(t)),walkStatements=e=>{let t=o;for(let t of e)walk(t),t.type===`IfStatement`&&alwaysExits(t.consequent)&&(o=guardedNamesWith(guardsOf(t.test).trueWhenUndeclared));o=t},walk=e=>{if(!e)return;switch(e.type){case`VariableDeclarator`:collectBindingsFromPattern(e.id,a.bindings),walk(e.init);return;case`ImportDeclaration`:for(let t of e.specifiers)a.bindings.add(t.local.name);return;case`FunctionDeclaration`:case`FunctionExpression`:{e.type===`FunctionDeclaration`&&e.id&&a.bindings.add(e.id.name);let t={bindings:/* @__PURE__ */ new Set,parent:a};e.type===`FunctionExpression`&&e.id&&t.bindings.add(e.id.name);for(let n of e.params)isBindingPattern(n)&&collectBindingsFromPattern(n,t.bindings);let n=a;a=t;for(let t of e.params)isBindingPattern(t)&&walkWithGuardedNames(t,J);walkWithGuardedNames(e.body,J),a=n;return}case`ArrowFunctionExpression`:{let t={bindings:/* @__PURE__ */ new Set,parent:a};for(let n of e.params)isBindingPattern(n)&&collectBindingsFromPattern(n,t.bindings);let n=a;a=t;for(let t of e.params)isBindingPattern(t)&&walkWithGuardedNames(t,J);walkWithGuardedNames(e.body,J),a=n;return}case`ClassDeclaration`:case`ClassExpression`:e.id&&a.bindings.add(e.id.name),walk(e.superClass),walkWithGuardedNames(e.body,J);return;case`CatchClause`:e.param&&collectBindingsFromPattern(e.param,a.bindings),walk(e.body);return;case`MemberExpression`:walk(e.object),e.computed&&walk(e.property);return;case`UnaryExpression`:if(!t?.includeGuardedReferences&&e.operator===`typeof`&&e.argument.type===`Identifier`)return;walk(e.argument);return;case`LogicalExpression`:{let t=guardsOf(e.left);walk(e.left),walkGuarded(e.right,e.operator===`&&`?t.falseWhenUndeclared:e.operator===`||`?t.trueWhenUndeclared:[]);return}case`ConditionalExpression`:case`IfStatement`:{let t=guardsOf(e.test);walk(e.test),walkGuarded(e.consequent,t.falseWhenUndeclared),walkGuarded(e.alternate,t.trueWhenUndeclared);return}case`Program`:case`BlockStatement`:case`StaticBlock`:walkStatements(e.body);return;case`SwitchCase`:walk(e.test),walkStatements(e.consequent);return;case`Property`:e.computed&&walk(e.key),walk(e.value);return;case`MethodDefinition`:case`TSAbstractMethodDefinition`:case`PropertyDefinition`:case`TSAbstractPropertyDefinition`:case`AccessorProperty`:case`TSAbstractAccessorProperty`:for(let t of e.decorators)walk(t.expression);e.computed&&walk(e.key),walk(e.value);return;case`LabeledStatement`:walk(e.body);return;case`Identifier`:if(o.has(e.name))return;i.push({name:e.name,scope:a});return}let n=e;for(let[e,t]of Object.entries(n))if(!(e===`type`||$e.has(e))){if(Array.isArray(t))for(let e of t)walk(e);else t&&typeof t==`object`&&`type`in t&&walk(t)}};walk(n);let s=/* @__PURE__ */ new Set;for(let{name:e,scope:t}of i)!isBoundInScope(t,e)&&!ne.has(e)&&s.add(e);return s}function packageNameOf(e){let t=L.normalize(e),n=t.lastIndexOf(`/node_modules/`);if(n===-1)return;let[r,i]=t.slice(n+14).split(`/`);return r?.startsWith(`@`)?`${r}/${i}`:r}function addTo(e,t,n){let r=e.get(t)??/* @__PURE__ */ new Set;r.add(n),e.set(t,r)}const describeGlobals=e=>`${e.length===1?`a global`:`globals`} unavailable in the Tailor Platform runtime: ${e.join(`, `)}`;function checkForbiddenRuntimeGlobals(e,t){let n=new Set([...findUndefinedReferences(e.code)].filter(isForbiddenGlobal));if(n.size===0)return{};let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;for(let[t,{code:o}]of Object.entries(e.modules)){if(!o)continue;let e=packageNameOf(t);for(let s of findUndefinedReferences(o))n.has(s)&&(a.add(s),e?addTo(i,e,s):addTo(r,s,L.relative(process.cwd(),t)))}for(let e of n)a.has(e)||r.set(e,/* @__PURE__ */ new Set);if(r.size>0){let e=[...r.keys()].toSorted();throw F({code:`FORBIDDEN_RUNTIME_GLOBAL`,message:`${t} references ${describeGlobals(e)}.`,details:e.map(e=>{let t=[...r.get(e)??[]].toSorted(),n=ae(e);return t.length>0?`${n}\nReferenced from: ${t.join(`, `)}`:n}).join(`
69
+ `)}function formatUnresolvedImport(e){let t=e.exporter??`an imported module`,n=e.id?.startsWith(`\0`)?`a generated entry (${e.id.slice(1)})`:e.id&&`"${e.id}"`;return`"${t}"${n?` imported from ${n}`:``}`}const Je=[`console.info`,`console.table`,`console.dir`,`console.dirxml`,`console.count`,`console.countReset`,`console.time`,`console.timeLog`,`console.timeEnd`,`console.group`,`console.groupCollapsed`,`console.groupEnd`,`console.clear`],G=[`console.debug`,`console.log`,`console.trace`],Ye=[`console.warn`],Xe=[`console.error`],K=[`globalThis.tailor.logger.debug`],Ze=[`globalThis.tailor.logger.info`],Qe=[`globalThis.tailor.logger.warn`],$e=[`globalThis.tailor.logger.error`],et={DEBUG:[],INFO:[...G,...K],WARN:[...G,...Je,...K,...Ze],ERROR:[...G,...Je,...Ye,...K,...Ze,...Qe],SILENT:[...G,...Je,...Ye,...Xe,...K,...Ze,...Qe,...$e]};function normalizeBundleLogLevel(e){let t=e.trim().toUpperCase();return isLogLevel(t)?t:void 0}function resolveBundleLogLevel(e){if(e===void 0)return`DEBUG`;let t=normalizeBundleLogLevel(e);if(t)return t;throw Error(`Invalid logLevel "${e}". Expected one of: ${De.join(`, `)}`)}function manualPureFunctionsForLogLevel(e){return et[e]}function createLogLevelTreeshakeOptions(e){let t=manualPureFunctionsForLogLevel(e);return t.length>0?{manualPureFunctions:t}:{}}const tt=/* @__PURE__ */ new Set([`typeAnnotation`,`typeParameters`,`returnType`,`superTypeArguments`,`typeArguments`]);function collectBindingsFromPattern(e,t){switch(e.type){case`Identifier`:t.add(e.name);break;case`ObjectPattern`:for(let n of e.properties)n.type===`RestElement`?collectBindingsFromPattern(n.argument,t):collectBindingsFromPattern(n.value,t);break;case`ArrayPattern`:for(let n of e.elements)n&&(n.type===`RestElement`?collectBindingsFromPattern(n.argument,t):collectBindingsFromPattern(n,t));break;case`AssignmentPattern`:collectBindingsFromPattern(e.left,t)}}function isBindingPattern(e){return e.type!==`TSParameterProperty`}function isBoundInScope(e,t){for(let n=e;n;n=n.parent)if(n.bindings.has(t))return!0;return!1}function staticStringValue(e){if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0&&e.quasis.length===1)return e.quasis[0]?.value.cooked??void 0}function compareStrings(e,t,n){switch(e){case`===`:case`==`:return t===n;case`!==`:case`!=`:return t!==n;case`<`:return t<n;case`>`:return t>n;default:return}}function typeofComparison(e){if(e.type!==`BinaryExpression`)return;let{left:t,right:n,operator:r}=e,[i,a]=t.type===`UnaryExpression`&&t.operator===`typeof`&&t.argument.type===`Identifier`?[t,n]:n.type===`UnaryExpression`&&n.operator===`typeof`&&n.argument.type===`Identifier`?[n,t]:[void 0,void 0];if(!i)return;let o=staticStringValue(a);if(o===void 0)return;let s=i===t?compareStrings(r,`undefined`,o):compareStrings(r,o,`undefined`);if(s!==void 0)return{name:i.argument.name,isTrueWhenUndeclared:s}}const nt={falseWhenUndeclared:[],trueWhenUndeclared:[]},q=/* @__PURE__ */ new Set;function typeofGuards(e){if(e.type===`ParenthesizedExpression`)return typeofGuards(e.expression);if(e.type===`LogicalExpression`){let t=typeofGuards(e.left),n=typeofGuards(e.right);switch(e.operator){case`&&`:return{falseWhenUndeclared:[...t.falseWhenUndeclared,...n.falseWhenUndeclared],trueWhenUndeclared:[]};case`||`:return{falseWhenUndeclared:[],trueWhenUndeclared:[...t.trueWhenUndeclared,...n.trueWhenUndeclared]};default:return nt}}let t=typeofComparison(e);return t?t.isTrueWhenUndeclared?{falseWhenUndeclared:[],trueWhenUndeclared:[t.name]}:{falseWhenUndeclared:[t.name],trueWhenUndeclared:[]}:nt}function alwaysExits(e){switch(e.type){case`ReturnStatement`:case`ThrowStatement`:case`BreakStatement`:case`ContinueStatement`:return!0;case`BlockStatement`:{let t=e.body.at(-1);return t!==void 0&&alwaysExits(t)}default:return!1}}function findUndefinedReferences(e,t){let{program:n,errors:r}=H(`_.js`,e);if(r.length>0){let e=r.map(e=>` - ${e.message}`).join(`
70
+ `);throw Error(`Failed to parse code for free-variable analysis.\nParse errors:\n${e}`)}let i=[],a={bindings:/* @__PURE__ */ new Set,parent:null},o=q,guardsOf=e=>t?.includeGuardedReferences?nt:typeofGuards(e),walkWithGuardedNames=(e,t)=>{let n=o;o=t,walk(e),o=n},guardedNamesWith=e=>e.length>0?/* @__PURE__ */ new Set([...o,...e]):o,walkGuarded=(e,t)=>walkWithGuardedNames(e,guardedNamesWith(t)),walkStatements=e=>{let t=o;for(let t of e)walk(t),t.type===`IfStatement`&&alwaysExits(t.consequent)&&(o=guardedNamesWith(guardsOf(t.test).trueWhenUndeclared));o=t},walk=e=>{if(!e)return;switch(e.type){case`VariableDeclarator`:collectBindingsFromPattern(e.id,a.bindings),walk(e.init);return;case`ImportDeclaration`:for(let t of e.specifiers)a.bindings.add(t.local.name);return;case`FunctionDeclaration`:case`FunctionExpression`:{e.type===`FunctionDeclaration`&&e.id&&a.bindings.add(e.id.name);let t={bindings:/* @__PURE__ */ new Set,parent:a};e.type===`FunctionExpression`&&e.id&&t.bindings.add(e.id.name);for(let n of e.params)isBindingPattern(n)&&collectBindingsFromPattern(n,t.bindings);let n=a;a=t;for(let t of e.params)isBindingPattern(t)&&walkWithGuardedNames(t,q);walkWithGuardedNames(e.body,q),a=n;return}case`ArrowFunctionExpression`:{let t={bindings:/* @__PURE__ */ new Set,parent:a};for(let n of e.params)isBindingPattern(n)&&collectBindingsFromPattern(n,t.bindings);let n=a;a=t;for(let t of e.params)isBindingPattern(t)&&walkWithGuardedNames(t,q);walkWithGuardedNames(e.body,q),a=n;return}case`ClassDeclaration`:case`ClassExpression`:e.id&&a.bindings.add(e.id.name),walk(e.superClass),walkWithGuardedNames(e.body,q);return;case`CatchClause`:e.param&&collectBindingsFromPattern(e.param,a.bindings),walk(e.body);return;case`MemberExpression`:walk(e.object),e.computed&&walk(e.property);return;case`UnaryExpression`:if(!t?.includeGuardedReferences&&e.operator===`typeof`&&e.argument.type===`Identifier`)return;walk(e.argument);return;case`LogicalExpression`:{let t=guardsOf(e.left);walk(e.left),walkGuarded(e.right,e.operator===`&&`?t.falseWhenUndeclared:e.operator===`||`?t.trueWhenUndeclared:[]);return}case`ConditionalExpression`:case`IfStatement`:{let t=guardsOf(e.test);walk(e.test),walkGuarded(e.consequent,t.falseWhenUndeclared),walkGuarded(e.alternate,t.trueWhenUndeclared);return}case`Program`:case`BlockStatement`:case`StaticBlock`:walkStatements(e.body);return;case`SwitchCase`:walk(e.test),walkStatements(e.consequent);return;case`Property`:e.computed&&walk(e.key),walk(e.value);return;case`MethodDefinition`:case`TSAbstractMethodDefinition`:case`PropertyDefinition`:case`TSAbstractPropertyDefinition`:case`AccessorProperty`:case`TSAbstractAccessorProperty`:for(let t of e.decorators)walk(t.expression);e.computed&&walk(e.key),walk(e.value);return;case`LabeledStatement`:walk(e.body);return;case`Identifier`:if(o.has(e.name))return;i.push({name:e.name,scope:a});return}let n=e;for(let[e,t]of Object.entries(n))if(!(e===`type`||tt.has(e))){if(Array.isArray(t))for(let e of t)walk(e);else t&&typeof t==`object`&&`type`in t&&walk(t)}};walk(n);let s=/* @__PURE__ */ new Set;for(let{name:e,scope:t}of i)!isBoundInScope(t,e)&&!ne.has(e)&&s.add(e);return s}function packageNameOf(e){let t=L.normalize(e),n=t.lastIndexOf(`/node_modules/`);if(n===-1)return;let[r,i]=t.slice(n+14).split(`/`);return r?.startsWith(`@`)?`${r}/${i}`:r}function addTo(e,t,n){let r=e.get(t)??/* @__PURE__ */ new Set;r.add(n),e.set(t,r)}const describeGlobals=e=>`${e.length===1?`a global`:`globals`} unavailable in the Tailor Platform runtime: ${e.join(`, `)}`;function checkForbiddenRuntimeGlobals(e,t){let n=new Set([...findUndefinedReferences(e.code)].filter(isForbiddenGlobal));if(n.size===0)return{};let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;for(let[t,{code:o}]of Object.entries(e.modules)){if(!o)continue;let e=packageNameOf(t);for(let s of findUndefinedReferences(o))n.has(s)&&(a.add(s),e?addTo(i,e,s):addTo(r,s,L.relative(process.cwd(),t)))}for(let e of n)a.has(e)||r.set(e,/* @__PURE__ */ new Set);if(r.size>0){let e=[...r.keys()].toSorted();throw F({code:`FORBIDDEN_RUNTIME_GLOBAL`,message:`${t} references ${describeGlobals(e)}.`,details:e.map(e=>{let t=[...r.get(e)??[]].toSorted(),n=ae(e);return t.length>0?`${n}\nReferenced from: ${t.join(`, `)}`:n}).join(`
71
71
  `)})}return Object.fromEntries([...i].map(([e,t])=>[e,[...t].toSorted()]))}function assertPackageRuntimeGlobalsAllowed(e,t,n={}){let r={};for(let[t,i]of Object.entries(e)){let e=Object.hasOwn(n,t)?n[t]:void 0;if(e===!0)continue;let a=i.filter(t=>!e?.includes(t));a.length>0&&(r[t]=a)}let i=Object.entries(r);if(i.length===0)return;let a=[...new Set(i.flatMap(([,e])=>e))].toSorted();throw F({code:`FORBIDDEN_RUNTIME_GLOBAL`,message:`${t} references ${describeGlobals(a)}.`,details:i.map(([e,t])=>`Referenced from the installed package ${e}: ${t.join(`, `)}. Code in ${e} that reaches ${t.length===1?`it`:`them`} throws a ReferenceError at runtime.`).join(`
72
- `),suggestion:`If that code never runs for your use of the package, allow it in defineConfig(): buildOptions: { allowedRuntimeGlobals: { ${i.map(([e,t])=>`${JSON.stringify(e)}: ${JSON.stringify(t)}`).join(`, `)} } }`,context:{packages:r}})}const tt={moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1};function mergeFunctionTreeshakeOptions(e){let t={},n=/* @__PURE__ */ new Set;for(let r of e){Object.assign(t,r);for(let e of r.manualPureFunctions??[])n.add(e)}return n.size>0?t.manualPureFunctions=[...n]:delete t.manualPureFunctions,t}function composeFunctionTreeshakeOptions(e=[]){return mergeFunctionTreeshakeOptions([tt,...e])}function createUserTreeshakeOptions(e={}){let{moduleSideEffects:t,annotations:n,unknownGlobalSideEffects:r,propertyReadSideEffects:i}=e;return{...t!==void 0&&{moduleSideEffects:t},...n!==void 0&&{annotations:n},...r!==void 0&&{unknownGlobalSideEffects:r},...i!==void 0&&{propertyReadSideEffects:i?`always`:!1}}}const nt=/(?<![\w$.])process\.env\.__TAILOR_PLATFORM_BUNDLE\b/g,rt=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_WITHOUT_DATE\b/g,it=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_WITHOUT_TEMPORAL\b/g,at=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_DATE_DEFAULT\b/g;function createPlatformBundleDefinePlugin(e={date:!0,temporal:!0},t=`legacy`){let n=t===`legacy`?`undefined`:JSON.stringify(t);return{name:`tailor-platform-bundle-define`,transform(t){return t.includes(`__TAILOR_PLATFORM_BUNDLE`)?{code:t.replace(nt,`true`).replace(rt,String(!e.date)).replace(it,String(!e.temporal)).replace(at,n)}:null},resolveId(e){return e===`node:async_hooks`?{id:e,external:!0}:null}}}const ot=createPlatformBundleDefinePlugin(),st=/\n*\/\/[#@]\s*sourceMappingURL=[^\n]*\s*$/;function pathSegments(e){return e.replaceAll(`\\`,`/`).split(`/`)}function isDependencySource(e){return pathSegments(e).includes(`node_modules`)}function sourcePackageName(e){let t=pathSegments(e),n=t.lastIndexOf(`node_modules`);if(n===-1)return;let r=t[n+1];if(!r||r.startsWith(`.`))return;if(!r.startsWith(`@`))return r;let i=t[n+2];return i?`${r}/${i}`:void 0}function isOmittedSource(e,t){if(!isDependencySource(e))return!1;let n=sourcePackageName(e);return n===void 0||!t.includes(n)}function omitSourcesContent(e){let{map:t,keep:n}=e;if(!t.sourcesContent)return t;let r=t.sourcesContent.map((e,r)=>{let i=t.sources[r];return i!==void 0&&isOmittedSource(i,n)?null:e});return{...t,sourcesContent:r}}function realpathOrSelf(e){try{return z.realpathSync(e)}catch{return e}}function keepsProjectSource(e,t){let matches=t=>t.some(t=>Te(e,t.replace(/^\.\//,``)));return t.include&&!matches(t.include)?!1:!(t.exclude&&matches(t.exclude))}function omitProjectSourcesContent(e){let{map:t,projectSources:n,sourcesDir:r}=e;if(!n.include&&!n.exclude||!t.sourcesContent)return t;let i=realpathOrSelf(n.root??process.cwd()),a=t.sourcesContent.map((e,a)=>{let o=t.sources[a];return o===void 0||isDependencySource(o)||keepsProjectSource(L.relative(i,L.resolve(r,o)),n)?e:null});return{...t,sourcesContent:a}}function toInlineSourcemapCode(e){let{code:t,map:n}=e,r=Buffer.from(JSON.stringify(n)).toString(`base64`);return`${t.replace(st,``)}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${r}`}function chunkCodeWithSourcemap(e){let{chunk:t,inlineSourcemap:n,dependencySources:r,projectSources:i={},sourcesDir:a=L.join(process.cwd(),`dist`)}=e;if(!n||!t.map)return t.code;let o=omitProjectSourcesContent({map:t.map,projectSources:i,sourcesDir:a});if(r===!0)return toInlineSourcemapCode({code:t.code,map:o});let s=omitSourcesContent({map:o,keep:r||[]});return toInlineSourcemapCode({code:t.code,map:s})}function createVirtualEntry(e,t,n=`js`,r){let i=`tailor-entry:${e}.${n}`,a=`\0${i}`;return{input:i,plugin:{name:`tailor-virtual-entry`,async resolveId(e,t){return e===i&&t===void 0?a:t!==a||!r||e.startsWith(`.`)||L.isAbsolute(e)||e.startsWith(`\0`)?null:this.resolve(e,r,{skipSelf:!0})},load(e){return e===a?t:null}}}}function createGeneratedEntryResolverPlugin(e,t){let n=L.resolve(e),r=L.join(L.resolve(t),`__tailor_sdk_generated_entry__.js`);return{name:`tailor-generated-entry-resolver`,async resolveId(e,t){return t===void 0||L.resolve(t)!==n||e.startsWith(`.`)||L.isAbsolute(e)||e.startsWith(`\0`)?null:this.resolve(e,r,{skipSelf:!0})}}}async function buildFunctionBundle(e){let{kind:t,namespace:n,name:r,sourceFile:i,tsconfig:a,entry:o,createTransformPlugin:s,dateRepresentations:c,define:l,runtimeGlobals:u,startContext:d,cache:f,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g=`DEBUG`,bundleTreeshake:_,tsconfigCache:v,dateDefault:y=`legacy`}=e,b=L.resolve(i),x=o(b),{code:S,packageRuntimeGlobals:C}=await withCache({cache:f,kind:t,namespace:n,name:r,sourceFile:i,contextHash:computeBundlerContextHash({sourceFile:i,extraContext:JSON.stringify([serializeStartContext(d),x,y]),tsconfig:a,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g,bundleTreeshake:_}),async build(e,n){let i=createVirtualEntry(`${t}:${r}`,x,`js`,b),o=(s??(()=>createStartTransformPlugin(d)))(),f=[i.plugin];o&&f.push(o),f.push(createTsconfigPathsPlugin({onTsconfigRead:n,cache:v}),createPlatformBundleDefinePlugin(c,y),...e);let S=createBundleLog({tsconfig:a}),C=await Se.build({input:i.input,write:!1,output:{format:`esm`,sourcemap:!0,minify:!p||{mangle:{keepNames:!0}},codeSplitting:!1},tsconfig:a,plugins:f,...l&&{transform:{define:l}},treeshake:composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(g),createUserTreeshakeOptions(_)]),...S.options});S.assertAllResolved();let[w]=C.output;return{code:chunkCodeWithSourcemap({chunk:w,inlineSourcemap:p??!1,dependencySources:m??!1,projectSources:h}),packageRuntimeGlobals:u?checkForbiddenRuntimeGlobals(w,u.label):{}}}});return u&&assertPackageRuntimeGlobalsAllowed(C,u.label,u.allowed),S}const ct=/* @__PURE__ */ new Set;async function resolveTSConfigWithFallback(e){let t=await tryResolve(e);if(t||e===process.cwd())return t;let n=await tryResolve(process.cwd());return n&&!ct.has(e)&&(ct.add(e),N.warn(`No tsconfig found from "${e}"; falling back to the tsconfig resolved from process.cwd(). Move (or extend) a tsconfig into this directory before v2, when this fallback will be removed.`)),n}async function tryResolve(e){try{return await fe(e)}catch{return}}async function bundleAuthHooks(e){let{configPath:t,authName:n,handlerAccessPath:r,env:i={},bundleLogLevel:a=`DEBUG`,baseDir:o}=e;N.newline(),N.log(`Bundling auth hook for ${j.info(`"${n}"`)}`);let s=await resolveTSConfigWithFallback(o),c=`auth-hook--${n}--before-login`,l=await buildFunctionBundle({...e,kind:`auth-hook`,name:c,sourceFile:L.resolve(t),tsconfig:s,bundleLogLevel:a,define:{"process.env.TAILOR_APP_LOG_LEVEL":JSON.stringify(a)},runtimeGlobals:!1,entry:e=>I`
72
+ `),suggestion:`If that code never runs for your use of the package, allow it in defineConfig(): buildOptions: { allowedRuntimeGlobals: { ${i.map(([e,t])=>`${JSON.stringify(e)}: ${JSON.stringify(t)}`).join(`, `)} } }`,context:{packages:r}})}const rt={moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},it={annotation:!1};function mergeFunctionTreeshakeOptions(e){let t={},n=/* @__PURE__ */ new Set;for(let r of e){Object.assign(t,r);for(let e of r.manualPureFunctions??[])n.add(e)}return n.size>0?t.manualPureFunctions=[...n]:delete t.manualPureFunctions,t}function composeFunctionTreeshakeOptions(e=[]){return mergeFunctionTreeshakeOptions([rt,...e])}function createUserTreeshakeOptions(e={}){let{moduleSideEffects:t,annotations:n,unknownGlobalSideEffects:r,propertyReadSideEffects:i}=e;return{...t!==void 0&&{moduleSideEffects:t},...n!==void 0&&{annotations:n},...r!==void 0&&{unknownGlobalSideEffects:r},...i!==void 0&&{propertyReadSideEffects:i?`always`:!1}}}const at=/(?<![\w$.])process\.env\.__TAILOR_PLATFORM_BUNDLE\b/g,ot=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_WITHOUT_DATE\b/g,st=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_WITHOUT_TEMPORAL\b/g,ct=/(?<![\w$.])globalThis\.process\?\.env\.__TAILOR_PLATFORM_BUNDLE_DATE_DEFAULT\b/g;function createPlatformBundleDefinePlugin(e={date:!0,temporal:!0},t=`legacy`){let n=t===`legacy`?`undefined`:JSON.stringify(t);return{name:`tailor-platform-bundle-define`,transform(t){return t.includes(`__TAILOR_PLATFORM_BUNDLE`)?{code:t.replace(at,`true`).replace(ot,String(!e.date)).replace(st,String(!e.temporal)).replace(ct,n)}:null},resolveId(e){return e===`node:async_hooks`?{id:e,external:!0}:null}}}const lt=createPlatformBundleDefinePlugin(),ut=`@tailor-platform/sdk`,dt=[`uuid`,`string`,`bool`,`int`,`float`,`decimal`,`date`,`datetime`,`time`,`enum`,`object`],ft={db:/* @__PURE__ */ new Set([...dt,`table`,`fields.timestamps`]),t:new Set(dt)},pt=/* @__PURE__ */ new Set([`clone`,`default`,`description`,`hooks`,`index`,`relation`,`serial`,`typeName`,`unique`,`validate`,`vector`,`features`,`files`,`gqlPermission`,`indexes`,`omitFields`,`permission`,`pickFields`,`plugin`]);function collectBuilderBindings(e){let t=/* @__PURE__ */ new Map;for(let n of e.body)if(n.type===`ImportDeclaration`&&n.importKind!==`type`&&n.source.value===ut)for(let e of n.specifiers){if(e.type!==`ImportSpecifier`||e.importKind===`type`)continue;let n=getModuleExportName(e.imported);n&&Object.hasOwn(ft,n)&&t.set(e.local.name,n)}return t}function chainSegments(e){let t=[],n=e;for(;;)if(n.type===`CallExpression`&&!n.optional)t.push({kind:`call`,node:n}),n=n.callee;else if(n.type===`MemberExpression`&&!n.computed&&!n.optional)t.push({kind:`member`,name:n.property.name}),n=n.object;else if(n.type===`Identifier`)return{root:n.name,segments:t.toReversed()};else return null}function builderChainCalls(e,t){let n=chainSegments(e),r=n&&t.get(n.root);if(!n||!r)return null;let{segments:i}=n,a=0,o=[];for(let e=i[a];e?.kind===`member`;e=i[++a])o.push(e.name);let s=i[a++];if(!ft[r]?.has(o.join(`.`))||s?.kind!==`call`)return null;let c=[s.node];for(;a<i.length;){let e=i[a++],t=i[a++];if(e?.kind!==`member`||!pt.has(e.name)||t?.kind!==`call`)return null;c.push(t.node)}return c}function isSideEffectFree(e,t){let check=e=>isSideEffectFree(e,t);if(!e)return!0;switch(e.type){case`Literal`:case`Identifier`:case`PrivateIdentifier`:case`ArrowFunctionExpression`:case`FunctionExpression`:return!0;case`TemplateLiteral`:return e.expressions.every(check);case`ParenthesizedExpression`:case`TSAsExpression`:case`TSSatisfiesExpression`:case`TSNonNullExpression`:case`TSTypeAssertion`:return check(e.expression);case`SpreadElement`:return check(e.argument);case`UnaryExpression`:return e.operator!==`delete`&&check(e.argument);case`BinaryExpression`:case`LogicalExpression`:return check(e.left)&&check(e.right);case`ConditionalExpression`:return check(e.test)&&check(e.consequent)&&check(e.alternate);case`MemberExpression`:return check(e.object)&&(!e.computed||check(e.property));case`ArrayExpression`:return e.elements.every(check);case`ObjectExpression`:return e.properties.every(e=>e.type===`SpreadElement`?check(e):(!e.computed||check(e.key))&&check(e.value));case`CallExpression`:{let n=builderChainCalls(e,t);return n!==null&&n.every(e=>e.arguments.every(check))}default:return!1}}function isChainLink(e,t){return e?.type===`MemberExpression`&&t===`object`||e?.type===`CallExpression`&&t===`callee`}function annotateSdkBuilderCalls(e,t){let{program:n,errors:r}=H(t,e);if(r.length>0)return null;let i=collectBuilderBindings(n);if(i.size===0)return null;let a=[];if(walkBindingAware(n,new Set(i.keys()),(e,t,n,r)=>{if(e.type!==`CallExpression`||isChainLink(n,r))return;let o=t.size===0?i:new Map([...i].filter(([e])=>!t.has(e))),s=builderChainCalls(e,o),c=s?.slice(0,-1)??[];s&&c.every(e=>e.arguments.every(e=>isSideEffectFree(e,o)))&&a.push(e.start)}),a.length===0)return null;let o=new Ce(e);for(let e of a)o.appendLeft(e,`/* @__PURE__ */ `);return{code:o.toString(),map:o.generateMap({hires:`boundary`}).toString()}}function createSdkBuilderPurePlugin(e=/* @__PURE__ */ new Map){return{name:`tailor-sdk-builder-pure`,transform:{filter:{id:{include:[/\.[cm]?[jt]sx?$/],exclude:[/[\\/]node_modules[\\/]/]},code:{include:[ut]}},handler(t,n){let r=e.get(n);if(r?.code===t)return r.result;let i=annotateSdkBuilderCalls(t,n);return e.set(n,{code:t,result:i}),i}}}}const mt=/\n*\/\/[#@]\s*sourceMappingURL=[^\n]*\s*$/;function pathSegments(e){return e.replaceAll(`\\`,`/`).split(`/`)}function isDependencySource(e){return pathSegments(e).includes(`node_modules`)}function sourcePackageName(e){let t=pathSegments(e),n=t.lastIndexOf(`node_modules`);if(n===-1)return;let r=t[n+1];if(!r||r.startsWith(`.`))return;if(!r.startsWith(`@`))return r;let i=t[n+2];return i?`${r}/${i}`:void 0}function isOmittedSource(e,t){if(!isDependencySource(e))return!1;let n=sourcePackageName(e);return n===void 0||!t.includes(n)}function omitSourcesContent(e){let{map:t,keep:n}=e;if(!t.sourcesContent)return t;let r=t.sourcesContent.map((e,r)=>{let i=t.sources[r];return i!==void 0&&isOmittedSource(i,n)?null:e});return{...t,sourcesContent:r}}function realpathOrSelf(e){try{return z.realpathSync(e)}catch{return e}}function keepsProjectSource(e,t){let matches=t=>t.some(t=>Ee(e,t.replace(/^\.\//,``)));return t.include&&!matches(t.include)?!1:!(t.exclude&&matches(t.exclude))}function omitProjectSourcesContent(e){let{map:t,projectSources:n,sourcesDir:r}=e;if(!n.include&&!n.exclude||!t.sourcesContent)return t;let i=realpathOrSelf(n.root??process.cwd()),a=t.sourcesContent.map((e,a)=>{let o=t.sources[a];return o===void 0||isDependencySource(o)||keepsProjectSource(L.relative(i,L.resolve(r,o)),n)?e:null});return{...t,sourcesContent:a}}function toInlineSourcemapCode(e){let{code:t,map:n}=e,r=Buffer.from(JSON.stringify(n)).toString(`base64`);return`${t.replace(mt,``)}\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,${r}`}function chunkCodeWithSourcemap(e){let{chunk:t,inlineSourcemap:n,dependencySources:r,projectSources:i={},sourcesDir:a=L.join(process.cwd(),`dist`)}=e;if(!n||!t.map)return t.code;let o=omitProjectSourcesContent({map:t.map,projectSources:i,sourcesDir:a});if(r===!0)return toInlineSourcemapCode({code:t.code,map:o});let s=omitSourcesContent({map:o,keep:r||[]});return toInlineSourcemapCode({code:t.code,map:s})}function createVirtualEntry(e,t,n=`js`,r){let i=`tailor-entry:${e}.${n}`,a=`\0${i}`;return{input:i,plugin:{name:`tailor-virtual-entry`,async resolveId(e,t){return e===i&&t===void 0?a:t!==a||!r||e.startsWith(`.`)||L.isAbsolute(e)||e.startsWith(`\0`)?null:this.resolve(e,r,{skipSelf:!0})},load(e){return e===a?t:null}}}}function createGeneratedEntryResolverPlugin(e,t){let n=L.resolve(e),r=L.join(L.resolve(t),`__tailor_sdk_generated_entry__.js`);return{name:`tailor-generated-entry-resolver`,async resolveId(e,t){return t===void 0||L.resolve(t)!==n||e.startsWith(`.`)||L.isAbsolute(e)||e.startsWith(`\0`)?null:this.resolve(e,r,{skipSelf:!0})}}}async function buildFunctionBundle(e){let{kind:t,namespace:n,name:r,sourceFile:i,tsconfig:a,entry:o,createTransformPlugin:s,dateRepresentations:c,define:l,runtimeGlobals:u,startContext:d,cache:f,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g=`DEBUG`,bundleTreeshake:_,tsconfigCache:v,sdkBuilderAnnotationCache:y,dateDefault:b=`legacy`}=e,x=L.resolve(i),S=o(x),{code:C,packageRuntimeGlobals:w}=await withCache({cache:f,kind:t,namespace:n,name:r,sourceFile:i,contextHash:computeBundlerContextHash({sourceFile:i,extraContext:JSON.stringify([serializeStartContext(d),S,b]),tsconfig:a,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g,bundleTreeshake:_}),async build(e,n){let i=createVirtualEntry(`${t}:${r}`,S,`js`,x),o=(s??(()=>createStartTransformPlugin(d)))(),f=[i.plugin];o&&f.push(o),f.push(createTsconfigPathsPlugin({onTsconfigRead:n,cache:v}),createPlatformBundleDefinePlugin(c,b),createSdkBuilderPurePlugin(y),...e);let C=createBundleLog({tsconfig:a}),w=await Se.build({input:i.input,write:!1,output:{format:`esm`,sourcemap:!0,minify:!p||{mangle:{keepNames:!0}},comments:it,codeSplitting:!1},tsconfig:a,plugins:f,...l&&{transform:{define:l}},treeshake:composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(g),createUserTreeshakeOptions(_)]),...C.options});C.assertAllResolved();let[T]=w.output;return{code:chunkCodeWithSourcemap({chunk:T,inlineSourcemap:p??!1,dependencySources:m??!1,projectSources:h}),packageRuntimeGlobals:u?checkForbiddenRuntimeGlobals(T,u.label):{}}}});return u&&assertPackageRuntimeGlobalsAllowed(w,u.label,u.allowed),C}const ht=/* @__PURE__ */ new Set;async function resolveTSConfigWithFallback(e){let t=await tryResolve(e);if(t||e===process.cwd())return t;let n=await tryResolve(process.cwd());return n&&!ht.has(e)&&(ht.add(e),N.warn(`No tsconfig found from "${e}"; falling back to the tsconfig resolved from process.cwd(). Move (or extend) a tsconfig into this directory before v2, when this fallback will be removed.`)),n}async function tryResolve(e){try{return await fe(e)}catch{return}}async function bundleAuthHooks(e){let{configPath:t,authName:n,handlerAccessPath:r,env:i={},bundleLogLevel:a=`DEBUG`,baseDir:o}=e;N.newline(),N.log(`Bundling auth hook for ${j.info(`"${n}"`)}`);let s=await resolveTSConfigWithFallback(o),c=`auth-hook--${n}--before-login`,l=await buildFunctionBundle({...e,kind:`auth-hook`,name:c,sourceFile:L.resolve(t),tsconfig:s,bundleLogLevel:a,define:{"process.env.TAILOR_APP_LOG_LEVEL":JSON.stringify(a)},runtimeGlobals:!1,entry:e=>I`
73
73
  import _config from "${e}";
74
74
  const __auth_hook_function = _config.${r};
75
75
  export async function main(args) {
76
76
  const env = ${JSON.stringify(i)};
77
77
  return await __auth_hook_function({ ...args, env });
78
78
  }
79
- `});N.log(`${j.success(`Bundled`)} auth hook for ${j.info(`"${n}"`)}`);let u=/* @__PURE__ */ new Map;return u.set(c,l),u}const lt=2e3;function formatGeneratedCode(e){return e.length<=lt?`Generated code:\n${e}`:`Generated code (truncated to ${lt} of ${e.length} characters):\n${e.slice(0,lt)}\n...`}function assertParsableExpression(e,t){let{errors:n}=H(`generated-expr.js`,`(${e}\n);`);if(n.length===0)return e;let r=n.map(e=>` - ${e.message}`).join(`
80
- `);throw Error(`Generated ${t} script is not valid JavaScript.\nParse errors:\n${r}\n`+formatGeneratedCode(e))}const Y=`_principal`;function buildHookCallArgs(e){switch(e){case`validate`:return`{ value: _value }`;case`hooks.create`:return`{ input: _value, invoker: ${Y}, now: _now }`;case`hooks.update`:return`{ input: _value, oldValue: _oldValue, invoker: ${Y}, now: _now }`;case`typeHook.create`:case`typeHook.update`:return`{ input: _input, oldRecord: _oldRecord, invoker: ${Y}, now: _now }`;case`typeValidate`:return`{ newRecord: _newRecord, oldRecord: _oldRecord, invoker: ${Y} }, __issues`;default:throw Error(`Unknown script expr kind: ${e}`)}}const ut=Symbol.for(`tailor-platform/sdk:precompiled-script-expr`),dt=/* @__PURE__ */ new WeakMap;function setPrecompiledScriptExpr(e,t,n,r=`legacy`){let i=dt.get(e)??{},a=i[r]??{};a[t]=n,i[r]=a,dt.set(e,i)}function getPrecompiledScriptExpr(e,t,n=`legacy`){let r=Object.hasOwn(e,ut)?e[ut]:void 0;if(typeof r==`object`&&r&&Object.hasOwn(r,t)){let e=r[t];if(typeof e==`string`)return e}return dt.get(e)?.[n]?.[t]}function makePrincipalExpr(e){let{source:t,fields:n,normalize:r,requireId:i=!1}=e,a=`{
79
+ `});N.log(`${j.success(`Bundled`)} auth hook for ${j.info(`"${n}"`)}`);let u=/* @__PURE__ */ new Map;return u.set(c,l),u}const gt=2e3;function formatGeneratedCode(e){return e.length<=gt?`Generated code:\n${e}`:`Generated code (truncated to ${gt} of ${e.length} characters):\n${e.slice(0,gt)}\n...`}function assertParsableExpression(e,t){let{errors:n}=H(`generated-expr.js`,`(${e}\n);`);if(n.length===0)return e;let r=n.map(e=>` - ${e.message}`).join(`
80
+ `);throw Error(`Generated ${t} script is not valid JavaScript.\nParse errors:\n${r}\n`+formatGeneratedCode(e))}const J=`_principal`;function buildHookCallArgs(e){switch(e){case`validate`:return`{ value: _value }`;case`hooks.create`:return`{ input: _value, invoker: ${J}, now: _now }`;case`hooks.update`:return`{ input: _value, oldValue: _oldValue, invoker: ${J}, now: _now }`;case`typeHook.create`:case`typeHook.update`:return`{ input: _input, oldRecord: _oldRecord, invoker: ${J}, now: _now }`;case`typeValidate`:return`{ newRecord: _newRecord, oldRecord: _oldRecord, invoker: ${J} }, __issues`;default:throw Error(`Unknown script expr kind: ${e}`)}}const _t=Symbol.for(`tailor-platform/sdk:precompiled-script-expr`),vt=/* @__PURE__ */ new WeakMap;function setPrecompiledScriptExpr(e,t,n,r=`legacy`){let i=vt.get(e)??{},a=i[r]??{};a[t]=n,i[r]=a,vt.set(e,i)}function getPrecompiledScriptExpr(e,t,n=`legacy`){let r=Object.hasOwn(e,_t)?e[_t]:void 0;if(typeof r==`object`&&r&&Object.hasOwn(r,t)){let e=r[t];if(typeof e==`string`)return e}return vt.get(e)?.[n]?.[t]}function makePrincipalExpr(e){let{source:t,fields:n,normalize:r,requireId:i=!1}=e,a=`{
81
81
  id,
82
82
  type,
83
83
  workspaceId: ${n.workspaceId},
@@ -104,9 +104,9 @@ import{r as e}from"./date-CgP7gMG_.mjs";import{n as t}from"./brand-C8nMKhJC.mjs"
104
104
  return null;
105
105
  }
106
106
  return ${a};
107
- })(${t})`}const ft=makePrincipalExpr({source:`user`,normalize:!0,fields:{type:{raw:`$raw?.type`},id:`$raw.id`,workspaceId:`$raw.workspace_id ?? $raw.workspaceId`,attributes:`$raw.attribute_map ?? $raw.attributeMap ?? {}`,attributeList:`$raw.attributes ?? []`}}),firstObjectProperty=e=>{let t=H(`stringify-function.ts`,e,{sourceType:`module`});if(t.errors.length>0)return;let n=t.program.body[0],r=n?.type===`ExpressionStatement`&&n.expression.type===`ParenthesizedExpression`?n.expression.expression:void 0;return r?.type===`ObjectExpression`?r.properties[0]:void 0},stringifyFunction=e=>{let t=e.toString().trim();if(firstObjectProperty(`({m: ${t}})`))return t;let n=`({${t}})`,r=firstObjectProperty(n);if(r?.type===`Property`&&r.method&&r.computed)throw Error(`Computed-key method shorthand cannot be converted to a TailorDB script expression. Use an arrow function or function expression instead.`);if(r?.type===`Property`&&r.method&&r.value.type===`FunctionExpression`){let{async:e,generator:t}=r.value,i=n.slice(r.value.start,r.value.end);return`${e?`async `:``}function${t?`*`:``} ${i}`}return t};function formatScriptContext(e,t){return t?`${e} for ${t.tableName}.${t.fieldPath.join(`.`)}`:e===`validate`?e:`hooks`}const convertToScriptExpr=(e,t,n)=>getPrecompiledScriptExpr(e,t,n?.dateDefault)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(t)})`,formatScriptContext(t,n)),convertTypeHookToExpr=(e,t,n)=>{let r=`typeHook.${t}`;return getPrecompiledScriptExpr(e,r,n)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(r)})`,`type-hook`)},convertTypeValidateToExpr=(e,t)=>getPrecompiledScriptExpr(e,`typeValidate`,t)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(`typeValidate`)})`,`type-validate`);function formatFieldLocation(e){return e?`Field "${e.fieldPath.join(`.`)}" on table "${e.tableName}": `:``}function parseFieldConfig(e,t){let n=e.metadata,r=e.type,i=e.rawRelation;if(t&&t.fieldPath.length>1&&n.default!==void 0)throw Error(`${formatFieldLocation(t)}.default() cannot be used on nested inner fields`);if(t&&t.fieldPath.length>1&&n.hooks)throw Error(`${formatFieldLocation(t)}.hooks() cannot be used on nested inner fields`);if(t&&t.fieldPath.length>1&&n.serial)throw Error(`${formatFieldLocation(t)}.serial() cannot be used on nested inner fields`);if(r===`enum`&&(n.allowedValues??[]).length===0)throw Error(`${formatFieldLocation(t)}enum fields must define at least one allowed value`);let a=e.fields;return{type:r,...n,rawRelation:i,...r===`nested`&&a&&Object.keys(a).length>0?{fields:Object.entries(a).reduce((e,[n,r])=>(e[n]=parseFieldConfig(r,t&&{...t,fieldPath:[...t.fieldPath,n]}),e),{})}:{},validate:n.validate?.map(e=>({script:{expr:convertToScriptExpr(e,`validate`,t)},errorMessage:``})),hooks:n.hooks?{create:n.hooks.create?{expr:convertToScriptExpr(n.hooks.create,`hooks.create`,t)}:void 0,update:n.hooks.update?{expr:convertToScriptExpr(n.hooks.update,`hooks.update`,t)}:void 0}:void 0,serial:n.serial?{start:n.serial.start,maxValue:n.serial.maxValue,format:`format`in n.serial?n.serial.format:void 0,gapless:n.serial.gapless}:void 0}}function isObjectPermissionFormat(e){return typeof e==`object`&&!!e&&`conditions`in e}function isSingleConditionFormat(e){return e.length>=2&&typeof e[1]==`string`}function normalizeOperand(e){if(e===null)throw Error(`Invalid permission operand: null`);if(typeof e==`object`&&!Array.isArray(e)&&`user`in e){let t=e.user;return{user:t===`id`?`_id`:t}}return e}function createPermissionNormalizer(e){function normalizeConditions(t){return t.map(t=>{let[n,r,i]=t;return[normalizeOperand(n),e[r],normalizeOperand(i)]})}function normalizeActionPermission(e){if(isObjectPermissionFormat(e)){let t=e.conditions;return{conditions:normalizeConditions(isSingleConditionFormat(t)?[t]:t),permit:e.permit?`allow`:`deny`,description:e.description}}if(!Array.isArray(e))throw Error(`Invalid permission format`);if(isSingleConditionFormat(e)){let[t,n,r,i]=[...e,!0];return{conditions:normalizeConditions([[t,n,r]]),permit:i?`allow`:`deny`}}let t=[],n=!0;for(let r of e)typeof r==`boolean`?n=r:t.push(r);return{conditions:normalizeConditions(t),permit:n?`allow`:`deny`}}return{normalizeConditions,normalizeActionPermission}}function hasOmittedPermit(e){return isObjectPermissionFormat(e)&&e.permit===void 0}const{normalizeConditions:pt,normalizeActionPermission:mt}=createPermissionNormalizer({"=":`eq`,"!=":`ne`,in:`in`,"not in":`nin`,hasAny:`hasAny`,"not hasAny":`nhasAny`});function normalizePermission(e){return Object.keys(e).reduce((t,n)=>(t[n]=e[n].map(e=>normalizeActionPermission(e)),t),{})}function normalizeGqlPermission(e){return e.map(e=>normalizeGqlPolicy(e))}function normalizeGqlPolicy(e){return{conditions:pt(e.conditions),actions:e.actions===`all`?[`all`]:e.actions,permit:e.permit?`allow`:`deny`,description:e.description}}function parsePermissions(e){return{...e.record&&{record:normalizePermission(e.record)},...e.gql&&{gql:normalizeGqlPermission(e.gql)}}}function normalizeActionPermission(e){return mt(e)}function findOmittedPermitRules(e){let t=[],n=e.record;if(n)for(let e of Object.keys(n))n[e].forEach((n,r)=>{hasOmittedPermit(n)&&t.push(`record.${String(e)}[${r}]`)});let r=e.gql;return r&&r.forEach((e,n)=>{e.permit===void 0&&t.push(`gql[${n}]`)}),t}function isGqlOperationsFullyDisabled(e){return e?e.create===!1&&e.update===!1&&e.delete===!1&&e.read===!1:!1}function findMissingPermissionConfig(e,t){return{missingPermission:!e.record,missingGqlPermission:!e.gql&&!isGqlOperationsFullyDisabled(t)}}function parseTypes(e,t,n,r=`legacy`){let i=createRecord(),a=new Set(Object.keys(e));for(let[t,o]of Object.entries(e))i[t]=parseTailorDBType(o,a,e,n,r);return buildBackwardRelationships(i,t,n),validatePluralFormUniqueness(i,t,n),i}function parseTailorDBType(e,t,n,r,i){let a=e.metadata,o=a.settings?.pluralForm||U.pluralize(e.name),s=formatTypeSourceLocation(getTypeSourceInfo(r,e.name)),c=createRecord(),l=createRecord();for(let[r,o]of Object.entries(e.fields)){let u={tableName:e.name,fieldName:r,allTableNames:t},d=parseFieldConfig(o,{tableName:e.name,fieldPath:[r],dateDefault:i}),f=d.rawRelation;if(f){if(y(f,u),[`n-1`,`manyToOne`,`N-1`].includes(f.type)&&d.unique)throw Error(`Field "${r}" on table "${e.name}": cannot set unique on n-1 (manyToOne) relation. Use 1-1 (oneToOne) relation instead, or remove the unique constraint.`);let t=b(f,u,d.array);d=T(d,t)}if(d=v(d,u),d.array&&d.index)throw Error(`Field "${r}" on table "${e.name}": index cannot be set on array fields`);if(d.array&&d.unique)throw Error(`Field "${r}" on table "${e.name}": unique cannot be set on array fields`);let p={name:r,config:d},m=f?S(f,u):void 0;if(m){p.relation={...m};let t=m.forwardName;if(t.length===0)throw Error(`Forward relation name for field "${r}" on table "${e.name}"${s} cannot be empty. Use the "as" option in .relation({ toward: { as: ... } }) to specify a non-empty name.`);let i=l[t];if(i)throw Error(`Forward relation name "${t}" on table "${e.name}"${s} is duplicated between fields "${i.targetField}" and "${r}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a unique name.`);if(Object.hasOwn(e.fields,t)){let n=t===r?`Forward relation name "${t}" on table "${e.name}"${s} is the same as its own relation field "${r}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`:`Forward relation name "${t}" from field "${r}" on table "${e.name}"${s} conflicts with existing field "${t}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`;throw Error(n)}if(Object.hasOwn(a.files,t))throw Error(`Forward relation name "${t}" from field "${r}" on table "${e.name}"${s} conflicts with files field "${t}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`);let o=n[m.targetType];l[t]={name:t,targetType:m.targetType,targetField:r,sourceField:m.key,isArray:!1,description:o?.metadata.description||``}}c[r]=p}return{name:e.name,pluralForm:o,description:a.description,fields:c,forwardRelationships:l,backwardRelationships:createRecord(),settings:a.settings??{},permissions:parsePermissions(a.permissions),indexes:a.indexes,files:a.files,...a.typeHook&&{typeHookExpr:{...typeof a.typeHook.create==`function`&&{create:convertTypeHookToExpr(a.typeHook.create,`create`,i)},...typeof a.typeHook.update==`function`&&{update:convertTypeHookToExpr(a.typeHook.update,`update`,i)}}},...typeof a.typeValidate==`function`&&{typeValidateExpr:convertTypeValidateToExpr(a.typeValidate,i)}}}function buildBackwardRelationships(e,t,n){let r=Object.create(null);for(let t of Object.keys(e))r[t]=Object.create(null);for(let[t,n]of Object.entries(e))for(let[i,a]of Object.entries(e))for(let[e,o]of Object.entries(a.fields))if(o.relation&&o.relation.targetType===t){let s=o.relation.backwardName;if(!s){let e=U.camelize(i,!0);s=o.relation.unique?U.singularize(e):U.pluralize(e)}let c=r[t];if(c===void 0)throw Error(`backward name sources not initialized for table: ${t}`);c[s]||(c[s]=[]);let l=c[s];if(l===void 0)throw Error(`backward name sources entry not initialized for: ${s}`);l.push({sourceType:i,fieldName:e}),n.backwardRelationships[s]={name:s,targetType:i,targetField:e,sourceField:o.relation.key,isArray:!o.relation.unique,description:a.description||``}}let i=[];for(let[t,a]of Object.entries(r)){let r=e[t];if(r===void 0)throw Error(`type not found: ${t}`);let o=formatTypeSourceLocation(getTypeSourceInfo(n,t));for(let[e,s]of Object.entries(a)){if(s.length>1){let r=s.map(e=>{let t=formatTypeSourceLocation(getTypeSourceInfo(n,e.sourceType));return`${e.sourceType}.${e.fieldName}${t}`}).join(`, `);i.push(`Backward relation name "${e}" on table "${t}" is duplicated from: ${r}. Use the "backward" option in .relation() to specify unique names.`)}if(Object.hasOwn(r.fields,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Backward relation name "${e}" from ${r.sourceType}.${r.fieldName}${a} conflicts with existing field "${e}" on table "${t}"${o}. Use the "backward" option in .relation() to specify a different name.`)}if(r.files&&Object.hasOwn(r.files,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Backward relation name "${e}" from ${r.sourceType}.${r.fieldName}${a} conflicts with files field "${e}" on table "${t}"${o}. Use the "backward" option in .relation() to specify a different name.`)}if(Object.hasOwn(r.forwardRelationships,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Relation name "${e}" on table "${t}"${o} is used by both a forward relationship and a backward relationship from ${r.sourceType}.${r.fieldName}${a}. Use the "as" option in .relation({ toward: { as: ... } }) or the "backward" option in .relation() to specify unique names.`)}}}if(i.length>0)throw Error(`Backward relation name conflicts detected in TailorDB service "${t}".\n${i.map(e=>` - ${e}`).join(`
107
+ })(${t})`}const yt=makePrincipalExpr({source:`user`,normalize:!0,fields:{type:{raw:`$raw?.type`},id:`$raw.id`,workspaceId:`$raw.workspace_id ?? $raw.workspaceId`,attributes:`$raw.attribute_map ?? $raw.attributeMap ?? {}`,attributeList:`$raw.attributes ?? []`}}),firstObjectProperty=e=>{let t=H(`stringify-function.ts`,e,{sourceType:`module`});if(t.errors.length>0)return;let n=t.program.body[0],r=n?.type===`ExpressionStatement`&&n.expression.type===`ParenthesizedExpression`?n.expression.expression:void 0;return r?.type===`ObjectExpression`?r.properties[0]:void 0},stringifyFunction=e=>{let t=e.toString().trim();if(firstObjectProperty(`({m: ${t}})`))return t;let n=`({${t}})`,r=firstObjectProperty(n);if(r?.type===`Property`&&r.method&&r.computed)throw Error(`Computed-key method shorthand cannot be converted to a TailorDB script expression. Use an arrow function or function expression instead.`);if(r?.type===`Property`&&r.method&&r.value.type===`FunctionExpression`){let{async:e,generator:t}=r.value,i=n.slice(r.value.start,r.value.end);return`${e?`async `:``}function${t?`*`:``} ${i}`}return t};function formatScriptContext(e,t){return t?`${e} for ${t.tableName}.${t.fieldPath.join(`.`)}`:e===`validate`?e:`hooks`}const convertToScriptExpr=(e,t,n)=>getPrecompiledScriptExpr(e,t,n?.dateDefault)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(t)})`,formatScriptContext(t,n)),convertTypeHookToExpr=(e,t,n)=>{let r=`typeHook.${t}`;return getPrecompiledScriptExpr(e,r,n)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(r)})`,`type-hook`)},convertTypeValidateToExpr=(e,t)=>getPrecompiledScriptExpr(e,`typeValidate`,t)||assertParsableExpression(`(${stringifyFunction(e)})(${buildHookCallArgs(`typeValidate`)})`,`type-validate`);function formatFieldLocation(e){return e?`Field "${e.fieldPath.join(`.`)}" on table "${e.tableName}": `:``}function parseFieldConfig(e,t){let n=e.metadata,r=e.type,i=e.rawRelation;if(t&&t.fieldPath.length>1&&n.default!==void 0)throw Error(`${formatFieldLocation(t)}.default() cannot be used on nested inner fields`);if(t&&t.fieldPath.length>1&&n.hooks)throw Error(`${formatFieldLocation(t)}.hooks() cannot be used on nested inner fields`);if(t&&t.fieldPath.length>1&&n.serial)throw Error(`${formatFieldLocation(t)}.serial() cannot be used on nested inner fields`);if(r===`enum`&&(n.allowedValues??[]).length===0)throw Error(`${formatFieldLocation(t)}enum fields must define at least one allowed value`);let a=e.fields;return{type:r,...n,rawRelation:i,...r===`nested`&&a&&Object.keys(a).length>0?{fields:Object.entries(a).reduce((e,[n,r])=>(e[n]=parseFieldConfig(r,t&&{...t,fieldPath:[...t.fieldPath,n]}),e),{})}:{},validate:n.validate?.map(e=>({script:{expr:convertToScriptExpr(e,`validate`,t)},errorMessage:``})),hooks:n.hooks?{create:n.hooks.create?{expr:convertToScriptExpr(n.hooks.create,`hooks.create`,t)}:void 0,update:n.hooks.update?{expr:convertToScriptExpr(n.hooks.update,`hooks.update`,t)}:void 0}:void 0,serial:n.serial?{start:n.serial.start,maxValue:n.serial.maxValue,format:`format`in n.serial?n.serial.format:void 0,gapless:n.serial.gapless}:void 0}}function isObjectPermissionFormat(e){return typeof e==`object`&&!!e&&`conditions`in e}function isSingleConditionFormat(e){return e.length>=2&&typeof e[1]==`string`}function normalizeOperand(e){if(e===null)throw Error(`Invalid permission operand: null`);if(typeof e==`object`&&!Array.isArray(e)&&`user`in e){let t=e.user;return{user:t===`id`?`_id`:t}}return e}function createPermissionNormalizer(e){function normalizeConditions(t){return t.map(t=>{let[n,r,i]=t;return[normalizeOperand(n),e[r],normalizeOperand(i)]})}function normalizeActionPermission(e){if(isObjectPermissionFormat(e)){let t=e.conditions;return{conditions:normalizeConditions(isSingleConditionFormat(t)?[t]:t),permit:e.permit?`allow`:`deny`,description:e.description}}if(!Array.isArray(e))throw Error(`Invalid permission format`);if(isSingleConditionFormat(e)){let[t,n,r,i]=[...e,!0];return{conditions:normalizeConditions([[t,n,r]]),permit:i?`allow`:`deny`}}let t=[],n=!0;for(let r of e)typeof r==`boolean`?n=r:t.push(r);return{conditions:normalizeConditions(t),permit:n?`allow`:`deny`}}return{normalizeConditions,normalizeActionPermission}}function hasOmittedPermit(e){return isObjectPermissionFormat(e)&&e.permit===void 0}const{normalizeConditions:bt,normalizeActionPermission:xt}=createPermissionNormalizer({"=":`eq`,"!=":`ne`,in:`in`,"not in":`nin`,hasAny:`hasAny`,"not hasAny":`nhasAny`});function normalizePermission(e){return Object.keys(e).reduce((t,n)=>(t[n]=e[n].map(e=>normalizeActionPermission(e)),t),{})}function normalizeGqlPermission(e){return e.map(e=>normalizeGqlPolicy(e))}function normalizeGqlPolicy(e){return{conditions:bt(e.conditions),actions:e.actions===`all`?[`all`]:e.actions,permit:e.permit?`allow`:`deny`,description:e.description}}function parsePermissions(e){return{...e.record&&{record:normalizePermission(e.record)},...e.gql&&{gql:normalizeGqlPermission(e.gql)}}}function normalizeActionPermission(e){return xt(e)}function findOmittedPermitRules(e){let t=[],n=e.record;if(n)for(let e of Object.keys(n))n[e].forEach((n,r)=>{hasOmittedPermit(n)&&t.push(`record.${String(e)}[${r}]`)});let r=e.gql;return r&&r.forEach((e,n)=>{e.permit===void 0&&t.push(`gql[${n}]`)}),t}function isGqlOperationsFullyDisabled(e){return e?e.create===!1&&e.update===!1&&e.delete===!1&&e.read===!1:!1}function findMissingPermissionConfig(e,t){return{missingPermission:!e.record,missingGqlPermission:!e.gql&&!isGqlOperationsFullyDisabled(t)}}function assertNoUniqueOrIndexInsideObjectArray(e,t,n,r=!1){let i=r||e.array===!0;for(let[r,a]of Object.entries(e.fields??{})){let e=[...t,r];for(let t of[`unique`,`index`]){if(!a[t])continue;let r=a.array?`${t} cannot be set on array fields`:i?`${t} cannot be set on a field inside an array of objects`:void 0;if(r)throw Error(`Field "${e.join(`.`)}" on table "${n}": ${r}`)}assertNoUniqueOrIndexInsideObjectArray(a,e,n,i)}}function parseTypes(e,t,n,r=`legacy`){let i=createRecord(),a=new Set(Object.keys(e));for(let[t,o]of Object.entries(e))i[t]=parseTailorDBType(o,a,e,n,r);return buildBackwardRelationships(i,t,n),validatePluralFormUniqueness(i,t,n),i}function parseTailorDBType(e,t,n,r,i){let a=e.metadata,o=a.settings?.pluralForm||U.pluralize(e.name),s=formatTypeSourceLocation(getTypeSourceInfo(r,e.name)),c=createRecord(),l=createRecord();for(let[r,o]of Object.entries(e.fields)){let u={tableName:e.name,fieldName:r,allTableNames:t},d=parseFieldConfig(o,{tableName:e.name,fieldPath:[r],dateDefault:i}),f=d.rawRelation;if(f){if(y(f,u),[`n-1`,`manyToOne`,`N-1`].includes(f.type)&&d.unique)throw Error(`Field "${r}" on table "${e.name}": cannot set unique on n-1 (manyToOne) relation. Use 1-1 (oneToOne) relation instead, or remove the unique constraint.`);let t=b(f,u,d.array);d=T(d,t)}if(d=v(d,u),d.array&&d.index)throw Error(`Field "${r}" on table "${e.name}": index cannot be set on array fields`);if(d.array&&d.unique)throw Error(`Field "${r}" on table "${e.name}": unique cannot be set on array fields`);assertNoUniqueOrIndexInsideObjectArray(d,[r],e.name);let p={name:r,config:d},m=f?S(f,u):void 0;if(m){p.relation={...m};let t=m.forwardName;if(t.length===0)throw Error(`Forward relation name for field "${r}" on table "${e.name}"${s} cannot be empty. Use the "as" option in .relation({ toward: { as: ... } }) to specify a non-empty name.`);let i=l[t];if(i)throw Error(`Forward relation name "${t}" on table "${e.name}"${s} is duplicated between fields "${i.targetField}" and "${r}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a unique name.`);if(Object.hasOwn(e.fields,t)){let n=t===r?`Forward relation name "${t}" on table "${e.name}"${s} is the same as its own relation field "${r}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`:`Forward relation name "${t}" from field "${r}" on table "${e.name}"${s} conflicts with existing field "${t}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`;throw Error(n)}if(Object.hasOwn(a.files,t))throw Error(`Forward relation name "${t}" from field "${r}" on table "${e.name}"${s} conflicts with files field "${t}". Use the "as" option in .relation({ toward: { as: ... } }) to specify a different name.`);let o=n[m.targetType];l[t]={name:t,targetType:m.targetType,targetField:r,sourceField:m.key,isArray:!1,description:o?.metadata.description||``}}c[r]=p}return{name:e.name,pluralForm:o,description:a.description,fields:c,forwardRelationships:l,backwardRelationships:createRecord(),settings:a.settings??{},permissions:parsePermissions(a.permissions),indexes:a.indexes,files:a.files,...a.typeHook&&{typeHookExpr:{...typeof a.typeHook.create==`function`&&{create:convertTypeHookToExpr(a.typeHook.create,`create`,i)},...typeof a.typeHook.update==`function`&&{update:convertTypeHookToExpr(a.typeHook.update,`update`,i)}}},...typeof a.typeValidate==`function`&&{typeValidateExpr:convertTypeValidateToExpr(a.typeValidate,i)}}}function buildBackwardRelationships(e,t,n){let r=Object.create(null);for(let t of Object.keys(e))r[t]=Object.create(null);for(let[t,n]of Object.entries(e))for(let[i,a]of Object.entries(e))for(let[e,o]of Object.entries(a.fields))if(o.relation&&o.relation.targetType===t){let s=o.relation.backwardName;if(!s){let e=U.camelize(i,!0);s=o.relation.unique?U.singularize(e):U.pluralize(e)}let c=r[t];if(c===void 0)throw Error(`backward name sources not initialized for table: ${t}`);c[s]||(c[s]=[]);let l=c[s];if(l===void 0)throw Error(`backward name sources entry not initialized for: ${s}`);l.push({sourceType:i,fieldName:e}),n.backwardRelationships[s]={name:s,targetType:i,targetField:e,sourceField:o.relation.key,isArray:!o.relation.unique,description:a.description||``}}let i=[];for(let[t,a]of Object.entries(r)){let r=e[t];if(r===void 0)throw Error(`type not found: ${t}`);let o=formatTypeSourceLocation(getTypeSourceInfo(n,t));for(let[e,s]of Object.entries(a)){if(s.length>1){let r=s.map(e=>{let t=formatTypeSourceLocation(getTypeSourceInfo(n,e.sourceType));return`${e.sourceType}.${e.fieldName}${t}`}).join(`, `);i.push(`Backward relation name "${e}" on table "${t}" is duplicated from: ${r}. Use the "backward" option in .relation() to specify unique names.`)}if(Object.hasOwn(r.fields,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Backward relation name "${e}" from ${r.sourceType}.${r.fieldName}${a} conflicts with existing field "${e}" on table "${t}"${o}. Use the "backward" option in .relation() to specify a different name.`)}if(r.files&&Object.hasOwn(r.files,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Backward relation name "${e}" from ${r.sourceType}.${r.fieldName}${a} conflicts with files field "${e}" on table "${t}"${o}. Use the "backward" option in .relation() to specify a different name.`)}if(Object.hasOwn(r.forwardRelationships,e)){let r=s[0];if(r===void 0)throw Error(`no source found for backward name: ${e}`);let a=formatTypeSourceLocation(getTypeSourceInfo(n,r.sourceType));i.push(`Relation name "${e}" on table "${t}"${o} is used by both a forward relationship and a backward relationship from ${r.sourceType}.${r.fieldName}${a}. Use the "as" option in .relation({ toward: { as: ... } }) or the "backward" option in .relation() to specify unique names.`)}}}if(i.length>0)throw Error(`Backward relation name conflicts detected in TailorDB service "${t}".\n${i.map(e=>` - ${e}`).join(`
108
108
  `)}`)}function validatePluralFormUniqueness(e,t,n){let r=[];for(let[,t]of Object.entries(e)){let e=U.camelize(t.name,!0);if(e===U.camelize(t.pluralForm,!0)){let i=formatTypeSourceLocation(getTypeSourceInfo(n,t.name));r.push(`Table "${t.name}"${i} has identical singular and plural query names "${e}". Use db.table(["${t.name}", "UniquePluralForm"], {...}) to set a unique pluralForm.`)}}let i=/* @__PURE__ */ new Map;for(let t of Object.values(e)){let e=U.camelize(t.name,!0),n=U.camelize(t.pluralForm,!0),r=i.get(e)??[];if(r.push({tableName:t.name,kind:`singular`}),i.set(e,r),e!==n){let e=i.get(n)??[];e.push({tableName:t.name,kind:`plural`}),i.set(n,e)}}let a=[...i].filter(([,e])=>e.length>1);for(let[e,t]of a){let i=t.map(e=>{let t=formatTypeSourceLocation(getTypeSourceInfo(n,e.tableName));return`"${e.tableName}"${t} (${e.kind})`}).join(`, `);r.push(`GraphQL query field "${e}" conflicts between: ${i}`)}if(r.length>0)throw Error(`GraphQL field name conflicts detected in TailorDB service "${t}".\n${r.map(e=>` - ${e}`).join(`
109
- `)}`)}function getTypeSourceInfo(e,t){return e&&Object.hasOwn(e,t)?e[t]:void 0}function formatTypeSourceLocation(e){return e?le(e)?` (plugin: ${e.pluginId})`:` (${e.filePath})`:``}function createRecord(){return Object.create(null)}function toScriptFunction(e,t,n){if(typeof e==`function`&&!getPrecompiledScriptExpr(e,t,n))return e}function collectScriptTargets(e,t){let n=[],collectFieldTargets=e=>{let r=e.metadata,i=toScriptFunction(r.hooks?.create,`hooks.create`,t);i&&n.push({fn:i,kind:`hooks.create`});let a=toScriptFunction(r.hooks?.update,`hooks.update`,t);a&&n.push({fn:a,kind:`hooks.update`});for(let e of r.validate??[]){let r=toScriptFunction(e,`validate`,t);r&&n.push({fn:r,kind:`validate`})}if(e.type===`nested`&&e.fields)for(let t of Object.values(e.fields))collectFieldTargets(t)};for(let t of Object.values(e.fields))collectFieldTargets(t);if(e.metadata.typeHook)for(let r of[`create`,`update`]){let i=`typeHook.${r}`,a=toScriptFunction(e.metadata.typeHook[r],i,t);a&&n.push({fn:a,kind:i})}let r=toScriptFunction(e.metadata.typeValidate,`typeValidate`,t);return r&&n.push({fn:r,kind:`typeValidate`}),n}function collectIdentifierNames(e){let{program:t}=H(`_.ts`,e),n=/* @__PURE__ */ new Set,walk=e=>{if(!e||typeof e!=`object`)return;let t=e;t.type===`Identifier`&&typeof t.name==`string`&&n.add(t.name);for(let[e,n]of Object.entries(t))if((e!==`property`||t.type!==`MemberExpression`||t.computed)&&(e!==`key`||t.type!==`Property`||t.computed)&&!$e.has(e)){if(Array.isArray(n))for(let e of n)walk(e);else n&&typeof n==`object`&&`type`in n&&walk(n)}};return walk(t),n}function collectSourceBindings(e){let t=me(e,`utf-8`),{program:n}=H(e,t),r=/* @__PURE__ */ new Map;for(let e of n.body)if(e.type===`ImportDeclaration`){let n=e,i=t.slice(n.start,n.end);for(let e of n.specifiers)r.set(e.local.name,{name:e.local.name,sourceText:i,kind:`import`})}else if(e.type===`VariableDeclaration`){let n=e,i=t.slice(n.start,n.end);for(let e of n.declarations)e.id.type===`Identifier`&&r.set(e.id.name,{name:e.id.name,sourceText:i,kind:`declaration`})}else if(e.type===`FunctionDeclaration`){let n=e;if(n.id){let e=t.slice(n.start,n.end);r.set(n.id.name,{name:n.id.name,sourceText:e,kind:`declaration`})}}else if(e.type===`ExportNamedDeclaration`){let n=e.declaration;if(!n)continue;if(n.type===`VariableDeclaration`){let e=n,i=t.slice(e.start,e.end);for(let t of e.declarations)t.id.type===`Identifier`&&r.set(t.id.name,{name:t.id.name,sourceText:i,kind:`declaration`})}else if(n.type===`FunctionDeclaration`){let e=n;if(e.id){let n=t.slice(e.start,e.end);r.set(e.id.name,{name:e.id.name,sourceText:n,kind:`declaration`})}}}return r}function resolveNeededBindings(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=[],a=/* @__PURE__ */ new Set,resolveVars=e=>{for(let o of e){if(a.has(o))continue;a.add(o);let e=t.get(o);if(!e)i.push(o);else if(e.kind===`import`)n.add(e.sourceText);else{let n=collectIdentifierNames(e.sourceText),i=/* @__PURE__ */ new Set;for(let e of n)e!==o&&t.has(e)&&i.add(e);resolveVars(i),r.add(e.sourceText)}}};return resolveVars(e),{imports:[...n],declarations:[...r],unresolved:i}}function buildPrecompiledExpr(e,t){return`(() => {
109
+ `)}`)}function getTypeSourceInfo(e,t){return e&&Object.hasOwn(e,t)?e[t]:void 0}function formatTypeSourceLocation(e){return e?le(e)?` (plugin: ${e.pluginId})`:` (${e.filePath})`:``}function createRecord(){return Object.create(null)}function toScriptFunction(e,t,n){if(typeof e==`function`&&!getPrecompiledScriptExpr(e,t,n))return e}function collectScriptTargets(e,t){let n=[],collectFieldTargets=e=>{let r=e.metadata,i=toScriptFunction(r.hooks?.create,`hooks.create`,t);i&&n.push({fn:i,kind:`hooks.create`});let a=toScriptFunction(r.hooks?.update,`hooks.update`,t);a&&n.push({fn:a,kind:`hooks.update`});for(let e of r.validate??[]){let r=toScriptFunction(e,`validate`,t);r&&n.push({fn:r,kind:`validate`})}if(e.type===`nested`&&e.fields)for(let t of Object.values(e.fields))collectFieldTargets(t)};for(let t of Object.values(e.fields))collectFieldTargets(t);if(e.metadata.typeHook)for(let r of[`create`,`update`]){let i=`typeHook.${r}`,a=toScriptFunction(e.metadata.typeHook[r],i,t);a&&n.push({fn:a,kind:i})}let r=toScriptFunction(e.metadata.typeValidate,`typeValidate`,t);return r&&n.push({fn:r,kind:`typeValidate`}),n}function collectIdentifierNames(e){let{program:t}=H(`_.ts`,e),n=/* @__PURE__ */ new Set,walk=e=>{if(!e||typeof e!=`object`)return;let t=e;t.type===`Identifier`&&typeof t.name==`string`&&n.add(t.name);for(let[e,n]of Object.entries(t))if((e!==`property`||t.type!==`MemberExpression`||t.computed)&&(e!==`key`||t.type!==`Property`||t.computed)&&!tt.has(e)){if(Array.isArray(n))for(let e of n)walk(e);else n&&typeof n==`object`&&`type`in n&&walk(n)}};return walk(t),n}function collectSourceBindings(e){let t=me(e,`utf-8`),{program:n}=H(e,t),r=/* @__PURE__ */ new Map;for(let e of n.body)if(e.type===`ImportDeclaration`){let n=e,i=t.slice(n.start,n.end);for(let e of n.specifiers)r.set(e.local.name,{name:e.local.name,sourceText:i,kind:`import`})}else if(e.type===`VariableDeclaration`){let n=e,i=t.slice(n.start,n.end);for(let e of n.declarations)e.id.type===`Identifier`&&r.set(e.id.name,{name:e.id.name,sourceText:i,kind:`declaration`})}else if(e.type===`FunctionDeclaration`){let n=e;if(n.id){let e=t.slice(n.start,n.end);r.set(n.id.name,{name:n.id.name,sourceText:e,kind:`declaration`})}}else if(e.type===`ExportNamedDeclaration`){let n=e.declaration;if(!n)continue;if(n.type===`VariableDeclaration`){let e=n,i=t.slice(e.start,e.end);for(let t of e.declarations)t.id.type===`Identifier`&&r.set(t.id.name,{name:t.id.name,sourceText:i,kind:`declaration`})}else if(n.type===`FunctionDeclaration`){let e=n;if(e.id){let n=t.slice(e.start,e.end);r.set(e.id.name,{name:e.id.name,sourceText:n,kind:`declaration`})}}}return r}function resolveNeededBindings(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=[],a=/* @__PURE__ */ new Set,resolveVars=e=>{for(let o of e){if(a.has(o))continue;a.add(o);let e=t.get(o);if(!e)i.push(o);else if(e.kind===`import`)n.add(e.sourceText);else{let n=collectIdentifierNames(e.sourceText),i=/* @__PURE__ */ new Set;for(let e of n)e!==o&&t.has(e)&&i.add(e);resolveVars(i),r.add(e.sourceText)}}};return resolveVars(e),{imports:[...n],declarations:[...r],unresolved:i}}function buildPrecompiledExpr(e,t){return`(() => {
110
110
  const module = { exports: {} };
111
111
  const exports = module.exports;
112
112
  ${e}\n return module.exports.main(${t});\n})()`}function buildMinimalEntryFromResolved(e,t,n,r,i=!1){let a=de(r,`..`).replace(/\\/g,`/`);return[...e.map(e=>e.replace(/from\s+["'](\.[^"']+)["']/g,(e,t)=>`from "${de(a,t).replace(/\\/g,`/`)}"`)),...t,i?`export function main(...args) { return (${n})(...args); }`:`export function main(input) { return (${n})(input); }`].join(`
@@ -114,7 +114,7 @@ ${e}\n return module.exports.main(${t});\n})()`}function buildMinimalEntryFromR
114
114
  ${n}: ${u}`);let y=buildMinimalEntryFromResolved(m,h,u,r,n===`typeValidate`),b=createVirtualEntry(`tailordb-script:${a}:${o}`,y,`ts`,r),x=createBundleLog({tsconfig:s}),S=await Se.build({plugins:[b.plugin,createTsconfigPathsPlugin({virtualEntrySourceFile:r}),createPlatformBundleDefinePlugin(void 0,c)],input:b.input,write:!1,output:{format:`cjs`,sourcemap:!1,minify:!0,codeSplitting:!1},tsconfig:s,treeshake:{moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},...x.options});x.assertAllResolved();let C=S.output[0].code;return assertParsableExpression(buildPrecompiledExpr(C,buildHookCallArgs(n)),l)}async function precompileTailorDBTypeScripts(e,t,n,r=`legacy`){let i=collectScriptTargets(e,r);if(i.length===0)return;let a=collectSourceBindings(t),s=await Promise.allSettled(i.map((i,o)=>bundleScriptTarget({fn:i.fn,kind:i.kind,sourceFilePath:t,sourceBindings:a,tableName:e.name,targetIndex:o,tsconfig:n,dateDefault:r}))),c=s.find(e=>e.status===`rejected`);if(c)throw c.reason;for(let[e,t]of s.entries())if(t.status===`fulfilled`){let n=o(i[e],`bundle target at index ${e} missing`);setPrecompiledScriptExpr(n.fn,n.kind,t.value,r)}}function formatTailorDBTypeSourceInfo(e){if(e){if(le(e)){let t=[`plugin ${e.pluginId}`];return e.generatedTableKind&&t.push(`kind ${e.generatedTableKind}`),e.originalFilePath&&t.push(`source ${e.originalFilePath}`),e.originalExportName&&t.push(`export ${e.originalExportName}`),t.join(`, `)}return`${e.filePath} export ${e.exportName}`}}function collectLocalTailorDBTypeNameSources(e){let t=[];for(let n of e.tailorDBServices)for(let e of Object.keys(n.types))t.push({namespace:n.namespace,tableName:e,kind:`local`,detail:formatTailorDBTypeSourceInfo(n.typeSourceInfo[e])});return t}async function fetchExternalTailorDBTypeNameSources(e){return(await Promise.all(e.externalTailorDBNamespaces.map(async t=>{let n=[],r=await fetchAll(async(n,r)=>{try{let{tailordbTypes:i,nextPageToken:a}=await e.client.listTailorDBTypes({workspaceId:e.workspaceId,namespaceName:t,pageToken:n,pageSize:r});return[i,a??``]}catch(e){if(isNotFoundError(e))return[[],``];throw e}});for(let e of r)n.push({namespace:t,tableName:e.name,kind:`external`});return n}))).flat()}function assertUniqueTailorDBTypeNames(e){let t=/* @__PURE__ */ new Map;for(let n of e.sources){let e=t.get(n.tableName);e?e.push(n):t.set(n.tableName,[n])}let n=[];for(let[e,r]of t){if(r.length<=1)continue;let t=r.map(formatTailorDBTypeNameSource).join(`, `);n.push(`Table "${e}" is defined more than once: ${t}`)}if(n.length>0)throw Error(`Duplicate TailorDB table names detected.
115
115
  ${n.map(e=>` - ${e}`).join(`
116
116
  `)}\nTailorDB table names must be unique across all TailorDB namespaces in an application.`)}function assertUniqueLocalTailorDBTypeNames(e){assertUniqueTailorDBTypeNames({sources:collectLocalTailorDBTypeNameSources(e)})}async function assertUniqueTailorDBTypeNamesWithExternal(e){let t=collectLocalTailorDBTypeNameSources(e),n=e.plannedExternalTailorDBServices??[],r=new Set(n.map(e=>e.namespace)),i=collectLocalTailorDBTypeNameSources({tailorDBServices:n}).map(e=>({...e,kind:`external`})),a=e.externalTailorDBNamespaces.filter(e=>!r.has(e)),o=a.length>0?await fetchExternalTailorDBTypeNameSources({client:e.client,workspaceId:e.workspaceId,externalTailorDBNamespaces:a}):[];assertUniqueTailorDBTypeNames({sources:[...t,...i,...o]})}function formatTailorDBTypeNameSource(e){let t=e.kind===`external`?`external namespace "${e.namespace}"`:`namespace "${e.namespace}"`;return e.detail?`${t} (${e.detail})`:t}function createTailorDBService(e){let{namespace:n,config:r,pluginManager:i,baseDir:a,dateDefault:s=`legacy`}=e,createRawTypesByName=()=>Object.create(null),c=Object.create(null),d={},f=Object.create(null),p=/* @__PURE__ */ new Map,h,registerRawType=(e,t,r,i)=>{let a=Object.hasOwn(f,t)?f[t]:void 0;if(a){let e=formatTailorDBTypeSourceInfo(a)??`unknown source`,r=formatTailorDBTypeSourceInfo(i)??`unknown source`;throw Error(`Duplicate TailorDB table name "${t}" detected in TailorDB service "${n}". First: ${e}. Second: ${r}. TailorDB table names must be unique across all TailorDB files in a service.`)}o(c[e],`raw table entry missing for key: ${e}`)[t]=r,f[t]=i},parsePluginTable=(e,t)=>{let r=_.safeParse(g(e));if(!r.success)throw Error(`TailorDB table ${t} in TailorDB service "${n}" failed schema validation:\n${l(u(r.error.issues))}`,{cause:r.error});return r.data},describeGeneratedTable=(e,t,n)=>`${typeof e==`string`&&e.length>0?`"${e}" `:``}generated as "${t}" by plugin "${n}"`,doParseTypes=()=>{let e=createRawTypesByName();for(let t of Object.values(c))for(let[n,r]of Object.entries(t))e[n]=r;d=parseTypes(e,n,f,s)},warnOmittedPermit=()=>{for(let e of Object.values(c))for(let[t,n]of Object.entries(e)){let e=findOmittedPermitRules(n.metadata.permissions);e.length>0&&N.warn(`TailorDB table "${t}" has permission rule(s) ${e.join(`, `)} in object form without an explicit "permit"; they default to "deny". Set permit: true (allow) or permit: false (deny) to silence this warning.`)}},validateRequiredPermissions=()=>{let e=[];for(let t of Object.values(c))for(let[n,i]of Object.entries(t)){let t=i.metadata.settings?.gqlOperations??r.gqlOperations,{missingPermission:a,missingGqlPermission:o}=findMissingPermissionConfig(i.metadata.permissions,t);if(!a&&!o)continue;let s=formatTailorDBTypeSourceInfo(f[n]),c=s?` (${s})`:``;a&&e.push(`TailorDB table "${n}"${c} has no .permission() configured. TailorDB denies all record operations for tables without permission; call .permission(...) to grant access explicitly.`),o&&e.push(`TailorDB table "${n}"${c} has no .gqlPermission() configured, but GraphQL operations are enabled for it. Call .gqlPermission(...) to grant GraphQL access explicitly, or disable GraphQL exposure with .features({ gqlOperations: { create: false, update: false, delete: false, read: false } }).`)}if(e.length>0)throw Error(`TailorDB permission configuration errors in service "${n}":\n${e.map(e=>` - ${e}`).join(`
117
- `)}`)},processPluginsForTable=async(e,t,r)=>{if(!i)return;let{extendedTable:a,generatedTables:s,events:l}=await i.processAttachmentsForTable({rawTable:e,attachments:t,namespace:n}),u=[...new Set(l.filter(e=>e.kind===`extended`).map(e=>e.pluginId))],d=a===void 0?void 0:parsePluginTable(a,`"${e.name}" extended by ${u.length===1?`plugin`:`plugins`} ${u.map(e=>`"${e}"`).join(`, `)}`),p=s.map(e=>({...e,table:parsePluginTable(e.table,describeGeneratedTable(e.tableName,e.kind,e.pluginId))}));d&&(o(c[r],`raw table entry missing for file: ${r}`)[e.name]=d);for(let t of p){let i={exportName:t.tableName,pluginId:t.pluginId,pluginImportPath:t.pluginImportPath,originalFilePath:r,originalExportName:f[e.name]?.exportName||e.name,generatedTableKind:t.kind,pluginConfig:t.pluginConfig,namespace:n};registerRawType(r,t.tableName,t.table,i)}for(let e of l)e.kind===`extended`?N.debug(` Extended: ${j.success(e.tableName)} with ${j.highlight(e.fieldCount.toString())} fields by plugin ${j.info(e.pluginId)}`):N.debug(` Generated: ${j.success(e.tableName)} by plugin ${j.info(e.pluginId)}`)},loadTypeFile=async(e,n)=>{c[e]=createRawTypesByName();let r=createRawTypesByName();try{let i=await A(e);for(let a of Object.keys(i)){let o=i[a],c=_.safeParse(x(o));if(!c.success){if(t(o,`tailordb-type`))throw k({kind:`tailordb-type`,file:e,exportName:a,error:c.error});continue}let l=L.relative(process.cwd(),e);N.debug(`Type: ${j.successBright(`"${c.data.name}"`)} loaded from ${j.path(l)}`),await precompileTailorDBTypeScripts(c.data,e,n,s),r[c.data.name]=c.data,registerRawType(e,c.data.name,c.data,{filePath:e,exportName:a});let u=o;u.plugins&&Array.isArray(u.plugins)&&u.plugins.length>0&&(p.set(u.name,[...u.plugins]),N.debug(` Plugin attachments: ${j.info(u.plugins.map(e=>e.pluginId).join(`, `))}`),await processPluginsForTable(u,u.plugins,e))}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`Failed to load table from ${j.bold(n)}`),N.error(String(t)),t}return r};return{namespace:n,config:r,get types(){return d},get typeSourceInfo(){return f},get pluginAttachments(){return p},loadTypes:async()=>(h||=(async()=>{if(r.files.length===0)return;let e=[...new Set(m(r,a))],t=await resolveTSConfigWithFallback(a);if(N.newline(),N.log(`Found ${j.highlight(e.length.toString())} table files for TailorDB service ${j.highlight(`"${n}"`)}`),i)for(let n of e)await loadTypeFile(n,t);else await Promise.all(e.map(e=>loadTypeFile(e,t)));return doParseTypes(),warnOmittedPermit(),validateRequiredPermissions(),d})(),h),processNamespacePlugins:async()=>{if(!i)return;let e=await i.processNamespacePlugins(n),t=`__plugin_generated__`,r=e.map(({pluginId:e,config:t,result:n})=>{if(!n.success)throw N.error(n.error),Error(n.error);return{pluginId:e,config:t,output:n.output}}).flatMap(({pluginId:e,config:t,output:n})=>Object.entries(n.tables??{}).map(([n,r])=>({pluginId:e,config:t,kind:n,table:parsePluginTable(r,describeGeneratedTable(ce(r),n,e))}))),a=Object.hasOwn(c,t),o=c[t],s=o?Object.keys(o):[],l=s.length>0;if(a)for(let e of s)delete f[e];c[t]=createRawTypesByName();for(let{pluginId:e,config:a,kind:o,table:s}of r){let r={exportName:s.name,pluginId:e,pluginImportPath:i.getPluginImportPath(e)??``,originalFilePath:``,originalExportName:``,generatedTableKind:o,pluginConfig:a,namespace:n};registerRawType(t,s.name,s,r),N.debug(` Generated: ${j.success(s.name)} by namespace plugin ${j.info(e)}`)}(r.length>0||l)&&(doParseTypes(),validateRequiredPermissions())}}}function createAuthService(e,t,n){let r=e.connections?{...e.connections}:{},i;return{config:e,tailorDBServices:t,externalTailorDBNamespaces:n,connections:r,get userProfile(){return i},resolveNamespaces:async()=>{if(!e.userProfile)return;if(e.userProfile.namespace){i={...e.userProfile,namespace:e.userProfile.namespace};return}let r=t.length+n.length,a;if(r===1)a=t[0]?.namespace??o(n[0],`external TailorDB namespace missing`);else{await Promise.all(t.map(e=>e.loadTypes()));let n=typeof e.userProfile.type==`object`&&`name`in e.userProfile.type?e.userProfile.type.name:void 0;if(n)for(let e of t){let t=e.types;if(Object.prototype.hasOwnProperty.call(t,n)){a=e.namespace;break}}if(!a)throw Error(`userProfile type "${e.userProfile.type.name}" not found in any TailorDB namespace`)}i={...e.userProfile,namespace:a}}}}function resolveBundleConcurrency(){return parsePositiveInt(process.env.TAILOR_BUNDLE_CONCURRENCY)??Math.max(1,xe.cpus().length)}async function withBundleConcurrency(e,t){let n=[];n.length=e.length;let r=ve(resolveBundleConcurrency()),i;if(await Promise.all(e.flatMap((e,a)=>[r(async()=>{if(!i)try{n[a]=await t(e)}catch(e){i??={reason:e}}})])),i)throw i.reason;return n}const ht=makePrincipalExpr({source:`tailor.context.getInvoker()`,normalize:!1,fields:{type:{raw:`$raw.type`},id:`$raw.id`,workspaceId:`$raw.workspaceId`,attributes:`$raw.attributeMap`,attributeList:`$raw.attributes`}}),gt=`actor: ${makePrincipalExpr({source:`args.actor`,normalize:!0,requireId:!0,fields:{type:{raw:`$raw?.userType`,fallback:`$raw?.type`},id:`$raw?.userId ?? $raw?.id`,workspaceId:`$raw.workspaceId`,attributes:`$raw.attributeMap ?? {}`,attributeList:`$raw.attributes ?? []`}})}`;function buildExecutorArgsExpr(e,t){let n=`env: ${JSON.stringify(t)}`;switch(e){case`schedule`:return`({ ...args, appNamespace: args.namespaceName, ${gt}, ${n} })`;case`resolverExecuted`:return`({ ...args, appNamespace: args.namespaceName, ${gt}, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error, ${n} })`;case`incomingWebhook`:return`({ ...args, appNamespace: args.namespaceName, rawBody: args.raw_body, ${n} })`;case`workflowExecution`:case`workflowJobExecution`:return`({ ...args, event: args.eventType?.split(".").pop(), rawEvent: args.eventType, ${gt}, ...(args.succeeded ? { success: true } : args.failed ? { success: false, error: args.failed.error ?? "" } : {}), ${n} })`;default:return`({ ...args, event: args.eventType?.split(".").pop(), rawEvent: args.eventType, appNamespace: args.namespaceName, ${gt}, ${n} })`}}function buildResolverOperationHookExpr(e){return`({ ...context.pipeline, input: context.args, caller: ${ft}, env: ${JSON.stringify(e)} });`}function isSingleResolverCondition(e){return e.length===3&&typeof e[1]==`string`}function resolverPermissionOperandExpr(e){return typeof e==`object`?e.user===`_loggedIn`?`(context.caller !== null)`:e.user===`id`?`context.caller?.id`:`context.caller?.attributes?.[${JSON.stringify(e.user)}]`:JSON.stringify(e)}function isArbitraryAttributeOperand(e){return typeof e==`object`&&e.user!==`_loggedIn`}function resolverPermissionConditionExpr(e){let[t,n,r]=e,i=resolverPermissionOperandExpr(t),a=resolverPermissionOperandExpr(r);if(n===`!=`){let e=isArbitraryAttributeOperand(t)?i:isArbitraryAttributeOperand(r)?a:void 0;if(e)return`(${e} !== undefined && ${i} !== ${a})`}return`(${i} ${n===`=`?`===`:`!==`} ${a})`}function resolverPermissionPolicyExpr(e){let t=isSingleResolverCondition(e.conditions)?[e.conditions]:e.conditions;if(t.length===0)throw Error(`Resolver permission policy must have at least one condition, got an empty array.`);return t.map(resolverPermissionConditionExpr).join(` && `)}function policyEntryExpr(e){return`{ matched: ${resolverPermissionPolicyExpr(e)}, description: ${JSON.stringify(e.description??``)} }`}function buildResolverPermissionGuardExpr(e){if(!e||e===`allowAnonymous`)return;if(e.length===0)throw Error(`Resolver permission must have at least one policy, got an empty array.`);let t=e.filter(e=>e.permit===!1),n=e.filter(e=>e.permit!==!1);return`{
117
+ `)}`)},processPluginsForTable=async(e,t,r)=>{if(!i)return;let{extendedTable:a,generatedTables:s,events:l}=await i.processAttachmentsForTable({rawTable:e,attachments:t,namespace:n}),u=[...new Set(l.filter(e=>e.kind===`extended`).map(e=>e.pluginId))],d=a===void 0?void 0:parsePluginTable(a,`"${e.name}" extended by ${u.length===1?`plugin`:`plugins`} ${u.map(e=>`"${e}"`).join(`, `)}`),p=s.map(e=>({...e,table:parsePluginTable(e.table,describeGeneratedTable(e.tableName,e.kind,e.pluginId))}));d&&(o(c[r],`raw table entry missing for file: ${r}`)[e.name]=d);for(let t of p){let i={exportName:t.tableName,pluginId:t.pluginId,pluginImportPath:t.pluginImportPath,originalFilePath:r,originalExportName:f[e.name]?.exportName||e.name,generatedTableKind:t.kind,pluginConfig:t.pluginConfig,namespace:n};registerRawType(r,t.tableName,t.table,i)}for(let e of l)e.kind===`extended`?N.debug(` Extended: ${j.success(e.tableName)} with ${j.highlight(e.fieldCount.toString())} fields by plugin ${j.info(e.pluginId)}`):N.debug(` Generated: ${j.success(e.tableName)} by plugin ${j.info(e.pluginId)}`)},loadTypeFile=async(e,n)=>{c[e]=createRawTypesByName();let r=createRawTypesByName();try{let i=await A(e);for(let a of Object.keys(i)){let o=i[a],c=_.safeParse(x(o));if(!c.success){if(t(o,`tailordb-type`))throw k({kind:`tailordb-type`,file:e,exportName:a,error:c.error});continue}let l=L.relative(process.cwd(),e);N.debug(`Type: ${j.successBright(`"${c.data.name}"`)} loaded from ${j.path(l)}`),await precompileTailorDBTypeScripts(c.data,e,n,s),r[c.data.name]=c.data,registerRawType(e,c.data.name,c.data,{filePath:e,exportName:a});let u=o;u.plugins&&Array.isArray(u.plugins)&&u.plugins.length>0&&(p.set(u.name,[...u.plugins]),N.debug(` Plugin attachments: ${j.info(u.plugins.map(e=>e.pluginId).join(`, `))}`),await processPluginsForTable(u,u.plugins,e))}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`Failed to load table from ${j.bold(n)}`),N.error(String(t)),t}return r};return{namespace:n,config:r,get types(){return d},get typeSourceInfo(){return f},get pluginAttachments(){return p},loadTypes:async()=>(h||=(async()=>{if(r.files.length===0)return;let e=[...new Set(m(r,a))],t=await resolveTSConfigWithFallback(a);if(N.newline(),N.log(`Found ${j.highlight(e.length.toString())} table files for TailorDB service ${j.highlight(`"${n}"`)}`),i)for(let n of e)await loadTypeFile(n,t);else await Promise.all(e.map(e=>loadTypeFile(e,t)));return doParseTypes(),warnOmittedPermit(),validateRequiredPermissions(),d})(),h),processNamespacePlugins:async()=>{if(!i)return;let e=await i.processNamespacePlugins(n),t=`__plugin_generated__`,r=e.map(({pluginId:e,config:t,result:n})=>{if(!n.success)throw N.error(n.error),Error(n.error);return{pluginId:e,config:t,output:n.output}}).flatMap(({pluginId:e,config:t,output:n})=>Object.entries(n.tables??{}).map(([n,r])=>({pluginId:e,config:t,kind:n,table:parsePluginTable(r,describeGeneratedTable(ce(r),n,e))}))),a=Object.hasOwn(c,t),o=c[t],s=o?Object.keys(o):[],l=s.length>0;if(a)for(let e of s)delete f[e];c[t]=createRawTypesByName();for(let{pluginId:e,config:a,kind:o,table:s}of r){let r={exportName:s.name,pluginId:e,pluginImportPath:i.getPluginImportPath(e)??``,originalFilePath:``,originalExportName:``,generatedTableKind:o,pluginConfig:a,namespace:n};registerRawType(t,s.name,s,r),N.debug(` Generated: ${j.success(s.name)} by namespace plugin ${j.info(e)}`)}(r.length>0||l)&&(doParseTypes(),validateRequiredPermissions())}}}function createAuthService(e,t,n){let r=e.connections?{...e.connections}:{},i;return{config:e,tailorDBServices:t,externalTailorDBNamespaces:n,connections:r,get userProfile(){return i},resolveNamespaces:async()=>{if(!e.userProfile)return;if(e.userProfile.namespace){i={...e.userProfile,namespace:e.userProfile.namespace};return}let r=t.length+n.length,a;if(r===1)a=t[0]?.namespace??o(n[0],`external TailorDB namespace missing`);else{await Promise.all(t.map(e=>e.loadTypes()));let n=typeof e.userProfile.type==`object`&&`name`in e.userProfile.type?e.userProfile.type.name:void 0;if(n)for(let e of t){let t=e.types;if(Object.prototype.hasOwnProperty.call(t,n)){a=e.namespace;break}}if(!a)throw Error(`userProfile type "${e.userProfile.type.name}" not found in any TailorDB namespace`)}i={...e.userProfile,namespace:a}}}}function resolveBundleConcurrency(){return parsePositiveInt(process.env.TAILOR_BUNDLE_CONCURRENCY)??Math.max(1,xe.cpus().length)}async function withBundleConcurrency(e,t){let n=[];n.length=e.length;let r=ve(resolveBundleConcurrency()),i;if(await Promise.all(e.flatMap((e,a)=>[r(async()=>{if(!i)try{n[a]=await t(e)}catch(e){i??={reason:e}}})])),i)throw i.reason;return n}const St=makePrincipalExpr({source:`tailor.context.getInvoker()`,normalize:!1,fields:{type:{raw:`$raw.type`},id:`$raw.id`,workspaceId:`$raw.workspaceId`,attributes:`$raw.attributeMap`,attributeList:`$raw.attributes`}}),Y=`actor: ${makePrincipalExpr({source:`args.actor`,normalize:!0,requireId:!0,fields:{type:{raw:`$raw?.userType`,fallback:`$raw?.type`},id:`$raw?.userId ?? $raw?.id`,workspaceId:`$raw.workspaceId`,attributes:`$raw.attributeMap ?? {}`,attributeList:`$raw.attributes ?? []`}})}`;function buildExecutorArgsExpr(e,t){let n=`env: ${JSON.stringify(t)}`;switch(e){case`schedule`:return`({ ...args, appNamespace: args.namespaceName, ${Y}, ${n} })`;case`resolverExecuted`:return`({ ...args, appNamespace: args.namespaceName, ${Y}, success: !!args.succeeded, result: args.succeeded?.result.resolver, error: args.failed?.error, ${n} })`;case`incomingWebhook`:return`({ ...args, appNamespace: args.namespaceName, rawBody: args.raw_body, ${n} })`;case`workflowExecution`:case`workflowJobExecution`:return`({ ...args, event: args.eventType?.split(".").pop(), rawEvent: args.eventType, ${Y}, ...(args.succeeded ? { success: true } : args.failed ? { success: false, error: args.failed.error ?? "" } : {}), ${n} })`;default:return`({ ...args, event: args.eventType?.split(".").pop(), rawEvent: args.eventType, appNamespace: args.namespaceName, ${Y}, ${n} })`}}function buildResolverOperationHookExpr(e){return`({ ...context.pipeline, input: context.args, caller: ${yt}, env: ${JSON.stringify(e)} });`}function isSingleResolverCondition(e){return e.length===3&&typeof e[1]==`string`}function resolverPermissionOperandExpr(e){return typeof e==`object`?e.user===`_loggedIn`?`(context.caller !== null)`:e.user===`id`?`context.caller?.id`:`context.caller?.attributes?.[${JSON.stringify(e.user)}]`:JSON.stringify(e)}function isArbitraryAttributeOperand(e){return typeof e==`object`&&e.user!==`_loggedIn`}function resolverPermissionConditionExpr(e){let[t,n,r]=e,i=resolverPermissionOperandExpr(t),a=resolverPermissionOperandExpr(r);if(n===`!=`){let e=isArbitraryAttributeOperand(t)?i:isArbitraryAttributeOperand(r)?a:void 0;if(e)return`(${e} !== undefined && ${i} !== ${a})`}return`(${i} ${n===`=`?`===`:`!==`} ${a})`}function resolverPermissionPolicyExpr(e){let t=isSingleResolverCondition(e.conditions)?[e.conditions]:e.conditions;if(t.length===0)throw Error(`Resolver permission policy must have at least one condition, got an empty array.`);return t.map(resolverPermissionConditionExpr).join(` && `)}function policyEntryExpr(e){return`{ matched: ${resolverPermissionPolicyExpr(e)}, description: ${JSON.stringify(e.description??``)} }`}function buildResolverPermissionGuardExpr(e){if(!e||e===`allowAnonymous`)return;if(e.length===0)throw Error(`Resolver permission must have at least one policy, got an empty array.`);let t=e.filter(e=>e.permit===!1),n=e.filter(e=>e.permit!==!1);return`{
118
118
  const $denyPolicies = ${`[${t.map(policyEntryExpr).join(`, `)}]`};
119
119
  const $allowPolicies = ${`[${n.map(policyEntryExpr).join(`, `)}]`};
120
120
  const $matchedDeny = $denyPolicies.filter((p) => p.matched);
@@ -148,15 +148,15 @@ ${n.map(e=>` - ${e}`).join(`
148
148
  import _internalExecutor from "${e}";
149
149
 
150
150
  const __executor_function = async (args) => {
151
- const invoker = ${ht};
151
+ const invoker = ${St};
152
152
  return _internalExecutor.operation.body({ ...args, invoker });
153
153
  };
154
154
 
155
155
  export { __executor_function as main };
156
- `});return[t.name,n]});for(let[e,n]of l)t.set(e,n);return N.log(`${j.success(`Bundled`)} ${j.info(`"executor"`)}`),t}const _t={get:`GET`,post:`POST`,put:`PUT`,patch:`PATCH`,delete:`DELETE`},vt=Object.keys(_t),yt=/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,bt=R.strictObject({get:d.optional().describe(`Handler for GET requests`),post:d.optional().describe(`Handler for POST requests`),put:d.optional().describe(`Handler for PUT requests`),patch:d.optional().describe(`Handler for PATCH requests`),delete:d.optional().describe(`Handler for DELETE requests`)}).refine(e=>Object.values(e).some(e=>e!==void 0),`input must declare at least one HTTP method handler`).describe(`Per-method functions that transform HTTP requests to GraphQL requests`),xt=R.strictObject({name:R.string().regex(yt,`name must be 3-63 chars, lowercase alphanumeric with hyphens, not starting or ending with a hyphen`).describe(`Unique adapter name within the domain`),pathPattern:R.string().min(1).describe(`Path pattern with segment wildcards (trailing or single-segment)`),enabled:R.boolean().default(!0).describe(`Whether the adapter is active`),priority:R.number().int().min(0).default(0).describe(`Matching priority; the lowest value wins when multiple adapters match`),input:bt,output:d.optional().describe(`Function that transforms GraphQL response to HTTP response`)}),St=65536,Ct=262144,wt=ue(import.meta.url).resolve(`@0no-co/graphql.web`);async function bundleHttpAdapters(e,t,n,r=`DEBUG`,i,a){if(e.length===0)return{bundledInputs:/* @__PURE__ */ new Map,bundledOutputs:/* @__PURE__ */ new Map};N.newline(),N.log(`Bundling ${j.highlight(e.length.toString())} files for ${j.info(`"http-adapter"`)}`);let o=await resolveTSConfigWithFallback(t),s=await withBundleConcurrency(e.flatMap(e=>(e.hasOutput?[`input`,`output`]:[`input`]).map(t=>({adapter:e,kind:t}))),({adapter:e,kind:t})=>bundleAdapterScript(e,t,o,n,r,i,a)),c=/* @__PURE__ */ new Map,l=/* @__PURE__ */ new Map;for(let[e,t,n]of s)t===`input`?c.set(e,n):l.set(e,n);return N.log(`${j.success(`Bundled`)} ${j.info(`"http-adapter"`)}`),{bundledInputs:c,bundledOutputs:l}}async function bundleAdapterScript(e,t,n,r,i=`DEBUG`,a,o){let s=computeBundlerContextHash({sourceFile:e.sourceFile,extraContext:t===`input`?e.methods.join(`,`):``,tsconfig:n,inlineSourcemap:!1,bundleLogLevel:i,bundleTreeshake:o,prefix:`${t}:document-query-normalize-v1`}),{code:c}=await withCache({cache:r,kind:t===`input`?`http-adapter-input`:`http-adapter-output`,name:e.name,sourceFile:e.sourceFile,contextHash:s,async build(r,s){let c=L.resolve(e.sourceFile),l=t===`input`?buildInputEntry(c,e.methods,wt):buildOutputEntry(c),u=createVirtualEntry(`http-adapter:${e.name}:${t}`,l,`js`,c),d=[u.plugin,{name:`http-adapter-reject-node-imports`,resolveId(t){if(ie(t))throw Error(`HTTP adapter "${e.name}": ${re(t)}`);return null}},{name:`http-adapter-stub-sdk`,resolveId(e){return e===`@tailor-platform/sdk`||e.startsWith(`@tailor-platform/sdk/`)?{id:`\0http-adapter-sdk-stub`,moduleSideEffects:!1}:null},load(e){return e===`\0http-adapter-sdk-stub`?`export const createHttpAdapter = (cfg) => cfg;
156
+ `});return[t.name,n]});for(let[e,n]of l)t.set(e,n);return N.log(`${j.success(`Bundled`)} ${j.info(`"executor"`)}`),t}const Ct={get:`GET`,post:`POST`,put:`PUT`,patch:`PATCH`,delete:`DELETE`},wt=Object.keys(Ct),Tt=/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,Et=R.strictObject({get:d.optional().describe(`Handler for GET requests`),post:d.optional().describe(`Handler for POST requests`),put:d.optional().describe(`Handler for PUT requests`),patch:d.optional().describe(`Handler for PATCH requests`),delete:d.optional().describe(`Handler for DELETE requests`)}).refine(e=>Object.values(e).some(e=>e!==void 0),`input must declare at least one HTTP method handler`).describe(`Per-method functions that transform HTTP requests to GraphQL requests`),Dt=R.strictObject({name:R.string().regex(Tt,`name must be 3-63 chars, lowercase alphanumeric with hyphens, not starting or ending with a hyphen`).describe(`Unique adapter name within the domain`),pathPattern:R.string().min(1).describe(`Path pattern with segment wildcards (trailing or single-segment)`),enabled:R.boolean().default(!0).describe(`Whether the adapter is active`),priority:R.number().int().min(0).default(0).describe(`Matching priority; the lowest value wins when multiple adapters match`),input:Et,output:d.optional().describe(`Function that transforms GraphQL response to HTTP response`)}),Ot=65536,kt=262144,At=ue(import.meta.url).resolve(`@0no-co/graphql.web`);async function bundleHttpAdapters(e,t,n,r=`DEBUG`,i,a){if(e.length===0)return{bundledInputs:/* @__PURE__ */ new Map,bundledOutputs:/* @__PURE__ */ new Map};N.newline(),N.log(`Bundling ${j.highlight(e.length.toString())} files for ${j.info(`"http-adapter"`)}`);let o=await resolveTSConfigWithFallback(t),s=await withBundleConcurrency(e.flatMap(e=>(e.hasOutput?[`input`,`output`]:[`input`]).map(t=>({adapter:e,kind:t}))),({adapter:e,kind:t})=>bundleAdapterScript(e,t,o,n,r,i,a)),c=/* @__PURE__ */ new Map,l=/* @__PURE__ */ new Map;for(let[e,t,n]of s)t===`input`?c.set(e,n):l.set(e,n);return N.log(`${j.success(`Bundled`)} ${j.info(`"http-adapter"`)}`),{bundledInputs:c,bundledOutputs:l}}async function bundleAdapterScript(e,t,n,r,i=`DEBUG`,a,o){let s=computeBundlerContextHash({sourceFile:e.sourceFile,extraContext:t===`input`?e.methods.join(`,`):``,tsconfig:n,inlineSourcemap:!1,bundleLogLevel:i,bundleTreeshake:o,prefix:`${t}:document-query-normalize-v1`}),{code:c}=await withCache({cache:r,kind:t===`input`?`http-adapter-input`:`http-adapter-output`,name:e.name,sourceFile:e.sourceFile,contextHash:s,async build(r,s){let c=L.resolve(e.sourceFile),l=t===`input`?buildInputEntry(c,e.methods,At):buildOutputEntry(c),u=createVirtualEntry(`http-adapter:${e.name}:${t}`,l,`js`,c),d=[u.plugin,{name:`http-adapter-reject-node-imports`,resolveId(t){if(ie(t))throw Error(`HTTP adapter "${e.name}": ${re(t)}`);return null}},{name:`http-adapter-stub-sdk`,resolveId(e){return e===`@tailor-platform/sdk`||e.startsWith(`@tailor-platform/sdk/`)?{id:`\0http-adapter-sdk-stub`,moduleSideEffects:!1}:null},load(e){return e===`\0http-adapter-sdk-stub`?`export const createHttpAdapter = (cfg) => cfg;
157
157
  export default { createHttpAdapter };
158
- `:null}},createTsconfigPathsPlugin({onTsconfigRead:s,cache:a}),...r],f=createBundleLog({tsconfig:n}),p=await Se.build({input:u.input,write:!1,output:{format:`iife`,sourcemap:!1,minify:!0,codeSplitting:!1},tsconfig:n,plugins:d,transform:{target:`es2017`},treeshake:composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(i),createUserTreeshakeOptions(o)]),...f.options});f.assertAllResolved();let m=p.output[0].code,h=Buffer.byteLength(m,`utf8`);if(h>Ct)throw Error(`HTTP adapter "${e.name}" ${t} script is ${h} bytes, exceeding the ${Ct} byte limit`);return h>St&&N.warn(`HTTP adapter "${e.name}" ${t} script is ${h} bytes, larger than the recommended ${St} byte limit`),rejectAsyncInBundle(m,e.name,t),{code:m,packageRuntimeGlobals:{}}}});return[e.name,t,c]}function buildInputEntry(e,t,n){let r=t.map(e=>{let t=`__normalizeHttpAdapterGraphQLRequest(${`__adapter.input.${e}(req)`})`;return` case "${_t[e]}": return ${t};`}).join(`
159
- `),i=t.map(e=>_t[e]).join(`, `);return`${`import { print as __printHttpAdapterDocument } from ${JSON.stringify(n)};
158
+ `:null}},createTsconfigPathsPlugin({onTsconfigRead:s,cache:a}),...r],f=createBundleLog({tsconfig:n}),p=await Se.build({input:u.input,write:!1,output:{format:`iife`,sourcemap:!1,minify:!0,comments:it,codeSplitting:!1},tsconfig:n,plugins:d,transform:{target:`es2017`},treeshake:composeFunctionTreeshakeOptions([createLogLevelTreeshakeOptions(i),createUserTreeshakeOptions(o)]),...f.options});f.assertAllResolved();let m=p.output[0].code,h=Buffer.byteLength(m,`utf8`);if(h>kt)throw Error(`HTTP adapter "${e.name}" ${t} script is ${h} bytes, exceeding the ${kt} byte limit`);return h>Ot&&N.warn(`HTTP adapter "${e.name}" ${t} script is ${h} bytes, larger than the recommended ${Ot} byte limit`),rejectAsyncInBundle(m,e.name,t),{code:m,packageRuntimeGlobals:{}}}});return[e.name,t,c]}function buildInputEntry(e,t,n){let r=t.map(e=>{let t=`__normalizeHttpAdapterGraphQLRequest(${`__adapter.input.${e}(req)`})`;return` case "${Ct[e]}": return ${t};`}).join(`
159
+ `),i=t.map(e=>Ct[e]).join(`, `);return`${`import { print as __printHttpAdapterDocument } from ${JSON.stringify(n)};
160
160
  function __normalizeHttpAdapterGraphQLRequest(result) {
161
161
  if (!result || typeof result.query === "string") {
162
162
  return result;
@@ -172,20 +172,20 @@ ${r}
172
172
  };
173
173
  `}function buildOutputEntry(e){return`import __adapter from ${JSON.stringify(e)};
174
174
  globalThis.transform = __adapter.output;
175
- `}function rejectAsyncInBundle(e,t,n){let{program:r}=H(`${t}.${n}.bundle.js`,e),i=!1,a=[r];for(;a.length>0;){let e=a.pop();if(!e||typeof e!=`object`)continue;let t=e,n=typeof t.type==`string`?t.type:``;if(n===`AwaitExpression`||(n===`FunctionDeclaration`||n===`FunctionExpression`||n===`ArrowFunctionExpression`)&&t.async===!0||(n===`ForOfStatement`||n===`ForStatement`)&&t.await===!0){i=!0;break}for(let e of Object.keys(t)){let n=t[e];if(Array.isArray(n))for(let e of n)a.push(e);else n&&typeof n==`object`&&a.push(n)}}if(i)throw Error(`HTTP adapter "${t}" ${n} bundle contains async/await, which is unavailable in the gateway runtime. Check imported helper modules — even if your handler is synchronous, an async helper will fail at runtime.`)}function createHttpAdapterService(e){let{config:t,baseDir:n}=e,r=[],i=0,a=!1;return{config:t,get adapters(){return r},get fileCount(){return i},loadAdapters:async()=>{if(a)return;let e=await loadAdapterFiles(t,n);r=e.adapters,i=e.fileCount,a=!0},printLoadedAdapters:()=>{if(r.length!==0){N.newline(),N.log(`Found ${j.highlight(r.length.toString())} HTTP adapters`);for(let{adapter:e,sourceFile:t}of r){let n=L.relative(process.cwd(),t);N.debug(`HTTP adapter: ${j.successBright(`"${e.name}"`)} loaded from ${j.path(n)}`)}}}}}async function loadAdapterFiles(e,t){if(e.files.length===0)return{adapters:[],fileCount:0};let n=m(e,t),r=await Promise.all(n.map(loadAdapterFromFile)),i=[],a=/* @__PURE__ */ new Map;for(let e of r){if(!e)continue;let t=a.get(e.adapter.name);if(t)throw Error(`Duplicate HTTP adapter name "${e.adapter.name}" found:\n - ${t}\n - ${e.sourceFile}\nEach HTTP adapter must have a unique name.`);a.set(e.adapter.name,e.sourceFile),i.push(e)}return{adapters:i,fileCount:n.length}}async function loadAdapterFromFile(e){try{let n=await A(e);if(!t(n.default,`http-adapter`)){let r=Object.entries(n).find(([e,n])=>e!=="default"&&t(n,`http-adapter`));if(r)throw c({kind:`http-adapter`,file:e,exportName:r[0]});return null}let r=xt.safeParse(n.default);if(!r.success)throw k({kind:`http-adapter`,file:e,exportName:`default`,error:r.error});let i=r.data,a=collectMethodKeys(i);return rejectAsyncHandlers(i,a,e),{adapter:i,sourceFile:e,methods:a,hasOutput:i.output!==void 0}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`${j.error(`Failed to load HTTP adapter from`)} ${j.errorBright(n)}`),N.error(String(t)),t}}function collectMethodKeys(e){let t=e.input;return vt.filter(e=>typeof t[e]==`function`)}function rejectAsyncHandlers(e,t,n){let r=e.input;for(let i of t)if(isAsyncFunction(r[i]))throw Error(`HTTP adapter "${e.name}" in ${n} has an async \`input.${i}\` function. Handlers must be synchronous; async/await is not supported.`);if(e.output!==void 0&&isAsyncFunction(e.output))throw Error(`HTTP adapter "${e.name}" in ${n} has an async \`output\` function. Handlers must be synchronous; async/await is not supported.`)}function isAsyncFunction(e){return typeof e==`function`&&e.constructor.name===`AsyncFunction`}const Tt=R.union([R.literal(`query`),R.literal(`mutation`)]).describe(`GraphQL operation type`),Et=R.union([R.strictObject({user:R.string()}),R.string(),R.boolean()]),Dt=R.union([R.literal(`=`),R.literal(`!=`)]),isUserOperand=e=>typeof e==`object`,Ot={_loggedIn:`boolean`,id:`string`},operandTypeMismatch=(e,t)=>{if(typeof e!=`object`)return;let n=Ot[e.user];if(n!==void 0&&typeof t!=`object`&&typeof t!==n)return{key:e.user,expected:n}},kt=R.tuple([Et,Dt,Et]).refine(([e,,t])=>isUserOperand(e)!==isUserOperand(t),"Resolver permission condition must reference a `user` operand on exactly one side (comparing two `user` operands to each other can match on `undefined === undefined`)").superRefine(([e,,t],n)=>{for(let r of[operandTypeMismatch(e,t),operandTypeMismatch(t,e)])r&&n.addIssue({code:`custom`,message:`\`${r.key}\` must compare to a ${r.expected}`})}).readonly(),At=R.strictObject({conditions:R.union([kt,R.array(kt).min(1,`Resolver permission policy must have at least one condition`).readonly()]),permit:R.boolean(),description:R.string().optional().describe(`Reason recorded for this policy, used in the access-denied error message`)}),jt=R.union([R.array(At).min(1,`Resolver permission must have at least one policy`).refine(e=>e.some(e=>e.permit===!0),"Resolver permission must include at least one `permit: true` policy — a policy array with only `permit: false` policies still lets any caller through by simply not authenticating, since none of the deny conditions apply to a caller with no user attributes at all").readonly(),R.literal(`allowAnonymous`)]).describe('Access requirement for this resolver, evaluated against the original caller (unaffected by `invoker`) before `body` runs. "allowAnonymous" documents that anonymous callers are allowed. Omitted (default): unchanged, anonymous callers can reach the resolver'),Mt=R.strictObject({operation:Tt.describe(`GraphQL operation type (query or mutation)`),name:R.string().describe(`Resolver name`),description:R.string().optional().describe(`Resolver description`),input:R.record(R.string(),E).optional().describe(`Input field definitions`),body:d.describe(`Resolver implementation function`),output:E.describe(`Output field definition`),publishEvents:R.boolean().optional().describe(`Enable publishing events from this resolver`),invoker:w.optional().describe(`Machine user to execute this resolver as`),permission:jt.optional()});async function loadResolver(e){let t=(await A(e)).default,n=Mt.safeParse(t);return n.success?n.data:null}async function bundleResolvers(e){let{namespace:t,files:n,baseDir:r,defaultPermission:i,allowedRuntimeGlobals:a,dateDefault:o=`legacy`}=e,s=/* @__PURE__ */ new Map;if(n.length===0)return s;N.newline(),N.log(`Bundling ${j.highlight(n.length.toString())} files for ${j.info(`"${t}"`)}`);let c=[];for(let e of n){let t=await loadResolver(e);t?c.push({name:t.name,sourceFile:e,permission:t.permission,input:t.input,output:t.output}):N.debug(` Skipping: ${e} (could not be loaded)`)}let l=await resolveTSConfigWithFallback(r),u=await withBundleConcurrency(c,async n=>{let r=await buildFunctionBundle({...e,kind:`resolver`,namespace:t,name:n.name,sourceFile:n.sourceFile,tsconfig:l,dateDefault:o,dateRepresentations:resolverDateRepresentations(n,o),runtimeGlobals:{label:`Resolver "${n.name}"`,allowed:a},entry:e=>{let t=buildResolverValidatedInputExpr({permission:n.permission,defaultPermission:i}),{importStatement:r,resultExpr:a}=buildResolverResultSerialization(n.output,o);return I`
175
+ `}function rejectAsyncInBundle(e,t,n){let{program:r}=H(`${t}.${n}.bundle.js`,e),i=!1,a=[r];for(;a.length>0;){let e=a.pop();if(!e||typeof e!=`object`)continue;let t=e,n=typeof t.type==`string`?t.type:``;if(n===`AwaitExpression`||(n===`FunctionDeclaration`||n===`FunctionExpression`||n===`ArrowFunctionExpression`)&&t.async===!0||(n===`ForOfStatement`||n===`ForStatement`)&&t.await===!0){i=!0;break}for(let e of Object.keys(t)){let n=t[e];if(Array.isArray(n))for(let e of n)a.push(e);else n&&typeof n==`object`&&a.push(n)}}if(i)throw Error(`HTTP adapter "${t}" ${n} bundle contains async/await, which is unavailable in the gateway runtime. Check imported helper modules — even if your handler is synchronous, an async helper will fail at runtime.`)}function createHttpAdapterService(e){let{config:t,baseDir:n}=e,r=[],i=0,a=!1;return{config:t,get adapters(){return r},get fileCount(){return i},loadAdapters:async()=>{if(a)return;let e=await loadAdapterFiles(t,n);r=e.adapters,i=e.fileCount,a=!0},printLoadedAdapters:()=>{if(r.length!==0){N.newline(),N.log(`Found ${j.highlight(r.length.toString())} HTTP adapters`);for(let{adapter:e,sourceFile:t}of r){let n=L.relative(process.cwd(),t);N.debug(`HTTP adapter: ${j.successBright(`"${e.name}"`)} loaded from ${j.path(n)}`)}}}}}async function loadAdapterFiles(e,t){if(e.files.length===0)return{adapters:[],fileCount:0};let n=m(e,t),r=await Promise.all(n.map(loadAdapterFromFile)),i=[],a=/* @__PURE__ */ new Map;for(let e of r){if(!e)continue;let t=a.get(e.adapter.name);if(t)throw Error(`Duplicate HTTP adapter name "${e.adapter.name}" found:\n - ${t}\n - ${e.sourceFile}\nEach HTTP adapter must have a unique name.`);a.set(e.adapter.name,e.sourceFile),i.push(e)}return{adapters:i,fileCount:n.length}}async function loadAdapterFromFile(e){try{let n=await A(e);if(!t(n.default,`http-adapter`)){let r=Object.entries(n).find(([e,n])=>e!=="default"&&t(n,`http-adapter`));if(r)throw c({kind:`http-adapter`,file:e,exportName:r[0]});return null}let r=Dt.safeParse(n.default);if(!r.success)throw k({kind:`http-adapter`,file:e,exportName:`default`,error:r.error});let i=r.data,a=collectMethodKeys(i);return rejectAsyncHandlers(i,a,e),{adapter:i,sourceFile:e,methods:a,hasOutput:i.output!==void 0}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`${j.error(`Failed to load HTTP adapter from`)} ${j.errorBright(n)}`),N.error(String(t)),t}}function collectMethodKeys(e){let t=e.input;return wt.filter(e=>typeof t[e]==`function`)}function rejectAsyncHandlers(e,t,n){let r=e.input;for(let i of t)if(isAsyncFunction(r[i]))throw Error(`HTTP adapter "${e.name}" in ${n} has an async \`input.${i}\` function. Handlers must be synchronous; async/await is not supported.`);if(e.output!==void 0&&isAsyncFunction(e.output))throw Error(`HTTP adapter "${e.name}" in ${n} has an async \`output\` function. Handlers must be synchronous; async/await is not supported.`)}function isAsyncFunction(e){return typeof e==`function`&&e.constructor.name===`AsyncFunction`}const jt=R.union([R.literal(`query`),R.literal(`mutation`)]).describe(`GraphQL operation type`),Mt=R.union([R.strictObject({user:R.string()}),R.string(),R.boolean()]),Nt=R.union([R.literal(`=`),R.literal(`!=`)]),isUserOperand=e=>typeof e==`object`,Pt={_loggedIn:`boolean`,id:`string`},operandTypeMismatch=(e,t)=>{if(typeof e!=`object`)return;let n=Pt[e.user];if(n!==void 0&&typeof t!=`object`&&typeof t!==n)return{key:e.user,expected:n}},Ft=R.tuple([Mt,Nt,Mt]).refine(([e,,t])=>isUserOperand(e)!==isUserOperand(t),"Resolver permission condition must reference a `user` operand on exactly one side (comparing two `user` operands to each other can match on `undefined === undefined`)").superRefine(([e,,t],n)=>{for(let r of[operandTypeMismatch(e,t),operandTypeMismatch(t,e)])r&&n.addIssue({code:`custom`,message:`\`${r.key}\` must compare to a ${r.expected}`})}).readonly(),It=R.strictObject({conditions:R.union([Ft,R.array(Ft).min(1,`Resolver permission policy must have at least one condition`).readonly()]),permit:R.boolean(),description:R.string().optional().describe(`Reason recorded for this policy, used in the access-denied error message`)}),Lt=R.union([R.array(It).min(1,`Resolver permission must have at least one policy`).refine(e=>e.some(e=>e.permit===!0),"Resolver permission must include at least one `permit: true` policy — a policy array with only `permit: false` policies still lets any caller through by simply not authenticating, since none of the deny conditions apply to a caller with no user attributes at all").readonly(),R.literal(`allowAnonymous`)]).describe('Access requirement for this resolver, evaluated against the original caller (unaffected by `invoker`) before `body` runs. "allowAnonymous" documents that anonymous callers are allowed. Omitted (default): unchanged, anonymous callers can reach the resolver'),Rt=R.strictObject({operation:jt.describe(`GraphQL operation type (query or mutation)`),name:R.string().describe(`Resolver name`),description:R.string().optional().describe(`Resolver description`),input:R.record(R.string(),E).optional().describe(`Input field definitions`),body:d.describe(`Resolver implementation function`),output:E.describe(`Output field definition`),publishEvents:R.boolean().optional().describe(`Enable publishing events from this resolver`),invoker:w.optional().describe(`Machine user to execute this resolver as`),permission:Lt.optional()});async function loadResolver(e){let t=(await A(e)).default,n=Rt.safeParse(t);return n.success?n.data:null}async function bundleResolvers(e){let{namespace:t,files:n,baseDir:r,defaultPermission:i,allowedRuntimeGlobals:a,dateDefault:o=`legacy`}=e,s=/* @__PURE__ */ new Map;if(n.length===0)return s;N.newline(),N.log(`Bundling ${j.highlight(n.length.toString())} files for ${j.info(`"${t}"`)}`);let c=[];for(let e of n){let t=await loadResolver(e);t?c.push({name:t.name,sourceFile:e,permission:t.permission,input:t.input,output:t.output}):N.debug(` Skipping: ${e} (could not be loaded)`)}let l=await resolveTSConfigWithFallback(r),u=await withBundleConcurrency(c,async n=>{let r=await buildFunctionBundle({...e,kind:`resolver`,namespace:t,name:n.name,sourceFile:n.sourceFile,tsconfig:l,dateDefault:o,dateRepresentations:resolverDateRepresentations(n,o),runtimeGlobals:{label:`Resolver "${n.name}"`,allowed:a},entry:e=>{let t=buildResolverValidatedInputExpr({permission:n.permission,defaultPermission:i}),{importStatement:r,resultExpr:a}=buildResolverResultSerialization(n.output,o);return I`
176
176
  import _internalResolver from "${e}";
177
177
  import { t } from "@tailor-platform/sdk";
178
178
  ${r}
179
179
 
180
180
  const $tailor_resolver_body = async (context) => {
181
- const invoker = ${ht};
181
+ const invoker = ${St};
182
182
  const input = ${t};
183
183
  const result = await _internalResolver.body({ ...context, input, invoker });
184
184
  return ${a};
185
185
  };
186
186
 
187
187
  export { $tailor_resolver_body as main };
188
- `}});return[n.name,r]});for(let[e,t]of u)s.set(e,t);return N.log(`${j.success(`Bundled`)} ${j.info(`"${t}"`)}`),s}function parseResolverDefaultPermission(e){let{namespace:t,config:n}=e;if(n.defaultPermission===void 0)return;let r=jt.safeParse(n.defaultPermission);if(!r.success)throw Error(`Invalid \`defaultPermission\` for resolver namespace "${t}": `+r.error.issues.map(e=>e.message).join(`; `));return r.data}function resolveResolverDefaultPermissionForFile(e){let{config:t,filePath:n,baseDir:r}=e;if(!t)return;let i=L.resolve(n),a=[];for(let[e,n]of Object.entries(t))`external`in n||m(n,r).some(e=>L.resolve(e)===i)&&a.push({namespace:e,config:n});if(a.length>1)throw Error(`Resolver ${L.relative(process.cwd(),i)} matches more than one resolver namespace: ${a.map(e=>`"${e.namespace}"`).join(`, `)}. Each namespace applies its own \`defaultPermission\`, so narrow the \`files\`/\`ignores\` patterns until exactly one namespace claims this file.`);let[o]=a;return o?parseResolverDefaultPermission(o):void 0}let X=null;const getDistDir=()=>{let e=process.env.TAILOR_BUILD_OUTPUT_DIR;return e&&e!==X?X=e:X===null&&(X=e||`.tailor`),X},Nt=Mt.extend({body:R.string()});function generatePluginResolverFiles(e,t,n,r){let i=L.resolve(getDistDir(),`plugin`,`resolvers`,be(`sha256`).update(JSON.stringify([e,t])).digest(`hex`));return z.rmSync(i,{recursive:!0,force:!0}),r.map((e,t)=>{let{resolver:r,pluginId:a,namespace:o,sourceTableName:s}=e,c=`plugin "${a}" in namespace "${o}"${s?` on table "${s}"`:``}`,d={kind:`resolver`,file:n,pluginId:a,namespace:o,sourceTableName:s,resolverName:r.name},f=Nt.safeParse({name:r.name,operation:r.operation,input:r.inputFields,output:{type:`nested`,metadata:{required:!0},fields:r.outputFields},body:r.body});if(!f.success){let e=u(f.error.issues).map(e=>{let[t,...n]=e.path,r=t===`input`?[`inputFields`,...n]:t===`output`?[`outputFields`,...n.slice(1)]:e.path;return{...e,path:r}});throw F({code:`DEFINITION_INVALID`,message:`Invalid resolver "${r.name}" from ${c}:\n${l(e)}`,context:{...d,issues:e}})}let p;try{p=`
188
+ `}});return[n.name,r]});for(let[e,t]of u)s.set(e,t);return N.log(`${j.success(`Bundled`)} ${j.info(`"${t}"`)}`),s}function parseResolverDefaultPermission(e){let{namespace:t,config:n}=e;if(n.defaultPermission===void 0)return;let r=Lt.safeParse(n.defaultPermission);if(!r.success)throw Error(`Invalid \`defaultPermission\` for resolver namespace "${t}": `+r.error.issues.map(e=>e.message).join(`; `));return r.data}function resolveResolverDefaultPermissionForFile(e){let{config:t,filePath:n,baseDir:r}=e;if(!t)return;let i=L.resolve(n),a=[];for(let[e,n]of Object.entries(t))`external`in n||m(n,r).some(e=>L.resolve(e)===i)&&a.push({namespace:e,config:n});if(a.length>1)throw Error(`Resolver ${L.relative(process.cwd(),i)} matches more than one resolver namespace: ${a.map(e=>`"${e.namespace}"`).join(`, `)}. Each namespace applies its own \`defaultPermission\`, so narrow the \`files\`/\`ignores\` patterns until exactly one namespace claims this file.`);let[o]=a;return o?parseResolverDefaultPermission(o):void 0}let X=null;const getDistDir=()=>{let e=process.env.TAILOR_BUILD_OUTPUT_DIR;return e&&e!==X?X=e:X===null&&(X=e||`.tailor`),X},zt=Rt.extend({body:R.string()});function generatePluginResolverFiles(e,t,n,r){let i=L.resolve(getDistDir(),`plugin`,`resolvers`,be(`sha256`).update(JSON.stringify([e,t])).digest(`hex`));return z.rmSync(i,{recursive:!0,force:!0}),r.map((e,t)=>{let{resolver:r,pluginId:a,namespace:o,sourceTableName:s}=e,c=`plugin "${a}" in namespace "${o}"${s?` on table "${s}"`:``}`,d={kind:`resolver`,file:n,pluginId:a,namespace:o,sourceTableName:s,resolverName:r.name},f=zt.safeParse({name:r.name,operation:r.operation,input:r.inputFields,output:{type:`nested`,metadata:{required:!0},fields:r.outputFields},body:r.body});if(!f.success){let e=u(f.error.issues).map(e=>{let[t,...n]=e.path,r=t===`input`?[`inputFields`,...n]:t===`output`?[`outputFields`,...n.slice(1)]:e.path;return{...e,path:r}});throw F({code:`DEFINITION_INVALID`,message:`Invalid resolver "${r.name}" from ${c}:\n${l(e)}`,context:{...d,issues:e}})}let p;try{p=`
189
189
  const $tailor_plugin_field = (type, metadata, fields) => ({ type, metadata, _metadata: metadata, fields });
190
190
  export default {
191
191
  name: ${JSON.stringify(f.data.name)},
@@ -193,15 +193,15 @@ globalThis.transform = __adapter.output;
193
193
  input: ${f.data.input===void 0?`undefined`:serializeFields(f.data.input)},
194
194
  output: ${serializeField(f.data.output)},
195
195
  body: async (context) => {\n${r.body}\n}
196
- };\n`}catch(e){let t=e instanceof Error?e.message:String(e);throw F({code:`PLUGIN_RESOLVER_INVALID`,message:`Invalid resolver "${r.name}" from ${c}: ${t}`,context:d,cause:e})}let m=L.resolve(i,`${t}-${encodeURIComponent(a)}-${encodeURIComponent(r.name)}-${be(`sha256`).update(p).digest(`hex`)}.ts`),{errors:h}=H(m,p);if(h.length>0)throw F({code:`PLUGIN_RESOLVER_INVALID`,message:`Invalid JavaScript for resolver "${r.name}" from ${c}: ${h.map(e=>e.message).join(`; `)}`,details:`Generated code:\n${p}`,context:{...d,issues:h.map(e=>({path:[`body`],message:e.message}))}});return z.mkdirSync(L.dirname(m),{recursive:!0}),z.writeFileSync(m,p),m})}function serializeFields(e){return`{${Object.entries(e).map(([e,t])=>`[${JSON.stringify(e)}]:${serializeField(t)}`).join(`,`)}}`}function serializeField(e){let t=serializeValue(e.metadata);return`$tailor_plugin_field(${JSON.stringify(e.type)},${t},${serializeFields(e.fields)})`}function serializeValue(e){if(typeof e==`function`){let t=`(${stringifyFunction(e)})`,n=findUndefinedReferences(t,{includeGuardedReferences:!0});if(n.size>0)throw Error(`Field functions must be self-contained; unresolved references: ${[...n].join(`, `)}.`);return t}if(e===void 0)return`undefined`;if(e instanceof Date)return`new Date(${JSON.stringify(e.toISOString())})`;if(Array.isArray(e))return`[${e.map(serializeValue).join(`,`)}]`;if(typeof e==`object`&&e)return`{${Object.entries(e).map(([e,t])=>`[${JSON.stringify(e)}]:${serializeValue(t)}`).join(`,`)}}`;if(typeof e==`symbol`)throw Error(`Plugin resolver fields contain an unsupported value.`);return JSON.stringify(e)}function createResolverService(e,n,r,i){let a={},o=parseResolverDefaultPermission({namespace:e,config:n}),s=!1,loadResolverForFile=async e=>{try{let n=await A(e),r=Mt.safeParse(n.default);if(r.success){let t=L.relative(process.cwd(),e);return N.debug(`Resolver: ${j.successBright(`"${r.data.name}"`)} loaded from ${j.path(t)}`),a[e]=r.data,r.data}if(t(n.default,`resolver`))throw k({kind:`resolver`,file:e,exportName:`default`,error:r.error})}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`Failed to load resolver from ${j.bold(n)}`),N.error(String(t)),t}};return{namespace:e,config:n,defaultPermission:o,get resolvers(){return a},loadResolvers:async()=>{if(s)return;let t=i?generatePluginResolverFiles(i.appName,e,i.configPath,i.pluginManager.getPluginGeneratedResolvers().filter(t=>t.namespace===e)):[],c=m(n,r),l=[.../* @__PURE__ */ new Set([...c,...t])];N.log(`Found ${j.highlight(l.length.toString())} resolver files for service ${j.highlight(`"${e}"`)}`);let u=n.files.length>0&&c.length===0;if(u||l.length===0){let t=u?` matching ${n.files.join(`, `)}`:``;N.warn(`No resolver files found for namespace "${e}"${t}`)}await Promise.all(l.map(e=>loadResolverForFile(e))),assertUniqueResolverNames(a,e),warnUndeclaredPermissions({namespace:e,defaultPermission:o,resolvers:a}),s=!0}}}function warnUndeclaredPermissions(e){let{namespace:t,defaultPermission:n,resolvers:r}=e;if(n!==void 0)return;let i=Object.values(r),a=i.filter(e=>e.permission===void 0);if(a.length===0)return;N.warn(`Resolver namespace ${j.highlight(`"${t}"`)}: ${a.length} of ${i.length} resolvers declare no \`permission\`, so anonymous callers can reach them. Set \`defaultPermission\` on the namespace, or declare \`permission\` on each resolver ("allowAnonymous" if public access is intended).`);let o=a.map(e=>e.name).toSorted();N.debug(` Resolvers without \`permission\`: ${o.join(`, `)}`)}function assertUniqueResolverNames(e,t){let n=/* @__PURE__ */ new Map;for(let[r,i]of Object.entries(e)){let e=L.relative(process.cwd(),r),a=n.get(i.name);if(a)throw Error(`Duplicate resolver name "${i.name}" found in namespace "${t}":\n - ${a}\n - ${e}\nEach resolver must have a unique name within a namespace.`);n.set(i.name,e)}}function findVariableDeclarationsByName(e){let t=/* @__PURE__ */ new Map;for(let n of e.body){let e=n.type===`ExportNamedDeclaration`?n.declaration:n;if(e?.type!==`VariableDeclaration`)continue;let r=e;for(let e of r.declarations)e.id.type===`Identifier`&&t.set(e.id.name,{start:n.start,end:n.end})}return t}function findWorkflowDefaultExport(e){let t=collectSdkBindings(e,`createWorkflow`);for(let n of e.body)if(n.type===`ExportDefaultDeclaration`){let e=n,r=e.declaration;if(isSdkFunctionCall(r,t,`createWorkflow`)||r.type===`Identifier`)return{start:e.start,end:e.end}}return null}function transformWorkflowSource(e,t,n,r){let{program:i}=H(`input.ts`,e),a=findAllJobs(i,e);if(!a.some(e=>e.name===t))return e;let o=findVariableDeclarationsByName(i),s=[],c=/* @__PURE__ */ new Set;for(let n of a)if(n.name!==t){if(n.statementRange&&!c.has(n.statementRange.start)){let t=findStatementEnd(e,n.statementRange.end);c.add(n.statementRange.start),s.push({start:n.statementRange.start,end:t,text:``})}else n.statementRange||(c.add(n.bodyValueRange.start),s.push({start:n.bodyValueRange.start,end:n.bodyValueRange.end,text:`() => {}`}))}if(r)for(let t of r){if(t===n)continue;let r=o.get(t);if(r&&!c.has(r.start)){let t=findStatementEnd(e,r.end);c.add(r.start),s.push({start:r.start,end:t,text:``})}}let l=findWorkflowDefaultExport(i);if(l&&!c.has(l.start)){let t=findStatementEnd(e,l.end);c.add(l.start),s.push({start:l.start,end:t,text:``})}return applyReplacements(e,s)}function safeRealpath(e){let t=L.resolve(e);try{return z.realpathSync(t)}catch(e){return N.debug(`realpathSync failed for ${t}: ${e instanceof Error?e.message:e}`),t}}var WorkflowJobDetectionError=class extends Error{};function isExecJobFunctionCallee(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`MemberExpression`)return!1;let n=t.property;if(n?.type!==`Identifier`||n.name!==`execJobFunction`)return!1;let r=t.object;if(r?.type!==`MemberExpression`)return!1;let i=r.property;if(i?.type!==`Identifier`||i.name!==`workflow`)return!1;let a=r.object;return a?.type===`Identifier`&&a.name===`tailor`}function extractStaticStringValue(e){if(!e||typeof e!=`object`)return;let t=e;if(t.type===`Literal`&&typeof t.value==`string`)return t.value;if(t.type===`TemplateLiteral`){let e=t.quasis,n=t.expressions;if(e?.length===1&&(n?.length??0)===0)return e[0]?.value?.cooked}}const Pt=/* @__PURE__ */ new Set([`@tailor-platform/sdk/runtime`,`@tailor-platform/sdk/runtime/workflow`]);function collectRuntimeWorkflowImportBindings(e){let t=/* @__PURE__ */ new Set;for(let n of e.body??[]){if(n.type!==`ImportDeclaration`||n.importKind===`type`)continue;let e=n.source;if(typeof e?.value==`string`&&Pt.has(e.value))for(let e of n.specifiers??[]){if(e.type!==`ImportSpecifier`||e.importKind===`type`)continue;let n=getModuleExportName(e.imported),r=getModuleExportName(e.local);n===`workflow`&&r&&t.add(r)}}return t}function isDirectExecJobFunctionCallee(e,t){if(isExecJobFunctionCallee(e))return!0;if(!e||typeof e!=`object`)return!1;let n=e;if(n.type!==`MemberExpression`)return!1;let r=n.property;if(r?.type!==`Identifier`||r.name!==`execJobFunction`)return!1;let i=n.object;return i?.type===`Identifier`&&t.has(i.name)}function findDirectExecJobFunctionCalls(e){let t=collectRuntimeWorkflowImportBindings(e),n=[];function walk(e){if(e&&typeof e==`object`){if(e.type===`CallExpression`&&isDirectExecJobFunctionCallee(e.callee,t)){let t=e.arguments;n.push({targetName:extractStaticStringValue(t?.[0])})}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}}return walk(e),n}function buildDirectExecJobFunctionErrorMessage(e,t){return t.targetName===void 0?`Workflow file ${e} calls execJobFunction(...) directly with a job name that isn't a string literal, so the target can't be resolved at build time. Call the target job's own .start(...) method from inside a job body instead of calling execJobFunction directly.`:`Workflow file ${e} calls execJobFunction("${t.targetName}", ...) directly. A direct call is never recognized as a dependency, so "${t.targetName}" would silently be dropped from the bundle unless something else happens to reference it. Call the "${t.targetName}" job's .start(...) method from inside a job body instead.`}function collectExecJobFunctionTargets(e){let{program:t,errors:n}=H(`input.js`,e);if(n.length>0)throw new WorkflowJobDetectionError(`Failed to parse bundled job code while checking for missed dependencies: ${n.map(e=>e.message).join(`; `)}`);let r=[];function walk(e){if(e&&typeof e==`object`){if(e.type===`CallExpression`&&isExecJobFunctionCallee(e.callee)){let t=e.arguments,n=extractStaticStringValue(t?.[0]);n!==void 0&&r.push(n)}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}}return walk(t),r}function validateBundledDependencies(e,t){let n=new Set(t);for(let[t,r]of e){let e;try{e=collectExecJobFunctionTargets(r)}catch(e){throw new WorkflowJobDetectionError(`Failed to check the bundled output of workflow job "${t}" for missed dependencies: ${e instanceof Error?e.message:String(e)}`)}for(let r of e)if(!n.has(r))throw new WorkflowJobDetectionError(`Workflow job "${t}" calls execJobFunction("${r}", ...) — usually the result of a rewritten "${r}" job .start() call — but "${r}" was not detected as a dependency and is not included in the bundle. Call the "${r}" job's .start() method from inside the body of workflow job "${t}" (a nested function inside body works too), or make sure the file containing the call is covered by the workflow service's "files" pattern.`)}}async function bundleWorkflowJobs(e){let{allJobs:t,mainJobNames:n,env:r={},startContext:i,baseDir:a,previousUsedJobs:o,allowedRuntimeGlobals:s}=e,c=t.map(e=>e.sourceFile),l=hashReachabilitySourceFiles([...c,...collectExtraStartCallFiles(c,i)]);if(t.length===0)return N.warn(`No workflow jobs to bundle`),{mainJobDeps:{},usedJobNames:[],bundledCode:/* @__PURE__ */ new Map,sourceFileState:l};let u,d;if(o&&o.sourceFileState===l){let e=new Set(o.usedJobNames);u=t.filter(t=>e.has(t.name)),d=o.mainJobDeps}else({usedJobs:u,mainJobDeps:d}=await filterUsedJobs(t,n,i));N.newline(),N.log(`Bundling ${j.highlight(u.length.toString())} files for ${j.info(`"workflow-job"`)}`);let f=await resolveTSConfigWithFallback(a),p=await withBundleConcurrency(u,async t=>{let n=await buildFunctionBundle({...e,kind:`workflow-job`,name:t.name,sourceFile:t.sourceFile,tsconfig:f,runtimeGlobals:{label:`Workflow job "${t.name}"`,allowed:s},createTransformPlugin:()=>createWorkflowTransformPlugin(t,u,i),entry:e=>I`
196
+ };\n`}catch(e){let t=e instanceof Error?e.message:String(e);throw F({code:`PLUGIN_RESOLVER_INVALID`,message:`Invalid resolver "${r.name}" from ${c}: ${t}`,context:d,cause:e})}let m=L.resolve(i,`${t}-${encodeURIComponent(a)}-${encodeURIComponent(r.name)}-${be(`sha256`).update(p).digest(`hex`)}.ts`),{errors:h}=H(m,p);if(h.length>0)throw F({code:`PLUGIN_RESOLVER_INVALID`,message:`Invalid JavaScript for resolver "${r.name}" from ${c}: ${h.map(e=>e.message).join(`; `)}`,details:`Generated code:\n${p}`,context:{...d,issues:h.map(e=>({path:[`body`],message:e.message}))}});return z.mkdirSync(L.dirname(m),{recursive:!0}),z.writeFileSync(m,p),m})}function serializeFields(e){return`{${Object.entries(e).map(([e,t])=>`[${JSON.stringify(e)}]:${serializeField(t)}`).join(`,`)}}`}function serializeField(e){let t=serializeValue(e.metadata);return`$tailor_plugin_field(${JSON.stringify(e.type)},${t},${serializeFields(e.fields)})`}function serializeValue(e){if(typeof e==`function`){let t=`(${stringifyFunction(e)})`,n=findUndefinedReferences(t,{includeGuardedReferences:!0});if(n.size>0)throw Error(`Field functions must be self-contained; unresolved references: ${[...n].join(`, `)}.`);return t}if(e===void 0)return`undefined`;if(e instanceof Date)return`new Date(${JSON.stringify(e.toISOString())})`;if(Array.isArray(e))return`[${e.map(serializeValue).join(`,`)}]`;if(typeof e==`object`&&e)return`{${Object.entries(e).map(([e,t])=>`[${JSON.stringify(e)}]:${serializeValue(t)}`).join(`,`)}}`;if(typeof e==`symbol`)throw Error(`Plugin resolver fields contain an unsupported value.`);return JSON.stringify(e)}function createResolverService(e,n,r,i){let a={},o=parseResolverDefaultPermission({namespace:e,config:n}),s=!1,loadResolverForFile=async e=>{try{let n=await A(e),r=Rt.safeParse(n.default);if(r.success){let t=L.relative(process.cwd(),e);return N.debug(`Resolver: ${j.successBright(`"${r.data.name}"`)} loaded from ${j.path(t)}`),a[e]=r.data,r.data}if(t(n.default,`resolver`))throw k({kind:`resolver`,file:e,exportName:`default`,error:r.error})}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`Failed to load resolver from ${j.bold(n)}`),N.error(String(t)),t}};return{namespace:e,config:n,defaultPermission:o,get resolvers(){return a},loadResolvers:async()=>{if(s)return;let t=i?generatePluginResolverFiles(i.appName,e,i.configPath,i.pluginManager.getPluginGeneratedResolvers().filter(t=>t.namespace===e)):[],c=m(n,r),l=[.../* @__PURE__ */ new Set([...c,...t])];N.log(`Found ${j.highlight(l.length.toString())} resolver files for service ${j.highlight(`"${e}"`)}`);let u=n.files.length>0&&c.length===0;if(u||l.length===0){let t=u?` matching ${n.files.join(`, `)}`:``;N.warn(`No resolver files found for namespace "${e}"${t}`)}await Promise.all(l.map(e=>loadResolverForFile(e))),assertUniqueResolverNames(a,e),warnUndeclaredPermissions({namespace:e,defaultPermission:o,resolvers:a}),s=!0}}}function warnUndeclaredPermissions(e){let{namespace:t,defaultPermission:n,resolvers:r}=e;if(n!==void 0)return;let i=Object.values(r),a=i.filter(e=>e.permission===void 0);if(a.length===0)return;N.warn(`Resolver namespace ${j.highlight(`"${t}"`)}: ${a.length} of ${i.length} resolvers declare no \`permission\`, so anonymous callers can reach them. Set \`defaultPermission\` on the namespace, or declare \`permission\` on each resolver ("allowAnonymous" if public access is intended).`);let o=a.map(e=>e.name).toSorted();N.debug(` Resolvers without \`permission\`: ${o.join(`, `)}`)}function assertUniqueResolverNames(e,t){let n=/* @__PURE__ */ new Map;for(let[r,i]of Object.entries(e)){let e=L.relative(process.cwd(),r),a=n.get(i.name);if(a)throw Error(`Duplicate resolver name "${i.name}" found in namespace "${t}":\n - ${a}\n - ${e}\nEach resolver must have a unique name within a namespace.`);n.set(i.name,e)}}function findVariableDeclarationsByName(e){let t=/* @__PURE__ */ new Map;for(let n of e.body){let e=n.type===`ExportNamedDeclaration`?n.declaration:n;if(e?.type!==`VariableDeclaration`)continue;let r=e;for(let e of r.declarations)e.id.type===`Identifier`&&t.set(e.id.name,{start:n.start,end:n.end})}return t}function findWorkflowDefaultExport(e){let t=collectSdkBindings(e,`createWorkflow`);for(let n of e.body)if(n.type===`ExportDefaultDeclaration`){let e=n,r=e.declaration;if(isSdkFunctionCall(r,t,`createWorkflow`)||r.type===`Identifier`)return{start:e.start,end:e.end}}return null}function transformWorkflowSource(e,t,n,r){let{program:i}=H(`input.ts`,e),a=findAllJobs(i,e);if(!a.some(e=>e.name===t))return e;let o=findVariableDeclarationsByName(i),s=[],c=/* @__PURE__ */ new Set;for(let n of a)if(n.name!==t){if(n.statementRange&&!c.has(n.statementRange.start)){let t=findStatementEnd(e,n.statementRange.end);c.add(n.statementRange.start),s.push({start:n.statementRange.start,end:t,text:``})}else n.statementRange||(c.add(n.bodyValueRange.start),s.push({start:n.bodyValueRange.start,end:n.bodyValueRange.end,text:`() => {}`}))}if(r)for(let t of r){if(t===n)continue;let r=o.get(t);if(r&&!c.has(r.start)){let t=findStatementEnd(e,r.end);c.add(r.start),s.push({start:r.start,end:t,text:``})}}let l=findWorkflowDefaultExport(i);if(l&&!c.has(l.start)){let t=findStatementEnd(e,l.end);c.add(l.start),s.push({start:l.start,end:t,text:``})}return applyReplacements(e,s)}function safeRealpath(e){let t=L.resolve(e);try{return z.realpathSync(t)}catch(e){return N.debug(`realpathSync failed for ${t}: ${e instanceof Error?e.message:e}`),t}}var WorkflowJobDetectionError=class extends Error{};function isExecJobFunctionCallee(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.type!==`MemberExpression`)return!1;let n=t.property;if(n?.type!==`Identifier`||n.name!==`execJobFunction`)return!1;let r=t.object;if(r?.type!==`MemberExpression`)return!1;let i=r.property;if(i?.type!==`Identifier`||i.name!==`workflow`)return!1;let a=r.object;return a?.type===`Identifier`&&a.name===`tailor`}function extractStaticStringValue(e){if(!e||typeof e!=`object`)return;let t=e;if(t.type===`Literal`&&typeof t.value==`string`)return t.value;if(t.type===`TemplateLiteral`){let e=t.quasis,n=t.expressions;if(e?.length===1&&(n?.length??0)===0)return e[0]?.value?.cooked}}const Bt=/* @__PURE__ */ new Set([`@tailor-platform/sdk/runtime`,`@tailor-platform/sdk/runtime/workflow`]);function collectRuntimeWorkflowImportBindings(e){let t=/* @__PURE__ */ new Set;for(let n of e.body??[]){if(n.type!==`ImportDeclaration`||n.importKind===`type`)continue;let e=n.source;if(typeof e?.value==`string`&&Bt.has(e.value))for(let e of n.specifiers??[]){if(e.type!==`ImportSpecifier`||e.importKind===`type`)continue;let n=getModuleExportName(e.imported),r=getModuleExportName(e.local);n===`workflow`&&r&&t.add(r)}}return t}function isDirectExecJobFunctionCallee(e,t){if(isExecJobFunctionCallee(e))return!0;if(!e||typeof e!=`object`)return!1;let n=e;if(n.type!==`MemberExpression`)return!1;let r=n.property;if(r?.type!==`Identifier`||r.name!==`execJobFunction`)return!1;let i=n.object;return i?.type===`Identifier`&&t.has(i.name)}function findDirectExecJobFunctionCalls(e){let t=collectRuntimeWorkflowImportBindings(e),n=[];function walk(e){if(e&&typeof e==`object`){if(e.type===`CallExpression`&&isDirectExecJobFunctionCallee(e.callee,t)){let t=e.arguments;n.push({targetName:extractStaticStringValue(t?.[0])})}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}}return walk(e),n}function buildDirectExecJobFunctionErrorMessage(e,t){return t.targetName===void 0?`Workflow file ${e} calls execJobFunction(...) directly with a job name that isn't a string literal, so the target can't be resolved at build time. Call the target job's own .start(...) method from inside a job body instead of calling execJobFunction directly.`:`Workflow file ${e} calls execJobFunction("${t.targetName}", ...) directly. A direct call is never recognized as a dependency, so "${t.targetName}" would silently be dropped from the bundle unless something else happens to reference it. Call the "${t.targetName}" job's .start(...) method from inside a job body instead.`}function collectExecJobFunctionTargets(e){let{program:t,errors:n}=H(`input.js`,e);if(n.length>0)throw new WorkflowJobDetectionError(`Failed to parse bundled job code while checking for missed dependencies: ${n.map(e=>e.message).join(`; `)}`);let r=[];function walk(e){if(e&&typeof e==`object`){if(e.type===`CallExpression`&&isExecJobFunctionCallee(e.callee)){let t=e.arguments,n=extractStaticStringValue(t?.[0]);n!==void 0&&r.push(n)}for(let t of Object.keys(e)){let n=e[t];Array.isArray(n)?n.forEach(e=>walk(e)):n&&typeof n==`object`&&walk(n)}}}return walk(t),r}function validateBundledDependencies(e,t){let n=new Set(t);for(let[t,r]of e){let e;try{e=collectExecJobFunctionTargets(r)}catch(e){throw new WorkflowJobDetectionError(`Failed to check the bundled output of workflow job "${t}" for missed dependencies: ${e instanceof Error?e.message:String(e)}`)}for(let r of e)if(!n.has(r))throw new WorkflowJobDetectionError(`Workflow job "${t}" calls execJobFunction("${r}", ...) — usually the result of a rewritten "${r}" job .start() call — but "${r}" was not detected as a dependency and is not included in the bundle. Call the "${r}" job's .start() method from inside the body of workflow job "${t}" (a nested function inside body works too), or make sure the file containing the call is covered by the workflow service's "files" pattern.`)}}async function bundleWorkflowJobs(e){let{allJobs:t,mainJobNames:n,env:r={},startContext:i,baseDir:a,previousUsedJobs:o,allowedRuntimeGlobals:s}=e,c=t.map(e=>e.sourceFile),l=hashReachabilitySourceFiles([...c,...collectExtraStartCallFiles(c,i)]);if(t.length===0)return N.warn(`No workflow jobs to bundle`),{mainJobDeps:{},usedJobNames:[],bundledCode:/* @__PURE__ */ new Map,sourceFileState:l};let u,d;if(o&&o.sourceFileState===l){let e=new Set(o.usedJobNames);u=t.filter(t=>e.has(t.name)),d=o.mainJobDeps}else({usedJobs:u,mainJobDeps:d}=await filterUsedJobs(t,n,i));N.newline(),N.log(`Bundling ${j.highlight(u.length.toString())} files for ${j.info(`"workflow-job"`)}`);let f=await resolveTSConfigWithFallback(a),p=await withBundleConcurrency(u,async t=>{let n=await buildFunctionBundle({...e,kind:`workflow-job`,name:t.name,sourceFile:t.sourceFile,tsconfig:f,runtimeGlobals:{label:`Workflow job "${t.name}"`,allowed:s},createTransformPlugin:()=>createWorkflowTransformPlugin(t,u,i),entry:e=>I`
197
197
  import { ${t.exportName} } from "${e}";
198
198
 
199
199
  export async function main(input) {
200
200
  const env = ${JSON.stringify(r)};
201
- const invoker = ${ht};
201
+ const invoker = ${St};
202
202
  return await ${t.exportName}.body(input, { env, invoker });
203
203
  }
204
- `});return[t.name,n]}),m=/* @__PURE__ */ new Map;for(let[e,t]of p)m.set(e,t);return validateBundledDependencies(m,u.map(e=>e.name)),N.log(`${j.success(`Bundled`)} ${j.info(`"workflow-job"`)}`),{mainJobDeps:d,usedJobNames:u.map(e=>e.name),bundledCode:m,sourceFileState:l}}function collectExtraStartCallFiles(e,t){let n=new Set([...e].map(safeRealpath)),r=[];for(let e of t.modules.values())n.has(safeRealpath(e.sourceFile))||r.push(e.sourceFile);return r}function hashReachabilitySourceFiles(e){let t=be(`sha256`);for(let n of[...new Set(e)].toSorted()){t.update(n),t.update(`\0`);try{t.update(z.readFileSync(n))}catch{t.update(`<missing>`)}t.update(`\0`)}return t.digest(`hex`)}async function filterUsedJobs(e,t,n){if(e.length===0||t.length===0)return{usedJobs:[],mainJobDeps:{}};let r=/* @__PURE__ */ new Map;for(let t of e){let e=r.get(t.sourceFile)||[];e.push(t),r.set(t.sourceFile,e)}let i=new Map(r);for(let e of collectExtraStartCallFiles(r.keys(),n))i.set(e,[]);let a=/* @__PURE__ */ new Map,o=await Promise.all(Array.from(i.entries()).map(async([e,t])=>{try{let r=await z.promises.readFile(e,`utf-8`),{program:i,errors:a}=H(e,r);if(a.length>0)throw new WorkflowJobDetectionError(`Failed to parse ${e}: ${a.map(e=>e.message).join(`; `)}`);let[o]=findDirectExecJobFunctionCalls(i);if(o)throw new WorkflowJobDetectionError(buildDirectExecJobFunctionErrorMessage(e,o));let s=findAllJobs(i,r),c=detectResolvedStartCalls(i,r,n,e),l=[];for(let n of t){let t=s.find(e=>e.name===n.name);if(!t)throw new WorkflowJobDetectionError(`Workflow job "${n.name}" (export "${n.exportName}" in ${e}) could not be statically detected: createWorkflowJob's "name" must be a string literal and "body" must be a function expression. Dynamic or computed values (e.g. body: someWrapper(fn)) cannot be bundled and would be silently dropped.`);let r=/* @__PURE__ */ new Set;for(let e of c)e.kind===`job`&&e.callRange.start>=t.bodyValueRange.start&&e.callRange.end<=t.bodyValueRange.end&&r.add(e.targetName);r.size>0&&l.push({jobName:n.name,deps:r})}for(let t of c)if(t.kind===`job`&&!s.some(e=>t.callRange.start>=e.bodyValueRange.start&&t.callRange.end<=e.bodyValueRange.end))throw new WorkflowJobDetectionError(`Call to job "${t.targetName}".start() in ${e} is not inside any workflow job's body: it was factored into a function defined outside the calling job's body. Dependency detection only sees .start() calls lexically inside a job body, so this call would silently drop "${t.targetName}" from the bundle. Move the call to a function defined inside the calling job's body.`);return l}catch(e){if(e instanceof WorkflowJobDetectionError)throw e;return[]}}));for(let e of o)for(let{jobName:t,deps:n}of e)a.set(t,n);let s=/* @__PURE__ */ new Set,c={};function collectDeps(e,t){if(t.has(e))return;t.add(e);let n=a.get(e);if(n)for(let e of n)collectDeps(e,t)}for(let e of t){let t=/* @__PURE__ */ new Set;collectDeps(e,t),c[e]=Array.from(t);for(let e of t)s.add(e)}return{usedJobs:e.filter(e=>s.has(e.name)),mainJobDeps:c}}function createWorkflowTransformPlugin(e,t,n){let r=safeRealpath(e.sourceFile),i=t.filter(t=>t.name!==e.name&&safeRealpath(t.sourceFile)===r).map(e=>e.exportName);return{name:`workflow-transform`,transform:{filter:{id:{include:[/\.(ts|mts|cts|js|mjs|cjs)$/]}},handler(t,a){if(!t.includes(`createWorkflowJob`)&&!t.includes(`createWorkflow`)&&!hasStartCall(t))return null;let o=t;return safeRealpath(a)===r&&(o=transformWorkflowSource(t,e.name,e.exportName,i)),hasStartCall(o)&&(o=transformStartCalls(o,n,a)),o===t?null:{code:o}}}}}const Ft=/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,It=/^[a-z0-9][a-z0-9_:.-]{0,62}[a-z0-9*]$/,Lt=`key must not end with '*'; omit the '*' and set matchType: "prefix" for wildcard policies (the SDK appends '*' automatically).`;function toPlatformExecutionPolicyKey(e,t){return t===`prefix`?`${e}*`:e}const Rt=[`ms`,`s`,`m`],zt={ms:1/1e3,s:1,m:60};function durationToSeconds(e){let t=/^(\d+)(ms|s|m)$/.exec(e);return t?.[1]===void 0||t[2]===void 0?null:parseInt(t[1],10)*zt[t[2]]}const Z={maxRetries:{min:1,max:10},initialBackoffMaxSeconds:3600,maxBackoffMaxSeconds:86400,backoffMultiplierMin:1},Bt=R.strictObject({name:R.string().describe(`Job name (must be unique across the project)`),start:d.describe(`Start function that initiates the job`),body:d.describe(`Job implementation function`),publishEvents:R.boolean().optional().describe(`Enable publishing job execution events for this job`)}),seconds=e=>durationToSeconds(e)??0,Vt=R.templateLiteral([R.number().int().positive(),R.enum(Rt)]),durationSchema=e=>Vt.refine(t=>seconds(t)<=e,{message:`Duration must be at most ${e} seconds`}),Ht=R.strictObject({maxRetries:R.number().int().min(Z.maxRetries.min).max(Z.maxRetries.max).describe(`Maximum number of retries (1-10)`),initialBackoff:durationSchema(Z.initialBackoffMaxSeconds).describe(`Initial backoff duration (e.g., '1s', '500ms', '1m', max 1h)`),maxBackoff:durationSchema(Z.maxBackoffMaxSeconds).describe(`Maximum backoff duration (e.g., '30s', '5m', max 24h)`),backoffMultiplier:R.number().min(Z.backoffMultiplierMin).describe(`Backoff multiplier (>= 1)`)}).refine(e=>seconds(e.initialBackoff)<=seconds(e.maxBackoff),{message:`initialBackoff must be less than or equal to maxBackoff`,path:[`initialBackoff`]}).refine(e=>seconds(e.initialBackoff)>0,{message:`initialBackoff must be greater than 0`,path:[`initialBackoff`]}),Ut=R.strictObject({maxConcurrentExecutions:R.number().int().min(1).max(1e3).describe(`Maximum number of concurrent executions (1-1000)`)}),Wt=R.string().regex(Ft,`Invalid execution policy name: must match [a-z0-9-] (3-63 chars; must start and end with [a-z0-9])`).describe(`Workspace-unique execution policy name embedded in the resource TRN`),Gt=R.string().regex(It,`Invalid execution policy key: must match [a-z0-9_:.-] (2-64 chars; must start with [a-z0-9] and end with [a-z0-9] or a trailing '*')`).describe(`Execution policy key passed to execJobFunction's executionPolicyKey option`),Kt=R.strictObject({name:Wt,key:Gt,concurrencyPolicy:Ut.optional().describe(`Optional per-key concurrency cap for job function dispatches matching this policy`)}),qt=R.strictObject({name:R.string().describe(`Workflow name`),mainJob:Bt.describe(`Main job that starts the workflow`),retryPolicy:Ht.optional().describe(`Retry policy for the workflow`),concurrencyPolicy:Ut.optional().describe(`Concurrency policy for the workflow`),publishEvents:R.boolean().optional().describe(`Enable publishing workflow execution events for this workflow`)});function stripRuntimeStart(e){if(!t(e,`workflow`)||typeof e!=`object`||!e||!(`start`in e))return e;let{start:n,...r}=e;return r}function createWorkflowService(e){let{config:t,baseDir:n}=e,r={},i=[],a=[],o=0,s=!1;return{config:t,get workflows(){return r},get workflowSources(){return i},get jobs(){return a},get fileCount(){return o},loadWorkflows:async()=>{if(s)return;let e=await loadAndCollectJobs(t,n);r=e.workflows,i=e.workflowSources,a=e.jobs,o=e.fileCount,s=!0},printLoadedWorkflows:()=>{if(o!==0){N.newline(),N.log(`Found ${j.highlight(o.toString())} workflow files`);for(let{workflow:e,sourceFile:t}of i){let n=L.relative(process.cwd(),t);N.debug(`Workflow: ${j.successBright(`"${e.name}"`)} loaded from ${j.path(n)}`)}}}}}async function loadAndCollectJobs(e,t){let n={},r=[],i=[];if(e.files.length===0)return{workflows:n,workflowSources:r,jobs:i,fileCount:0};let a=m(e,t),o=a.length,s=/* @__PURE__ */ new Map,c=await Promise.all(a.map(async e=>{let{jobs:t,workflow:n}=await loadFileContent(e);return{workflowFile:e,jobs:t,workflow:n}}));for(let{workflowFile:e,jobs:t,workflow:a}of c){a&&(r.push({workflow:a,sourceFile:e}),n[e]=a);for(let e of t){let t=s.get(e.name);if(t)throw Error(`Duplicate job name "${e.name}" found:\n - ${t.sourceFile} (export: ${t.exportName})\n - ${e.sourceFile} (export: ${e.exportName})\nEach job must have a unique name.`);s.set(e.name,e),i.push(e)}}return{workflows:n,workflowSources:r,jobs:i,fileCount:o}}async function loadFileContent(e){let n=[],r=null;try{let i=await A(e);for(let[a,o]of Object.entries(i)){if(a==="default"){let n=qt.safeParse(stripRuntimeStart(o));if(n.success)r=n.data;else if(t(o,`workflow`))throw k({kind:`workflow`,file:e,exportName:a,error:n.error});else if(t(o,`workflow-job`))throw c({kind:`workflow-job`,file:e,exportName:a});continue}let i=Bt.safeParse(o);if(i.success)n.push({name:i.data.name,exportName:a,sourceFile:e,...i.data.publishEvents===void 0?{}:{publishEvents:i.data.publishEvents}});else if(t(o,`workflow-job`))throw k({kind:`workflow-job`,file:e,exportName:a,error:i.error});else if(t(o,`workflow`))throw c({kind:`workflow`,file:e,exportName:a})}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`${j.error(`Failed to load workflow from`)} ${j.errorBright(n)}`),N.error(String(t)),t}return{jobs:n,workflow:r}}function getApplicationAuthNamespace(e){return e.authService?.config.name??e.config?.auth?.name}function requireApplicationAuthNamespace(e){let t=getApplicationAuthNamespace(e);if(!t)throw Error(`No Auth service configured`);return t}function buildOptionsOf(e){let{buildOptions:t={}}=e;return{inlineSourcemap:t.inlineSourcemap??e.inlineSourcemap,inlineSourcemapDependencySources:t.inlineSourcemapDependencySources,inlineSourcemapProjectSources:t.inlineSourcemapProjectSources,logLevel:t.logLevel??e.logLevel,allowedRuntimeGlobals:t.allowedRuntimeGlobals,treeshake:t.treeshake}}function projectSourcesOf(e){let{buildOptions:t,baseDir:n}=e;return{...t.inlineSourcemapProjectSources,root:n}}function effectiveDateDefault(e){return e.defaultDateRepresentation??`legacy`}function resolveInlineSourcemap(e){if(e!==void 0)return e;let t=ee(process.env.TAILOR_INLINE_SOURCEMAP);return t===void 0||t}function resolverBundleKey(e,t){return`${e}:${t}`}const Jt=R.strictObject({name:R.string().regex(/^[a-z0-9][a-z0-9-]{1,28}[a-z0-9]$/,`Must be 3-30 lowercase alphanumeric characters or hyphens`).describe(`AI Gateway name`),authNamespace:R.string().regex(/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,`Must be 3-63 lowercase alphanumeric characters or hyphens`).optional().describe(`Auth namespace used to resolve request tokens against the workspace's auth. Defaults to the application's own auth service when omitted; omitting it without an Auth service configured is rejected.`),cors:R.array(R.string()).optional().describe("Allowed CORS origins for browser-based clients. Each entry is `*`, `http(s)://*`, `http(s)://*.example.com`, or `http(s)://app.example.com`, optionally with `:port`. Empty list disables cross-origin access.")}),Yt=/^(\*|[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/;function containsAllEmailDomains(e){return e.some(e=>e.trim()===`*`)}function hasImplicitAllEmailDomains(e){return e?.useNonEmailIdentifier===!0?!1:!e?.allowedEmailDomains||e.allowedEmailDomains.length===0}function normalizeIdPGqlOperations(e){return e===`query`?{create:!1,update:!1,delete:!1,read:!0,sendPasswordResetEmail:!1,requestMfaSettingsUrl:!0,unenrollMfa:!1}:e}const Xt=R.union([R.literal(`query`),R.strictObject({create:R.boolean().optional().describe(`Enable _createUser mutation (default: true)`),update:R.boolean().optional().describe(`Enable _updateUser mutation (default: true)`),delete:R.boolean().optional().describe(`Enable _deleteUser mutation (default: true)`),read:R.boolean().optional().describe(`Enable _users and _user queries (default: true)`),sendPasswordResetEmail:R.boolean().optional().describe(`Enable _sendPasswordResetEmail mutation (default: true)`),requestMfaSettingsUrl:R.boolean().optional().describe(`Enable _requestMfaSettingsUrl query (default: true)`),unenrollMfa:R.boolean().optional().describe(`Enable _unenrollMfa mutation (default: true)`)})]).describe(`Configuration for GraphQL operations on IdP users.
205
- All operations are enabled by default (undefined or true = enabled, false = disabled).`).transform(e=>normalizeIdPGqlOperations(e)),Zt=R.enum([`en`,`ja`]).describe(`IdP UI language`),Qt=R.strictObject({useNonEmailIdentifier:R.boolean().optional().describe(`Use non-email identifier for usernames`),allowSelfPasswordReset:R.boolean().optional().describe(`Allow users to reset their own passwords`),passwordRequireUppercase:R.boolean().optional().describe(`Require uppercase letters in passwords`),passwordRequireLowercase:R.boolean().optional().describe(`Require lowercase letters in passwords`),passwordRequireNonAlphanumeric:R.boolean().optional().describe(`Require non-alphanumeric characters in passwords`),passwordRequireNumeric:R.boolean().optional().describe(`Require numeric characters in passwords`),passwordMinLength:R.number().int().refine(e=>e>=6&&e<=30,{message:`passwordMinLength must be between 6 and 30`}).optional().describe(`Minimum password length (6-30)`),passwordMaxLength:R.number().int().refine(e=>e>=6&&e<=4096,{message:`passwordMaxLength must be between 6 and 4096`}).optional().describe(`Maximum password length (6-4096)`),allowedEmailDomains:R.array(R.string().regex(Yt,`must be a hostname, or * to allow all email domains`)).max(100,`allowedEmailDomains accepts at most 100 entries`).refine(e=>new Set(e.map(e=>e.toLowerCase())).size===e.length,{message:`allowedEmailDomains entries must be unique, compared case-insensitively`}).refine(e=>e.length<=1||!containsAllEmailDomains(e),{message:`allowedEmailDomains cannot contain other entries when * is set`}).optional().describe(`Restrict registration to these email domains. A lone * entry allows every domain`),allowGoogleOauth:R.boolean().optional().describe(`Enable Google OAuth login`),allowMicrosoftOauth:R.boolean().optional().describe(`Enable Microsoft OAuth login`),disablePasswordAuth:R.boolean().optional().describe(`Disable password-based authentication`),enableMfa:R.boolean().optional().describe(`Make TOTP MFA available for users in this namespace`),requireMfa:R.boolean().optional().describe(`Require TOTP MFA enrollment and challenge for password-authenticated users (requires enableMfa)`),allowedReturnOrigins:R.array(R.string().regex(/^(https?:\/\/[a-zA-Z0-9.-]+(:[0-9]+)?|[a-z0-9][a-z0-9-]{1,61}[a-z0-9]:url)$/,`must be an http(s) origin like "https://app.example.com" (scheme + host + optional port, no path/query/fragment) or a static-website placeholder like "<name>:url"`)).optional().describe(`Application origins (scheme + host + optional port) allowed as MFA self-service return targets`),mfaIssuer:R.string().max(64,`mfaIssuer must be 64 characters or less`).optional().describe(`Label shown next to the user account in authenticator apps`)}).refine(e=>e.passwordMinLength===void 0||e.passwordMaxLength===void 0||e.passwordMinLength<=e.passwordMaxLength,{message:`passwordMinLength must be less than or equal to passwordMaxLength`,path:[`passwordMinLength`]}).refine(e=>!e.allowedEmailDomains||e.allowedEmailDomains.length===0||!e.useNonEmailIdentifier,{message:`allowedEmailDomains cannot be set when useNonEmailIdentifier is true`,path:[`allowedEmailDomains`]}).refine(e=>e.allowGoogleOauth===void 0||e.allowGoogleOauth===!1||!e.useNonEmailIdentifier,{message:`allowGoogleOauth cannot be set when useNonEmailIdentifier is true`,path:[`allowGoogleOauth`]}).refine(e=>!e.allowGoogleOauth||e.allowedEmailDomains&&e.allowedEmailDomains.length>0,{message:`allowGoogleOauth requires a non-empty allowedEmailDomains (["*"] to allow every domain)`,path:[`allowGoogleOauth`]}).refine(e=>!e.allowMicrosoftOauth||!e.useNonEmailIdentifier,{message:`allowMicrosoftOauth cannot be set when useNonEmailIdentifier is true`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.allowMicrosoftOauth||e.allowedEmailDomains&&e.allowedEmailDomains.length>0,{message:`allowMicrosoftOauth requires a non-empty allowedEmailDomains (["*"] to allow every domain)`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.allowMicrosoftOauth||e.disablePasswordAuth===!0,{message:`allowMicrosoftOauth requires disablePasswordAuth to be enabled`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.disablePasswordAuth||e.allowGoogleOauth===!0||e.allowMicrosoftOauth===!0,{message:`disablePasswordAuth requires allowGoogleOauth or allowMicrosoftOauth to be enabled`,path:[`disablePasswordAuth`]}).refine(e=>!e.disablePasswordAuth||!e.allowSelfPasswordReset,{message:`disablePasswordAuth cannot be used with allowSelfPasswordReset`,path:[`disablePasswordAuth`]}).refine(e=>!e.requireMfa||e.enableMfa===!0,{message:`requireMfa requires enableMfa to be enabled`,path:[`requireMfa`]}).refine(e=>!e.enableMfa||e.allowedReturnOrigins&&e.allowedReturnOrigins.length>0,{message:`enableMfa requires allowedReturnOrigins to list at least one origin so MFA self-service has a valid return target`,path:[`enableMfa`]}),$t=R.string().max(200,`must be 200 characters or less`).regex(/^[^\r\n]*$/,`must not contain newline characters`),en=R.strictObject({fromName:$t.optional().describe(`Default sender display name for emails`),passwordResetSubject:$t.optional().describe(`Default subject for password reset emails`)}).describe(`Namespace-level email configuration defaults`),Q=R.union([R.string(),R.boolean(),R.array(R.string()).readonly(),R.array(R.boolean()).readonly(),R.strictObject({user:R.string()}),R.strictObject({idpUser:R.enum([`id`,`name`,`disabled`])}),R.strictObject({oldIdpUser:R.enum([`id`,`name`,`disabled`])}),R.strictObject({newIdpUser:R.enum([`id`,`name`,`disabled`])})]),tn=R.enum([`=`,`!=`,`in`,`not in`]),nn=R.tuple([Q,tn,Q]).readonly(),$=R.union([R.strictObject({conditions:R.union([nn,R.array(nn).readonly()]),description:R.string().optional(),permit:R.boolean().optional()}),R.tuple([Q,tn,Q]).readonly(),R.tuple([Q,tn,Q,R.boolean()]).readonly(),R.array(R.union([nn,R.boolean()])).refine(e=>{let t=e.findIndex(e=>typeof e==`boolean`);return t===-1||t===e.length-1},{message:`Boolean permit flag must only appear at the end`}).readonly()]),rn=R.strictObject({create:R.array($).readonly(),read:R.array($).readonly(),update:R.array($).readonly(),delete:R.array($).readonly(),sendPasswordResetEmail:R.array($).readonly().optional(),unenrollMfa:R.array($).readonly().optional()}).describe(`Per-operation permission policies for IdP users`),an=R.strictObject({name:R.string().describe(`IdP service name`),authorization:R.union([R.literal(`insecure`),R.literal(`loggedIn`),R.strictObject({cel:R.string()})]).optional().describe(`Authorization mode for IdP API access`),clients:R.array(R.string()).describe(`OAuth2 client names that can use this IdP`),lang:Zt.optional().describe(`UI language for IdP pages`),userAuthPolicy:Qt.transform(e=>Qt.parse(e??{})).optional().describe(`User authentication policy configuration`),publishEvents:R.boolean().optional().describe(`Enable publishing user lifecycle events`),gqlOperations:Xt.optional().describe(`Configure which GraphQL operations are enabled`),emailConfig:en.optional().describe(`Namespace-level email configuration defaults`),permission:rn.optional().describe(`Per-operation permission policies for IdP users`)}).refine(e=>!e.userAuthPolicy?.enableMfa||e.gqlOperations?.unenrollMfa===!1||e.permission!==void 0&&e.permission.unenrollMfa!==void 0,{message:`permission.unenrollMfa must be set explicitly when userAuthPolicy.enableMfa is true (set [{ conditions: [...], permit: true }] to allow, or [] to deny all). permission itself must also be defined. The requirement is only relaxed when gqlOperations.unenrollMfa is false.`,path:[`permission`,`unenrollMfa`]}).refine(e=>!e.permission||e.userAuthPolicy?.disablePasswordAuth===!0||e.gqlOperations?.sendPasswordResetEmail===!1||e.permission.sendPasswordResetEmail!==void 0,{message:`permission.sendPasswordResetEmail must be set explicitly when password authentication is enabled (set [{ conditions: [...], permit: true }] to allow, or [] to deny; only optional when userAuthPolicy.disablePasswordAuth is true or gqlOperations.sendPasswordResetEmail is false)`,path:[`permission`,`sendPasswordResetEmail`]}),on=R.string().regex(/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/),sn=R.record(on,R.string().nullish()),cn=R.strictObject({vaults:R.record(on,sn),options:R.strictObject({ignoreNullishValues:R.boolean()})}),ln=R.strictObject({domain:R.string().describe(`Custom domain to move to another workspace`),transferTo:R.strictObject({workspaceId:R.string().describe(`Workspace that receives the domain`)}).describe(`Where the domain should move`)}),un=R.union([R.string(),ln]),dn=R.strictObject({name:R.string().describe(`Static website name`),description:R.string().optional().describe(`Static website description`),allowedIpAddresses:R.array(R.string()).optional().describe(`IP addresses allowed to access the website`),customDomains:R.array(un).superRefine((e,t)=>{let n=/* @__PURE__ */ new Set;e.forEach((e,r)=>{let i=typeof e==`string`?e:e.domain;n.has(i)&&t.addIssue({code:`custom`,path:[r],message:`Duplicate custom domain "${i}"`}),n.add(i)})}).optional().describe(`Custom domains for the static website`)}),fn=/^[a-z0-9]+$/,pn=/^[A-Za-z_][A-Za-z0-9_]*$/;function checkWaitPointKey(e){let{key:t,declaredBy:i}=e,o=t.split(`-`),s=o.filter(a);if(s.length>0&&i!==`define`)return i===`property`?`Invalid wait point key "${t}": $params cannot come from a property name. Pass the key to define instead, e.g. define.for("${t}")<Payload, Result>().`:`Invalid wait point key "${t}": createWaitPoint takes its type arguments first, which stops TypeScript inferring the key as a literal, so it cannot type the $params. Declare it through createWaitPoints instead: createWaitPoints((define) => ({ myWaitPoint: define.for("${t}")<Payload, Result>() })).`;let c=/* @__PURE__ */ new Set,l=0;for(let e of o)if(e.startsWith(`$`)){let n=e.slice(1);if(!pn.test(n))return`Invalid wait point key "${t}": "${e}" is not a usable parameter name. Use letters, digits and underscores, starting with a letter or underscore.`;if(c.has(n))return`Invalid wait point key "${t}": parameter "$${n}" appears more than once.`;c.add(n)}else if(e!==``){if(!fn.test(e))return`Invalid wait point key "${t}": segment "${e}" may only contain [a-z0-9]. Wait point keys accept ${r}, with $params standing in for runtime values.`;l+=1}if(l===0&&s.length>0)return t.startsWith(`-`)||t.endsWith(`-`)?`Invalid wait point key "${t}": must match ${r}.`:`Invalid wait point key "${t}": it needs at least one literal segment alongside its $params, otherwise the key carries no identity of its own and can collide with an unrelated wait point.`;if(s.length===0)return n.test(t)?void 0:`Invalid wait point key "${t}": must match ${r}.`;let u=o.map(e=>e.startsWith(`$`)?`0`:e).join(`-`);return u.length>63?`Wait point key "${t}" cannot fit in 63 characters: even single-character parameter values produce ${u.length}.`:n.test(u)?void 0:`Invalid wait point key "${t}": must match ${r}.`}function collectWaitPointKeyFailures(e){let t=[],n=/* @__PURE__ */ new Set;for(let r of e){let e=`${r.declaredBy} ${r.key}`;if(n.has(e))continue;n.add(e);let i=checkWaitPointKey(r);i&&t.push(i)}return t}const mn={db:`TailorDB service`,idp:`IdP`,auth:`Auth service`,staticWebsites:`static website`,aiGateways:`AI Gateway`,secrets:`secret manager`};function parseServiceConfig(e,t,n){let r=e.safeParse(t);if(r.success)return r.data;let{file:i,configKey:a,key:o,name:s}=n;throw f({file:i,exportName:`default`,subject:`config for ${mn[a]}${s===void 0?``:` "${s}"`}`,error:r.error,pathPrefix:o===void 0?[a]:[a,o],service:{configKey:a,name:s}})}function defineTailorDB(e,t,n,r,i){let a=[],o=[],s=[];if(!e)return{tailorDBServices:a,externalTailorDBNamespaces:o,subgraphs:s};for(let[c,l]of Object.entries(e)){if(`external`in l)o.push(c);else{let e=createTailorDBService({namespace:c,config:parseServiceConfig(O,l,{file:t,configKey:`db`,key:c,name:c}),pluginManager:i,baseDir:n,dateDefault:r});a.push(e)}s.push({Type:`tailordb`,Name:c})}return{tailorDBServices:a,externalTailorDBNamespaces:o,subgraphs:s}}function pluginResolverSource(e,t){return t&&{pluginManager:t,appName:e.name,configPath:e.path}}function defineResolver(e,t,n){let r=[],i=[];if(!e)return{resolverServices:r,subgraphs:i};for(let[a,o]of Object.entries(e)){if(!(`external`in o)){let e=createResolverService(a,o,t,n);r.push(e)}i.push({Type:`pipeline`,Name:a})}return{resolverServices:r,subgraphs:i}}function definePluginResolverServices(e,t){let n=L.dirname(e.path),r=[];for(let{namespace:i,pluginId:a}of t?.getPluginGeneratedResolvers()??[]){let o=e.resolver?.[i];if(o&&`external`in o)throw F({code:`PLUGIN_RESOLVER_NAMESPACE_EXTERNAL`,message:`Plugin "${a}" cannot generate resolvers in external namespace "${i}".`,context:{pluginId:a,namespace:i,resourceType:`pipeline.service`}});o||r.some(e=>e.namespace===i)||r.push(createResolverService(i,{files:[]},n,pluginResolverSource(e,t)))}return r}function stripIdpProviderHelper(e){let t=e;if(typeof t.provider!=`function`)return e;let{provider:n,...r}=t;return r}function defineIdp(e,t){let n=[],r=[];if(!e)return{idpServices:n,subgraphs:r};let i=/* @__PURE__ */ new Set;return e.forEach((e,a)=>{let o=e.name;if(i.has(o))throw Error(`IdP with name "${o}" already defined.`);if(i.add(o),!(`external`in e)){let r=parseServiceConfig(an,stripIdpProviderHelper(e),{file:t,configKey:`idp`,key:a,name:o});n.push(r)}r.push({Type:`idp`,Name:o})}),{idpServices:n,subgraphs:r}}function defineAuth(e,t,n,r){let i=[];if(!e)return{authService:void 0,subgraphs:i};let a;return`external`in e||(a=createAuthService(parseServiceConfig(h,e,{file:t,configKey:`auth`,name:e.name}),n,r)),i.push({Type:`auth`,Name:e.name}),{authService:a,subgraphs:i}}function defineExecutor(e,t,n){if(e||n)return D({config:e??{files:[]},baseDir:t})}function defineWorkflow(e,t){if(e)return createWorkflowService({config:e,baseDir:t})}function defineHttpAdapterService(e,t){if(e)return createHttpAdapterService({config:e,baseDir:t})}function stripStaticWebsiteUrlHelper(e){let t=e;if(t.url!==`${e.name}:url`)return e;let{url:n,...r}=t;return r}function defineStaticWebsites(e,t){let n=[],r=/* @__PURE__ */ new Set;return(e??[]).forEach((e,i)=>{let a=parseServiceConfig(dn,stripStaticWebsiteUrlHelper(e),{file:t,configKey:`staticWebsites`,key:i,name:e.name});if(r.has(a.name))throw Error(`Static website with name "${a.name}" already defined.`);r.add(a.name),n.push(a)}),n}function defineAIGateways(e,t,n){let r=[],i=/* @__PURE__ */ new Set;return(e??[]).forEach((e,a)=>{let o=parseServiceConfig(Jt,e,{file:t,configKey:`aiGateways`,key:a,name:e.name});if(i.has(o.name))throw Error(`AI Gateway with name "${o.name}" already defined.`);if(i.add(o.name),o.authNamespace===void 0){if(!n)throw Error(`AI Gateway "${o.name}" has no "authNamespace" and no Auth service is configured to default to. Define an Auth service, or set "authNamespace" explicitly.`);o.authNamespace=n}r.push(o)}),r}function parseSecretManager(e,t){if(!e)return{secrets:[],ignoreNullishValues:!1};let n=parseServiceConfig(cn,e,{file:t,configKey:`secrets`}),{ignoreNullishValues:r}=n.options,i=Object.entries(n.vaults).map(([e,t])=>({vaultName:e,secrets:Object.entries(t).map(([e,t])=>({name:e,value:t}))}));if(!r){for(let e of i)for(let t of e.secrets)if(t.value==null)throw Error(`Secret "${e.vaultName}/${t.name}" has no value. Use { ignoreNullishValues: true } option in defineSecretManager() to skip secrets without values.`)}return{secrets:i,ignoreNullishValues:r}}function defineServices(e,t,n){let r=defineTailorDB(e.db,e.path,t,effectiveDateDefault(e),n),i=defineResolver(e.resolver,t,pluginResolverSource(e,n)),a=defineIdp(e.idp,e.path),o=defineAuth(e.auth,e.path,r.tailorDBServices,r.externalTailorDBNamespaces),s=defineStaticWebsites(e.staticWebsites,e.path),c=defineAIGateways(e.aiGateways,e.path,getApplicationAuthNamespace({authService:o.authService,config:e})),{secrets:l,ignoreNullishValues:u}=parseSecretManager(e.secrets,e.path);return{tailordbResult:r,resolverResult:i,idpResult:a,authResult:o,staticWebsiteServices:s,aiGatewayServices:c,secrets:l,ignoreNullishValues:u}}function buildApplication(e){let t={name:e.config.name,id:e.config.id,config:e.config,subgraphs:[...e.tailordbResult.subgraphs,...e.resolverResult.subgraphs,...e.idpResult.subgraphs,...e.authResult.subgraphs],tailorDBServices:e.tailordbResult.tailorDBServices,externalTailorDBNamespaces:e.tailordbResult.externalTailorDBNamespaces,resolverServices:e.resolverResult.resolverServices,idpServices:e.idpResult.idpServices,authService:e.authResult.authService,executorService:e.executorService,workflowService:e.workflowService,httpAdapterService:e.httpAdapterService,staticWebsiteServices:e.staticWebsiteServices,aiGatewayServices:e.aiGatewayServices,secrets:e.secrets,ignoreNullishValues:e.ignoreNullishValues,env:e.env,get applications(){return[t]}};return t}function defineApplication(e){let{config:t,pluginManager:n}=e,r=L.dirname(t.path),i=defineServices(t,r,n),a=defineExecutor(t.executor,r,!1),o=defineWorkflow(t.workflow,r),s=defineHttpAdapterService(t.httpAdapter,r);return buildApplication({config:t,...i,executorService:a,workflowService:o,httpAdapterService:s,env:t.env??{}})}function generatePluginFilesIfNeeded(e,t,n){if(!e)return[];let r=/* @__PURE__ */ new Map;for(let e of t){let t=e.typeSourceInfo;for(let[e,n]of Object.entries(t))n.filePath&&r.set(e,{filePath:n.filePath,exportName:n.exportName})}return e.generatePluginFiles({outputDir:L.join(getDistDir(),`plugin`),sourceTableInfoMap:r,configPath:n,tableGenerator:generatePluginTableFiles,executorGenerator:generatePluginExecutorFiles})}function assertWaitPointKeys(){let e=collectWaitPointKeyFailures(i());if(e.length!==0)throw Error(e.join(`
206
- `))}async function loadApplication(e){let{config:t,pluginManager:n,bundleCache:r,client:i,workspaceId:a,expectedLocalStaticWebsiteNames:o,previous:s}=e,c=L.dirname(t.path);if(s)return reloadEnvDependentBundles({config:t,baseDir:c,client:i,workspaceId:a,expectedLocalStaticWebsiteNames:o,bundleCache:r,previous:s});let{tailordbResult:l,resolverResult:u,idpResult:d,authResult:f,staticWebsiteServices:p,aiGatewayServices:m,secrets:h,ignoreNullishValues:g}=defineServices(t,c,n),_=i&&a?await resolveStaticWebsiteUrlsInEnv(i,a,t.env??{},{expectedLocalNames:o??new Set(p.map(e=>e.name))}):t.env??{};for(let e of l.tailorDBServices)await e.loadTypes(),await e.processNamespacePlugins();assertUniqueLocalTailorDBTypeNames({tailorDBServices:l.tailorDBServices});let v=definePluginResolverServices(t,n),y={resolverServices:[...u.resolverServices,...v],subgraphs:[...u.subgraphs,...v.map(({namespace:e})=>({Type:`pipeline`,Name:e}))]},b=generatePluginFilesIfNeeded(n,l.tailorDBServices,t.path),x=defineExecutor(t.executor,c,b.length>0),S=defineWorkflow(t.workflow,c);S&&await S.loadWorkflows();let C=defineHttpAdapterService(t.httpAdapter,c);C&&await C.loadAdapters();let w=createTsconfigLookupCache(),T=await buildStartContext(t.workflow,getApplicationAuthNamespace({authService:f.authService,config:t}),c,S?.workflowSources,w),E=buildOptionsOf(t),D=resolveInlineSourcemap(E.inlineSourcemap),O=E.inlineSourcemapDependencySources??!1,k=projectSourcesOf({buildOptions:E,baseDir:c}),A=resolveBundleLogLevel(E.logLevel),j=effectiveDateDefault(t),M={resolvers:/* @__PURE__ */ new Map,executors:/* @__PURE__ */ new Map,workflowJobs:/* @__PURE__ */ new Map,authHooks:/* @__PURE__ */ new Map};for(let e of y.resolverServices){await e.loadResolvers();let t=await bundleResolvers({namespace:e.namespace,files:Object.keys(e.resolvers),baseDir:c,defaultPermission:e.defaultPermission,startContext:T,cache:r,inlineSourcemap:D,inlineSourcemapDependencySources:O,inlineSourcemapProjectSources:k,bundleLogLevel:A,bundleTreeshake:E.treeshake,tsconfigCache:w,allowedRuntimeGlobals:E.allowedRuntimeGlobals,dateDefault:j});for(let[n,r]of t)M.resolvers.set(resolverBundleKey(e.namespace,n),r)}x&&(M.executors=await bundleExecutors({config:x.config,startContext:T,additionalFiles:[...b],cache:r,inlineSourcemap:D,inlineSourcemapDependencySources:O,inlineSourcemapProjectSources:k,bundleLogLevel:A,bundleTreeshake:E.treeshake,baseDir:c,tsconfigCache:w,allowedRuntimeGlobals:E.allowedRuntimeGlobals,dateDefault:j}));let P;if(S&&S.jobs.length>0){let e=S.workflowSources.map(e=>e.workflow.mainJob.name);P=await bundleWorkflowJobs({allJobs:S.jobs,mainJobNames:e,env:_,startContext:T,baseDir:c,cache:r,inlineSourcemap:D,inlineSourcemapDependencySources:O,inlineSourcemapProjectSources:k,bundleLogLevel:A,bundleTreeshake:E.treeshake,tsconfigCache:w,allowedRuntimeGlobals:E.allowedRuntimeGlobals,dateDefault:j}),M.workflowJobs=P.bundledCode}let F;if(C&&C.adapters.length>0&&(F=await bundleHttpAdapters(C.adapters.map(e=>({name:e.adapter.name,sourceFile:e.sourceFile,methods:e.methods,hasOutput:e.hasOutput})),c,r,A,w,E.treeshake)),f.authService?.config.hooks?.beforeLogin){let e=f.authService.config.name;M.authHooks=await bundleAuthHooks({configPath:t.path,authName:e,handlerAccessPath:`auth.hooks.beforeLogin.handler`,env:_,startContext:T,cache:r,inlineSourcemap:D,inlineSourcemapDependencySources:O,inlineSourcemapProjectSources:k,bundleLogLevel:A,bundleTreeshake:E.treeshake,baseDir:c,tsconfigCache:w,dateDefault:j})}for(let e of y.resolverServices)await e.loadResolvers();return x&&(await x.loadExecutors(),b.length>0&&await x.loadPluginExecutorFiles([...b])),assertWaitPointKeys(),S&&S.printLoadedWorkflows(),C&&C.printLoadedAdapters(),N.newline(),{application:buildApplication({config:t,tailordbResult:l,resolverResult:y,idpResult:d,authResult:f,executorService:x,workflowService:S,httpAdapterService:C,staticWebsiteServices:p,aiGatewayServices:m,secrets:h,ignoreNullishValues:g,env:_}),workflowBuildResult:P,httpAdapterBuildResult:F,bundledScripts:M,reusableBuildState:{startContext:T,tsconfigCache:w,inlineSourcemap:D,inlineSourcemapDependencySources:O,inlineSourcemapProjectSources:k,bundleLogLevel:A}}}async function reloadEnvDependentBundles(e){let{config:t,baseDir:n,client:r,workspaceId:i,expectedLocalStaticWebsiteNames:a,bundleCache:o,previous:s}=e,{application:c,reusableBuildState:l}=s,{startContext:u,tsconfigCache:d,inlineSourcemap:f,inlineSourcemapDependencySources:p,inlineSourcemapProjectSources:m,bundleLogLevel:h}=l,g=r&&i?await resolveStaticWebsiteUrlsInEnv(r,i,t.env??{},{expectedLocalNames:a??new Set(c.staticWebsiteServices.map(e=>e.name))}):t.env??{},_={...s.bundledScripts},v=c.workflowService,y=s.workflowBuildResult;if(v&&v.jobs.length>0){let e=v.workflowSources.map(e=>e.workflow.mainJob.name);y=await bundleWorkflowJobs({allJobs:v.jobs,mainJobNames:e,env:g,startContext:u,baseDir:n,cache:o,inlineSourcemap:f,inlineSourcemapDependencySources:p,inlineSourcemapProjectSources:m,bundleLogLevel:h,bundleTreeshake:buildOptionsOf(t).treeshake,tsconfigCache:d,previousUsedJobs:s.workflowBuildResult,allowedRuntimeGlobals:buildOptionsOf(t).allowedRuntimeGlobals,dateDefault:effectiveDateDefault(t)}),_.workflowJobs=y.bundledCode}if(c.authService?.config.hooks?.beforeLogin){let e=c.authService.config.name;_.authHooks=await bundleAuthHooks({configPath:t.path,authName:e,handlerAccessPath:`auth.hooks.beforeLogin.handler`,env:g,startContext:u,cache:o,inlineSourcemap:f,inlineSourcemapDependencySources:p,inlineSourcemapProjectSources:m,bundleLogLevel:h,bundleTreeshake:buildOptionsOf(t).treeshake,baseDir:n,tsconfigCache:d,dateDefault:effectiveDateDefault(t)})}let b={...c,env:g,get applications(){return[b]}};return{application:b,workflowBuildResult:y,httpAdapterBuildResult:s.httpAdapterBuildResult,bundledScripts:_,reusableBuildState:l}}export{Oe as $,hasOmittedPermit as A,ot as B,buildResolverOperationHookExpr as C,Ee as Ct,assertUniqueLocalTailorDBTypeNames as D,resolverDateRepresentations as E,resolveTSConfigWithFallback as F,resolveBundleLogLevel as G,createUserTreeshakeOptions as H,createGeneratedEntryResolverPlugin as I,createBundleCache as J,createBundleLog as K,chunkCodeWithSourcemap as L,ft as M,Y as N,assertUniqueTailorDBTypeNamesWithExternal as O,assertParsableExpression as P,closeConnectionPool as Q,isDependencySource as R,buildExecutorArgsExpr as S,createApplyLimiter as St,buildResolverValidatedInputExpr as T,findUndefinedReferences as U,composeFunctionTreeshakeOptions as V,createLogLevelTreeshakeOptions as W,hashFile as X,hashContent as Y,W as Z,getDistDir as _,rememberPlatformConfigForToken as _t,hasImplicitAllEmailDomains as a,fetchUserInfo as at,_t as b,staticWebsiteNameFromPlaceholder as bt,effectiveDateDefault as c,getOrNull as ct,getApplicationAuthNamespace as d,initOAuth2Client as dt,fetchAll as et,requireApplicationAuthNamespace as f,initOperatorClient as ft,toPlatformExecutionPolicyKey as g,registerAccessTokenSource as gt,Lt as h,normalizeBaseUrl as ht,loadApplication as i,fetchPlatformMachineUserToken as it,stringifyFunction as j,createPermissionNormalizer as k,buildOptionsOf as l,getPlatformBaseUrl as lt,Bt as m,isNotFoundError as mt,definePluginResolverServices as n,fetchMachineUserToken as nt,resolverBundleKey as o,getConsoleBaseUrl as ot,Kt as p,isDefaultPlatform as pt,createTsconfigPathsPlugin as q,generatePluginFilesIfNeeded as r,fetchPaged as rt,resolveInlineSourcemap as s,getOAuth2ClientId as st,defineApplication as t,fetchAllTolerant as tt,projectSourcesOf as u,hasStaticWebsiteUrlPlaceholder as ut,resolveResolverDefaultPermissionForFile as v,resolveStaticWebsiteUrls as vt,buildResolverResultSerialization as w,isForbiddenGlobal as wt,ht as x,byName as xt,Mt as y,resolveStaticWebsiteUrlsInEnv as yt,createPlatformBundleDefinePlugin as z};
207
- //# sourceMappingURL=application-Nce5z46R.mjs.map
204
+ `});return[t.name,n]}),m=/* @__PURE__ */ new Map;for(let[e,t]of p)m.set(e,t);return validateBundledDependencies(m,u.map(e=>e.name)),N.log(`${j.success(`Bundled`)} ${j.info(`"workflow-job"`)}`),{mainJobDeps:d,usedJobNames:u.map(e=>e.name),bundledCode:m,sourceFileState:l}}function collectExtraStartCallFiles(e,t){let n=new Set([...e].map(safeRealpath)),r=[];for(let e of t.modules.values())n.has(safeRealpath(e.sourceFile))||r.push(e.sourceFile);return r}function hashReachabilitySourceFiles(e){let t=be(`sha256`);for(let n of[...new Set(e)].toSorted()){t.update(n),t.update(`\0`);try{t.update(z.readFileSync(n))}catch{t.update(`<missing>`)}t.update(`\0`)}return t.digest(`hex`)}async function filterUsedJobs(e,t,n){if(e.length===0||t.length===0)return{usedJobs:[],mainJobDeps:{}};let r=/* @__PURE__ */ new Map;for(let t of e){let e=r.get(t.sourceFile)||[];e.push(t),r.set(t.sourceFile,e)}let i=new Map(r);for(let e of collectExtraStartCallFiles(r.keys(),n))i.set(e,[]);let a=/* @__PURE__ */ new Map,o=await Promise.all(Array.from(i.entries()).map(async([e,t])=>{try{let r=await z.promises.readFile(e,`utf-8`),{program:i,errors:a}=H(e,r);if(a.length>0)throw new WorkflowJobDetectionError(`Failed to parse ${e}: ${a.map(e=>e.message).join(`; `)}`);let[o]=findDirectExecJobFunctionCalls(i);if(o)throw new WorkflowJobDetectionError(buildDirectExecJobFunctionErrorMessage(e,o));let s=findAllJobs(i,r),c=detectResolvedStartCalls(i,r,n,e),l=[];for(let n of t){let t=s.find(e=>e.name===n.name);if(!t)throw new WorkflowJobDetectionError(`Workflow job "${n.name}" (export "${n.exportName}" in ${e}) could not be statically detected: createWorkflowJob's "name" must be a string literal and "body" must be a function expression. Dynamic or computed values (e.g. body: someWrapper(fn)) cannot be bundled and would be silently dropped.`);let r=/* @__PURE__ */ new Set;for(let e of c)e.kind===`job`&&e.callRange.start>=t.bodyValueRange.start&&e.callRange.end<=t.bodyValueRange.end&&r.add(e.targetName);r.size>0&&l.push({jobName:n.name,deps:r})}for(let t of c)if(t.kind===`job`&&!s.some(e=>t.callRange.start>=e.bodyValueRange.start&&t.callRange.end<=e.bodyValueRange.end))throw new WorkflowJobDetectionError(`Call to job "${t.targetName}".start() in ${e} is not inside any workflow job's body: it was factored into a function defined outside the calling job's body. Dependency detection only sees .start() calls lexically inside a job body, so this call would silently drop "${t.targetName}" from the bundle. Move the call to a function defined inside the calling job's body.`);return l}catch(e){if(e instanceof WorkflowJobDetectionError)throw e;return[]}}));for(let e of o)for(let{jobName:t,deps:n}of e)a.set(t,n);let s=/* @__PURE__ */ new Set,c={};function collectDeps(e,t){if(t.has(e))return;t.add(e);let n=a.get(e);if(n)for(let e of n)collectDeps(e,t)}for(let e of t){let t=/* @__PURE__ */ new Set;collectDeps(e,t),c[e]=Array.from(t);for(let e of t)s.add(e)}return{usedJobs:e.filter(e=>s.has(e.name)),mainJobDeps:c}}function createWorkflowTransformPlugin(e,t,n){let r=safeRealpath(e.sourceFile),i=t.filter(t=>t.name!==e.name&&safeRealpath(t.sourceFile)===r).map(e=>e.exportName);return{name:`workflow-transform`,transform:{filter:{id:{include:[/\.(ts|mts|cts|js|mjs|cjs)$/]}},handler(t,a){if(!t.includes(`createWorkflowJob`)&&!t.includes(`createWorkflow`)&&!hasStartCall(t))return null;let o=t;return safeRealpath(a)===r&&(o=transformWorkflowSource(t,e.name,e.exportName,i)),hasStartCall(o)&&(o=transformStartCalls(o,n,a)),o===t?null:{code:o}}}}}const Vt=/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,Ht=/^[a-z0-9][a-z0-9_:.-]{0,62}[a-z0-9*]$/,Ut=`key must not end with '*'; omit the '*' and set matchType: "prefix" for wildcard policies (the SDK appends '*' automatically).`;function toPlatformExecutionPolicyKey(e,t){return t===`prefix`?`${e}*`:e}const Wt=[`ms`,`s`,`m`],Gt={ms:1/1e3,s:1,m:60};function durationToSeconds(e){let t=/^(\d+)(ms|s|m)$/.exec(e);return t?.[1]===void 0||t[2]===void 0?null:parseInt(t[1],10)*Gt[t[2]]}const Z={maxRetries:{min:1,max:10},initialBackoffMaxSeconds:3600,maxBackoffMaxSeconds:86400,backoffMultiplierMin:1},Kt=R.strictObject({name:R.string().describe(`Job name (must be unique across the project)`),start:d.describe(`Start function that initiates the job`),body:d.describe(`Job implementation function`),publishEvents:R.boolean().optional().describe(`Enable publishing job execution events for this job`)}),seconds=e=>durationToSeconds(e)??0,qt=R.templateLiteral([R.number().int().positive(),R.enum(Wt)]),durationSchema=e=>qt.refine(t=>seconds(t)<=e,{message:`Duration must be at most ${e} seconds`}),Jt=R.strictObject({maxRetries:R.number().int().min(Z.maxRetries.min).max(Z.maxRetries.max).describe(`Maximum number of retries (1-10)`),initialBackoff:durationSchema(Z.initialBackoffMaxSeconds).describe(`Initial backoff duration (e.g., '1s', '500ms', '1m', max 1h)`),maxBackoff:durationSchema(Z.maxBackoffMaxSeconds).describe(`Maximum backoff duration (e.g., '30s', '5m', max 24h)`),backoffMultiplier:R.number().min(Z.backoffMultiplierMin).describe(`Backoff multiplier (>= 1)`)}).refine(e=>seconds(e.initialBackoff)<=seconds(e.maxBackoff),{message:`initialBackoff must be less than or equal to maxBackoff`,path:[`initialBackoff`]}).refine(e=>seconds(e.initialBackoff)>0,{message:`initialBackoff must be greater than 0`,path:[`initialBackoff`]}),Yt=R.strictObject({maxConcurrentExecutions:R.number().int().min(1).max(1e3).describe(`Maximum number of concurrent executions (1-1000)`)}),Xt=R.string().regex(Vt,`Invalid execution policy name: must match [a-z0-9-] (3-63 chars; must start and end with [a-z0-9])`).describe(`Workspace-unique execution policy name embedded in the resource TRN`),Zt=R.string().regex(Ht,`Invalid execution policy key: must match [a-z0-9_:.-] (2-64 chars; must start with [a-z0-9] and end with [a-z0-9] or a trailing '*')`).describe(`Execution policy key passed to execJobFunction's executionPolicyKey option`),Qt=R.strictObject({name:Xt,key:Zt,concurrencyPolicy:Yt.optional().describe(`Optional per-key concurrency cap for job function dispatches matching this policy`)}),$t=R.strictObject({name:R.string().describe(`Workflow name`),mainJob:Kt.describe(`Main job that starts the workflow`),retryPolicy:Jt.optional().describe(`Retry policy for the workflow`),concurrencyPolicy:Yt.optional().describe(`Concurrency policy for the workflow`),publishEvents:R.boolean().optional().describe(`Enable publishing workflow execution events for this workflow`)});function stripRuntimeStart(e){if(!t(e,`workflow`)||typeof e!=`object`||!e||!(`start`in e))return e;let{start:n,...r}=e;return r}function createWorkflowService(e){let{config:t,baseDir:n}=e,r={},i=[],a=[],o=0,s=!1;return{config:t,get workflows(){return r},get workflowSources(){return i},get jobs(){return a},get fileCount(){return o},loadWorkflows:async()=>{if(s)return;let e=await loadAndCollectJobs(t,n);r=e.workflows,i=e.workflowSources,a=e.jobs,o=e.fileCount,s=!0},printLoadedWorkflows:()=>{if(o!==0){N.newline(),N.log(`Found ${j.highlight(o.toString())} workflow files`);for(let{workflow:e,sourceFile:t}of i){let n=L.relative(process.cwd(),t);N.debug(`Workflow: ${j.successBright(`"${e.name}"`)} loaded from ${j.path(n)}`)}}}}}async function loadAndCollectJobs(e,t){let n={},r=[],i=[];if(e.files.length===0)return{workflows:n,workflowSources:r,jobs:i,fileCount:0};let a=m(e,t),o=a.length,s=/* @__PURE__ */ new Map,c=await Promise.all(a.map(async e=>{let{jobs:t,workflow:n}=await loadFileContent(e);return{workflowFile:e,jobs:t,workflow:n}}));for(let{workflowFile:e,jobs:t,workflow:a}of c){a&&(r.push({workflow:a,sourceFile:e}),n[e]=a);for(let e of t){let t=s.get(e.name);if(t)throw Error(`Duplicate job name "${e.name}" found:\n - ${t.sourceFile} (export: ${t.exportName})\n - ${e.sourceFile} (export: ${e.exportName})\nEach job must have a unique name.`);s.set(e.name,e),i.push(e)}}return{workflows:n,workflowSources:r,jobs:i,fileCount:o}}async function loadFileContent(e){let n=[],r=null;try{let i=await A(e);for(let[a,o]of Object.entries(i)){if(a==="default"){let n=$t.safeParse(stripRuntimeStart(o));if(n.success)r=n.data;else if(t(o,`workflow`))throw k({kind:`workflow`,file:e,exportName:a,error:n.error});else if(t(o,`workflow-job`))throw c({kind:`workflow-job`,file:e,exportName:a});continue}let i=Kt.safeParse(o);if(i.success)n.push({name:i.data.name,exportName:a,sourceFile:e,...i.data.publishEvents===void 0?{}:{publishEvents:i.data.publishEvents}});else if(t(o,`workflow-job`))throw k({kind:`workflow-job`,file:e,exportName:a,error:i.error});else if(t(o,`workflow`))throw c({kind:`workflow`,file:e,exportName:a})}}catch(t){let n=L.relative(process.cwd(),e);throw N.error(`${j.error(`Failed to load workflow from`)} ${j.errorBright(n)}`),N.error(String(t)),t}return{jobs:n,workflow:r}}function getApplicationAuthNamespace(e){return e.authService?.config.name??e.config?.auth?.name}function requireApplicationAuthNamespace(e){let t=getApplicationAuthNamespace(e);if(!t)throw Error(`No Auth service configured`);return t}function buildOptionsOf(e){let{buildOptions:t={}}=e;return{inlineSourcemap:t.inlineSourcemap??e.inlineSourcemap,inlineSourcemapDependencySources:t.inlineSourcemapDependencySources,inlineSourcemapProjectSources:t.inlineSourcemapProjectSources,logLevel:t.logLevel??e.logLevel,allowedRuntimeGlobals:t.allowedRuntimeGlobals,treeshake:t.treeshake}}function projectSourcesOf(e){let{buildOptions:t,baseDir:n}=e;return{...t.inlineSourcemapProjectSources,root:n}}function effectiveDateDefault(e){return e.defaultDateRepresentation??`legacy`}function resolveInlineSourcemap(e){if(e!==void 0)return e;let t=ee(process.env.TAILOR_INLINE_SOURCEMAP);return t===void 0||t}function resolverBundleKey(e,t){return`${e}:${t}`}const en=R.strictObject({name:R.string().regex(/^[a-z0-9][a-z0-9-]{1,28}[a-z0-9]$/,`Must be 3-30 lowercase alphanumeric characters or hyphens`).describe(`AI Gateway name`),authNamespace:R.string().regex(/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/,`Must be 3-63 lowercase alphanumeric characters or hyphens`).optional().describe(`Auth namespace used to resolve request tokens against the workspace's auth. Defaults to the application's own auth service when omitted; omitting it without an Auth service configured is rejected.`),cors:R.array(R.string()).optional().describe("Allowed CORS origins for browser-based clients. Each entry is `*`, `http(s)://*`, `http(s)://*.example.com`, or `http(s)://app.example.com`, optionally with `:port`. Empty list disables cross-origin access.")}),tn=/^(\*|[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/;function containsAllEmailDomains(e){return e.some(e=>e.trim()===`*`)}function hasImplicitAllEmailDomains(e){return e?.useNonEmailIdentifier===!0?!1:!e?.allowedEmailDomains||e.allowedEmailDomains.length===0}function normalizeIdPGqlOperations(e){return e===`query`?{create:!1,update:!1,delete:!1,read:!0,sendPasswordResetEmail:!1,requestMfaSettingsUrl:!0,unenrollMfa:!1}:e}const nn=R.union([R.literal(`query`),R.strictObject({create:R.boolean().optional().describe(`Enable _createUser mutation (default: true)`),update:R.boolean().optional().describe(`Enable _updateUser mutation (default: true)`),delete:R.boolean().optional().describe(`Enable _deleteUser mutation (default: true)`),read:R.boolean().optional().describe(`Enable _users and _user queries (default: true)`),sendPasswordResetEmail:R.boolean().optional().describe(`Enable _sendPasswordResetEmail mutation (default: true)`),requestMfaSettingsUrl:R.boolean().optional().describe(`Enable _requestMfaSettingsUrl query (default: true)`),unenrollMfa:R.boolean().optional().describe(`Enable _unenrollMfa mutation (default: true)`)})]).describe(`Configuration for GraphQL operations on IdP users.
205
+ All operations are enabled by default (undefined or true = enabled, false = disabled).`).transform(e=>normalizeIdPGqlOperations(e)),rn=R.enum([`en`,`ja`]).describe(`IdP UI language`),an=R.strictObject({useNonEmailIdentifier:R.boolean().optional().describe(`Use non-email identifier for usernames`),allowSelfPasswordReset:R.boolean().optional().describe(`Allow users to reset their own passwords`),passwordRequireUppercase:R.boolean().optional().describe(`Require uppercase letters in passwords`),passwordRequireLowercase:R.boolean().optional().describe(`Require lowercase letters in passwords`),passwordRequireNonAlphanumeric:R.boolean().optional().describe(`Require non-alphanumeric characters in passwords`),passwordRequireNumeric:R.boolean().optional().describe(`Require numeric characters in passwords`),passwordMinLength:R.number().int().refine(e=>e>=6&&e<=30,{message:`passwordMinLength must be between 6 and 30`}).optional().describe(`Minimum password length (6-30)`),passwordMaxLength:R.number().int().refine(e=>e>=6&&e<=4096,{message:`passwordMaxLength must be between 6 and 4096`}).optional().describe(`Maximum password length (6-4096)`),allowedEmailDomains:R.array(R.string().regex(tn,`must be a hostname, or * to allow all email domains`)).max(100,`allowedEmailDomains accepts at most 100 entries`).refine(e=>new Set(e.map(e=>e.toLowerCase())).size===e.length,{message:`allowedEmailDomains entries must be unique, compared case-insensitively`}).refine(e=>e.length<=1||!containsAllEmailDomains(e),{message:`allowedEmailDomains cannot contain other entries when * is set`}).optional().describe(`Restrict registration to these email domains. A lone * entry allows every domain`),allowGoogleOauth:R.boolean().optional().describe(`Enable Google OAuth login`),allowMicrosoftOauth:R.boolean().optional().describe(`Enable Microsoft OAuth login`),disablePasswordAuth:R.boolean().optional().describe(`Disable password-based authentication`),enableMfa:R.boolean().optional().describe(`Make TOTP MFA available for users in this namespace`),requireMfa:R.boolean().optional().describe(`Require TOTP MFA enrollment and challenge for password-authenticated users (requires enableMfa)`),allowedReturnOrigins:R.array(R.string().regex(/^(https?:\/\/[a-zA-Z0-9.-]+(:[0-9]+)?|[a-z0-9][a-z0-9-]{1,61}[a-z0-9]:url)$/,`must be an http(s) origin like "https://app.example.com" (scheme + host + optional port, no path/query/fragment) or a static-website placeholder like "<name>:url"`)).optional().describe(`Application origins (scheme + host + optional port) allowed as MFA self-service return targets`),mfaIssuer:R.string().max(64,`mfaIssuer must be 64 characters or less`).optional().describe(`Label shown next to the user account in authenticator apps`)}).refine(e=>e.passwordMinLength===void 0||e.passwordMaxLength===void 0||e.passwordMinLength<=e.passwordMaxLength,{message:`passwordMinLength must be less than or equal to passwordMaxLength`,path:[`passwordMinLength`]}).refine(e=>!e.allowedEmailDomains||e.allowedEmailDomains.length===0||!e.useNonEmailIdentifier,{message:`allowedEmailDomains cannot be set when useNonEmailIdentifier is true`,path:[`allowedEmailDomains`]}).refine(e=>e.allowGoogleOauth===void 0||e.allowGoogleOauth===!1||!e.useNonEmailIdentifier,{message:`allowGoogleOauth cannot be set when useNonEmailIdentifier is true`,path:[`allowGoogleOauth`]}).refine(e=>!e.allowGoogleOauth||e.allowedEmailDomains&&e.allowedEmailDomains.length>0,{message:`allowGoogleOauth requires a non-empty allowedEmailDomains (["*"] to allow every domain)`,path:[`allowGoogleOauth`]}).refine(e=>!e.allowMicrosoftOauth||!e.useNonEmailIdentifier,{message:`allowMicrosoftOauth cannot be set when useNonEmailIdentifier is true`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.allowMicrosoftOauth||e.allowedEmailDomains&&e.allowedEmailDomains.length>0,{message:`allowMicrosoftOauth requires a non-empty allowedEmailDomains (["*"] to allow every domain)`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.allowMicrosoftOauth||e.disablePasswordAuth===!0,{message:`allowMicrosoftOauth requires disablePasswordAuth to be enabled`,path:[`allowMicrosoftOauth`]}).refine(e=>!e.disablePasswordAuth||e.allowGoogleOauth===!0||e.allowMicrosoftOauth===!0,{message:`disablePasswordAuth requires allowGoogleOauth or allowMicrosoftOauth to be enabled`,path:[`disablePasswordAuth`]}).refine(e=>!e.disablePasswordAuth||!e.allowSelfPasswordReset,{message:`disablePasswordAuth cannot be used with allowSelfPasswordReset`,path:[`disablePasswordAuth`]}).refine(e=>!e.requireMfa||e.enableMfa===!0,{message:`requireMfa requires enableMfa to be enabled`,path:[`requireMfa`]}).refine(e=>!e.enableMfa||e.allowedReturnOrigins&&e.allowedReturnOrigins.length>0,{message:`enableMfa requires allowedReturnOrigins to list at least one origin so MFA self-service has a valid return target`,path:[`enableMfa`]}),on=R.string().max(200,`must be 200 characters or less`).regex(/^[^\r\n]*$/,`must not contain newline characters`),sn=R.strictObject({fromName:on.optional().describe(`Default sender display name for emails`),passwordResetSubject:on.optional().describe(`Default subject for password reset emails`)}).describe(`Namespace-level email configuration defaults`),Q=R.union([R.string(),R.boolean(),R.array(R.string()).readonly(),R.array(R.boolean()).readonly(),R.strictObject({user:R.string()}),R.strictObject({idpUser:R.enum([`id`,`name`,`disabled`])}),R.strictObject({oldIdpUser:R.enum([`id`,`name`,`disabled`])}),R.strictObject({newIdpUser:R.enum([`id`,`name`,`disabled`])})]),cn=R.enum([`=`,`!=`,`in`,`not in`]),ln=R.tuple([Q,cn,Q]).readonly(),$=R.union([R.strictObject({conditions:R.union([ln,R.array(ln).readonly()]),description:R.string().optional(),permit:R.boolean().optional()}),R.tuple([Q,cn,Q]).readonly(),R.tuple([Q,cn,Q,R.boolean()]).readonly(),R.array(R.union([ln,R.boolean()])).refine(e=>{let t=e.findIndex(e=>typeof e==`boolean`);return t===-1||t===e.length-1},{message:`Boolean permit flag must only appear at the end`}).readonly()]),un=R.strictObject({create:R.array($).readonly(),read:R.array($).readonly(),update:R.array($).readonly(),delete:R.array($).readonly(),sendPasswordResetEmail:R.array($).readonly().optional(),unenrollMfa:R.array($).readonly().optional()}).describe(`Per-operation permission policies for IdP users`),dn=R.strictObject({name:R.string().describe(`IdP service name`),authorization:R.union([R.literal(`insecure`),R.literal(`loggedIn`),R.strictObject({cel:R.string()})]).optional().describe(`Authorization mode for IdP API access`),clients:R.array(R.string()).describe(`OAuth2 client names that can use this IdP`),lang:rn.optional().describe(`UI language for IdP pages`),userAuthPolicy:an.transform(e=>an.parse(e??{})).optional().describe(`User authentication policy configuration`),publishEvents:R.boolean().optional().describe(`Enable publishing user lifecycle events`),gqlOperations:nn.optional().describe(`Configure which GraphQL operations are enabled`),emailConfig:sn.optional().describe(`Namespace-level email configuration defaults`),permission:un.optional().describe(`Per-operation permission policies for IdP users`)}).refine(e=>!e.userAuthPolicy?.enableMfa||e.gqlOperations?.unenrollMfa===!1||e.permission!==void 0&&e.permission.unenrollMfa!==void 0,{message:`permission.unenrollMfa must be set explicitly when userAuthPolicy.enableMfa is true (set [{ conditions: [...], permit: true }] to allow, or [] to deny all). permission itself must also be defined. The requirement is only relaxed when gqlOperations.unenrollMfa is false.`,path:[`permission`,`unenrollMfa`]}).refine(e=>!e.permission||e.userAuthPolicy?.disablePasswordAuth===!0||e.gqlOperations?.sendPasswordResetEmail===!1||e.permission.sendPasswordResetEmail!==void 0,{message:`permission.sendPasswordResetEmail must be set explicitly when password authentication is enabled (set [{ conditions: [...], permit: true }] to allow, or [] to deny; only optional when userAuthPolicy.disablePasswordAuth is true or gqlOperations.sendPasswordResetEmail is false)`,path:[`permission`,`sendPasswordResetEmail`]}),fn=R.string().regex(/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/),pn=R.record(fn,R.string().nullish()),mn=R.strictObject({vaults:R.record(fn,pn),options:R.strictObject({ignoreNullishValues:R.boolean()})}),hn=R.strictObject({domain:R.string().describe(`Custom domain to move to another workspace`),transferTo:R.strictObject({workspaceId:R.string().describe(`Workspace that receives the domain`)}).describe(`Where the domain should move`)}),gn=R.union([R.string(),hn]),_n=R.strictObject({name:R.string().describe(`Static website name`),description:R.string().optional().describe(`Static website description`),allowedIpAddresses:R.array(R.string()).optional().describe(`IP addresses allowed to access the website`),customDomains:R.array(gn).superRefine((e,t)=>{let n=/* @__PURE__ */ new Set;e.forEach((e,r)=>{let i=typeof e==`string`?e:e.domain;n.has(i)&&t.addIssue({code:`custom`,path:[r],message:`Duplicate custom domain "${i}"`}),n.add(i)})}).optional().describe(`Custom domains for the static website`)}),vn=/^[a-z0-9]+$/,yn=/^[A-Za-z_][A-Za-z0-9_]*$/;function checkWaitPointKey(e){let{key:t,declaredBy:i}=e,o=t.split(`-`),s=o.filter(a);if(s.length>0&&i!==`define`)return i===`property`?`Invalid wait point key "${t}": $params cannot come from a property name. Pass the key to define instead, e.g. define.for("${t}")<Payload, Result>().`:`Invalid wait point key "${t}": createWaitPoint takes its type arguments first, which stops TypeScript inferring the key as a literal, so it cannot type the $params. Declare it through createWaitPoints instead: createWaitPoints((define) => ({ myWaitPoint: define.for("${t}")<Payload, Result>() })).`;let c=/* @__PURE__ */ new Set,l=0;for(let e of o)if(e.startsWith(`$`)){let n=e.slice(1);if(!yn.test(n))return`Invalid wait point key "${t}": "${e}" is not a usable parameter name. Use letters, digits and underscores, starting with a letter or underscore.`;if(c.has(n))return`Invalid wait point key "${t}": parameter "$${n}" appears more than once.`;c.add(n)}else if(e!==``){if(!vn.test(e))return`Invalid wait point key "${t}": segment "${e}" may only contain [a-z0-9]. Wait point keys accept ${r}, with $params standing in for runtime values.`;l+=1}if(l===0&&s.length>0)return t.startsWith(`-`)||t.endsWith(`-`)?`Invalid wait point key "${t}": must match ${r}.`:`Invalid wait point key "${t}": it needs at least one literal segment alongside its $params, otherwise the key carries no identity of its own and can collide with an unrelated wait point.`;if(s.length===0)return n.test(t)?void 0:`Invalid wait point key "${t}": must match ${r}.`;let u=o.map(e=>e.startsWith(`$`)?`0`:e).join(`-`);return u.length>63?`Wait point key "${t}" cannot fit in 63 characters: even single-character parameter values produce ${u.length}.`:n.test(u)?void 0:`Invalid wait point key "${t}": must match ${r}.`}function collectWaitPointKeyFailures(e){let t=[],n=/* @__PURE__ */ new Set;for(let r of e){let e=`${r.declaredBy} ${r.key}`;if(n.has(e))continue;n.add(e);let i=checkWaitPointKey(r);i&&t.push(i)}return t}const bn={db:`TailorDB service`,idp:`IdP`,auth:`Auth service`,staticWebsites:`static website`,aiGateways:`AI Gateway`,secrets:`secret manager`};function parseServiceConfig(e,t,n){let r=e.safeParse(t);if(r.success)return r.data;let{file:i,configKey:a,key:o,name:s}=n;throw f({file:i,exportName:`default`,subject:`config for ${bn[a]}${s===void 0?``:` "${s}"`}`,error:r.error,pathPrefix:o===void 0?[a]:[a,o],service:{configKey:a,name:s}})}function defineTailorDB(e,t,n,r,i){let a=[],o=[],s=[];if(!e)return{tailorDBServices:a,externalTailorDBNamespaces:o,subgraphs:s};for(let[c,l]of Object.entries(e)){if(`external`in l)o.push(c);else{let e=createTailorDBService({namespace:c,config:parseServiceConfig(O,l,{file:t,configKey:`db`,key:c,name:c}),pluginManager:i,baseDir:n,dateDefault:r});a.push(e)}s.push({Type:`tailordb`,Name:c})}return{tailorDBServices:a,externalTailorDBNamespaces:o,subgraphs:s}}function pluginResolverSource(e,t){return t&&{pluginManager:t,appName:e.name,configPath:e.path}}function defineResolver(e,t,n){let r=[],i=[];if(!e)return{resolverServices:r,subgraphs:i};for(let[a,o]of Object.entries(e)){if(!(`external`in o)){let e=createResolverService(a,o,t,n);r.push(e)}i.push({Type:`pipeline`,Name:a})}return{resolverServices:r,subgraphs:i}}function definePluginResolverServices(e,t){let n=L.dirname(e.path),r=[];for(let{namespace:i,pluginId:a}of t?.getPluginGeneratedResolvers()??[]){let o=e.resolver?.[i];if(o&&`external`in o)throw F({code:`PLUGIN_RESOLVER_NAMESPACE_EXTERNAL`,message:`Plugin "${a}" cannot generate resolvers in external namespace "${i}".`,context:{pluginId:a,namespace:i,resourceType:`pipeline.service`}});o||r.some(e=>e.namespace===i)||r.push(createResolverService(i,{files:[]},n,pluginResolverSource(e,t)))}return r}function stripIdpProviderHelper(e){let t=e;if(typeof t.provider!=`function`)return e;let{provider:n,...r}=t;return r}function defineIdp(e,t){let n=[],r=[];if(!e)return{idpServices:n,subgraphs:r};let i=/* @__PURE__ */ new Set;return e.forEach((e,a)=>{let o=e.name;if(i.has(o))throw Error(`IdP with name "${o}" already defined.`);if(i.add(o),!(`external`in e)){let r=parseServiceConfig(dn,stripIdpProviderHelper(e),{file:t,configKey:`idp`,key:a,name:o});n.push(r)}r.push({Type:`idp`,Name:o})}),{idpServices:n,subgraphs:r}}function defineAuth(e,t,n,r){let i=[];if(!e)return{authService:void 0,subgraphs:i};let a;return`external`in e||(a=createAuthService(parseServiceConfig(h,e,{file:t,configKey:`auth`,name:e.name}),n,r)),i.push({Type:`auth`,Name:e.name}),{authService:a,subgraphs:i}}function defineExecutor(e,t,n){if(e||n)return D({config:e??{files:[]},baseDir:t})}function defineWorkflow(e,t){if(e)return createWorkflowService({config:e,baseDir:t})}function defineHttpAdapterService(e,t){if(e)return createHttpAdapterService({config:e,baseDir:t})}function stripStaticWebsiteUrlHelper(e){let t=e;if(t.url!==`${e.name}:url`)return e;let{url:n,...r}=t;return r}function defineStaticWebsites(e,t){let n=[],r=/* @__PURE__ */ new Set;return(e??[]).forEach((e,i)=>{let a=parseServiceConfig(_n,stripStaticWebsiteUrlHelper(e),{file:t,configKey:`staticWebsites`,key:i,name:e.name});if(r.has(a.name))throw Error(`Static website with name "${a.name}" already defined.`);r.add(a.name),n.push(a)}),n}function defineAIGateways(e,t,n){let r=[],i=/* @__PURE__ */ new Set;return(e??[]).forEach((e,a)=>{let o=parseServiceConfig(en,e,{file:t,configKey:`aiGateways`,key:a,name:e.name});if(i.has(o.name))throw Error(`AI Gateway with name "${o.name}" already defined.`);if(i.add(o.name),o.authNamespace===void 0){if(!n)throw Error(`AI Gateway "${o.name}" has no "authNamespace" and no Auth service is configured to default to. Define an Auth service, or set "authNamespace" explicitly.`);o.authNamespace=n}r.push(o)}),r}function parseSecretManager(e,t){if(!e)return{secrets:[],ignoreNullishValues:!1};let n=parseServiceConfig(mn,e,{file:t,configKey:`secrets`}),{ignoreNullishValues:r}=n.options,i=Object.entries(n.vaults).map(([e,t])=>({vaultName:e,secrets:Object.entries(t).map(([e,t])=>({name:e,value:t}))}));if(!r){for(let e of i)for(let t of e.secrets)if(t.value==null)throw Error(`Secret "${e.vaultName}/${t.name}" has no value. Use { ignoreNullishValues: true } option in defineSecretManager() to skip secrets without values.`)}return{secrets:i,ignoreNullishValues:r}}function defineServices(e,t,n){let r=defineTailorDB(e.db,e.path,t,effectiveDateDefault(e),n),i=defineResolver(e.resolver,t,pluginResolverSource(e,n)),a=defineIdp(e.idp,e.path),o=defineAuth(e.auth,e.path,r.tailorDBServices,r.externalTailorDBNamespaces),s=defineStaticWebsites(e.staticWebsites,e.path),c=defineAIGateways(e.aiGateways,e.path,getApplicationAuthNamespace({authService:o.authService,config:e})),{secrets:l,ignoreNullishValues:u}=parseSecretManager(e.secrets,e.path);return{tailordbResult:r,resolverResult:i,idpResult:a,authResult:o,staticWebsiteServices:s,aiGatewayServices:c,secrets:l,ignoreNullishValues:u}}function buildApplication(e){let t={name:e.config.name,id:e.config.id,config:e.config,subgraphs:[...e.tailordbResult.subgraphs,...e.resolverResult.subgraphs,...e.idpResult.subgraphs,...e.authResult.subgraphs],tailorDBServices:e.tailordbResult.tailorDBServices,externalTailorDBNamespaces:e.tailordbResult.externalTailorDBNamespaces,resolverServices:e.resolverResult.resolverServices,idpServices:e.idpResult.idpServices,authService:e.authResult.authService,executorService:e.executorService,workflowService:e.workflowService,httpAdapterService:e.httpAdapterService,staticWebsiteServices:e.staticWebsiteServices,aiGatewayServices:e.aiGatewayServices,secrets:e.secrets,ignoreNullishValues:e.ignoreNullishValues,env:e.env,get applications(){return[t]}};return t}function defineApplication(e){let{config:t,pluginManager:n}=e,r=L.dirname(t.path),i=defineServices(t,r,n),a=defineExecutor(t.executor,r,!1),o=defineWorkflow(t.workflow,r),s=defineHttpAdapterService(t.httpAdapter,r);return buildApplication({config:t,...i,executorService:a,workflowService:o,httpAdapterService:s,env:t.env??{}})}function generatePluginFilesIfNeeded(e,t,n){if(!e)return[];let r=/* @__PURE__ */ new Map;for(let e of t){let t=e.typeSourceInfo;for(let[e,n]of Object.entries(t))n.filePath&&r.set(e,{filePath:n.filePath,exportName:n.exportName})}return e.generatePluginFiles({outputDir:L.join(getDistDir(),`plugin`),sourceTableInfoMap:r,configPath:n,tableGenerator:generatePluginTableFiles,executorGenerator:generatePluginExecutorFiles})}function assertWaitPointKeys(){let e=collectWaitPointKeyFailures(i());if(e.length!==0)throw Error(e.join(`
206
+ `))}async function loadApplication(e){let{config:t,pluginManager:n,bundleCache:r,client:i,workspaceId:a,expectedLocalStaticWebsiteNames:o,previous:s}=e,c=L.dirname(t.path);if(s)return reloadEnvDependentBundles({config:t,baseDir:c,client:i,workspaceId:a,expectedLocalStaticWebsiteNames:o,bundleCache:r,previous:s});let{tailordbResult:l,resolverResult:u,idpResult:d,authResult:f,staticWebsiteServices:p,aiGatewayServices:m,secrets:h,ignoreNullishValues:g}=defineServices(t,c,n),_=i&&a?await resolveStaticWebsiteUrlsInEnv(i,a,t.env??{},{expectedLocalNames:o??new Set(p.map(e=>e.name))}):t.env??{};for(let e of l.tailorDBServices)await e.loadTypes(),await e.processNamespacePlugins();assertUniqueLocalTailorDBTypeNames({tailorDBServices:l.tailorDBServices});let v=definePluginResolverServices(t,n),y={resolverServices:[...u.resolverServices,...v],subgraphs:[...u.subgraphs,...v.map(({namespace:e})=>({Type:`pipeline`,Name:e}))]},b=generatePluginFilesIfNeeded(n,l.tailorDBServices,t.path),x=defineExecutor(t.executor,c,b.length>0),S=defineWorkflow(t.workflow,c);S&&await S.loadWorkflows();let C=defineHttpAdapterService(t.httpAdapter,c);C&&await C.loadAdapters();let w=createTsconfigLookupCache(),T=/* @__PURE__ */ new Map,E=await buildStartContext(t.workflow,getApplicationAuthNamespace({authService:f.authService,config:t}),c,S?.workflowSources,w),D=buildOptionsOf(t),O=resolveInlineSourcemap(D.inlineSourcemap),k=D.inlineSourcemapDependencySources??!1,A=projectSourcesOf({buildOptions:D,baseDir:c}),j=resolveBundleLogLevel(D.logLevel),M=effectiveDateDefault(t),P={resolvers:/* @__PURE__ */ new Map,executors:/* @__PURE__ */ new Map,workflowJobs:/* @__PURE__ */ new Map,authHooks:/* @__PURE__ */ new Map};for(let e of y.resolverServices){await e.loadResolvers();let t=await bundleResolvers({namespace:e.namespace,files:Object.keys(e.resolvers),baseDir:c,defaultPermission:e.defaultPermission,startContext:E,cache:r,inlineSourcemap:O,inlineSourcemapDependencySources:k,inlineSourcemapProjectSources:A,bundleLogLevel:j,bundleTreeshake:D.treeshake,tsconfigCache:w,sdkBuilderAnnotationCache:T,allowedRuntimeGlobals:D.allowedRuntimeGlobals,dateDefault:M});for(let[n,r]of t)P.resolvers.set(resolverBundleKey(e.namespace,n),r)}x&&(P.executors=await bundleExecutors({config:x.config,startContext:E,additionalFiles:[...b],cache:r,inlineSourcemap:O,inlineSourcemapDependencySources:k,inlineSourcemapProjectSources:A,bundleLogLevel:j,bundleTreeshake:D.treeshake,baseDir:c,tsconfigCache:w,sdkBuilderAnnotationCache:T,allowedRuntimeGlobals:D.allowedRuntimeGlobals,dateDefault:M}));let F;if(S&&S.jobs.length>0){let e=S.workflowSources.map(e=>e.workflow.mainJob.name);F=await bundleWorkflowJobs({allJobs:S.jobs,mainJobNames:e,env:_,startContext:E,baseDir:c,cache:r,inlineSourcemap:O,inlineSourcemapDependencySources:k,inlineSourcemapProjectSources:A,bundleLogLevel:j,bundleTreeshake:D.treeshake,tsconfigCache:w,sdkBuilderAnnotationCache:T,allowedRuntimeGlobals:D.allowedRuntimeGlobals,dateDefault:M}),P.workflowJobs=F.bundledCode}let ee;if(C&&C.adapters.length>0&&(ee=await bundleHttpAdapters(C.adapters.map(e=>({name:e.adapter.name,sourceFile:e.sourceFile,methods:e.methods,hasOutput:e.hasOutput})),c,r,j,w,D.treeshake)),f.authService?.config.hooks?.beforeLogin){let e=f.authService.config.name;P.authHooks=await bundleAuthHooks({configPath:t.path,authName:e,handlerAccessPath:`auth.hooks.beforeLogin.handler`,env:_,startContext:E,cache:r,inlineSourcemap:O,inlineSourcemapDependencySources:k,inlineSourcemapProjectSources:A,bundleLogLevel:j,bundleTreeshake:D.treeshake,baseDir:c,tsconfigCache:w,sdkBuilderAnnotationCache:T,dateDefault:M})}for(let e of y.resolverServices)await e.loadResolvers();return x&&(await x.loadExecutors(),b.length>0&&await x.loadPluginExecutorFiles([...b])),assertWaitPointKeys(),S&&S.printLoadedWorkflows(),C&&C.printLoadedAdapters(),N.newline(),{application:buildApplication({config:t,tailordbResult:l,resolverResult:y,idpResult:d,authResult:f,executorService:x,workflowService:S,httpAdapterService:C,staticWebsiteServices:p,aiGatewayServices:m,secrets:h,ignoreNullishValues:g,env:_}),workflowBuildResult:F,httpAdapterBuildResult:ee,bundledScripts:P,reusableBuildState:{startContext:E,tsconfigCache:w,sdkBuilderAnnotationCache:T,inlineSourcemap:O,inlineSourcemapDependencySources:k,inlineSourcemapProjectSources:A,bundleLogLevel:j}}}async function reloadEnvDependentBundles(e){let{config:t,baseDir:n,client:r,workspaceId:i,expectedLocalStaticWebsiteNames:a,bundleCache:o,previous:s}=e,{application:c,reusableBuildState:l}=s,{startContext:u,tsconfigCache:d,sdkBuilderAnnotationCache:f,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g}=l,_=r&&i?await resolveStaticWebsiteUrlsInEnv(r,i,t.env??{},{expectedLocalNames:a??new Set(c.staticWebsiteServices.map(e=>e.name))}):t.env??{},v={...s.bundledScripts},y=c.workflowService,b=s.workflowBuildResult;if(y&&y.jobs.length>0){let e=y.workflowSources.map(e=>e.workflow.mainJob.name);b=await bundleWorkflowJobs({allJobs:y.jobs,mainJobNames:e,env:_,startContext:u,baseDir:n,cache:o,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g,bundleTreeshake:buildOptionsOf(t).treeshake,tsconfigCache:d,sdkBuilderAnnotationCache:f,previousUsedJobs:s.workflowBuildResult,allowedRuntimeGlobals:buildOptionsOf(t).allowedRuntimeGlobals,dateDefault:effectiveDateDefault(t)}),v.workflowJobs=b.bundledCode}if(c.authService?.config.hooks?.beforeLogin){let e=c.authService.config.name;v.authHooks=await bundleAuthHooks({configPath:t.path,authName:e,handlerAccessPath:`auth.hooks.beforeLogin.handler`,env:_,startContext:u,cache:o,inlineSourcemap:p,inlineSourcemapDependencySources:m,inlineSourcemapProjectSources:h,bundleLogLevel:g,bundleTreeshake:buildOptionsOf(t).treeshake,baseDir:n,tsconfigCache:d,sdkBuilderAnnotationCache:f,dateDefault:effectiveDateDefault(t)})}let x={...c,env:_,get applications(){return[x]}};return{application:x,workflowBuildResult:b,httpAdapterBuildResult:s.httpAdapterBuildResult,bundledScripts:v,reusableBuildState:l}}export{Ue as $,hasOmittedPermit as A,createPlatformBundleDefinePlugin as B,buildResolverOperationHookExpr as C,byName as Ct,assertUniqueLocalTailorDBTypeNames as D,resolverDateRepresentations as E,isForbiddenGlobal as Et,resolveTSConfigWithFallback as F,findUndefinedReferences as G,it as H,createGeneratedEntryResolverPlugin as I,createBundleLog as J,createLogLevelTreeshakeOptions as K,chunkCodeWithSourcemap as L,yt as M,J as N,assertUniqueTailorDBTypeNamesWithExternal as O,assertParsableExpression as P,hashFile as Q,isDependencySource as R,buildExecutorArgsExpr as S,staticWebsiteNameFromPlaceholder as St,buildResolverValidatedInputExpr as T,De as Tt,composeFunctionTreeshakeOptions as U,lt as V,createUserTreeshakeOptions as W,createBundleCache as X,createTsconfigPathsPlugin as Y,hashContent as Z,getDistDir as _,normalizeBaseUrl as _t,hasImplicitAllEmailDomains as a,fetchPaged as at,Ct as b,resolveStaticWebsiteUrls as bt,effectiveDateDefault as c,getConsoleBaseUrl as ct,getApplicationAuthNamespace as d,getPlatformBaseUrl as dt,closeConnectionPool as et,requireApplicationAuthNamespace as f,hasStaticWebsiteUrlPlaceholder as ft,toPlatformExecutionPolicyKey as g,isNotFoundError as gt,Ut as h,isDefaultPlatform as ht,loadApplication as i,fetchMachineUserToken as it,stringifyFunction as j,createPermissionNormalizer as k,buildOptionsOf as l,getOAuth2ClientId as lt,Kt as m,initOperatorClient as mt,definePluginResolverServices as n,fetchAll as nt,resolverBundleKey as o,fetchPlatformMachineUserToken as ot,Qt as p,initOAuth2Client as pt,resolveBundleLogLevel as q,generatePluginFilesIfNeeded as r,fetchAllTolerant as rt,resolveInlineSourcemap as s,fetchUserInfo as st,defineApplication as t,ke as tt,projectSourcesOf as u,getOrNull as ut,resolveResolverDefaultPermissionForFile as v,registerAccessTokenSource as vt,buildResolverResultSerialization as w,createApplyLimiter as wt,St as x,resolveStaticWebsiteUrlsInEnv as xt,Rt as y,rememberPlatformConfigForToken as yt,createSdkBuilderPurePlugin as z};
207
+ //# sourceMappingURL=application-DIsQSnj3.mjs.map