@tailor-platform/sdk 1.47.1 → 1.48.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 (72) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/{actor-jk4-f0yp.d.mts → actor-BeIEiPYM.d.mts} +2 -2
  3. package/dist/application-BNkNt47b.mjs +4 -0
  4. package/dist/{application-C7H7y0hS.mjs → application-DUENhx4Y.mjs} +80 -17
  5. package/dist/application-DUENhx4Y.mjs.map +1 -0
  6. package/dist/cli/index.mjs +12 -12
  7. package/dist/cli/index.mjs.map +1 -1
  8. package/dist/cli/lib.d.mts +6 -6
  9. package/dist/cli/lib.mjs +4 -4
  10. package/dist/{client-DCqdtFte.mjs → client-CPW1N1Rs.mjs} +1 -1
  11. package/dist/{client-DbyKSN1F.mjs → client-_kHh0Pip.mjs} +2 -2
  12. package/dist/{client-DbyKSN1F.mjs.map → client-_kHh0Pip.mjs.map} +1 -1
  13. package/dist/configure/index.d.mts +4 -4
  14. package/dist/configure/index.mjs +51 -3
  15. package/dist/configure/index.mjs.map +1 -1
  16. package/dist/{crashreport-CNSw_BrJ.mjs → crashreport-CvmdFs4i.mjs} +5 -5
  17. package/dist/crashreport-CvmdFs4i.mjs.map +1 -0
  18. package/dist/{crashreport-DXGFd16F.mjs → crashreport-DHJuSmUc.mjs} +1 -1
  19. package/dist/{errors-wNQxQQBH.mjs → errors-pMPXghkO.mjs} +1 -1
  20. package/dist/{errors-wNQxQQBH.mjs.map → errors-pMPXghkO.mjs.map} +1 -1
  21. package/dist/index-BQ4oi0AI.d.mts +48 -0
  22. package/dist/{index-BbOTbZFf.d.mts → index-BjXN1SdY.d.mts} +2 -2
  23. package/dist/{index-DB8EapT-.d.mts → index-C--7W0UO.d.mts} +5 -5
  24. package/dist/{index-BRvNi5q9.d.mts → index-VJW98BSy.d.mts} +2 -2
  25. package/dist/{index-iy-hNfGp.d.mts → index-nV4ZC_Ve.d.mts} +2 -2
  26. package/dist/{interceptor-CBsqEWDK.mjs → interceptor-DTNS0EtF.mjs} +1 -1
  27. package/dist/{interceptor-CBsqEWDK.mjs.map → interceptor-DTNS0EtF.mjs.map} +1 -1
  28. package/dist/{job-R5C2Hfcc.mjs → job-M3Avv_SV.mjs} +4 -3
  29. package/dist/{job-R5C2Hfcc.mjs.map → job-M3Avv_SV.mjs.map} +1 -1
  30. package/dist/{mock-BP-9O5On.mjs → mock-BfL09ULZ.mjs} +1 -1
  31. package/dist/{mock-BP-9O5On.mjs.map → mock-BfL09ULZ.mjs.map} +1 -1
  32. package/dist/plugin/builtin/enum-constants/index.d.mts +1 -1
  33. package/dist/plugin/builtin/file-utils/index.d.mts +1 -1
  34. package/dist/plugin/builtin/kysely-type/index.d.mts +1 -1
  35. package/dist/plugin/builtin/seed/index.d.mts +1 -1
  36. package/dist/plugin/builtin/seed/index.mjs +1 -1
  37. package/dist/plugin/index.d.mts +2 -2
  38. package/dist/{repl-editor-CZpLlOBj.mjs → repl-editor-jZ493eQI.mjs} +1 -1
  39. package/dist/{repl-editor-CZpLlOBj.mjs.map → repl-editor-jZ493eQI.mjs.map} +1 -1
  40. package/dist/{runtime-XjP6JMmP.mjs → runtime-CNg0w27y.mjs} +396 -125
  41. package/dist/runtime-CNg0w27y.mjs.map +1 -0
  42. package/dist/{tailordb-DjlNUV6u.mjs → schema-C5QjYEc-.mjs} +2 -42
  43. package/dist/schema-C5QjYEc-.mjs.map +1 -0
  44. package/dist/secret-file-BHpxGyNf.mjs +65 -0
  45. package/dist/secret-file-BHpxGyNf.mjs.map +1 -0
  46. package/dist/{seed-DrKY5yIF.mjs → seed-DjfAn0BC.mjs} +44 -19
  47. package/dist/seed-DjfAn0BC.mjs.map +1 -0
  48. package/dist/{service-obEU5gSM.mjs → service-DCgJxdg1.mjs} +2 -2
  49. package/dist/{service-obEU5gSM.mjs.map → service-DCgJxdg1.mjs.map} +1 -1
  50. package/dist/{tailor-db-field-Bn8ZC5lK.d.mts → tailor-db-field-4bMLe25-.d.mts} +5 -1
  51. package/dist/telemetry-C13VIFpT.mjs +4 -0
  52. package/dist/{telemetry-DcL8Fsm_.mjs → telemetry-C1Y56L5E.mjs} +1 -1
  53. package/dist/{telemetry-DcL8Fsm_.mjs.map → telemetry-C1Y56L5E.mjs.map} +1 -1
  54. package/dist/utils/test/index.d.mts +3 -3
  55. package/dist/utils/test/index.mjs +1 -1
  56. package/dist/vitest/environment.mjs +1 -1
  57. package/dist/vitest/index.mjs +1 -1
  58. package/dist/vitest/setup.mjs +1 -1
  59. package/dist/{workflow.generated-i7PK4fg-.d.mts → workflow.generated-OYAu_6zX.d.mts} +12 -2
  60. package/docs/cli/application.md +4 -0
  61. package/docs/configuration.md +4 -0
  62. package/docs/generator/builtin.md +35 -4
  63. package/package.json +11 -11
  64. package/postinstall.mjs +1 -1
  65. package/dist/application-C7H7y0hS.mjs.map +0 -1
  66. package/dist/application-Csq5jxYP.mjs +0 -4
  67. package/dist/crashreport-CNSw_BrJ.mjs.map +0 -1
  68. package/dist/index-BXyS7xKC.d.mts +0 -21
  69. package/dist/runtime-XjP6JMmP.mjs.map +0 -1
  70. package/dist/seed-DrKY5yIF.mjs.map +0 -1
  71. package/dist/tailordb-DjlNUV6u.mjs.map +0 -1
  72. package/dist/telemetry-21afNV9_.mjs +0 -4
@@ -1,6 +1,7 @@
1
1
 
2
2
  import { n as logger } from "./logger-DTNAMYGy.mjs";
3
3
  import { t as readPackageJson } from "./package-json-6Px8bDpG.mjs";
4
+ import { r as writeSecretFile, t as ensureSecretDir } from "./secret-file-BHpxGyNf.mjs";
4
5
  import * as fs from "node:fs";
5
6
  import * as path from "pathe";
6
7
  import * as os from "node:os";
@@ -102,11 +103,10 @@ function cleanupOldFiles(dir) {
102
103
  */
103
104
  function writeCrashReport(report, dir) {
104
105
  try {
105
- fs.mkdirSync(dir, { recursive: true });
106
+ ensureSecretDir(dir);
106
107
  const filename = generateFilename(report);
107
108
  const filePath = path.join(dir, filename);
108
- const content = formatCrashReport(report);
109
- fs.writeFileSync(filePath, content, "utf-8");
109
+ writeSecretFile(filePath, formatCrashReport(report));
110
110
  cleanupOldFiles(dir);
111
111
  return filePath;
112
112
  } catch {
@@ -386,7 +386,7 @@ async function reportCrash(error, errorType) {
386
386
  ].join("\n"));
387
387
  }
388
388
  if (config.remoteEnabled) {
389
- const { userAgent } = await import("./client-DCqdtFte.mjs");
389
+ const { userAgent } = await import("./client-CPW1N1Rs.mjs");
390
390
  await sendCrashReport(report, await userAgent());
391
391
  }
392
392
  } catch {}
@@ -412,4 +412,4 @@ function initCrashReporting() {
412
412
 
413
413
  //#endregion
414
414
  export { JSON_FOOTER_MARKER as a, CRASH_LOG_EXTENSION as i, reportCrash as n, parseCrashReportConfig as o, sendCrashReport as r, initCrashReporting as t };
415
- //# sourceMappingURL=crashreport-CNSw_BrJ.mjs.map
415
+ //# sourceMappingURL=crashreport-CvmdFs4i.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crashreport-CvmdFs4i.mjs","names":[],"sources":["../src/cli/crashreport/config.ts","../src/cli/crashreport/writer.ts","../src/cli/crashreport/sender.ts","../src/cli/crashreport/sanitize.ts","../src/cli/crashreport/report.ts","../src/cli/crashreport/index.ts"],"sourcesContent":["import * as path from \"pathe\";\nimport { isCI } from \"std-env\";\nimport { xdgConfig } from \"xdg-basedir\";\n\nexport interface CrashReportConfig {\n readonly localEnabled: boolean;\n readonly remoteEnabled: boolean;\n readonly localDir: string;\n}\n\n/**\n * Parse crash report configuration from environment variables.\n * Local crash log writing is enabled by default (opt-out via TAILOR_CRASH_REPORTS_LOCAL=off).\n * Remote sending is disabled by default (opt-in via TAILOR_CRASH_REPORTS_REMOTE=on).\n * Both are auto-disabled in CI environments.\n * @returns Crash report configuration\n */\nexport function parseCrashReportConfig(): CrashReportConfig {\n if (isCI) {\n return {\n localEnabled: false,\n remoteEnabled: false,\n localDir: \"\",\n };\n }\n\n const localEnabled = (process.env.TAILOR_CRASH_REPORTS_LOCAL ?? \"on\").toLowerCase() !== \"off\";\n const remoteEnabled = (process.env.TAILOR_CRASH_REPORTS_REMOTE ?? \"off\").toLowerCase() === \"on\";\n const localDir = xdgConfig ? path.join(xdgConfig, \"tailor-platform\", \"crash-reports\") : \"\";\n\n return {\n localEnabled: localEnabled && localDir !== \"\",\n remoteEnabled,\n localDir,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { ensureSecretDir, writeSecretFile } from \"@/cli/shared/secret-file\";\nimport type { CrashReport } from \"./report\";\n\nconst MAX_CRASH_FILES = 10;\n\n/** Marker line that separates human-readable content from the JSON footer. */\nexport const JSON_FOOTER_MARKER = \"--- JSON ---\";\n\n/** File extension for crash log files. */\nexport const CRASH_LOG_EXTENSION = \".crash.log\";\n\n/**\n * Format a CrashReport as human-readable text for local crash log files.\n * @param report - Crash report to format\n * @returns Formatted text content\n */\nexport function formatCrashReport(report: CrashReport): string {\n const lines = [\n `Crash Report: ${report.id}`,\n `Timestamp: ${report.timestamp}`,\n `Error Type: ${report.errorType}`,\n \"\",\n \"--- Environment ---\",\n `SDK Version: ${report.sdkVersion}`,\n `Node Version: ${report.nodeVersion}`,\n `OS: ${report.osPlatform} ${report.osRelease}`,\n `Arch: ${report.arch}`,\n \"\",\n \"--- Command ---\",\n `Command: ${report.command}`,\n `Arguments: ${JSON.stringify(report.argv)}`,\n \"\",\n \"--- Error ---\",\n `Name: ${report.errorName}`,\n `Message: ${report.errorMessage}`,\n \"\",\n \"--- Stack Trace ---\",\n report.stackTrace || \"(no stack trace available)\",\n \"\",\n JSON_FOOTER_MARKER,\n JSON.stringify(report),\n \"\",\n ];\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate a filename for a crash log file.\n * Format: {timestamp}-{shortId}.crash.log\n * @param report - Crash report to generate filename for\n * @returns Filename string\n */\nfunction generateFilename(report: CrashReport): string {\n const safeTimestamp = report.timestamp.replace(/[:.]/g, \"-\");\n const shortId = report.id.slice(0, 8);\n return `${safeTimestamp}-${shortId}${CRASH_LOG_EXTENSION}`;\n}\n\n/**\n * Remove old crash log files, keeping only the most recent ones.\n * @param dir - Crash log directory\n */\nfunction cleanupOldFiles(dir: string): void {\n try {\n const files = fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(CRASH_LOG_EXTENSION))\n .sort()\n .reverse();\n\n for (const file of files.slice(MAX_CRASH_FILES)) {\n fs.unlinkSync(path.join(dir, file));\n }\n } catch {\n // Best-effort cleanup, ignore errors\n }\n}\n\n/**\n * Write a crash report to a local file.\n * Creates the directory if it doesn't exist. Keeps only the last 10 crash files.\n * Never throws - returns the file path on success or undefined on failure.\n * @param report - Crash report to write\n * @param dir - Directory to write the crash log file to\n * @returns File path on success, undefined on failure\n */\nexport function writeCrashReport(report: CrashReport, dir: string): string | undefined {\n try {\n ensureSecretDir(dir);\n\n const filename = generateFilename(report);\n const filePath = path.join(dir, filename);\n const content = formatCrashReport(report);\n\n writeSecretFile(filePath, content);\n cleanupOldFiles(dir);\n\n return filePath;\n } catch {\n return undefined;\n }\n}\n","import type { CrashReport } from \"./report\";\n\nconst SEND_TIMEOUT_MS = 5000;\nconst PRODUCTION_ENDPOINT = \"https://sdk-error-tracking-926vh9t4cl.erp.dev/query\";\n\nconst SUBMIT_MUTATION = `\nmutation SubmitCrashReport(\n $id: String!\n $timestamp: String!\n $sdkVersion: String!\n $nodeVersion: String!\n $osPlatform: String!\n $osRelease: String!\n $arch: String!\n $command: String!\n $argv: [String]\n $errorName: String!\n $errorMessage: String!\n $stackTrace: String\n $errorType: String!\n $userId: String\n $userEmail: String\n) {\n submitCrashReport(\n id: $id\n timestamp: $timestamp\n sdkVersion: $sdkVersion\n nodeVersion: $nodeVersion\n osPlatform: $osPlatform\n osRelease: $osRelease\n arch: $arch\n command: $command\n argv: $argv\n errorName: $errorName\n errorMessage: $errorMessage\n stackTrace: $stackTrace\n errorType: $errorType\n userId: $userId\n userEmail: $userEmail\n ) {\n success\n }\n}`;\n\n/**\n * Send a crash report to the remote endpoint via GraphQL mutation.\n * Best-effort: never throws, returns boolean success.\n * @param report - Crash report to send\n * @param ua - User-Agent header value\n * @returns true if the request succeeded, false otherwise\n */\nexport async function sendCrashReport(report: CrashReport, ua: string): Promise<boolean> {\n try {\n const endpoint = process.env.TAILOR_CRASH_REPORT_ENDPOINT || PRODUCTION_ENDPOINT;\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"User-Agent\": ua,\n },\n body: JSON.stringify({\n query: SUBMIT_MUTATION,\n variables: report,\n }),\n signal: AbortSignal.timeout(SEND_TIMEOUT_MS),\n });\n\n if (!response.ok) return false;\n\n const data = (await response.json()) as {\n errors?: unknown[];\n data?: { submitCrashReport: { success: boolean } };\n };\n if (data.errors?.length) return false;\n return data.data?.submitCrashReport.success === true;\n } catch {\n return false;\n }\n}\n","import * as os from \"node:os\";\n\nconst HOME_DIR = os.homedir();\n\n// Patterns for sanitization (global variants for use with .replace())\nconst UUID_PATTERN = /\\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\b/gi;\nconst LONG_HEX_PATTERN = /\\b[0-9a-fA-F]{32,}\\b/g;\nconst EMAIL_PATTERN = /\\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\\b/g;\nconst ABSOLUTE_PATH_PATTERN = /(?:\\/(?:[\\w.@\\- ]+\\/)+[\\w.@\\- ]+)/g;\nconst WINDOWS_PATH_PATTERN = /(?:[A-Za-z]:\\\\(?:[\\w.@\\- ]+\\\\)+[\\w.@\\- ]+)/g;\nconst URL_QUERY_PATTERN = /[?&][^?\\s]*/g;\n\n// Non-global variants for single-match .test() calls (avoids lastIndex state issues)\nconst EMAIL_TEST_PATTERN = /\\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}\\b/;\nconst WINDOWS_DRIVE_TEST_PATTERN = /^[A-Za-z]:\\\\/;\n\n// SDK package path marker for relative paths\nconst SDK_PACKAGE_MARKER = \"packages/sdk/\";\n\nfunction lastSegment(filePath: string, separator: string): string {\n return filePath.split(separator).pop() ?? filePath;\n}\n\n/**\n * Sanitize a stack trace by replacing absolute paths with relative SDK paths.\n * External paths are replaced with `<external>/filename.ext`.\n * Home directories are replaced with `~/<redacted>/`.\n * @param stack - Raw stack trace string\n * @returns Sanitized stack trace\n */\nexport function sanitizeStackTrace(stack: string): string {\n // V8 stack traces start with \"ErrorType: message\\n at ...\".\n // The error message may span multiple lines before the first \" at \" frame.\n // Apply message sanitization to all message lines so secrets embedded in\n // multiline error messages are redacted consistently with errorMessage.\n const firstFrameIndex = stack.search(/\\n\\s+at /);\n let result: string;\n if (firstFrameIndex !== -1) {\n result = sanitizeMessage(stack.slice(0, firstFrameIndex)) + stack.slice(firstFrameIndex);\n } else {\n result = sanitizeMessage(stack);\n }\n\n result = result.replace(ABSOLUTE_PATH_PATTERN, (match) => {\n const sdkIndex = match.indexOf(SDK_PACKAGE_MARKER);\n if (sdkIndex !== -1) {\n return match.slice(sdkIndex);\n }\n\n if (match.startsWith(HOME_DIR)) {\n return `~/<redacted>/${lastSegment(match, \"/\")}`;\n }\n\n return `<external>/${lastSegment(match, \"/\")}`;\n });\n result = result.replace(WINDOWS_PATH_PATTERN, (match) => {\n const normalized = match.replace(/\\\\/g, \"/\");\n const sdkIndex = normalized.indexOf(SDK_PACKAGE_MARKER);\n if (sdkIndex !== -1) {\n return normalized.slice(sdkIndex);\n }\n return `<external>/${lastSegment(match, \"\\\\\")}`;\n });\n return result;\n}\n\n/**\n * Sanitize an error message by redacting sensitive information.\n * Redacts: UUIDs, long hex tokens, email addresses, absolute paths, URL query strings.\n * @param message - Raw error message\n * @returns Sanitized error message\n */\nexport function sanitizeMessage(message: string): string {\n let result = message;\n // Strip serialized request/response bodies that may contain secrets\n result = result.replace(/\\nRequest:\\s*[\\s\\S]*$/, \"\\nRequest: <redacted>\");\n result = result.replace(UUID_PATTERN, \"<uuid>\");\n result = result.replace(LONG_HEX_PATTERN, \"<redacted>\");\n result = result.replace(EMAIL_PATTERN, \"<email>\");\n result = result.replace(URL_QUERY_PATTERN, \"?<redacted>\");\n result = result.replace(ABSOLUTE_PATH_PATTERN, (match) => `<path>/${lastSegment(match, \"/\")}`);\n result = result.replace(WINDOWS_PATH_PATTERN, (match) => `<path>/${lastSegment(match, \"\\\\\")}`);\n\n return result;\n}\n\n/**\n * Sanitize process.argv by keeping command/subcommand names and redacting\n * values of sensitive flags.\n * @param argv - Raw process.argv array\n * @returns Sanitized argv array\n */\nexport function sanitizeArgv(argv: string[]): string[] {\n const result: string[] = [];\n let redactNext = false;\n\n for (const arg of argv) {\n if (redactNext) {\n // If the next token is itself a flag, treat it as a new flag rather\n // than consuming it as the previous flag's value. This avoids leaking\n // the *next* flag's value (e.g., `--verbose --workspace-id secret`\n // would otherwise expose `secret`).\n if (!arg.startsWith(\"-\")) {\n result.push(\"<redacted>\");\n redactNext = false;\n continue;\n }\n redactNext = false;\n }\n\n if (arg.startsWith(\"-\")) {\n // --flag=value: keep flag name, redact value\n const eqIndex = arg.indexOf(\"=\");\n if (eqIndex !== -1) {\n result.push(`${arg.slice(0, eqIndex)}=<redacted>`);\n continue;\n }\n\n // --flag / -f: keep flag name, redact next arg as its value\n result.push(arg);\n redactNext = true;\n continue;\n }\n\n // Redact absolute paths\n if (arg.startsWith(\"/\") && arg.includes(\"/\", 1)) {\n result.push(\"<path>\");\n continue;\n }\n\n // Redact Windows-style absolute paths\n if (WINDOWS_DRIVE_TEST_PATTERN.test(arg)) {\n result.push(\"<path>\");\n continue;\n }\n\n // Redact email addresses\n if (EMAIL_TEST_PATTERN.test(arg)) {\n result.push(\"<email>\");\n continue;\n }\n\n result.push(arg);\n }\n\n return result;\n}\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport { parseYAML } from \"confbox\";\nimport * as path from \"pathe\";\nimport { xdgConfig } from \"xdg-basedir\";\nimport { sanitizeArgv, sanitizeMessage, sanitizeStackTrace } from \"./sanitize\";\n\nexport type ErrorType = \"uncaughtException\" | \"unhandledRejection\" | \"handledError\";\n\nexport interface CrashReport {\n id: string;\n timestamp: string;\n sdkVersion: string;\n nodeVersion: string;\n osPlatform: string;\n osRelease: string;\n arch: string;\n command: string;\n argv: string[];\n errorName: string;\n errorMessage: string;\n stackTrace: string;\n errorType: ErrorType;\n userId: string | null;\n userEmail: string | null;\n}\n\ninterface BuildCrashReportOptions {\n error: unknown;\n sdkVersion: string;\n errorType: ErrorType;\n}\n\n// Maximum subcommand depth to keep (e.g., \"tailordb migrate generate\" = 3 tokens).\n// Positional arguments beyond this are potentially sensitive user input.\n// Accepted trade-off: plain-text positional args that don't match known patterns\n// (UUIDs, hex tokens, emails, paths) pass through to `command` and `argv`.\n// Full redaction would require embedding the CLI command tree here, which is fragile.\nconst MAX_COMMAND_TOKENS = 3;\n\n/**\n * Parse the command name from process.argv.\n * Extracts up to MAX_COMMAND_TOKENS non-flag arguments after the script name.\n * @returns Parsed command string\n */\nfunction parseCommand(): string {\n const args = process.argv.slice(2);\n const commandParts: string[] = [];\n for (const arg of args) {\n if (arg.startsWith(\"-\") || commandParts.length >= MAX_COMMAND_TOKENS) break;\n commandParts.push(arg);\n }\n return commandParts.join(\" \") || \"<unknown>\";\n}\n\n/**\n * Build a CrashReport data structure from an error and context.\n * All sensitive data is sanitized before inclusion.\n * @param options - Error, SDK version, and crash type\n * @returns Sanitized crash report\n */\nexport function buildCrashReport(options: BuildCrashReportOptions): CrashReport {\n const { error, sdkVersion, errorType } = options;\n\n const isError = error instanceof Error;\n const rawMessage = isError ? error.message : String(error);\n const rawStack = isError && error.stack ? error.stack : \"\";\n const errorName = isError ? error.name : \"UnknownError\";\n\n const currentUser = readCurrentUser();\n\n return {\n id: crypto.randomUUID(),\n timestamp: new Date().toISOString(),\n sdkVersion,\n nodeVersion: process.version,\n osPlatform: process.platform,\n osRelease: os.release(),\n arch: process.arch,\n command: sanitizeMessage(parseCommand()),\n argv: sanitizeArgv(process.argv),\n errorName,\n errorMessage: sanitizeMessage(rawMessage),\n stackTrace: sanitizeStackTrace(rawStack),\n errorType,\n userId: currentUser,\n userEmail: currentUser,\n };\n}\n\n/**\n * Read current_user from Tailor Platform config without side effects.\n * Unlike readPlatformConfig(), this never triggers migration or logs warnings.\n * @returns The current user email, or null if unavailable\n */\nfunction readCurrentUser(): string | null {\n try {\n if (!xdgConfig) return null;\n const configPath = path.join(xdgConfig, \"tailor-platform\", \"config.yaml\");\n if (!fs.existsSync(configPath)) return null;\n const raw = parseYAML(fs.readFileSync(configPath, \"utf-8\")) as { current_user?: string | null };\n return raw?.current_user ?? null;\n } catch {\n return null;\n }\n}\n","import { logger } from \"@/cli/shared/logger\";\nimport { readPackageJson } from \"@/cli/shared/package-json\";\nimport { parseCrashReportConfig } from \"./config\";\nimport { buildCrashReport, type ErrorType } from \"./report\";\nimport { sendCrashReport } from \"./sender\";\nimport { writeCrashReport } from \"./writer\";\n\n/**\n * Report an unexpected crash. Writes a local crash log file and optionally\n * sends the report to a remote endpoint. Displays a user-facing message\n * with the crash log path and a command to submit the report.\n *\n * Never throws - all errors are silently caught.\n * @param error - The error that caused the crash\n * @param errorType - How the error was caught\n */\nexport async function reportCrash(error: unknown, errorType: ErrorType): Promise<void> {\n try {\n const config = parseCrashReportConfig();\n if (!config.localEnabled && !config.remoteEnabled) return;\n\n const packageJson = await readPackageJson();\n const sdkVersion = packageJson.version ?? \"unknown\";\n\n const report = buildCrashReport({ error, sdkVersion, errorType });\n\n if (config.localEnabled) {\n const filePath = writeCrashReport(report, config.localDir);\n if (filePath) {\n logger.log(\n [\n \"\",\n \"An unexpected error occurred. A crash report has been saved to:\",\n ` ${filePath}`,\n \"\",\n \"To submit this report:\",\n ` tailor-sdk crashreport send --file \"${filePath}\"`,\n ].join(\"\\n\"),\n );\n }\n }\n\n if (config.remoteEnabled) {\n // Lazy import: client.ts pulls in heavy dependencies (OAuth2, Connect, Protobuf)\n // that should not be loaded on the startup critical path via initCrashReporting().\n const { userAgent } = await import(\"@/cli/shared/client\");\n const ua = await userAgent();\n await sendCrashReport(report, ua);\n }\n } catch {\n // Never throw from crash reporting\n }\n}\n\n/**\n * Register global uncaughtException and unhandledRejection handlers.\n * These catch errors outside the normal cleanup flow (e.g., during\n * argument parsing). Should be called once at CLI startup before runMain.\n */\nexport function initCrashReporting(): void {\n const config = parseCrashReportConfig();\n if (!config.localEnabled && !config.remoteEnabled) return;\n\n const handleFatal = (error: unknown, errorType: ErrorType) => {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(message);\n void reportCrash(error, errorType).finally(() => {\n process.exit(1);\n });\n };\n\n process.on(\"uncaughtException\", (error) => handleFatal(error, \"uncaughtException\"));\n process.on(\"unhandledRejection\", (reason) => handleFatal(reason, \"unhandledRejection\"));\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
 
2
- import { n as reportCrash, t as initCrashReporting } from "./crashreport-CNSw_BrJ.mjs";
2
+ import { n as reportCrash, t as initCrashReporting } from "./crashreport-CvmdFs4i.mjs";
3
3
 
4
4
  export { reportCrash };
@@ -40,4 +40,4 @@ function isCLIError(error) {
40
40
 
41
41
  //#endregion
42
42
  export { isCLIError as n, createCLIError as t };
43
- //# sourceMappingURL=errors-wNQxQQBH.mjs.map
43
+ //# sourceMappingURL=errors-pMPXghkO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors-wNQxQQBH.mjs","names":[],"sources":["../src/cli/shared/errors.ts"],"sourcesContent":["import chalk from \"chalk\";\n\n/**\n * Options for creating a CLI error\n */\nexport interface CLIErrorOptions {\n message: string;\n details?: string;\n suggestion?: string;\n command?: string;\n code?: string;\n}\n\n/**\n * CLI error interface with formatted output\n */\nexport interface CLIError extends Error {\n readonly code?: string;\n readonly details?: string;\n readonly suggestion?: string;\n readonly command?: string;\n format(): string;\n}\n\ntype CLIErrorInternal = Error & {\n code?: string;\n details?: string;\n suggestion?: string;\n command?: string;\n format(): string;\n};\n\n/**\n * Format CLI error for output\n * @param error - CLIError instance to format\n * @returns Formatted error message\n */\nfunction formatError(error: CLIError): string {\n const parts: string[] = [\n chalk.red(`Error${error.code ? ` [${error.code}]` : \"\"}: ${error.message}`),\n ];\n\n if (error.details) {\n parts.push(`\\n ${chalk.gray(\"Details:\")} ${error.details}`);\n }\n\n if (error.suggestion) {\n parts.push(`\\n ${chalk.cyan(\"Suggestion:\")} ${error.suggestion}`);\n }\n\n if (error.command) {\n parts.push(\n `\\n ${chalk.gray(\"Help:\")} Run \\`tailor-sdk ${error.command} --help\\` for usage information.`,\n );\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Create a CLI error with formatted output\n * @param options - Options to construct a CLIError\n * @returns Constructed CLIError instance\n */\nfunction createCLIError(options: CLIErrorOptions): CLIError {\n const error = new Error(options.message) as CLIErrorInternal;\n error.name = \"CLIError\";\n error.code = options.code;\n error.details = options.details;\n error.suggestion = options.suggestion;\n error.command = options.command;\n error.format = () => formatError(error);\n return error;\n}\n\n/**\n * Type guard to check if an error is a CLIError\n * @param error - Error to check\n * @returns True if the error is a CLIError\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof Error && error.name === \"CLIError\";\n}\n\n// Re-export createCLIError as CLIError for backward compatibility\nexport { createCLIError as CLIError };\n"],"mappings":";;;;;;;;;AAqCA,SAAS,YAAY,OAAyB;CAC5C,MAAM,QAAkB,CACtB,MAAM,IAAI,QAAQ,MAAM,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,MAAM,UAAU,CAC5E;CAED,IAAI,MAAM,SACR,MAAM,KAAK,OAAO,MAAM,KAAK,WAAW,CAAC,GAAG,MAAM,UAAU;CAG9D,IAAI,MAAM,YACR,MAAM,KAAK,OAAO,MAAM,KAAK,cAAc,CAAC,GAAG,MAAM,aAAa;CAGpE,IAAI,MAAM,SACR,MAAM,KACJ,OAAO,MAAM,KAAK,QAAQ,CAAC,oBAAoB,MAAM,QAAQ,kCAC9D;CAGH,OAAO,MAAM,KAAK,GAAG;;;;;;;AAQvB,SAAS,eAAe,SAAoC;CAC1D,MAAM,QAAQ,IAAI,MAAM,QAAQ,QAAQ;CACxC,MAAM,OAAO;CACb,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAU,QAAQ;CACxB,MAAM,aAAa,QAAQ;CAC3B,MAAM,UAAU,QAAQ;CACxB,MAAM,eAAe,YAAY,MAAM;CACvC,OAAO;;;;;;;AAQT,SAAgB,WAAW,OAAmC;CAC5D,OAAO,iBAAiB,SAAS,MAAM,SAAS"}
1
+ {"version":3,"file":"errors-pMPXghkO.mjs","names":[],"sources":["../src/cli/shared/errors.ts"],"sourcesContent":["import chalk from \"chalk\";\n\n/**\n * Options for creating a CLI error\n */\nexport interface CLIErrorOptions {\n message: string;\n details?: string;\n suggestion?: string;\n command?: string;\n code?: string;\n}\n\n/**\n * CLI error interface with formatted output\n */\nexport interface CLIError extends Error {\n readonly code?: string;\n readonly details?: string;\n readonly suggestion?: string;\n readonly command?: string;\n format(): string;\n}\n\ntype CLIErrorInternal = Error & {\n code?: string;\n details?: string;\n suggestion?: string;\n command?: string;\n format(): string;\n};\n\n/**\n * Format CLI error for output\n * @param error - CLIError instance to format\n * @returns Formatted error message\n */\nfunction formatError(error: CLIError): string {\n const parts: string[] = [\n chalk.red(`Error${error.code ? ` [${error.code}]` : \"\"}: ${error.message}`),\n ];\n\n if (error.details) {\n parts.push(`\\n ${chalk.gray(\"Details:\")} ${error.details}`);\n }\n\n if (error.suggestion) {\n parts.push(`\\n ${chalk.cyan(\"Suggestion:\")} ${error.suggestion}`);\n }\n\n if (error.command) {\n parts.push(\n `\\n ${chalk.gray(\"Help:\")} Run \\`tailor-sdk ${error.command} --help\\` for usage information.`,\n );\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Create a CLI error with formatted output\n * @param options - Options to construct a CLIError\n * @returns Constructed CLIError instance\n */\nfunction createCLIError(options: CLIErrorOptions): CLIError {\n const error = new Error(options.message) as CLIErrorInternal;\n error.name = \"CLIError\";\n error.code = options.code;\n error.details = options.details;\n error.suggestion = options.suggestion;\n error.command = options.command;\n error.format = () => formatError(error);\n return error;\n}\n\n/**\n * Type guard to check if an error is a CLIError\n * @param error - Error to check\n * @returns True if the error is a CLIError\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof Error && error.name === \"CLIError\";\n}\n\n// Re-export createCLIError as CLIError for backward compatibility\nexport { createCLIError as CLIError };\n"],"mappings":";;;;;;;;;AAqCA,SAAS,YAAY,OAAyB;CAC5C,MAAM,QAAkB,CACtB,MAAM,IAAI,QAAQ,MAAM,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,MAAM,UAAU,CAC5E;CAED,IAAI,MAAM,SACR,MAAM,KAAK,OAAO,MAAM,KAAK,WAAW,CAAC,GAAG,MAAM,UAAU;CAG9D,IAAI,MAAM,YACR,MAAM,KAAK,OAAO,MAAM,KAAK,cAAc,CAAC,GAAG,MAAM,aAAa;CAGpE,IAAI,MAAM,SACR,MAAM,KACJ,OAAO,MAAM,KAAK,QAAQ,CAAC,oBAAoB,MAAM,QAAQ,kCAC9D;CAGH,OAAO,MAAM,KAAK,GAAG;;;;;;;AAQvB,SAAS,eAAe,SAAoC;CAC1D,MAAM,QAAQ,IAAI,MAAM,QAAQ,QAAQ;CACxC,MAAM,OAAO;CACb,MAAM,OAAO,QAAQ;CACrB,MAAM,UAAU,QAAQ;CACxB,MAAM,aAAa,QAAQ;CAC3B,MAAM,UAAU,QAAQ;CACxB,MAAM,eAAe,YAAY,MAAM;CACvC,OAAO;;;;;;;AAQT,SAAgB,WAAW,OAAmC;CAC5D,OAAO,iBAAiB,SAAS,MAAM,SAAS"}
@@ -0,0 +1,48 @@
1
+ /// <reference types="@tailor-platform/function-types" />
2
+ import { o as Plugin } from "./tailor-db-field-4bMLe25-.mjs";
3
+
4
+ //#region src/plugin/builtin/seed/index.d.ts
5
+ /** Unique identifier for the seed generator plugin. */
6
+ declare const SeedGeneratorID = "@tailor-platform/seed";
7
+ type DisableIdpUserSyncDirections = {
8
+ /**
9
+ * Skip emitting the foreign key from `<userProfile>.<usernameField>` to
10
+ * `_User.name`. Defaults to `false` (FK emitted).
11
+ *
12
+ * Set to `true` to seed pre-registration states such as
13
+ * invited-but-not-registered users.
14
+ */
15
+ userToIdp?: boolean;
16
+ /**
17
+ * Skip emitting the foreign key from `_User.name` to
18
+ * `<userProfile>.<usernameField>`. Defaults to `false` (FK emitted).
19
+ *
20
+ * Set to `true` to seed `_User` rows that do not yet have a corresponding
21
+ * userProfile row.
22
+ */
23
+ idpToUser?: boolean;
24
+ };
25
+ type SeedPluginOptions = {
26
+ distPath: string;
27
+ machineUserName?: string;
28
+ /**
29
+ * Disable individual `_User <-> userProfile` foreign keys emitted into
30
+ * the generated seed schema. Both directions are emitted by default.
31
+ *
32
+ * Set a direction to `true` to relax it — for example to seed invited
33
+ * users that do not yet have an IdP credential.
34
+ */
35
+ disableIdpUserSync?: DisableIdpUserSyncDirections;
36
+ };
37
+ /**
38
+ * Plugin that generates seed data files with Kysely batch insert and tailor.idp.Client for _User.
39
+ * @param options - Plugin options
40
+ * @param options.distPath - Output directory path for generated seed files
41
+ * @param options.machineUserName - Default machine user name for authentication
42
+ * @param options.disableIdpUserSync - Skip emitting individual `_User <-> userProfile` foreign keys. Both directions are emitted by default; set a direction to `true` to relax that side.
43
+ * @returns Plugin instance with onTailorDBReady hook
44
+ */
45
+ declare function seedPlugin(options: SeedPluginOptions): Plugin<unknown, SeedPluginOptions>;
46
+ //#endregion
47
+ export { seedPlugin as n, SeedGeneratorID as t };
48
+ //# sourceMappingURL=index-BQ4oi0AI.d.mts.map
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { o as Plugin } from "./tailor-db-field-Bn8ZC5lK.mjs";
2
+ import { o as Plugin } from "./tailor-db-field-4bMLe25-.mjs";
3
3
 
4
4
  //#region src/plugin/builtin/enum-constants/index.d.ts
5
5
  /** Unique identifier for the enum constants generator plugin. */
@@ -16,4 +16,4 @@ type EnumConstantsPluginOptions = {
16
16
  declare function enumConstantsPlugin(options: EnumConstantsPluginOptions): Plugin<unknown, EnumConstantsPluginOptions>;
17
17
  //#endregion
18
18
  export { enumConstantsPlugin as n, EnumConstantsGeneratorID as t };
19
- //# sourceMappingURL=index-BbOTbZFf.d.mts.map
19
+ //# sourceMappingURL=index-BjXN1SdY.d.mts.map
@@ -1,7 +1,7 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { $ as ResolverInput, At as FieldMetadata, Bt as InferredAttributeMap, Dt as ArrayFieldOutput, Ft as FieldValidateInput, G as UserAttributeListKey, Gt as JsonCompatible, Ht as TailorUser, Jt as output$1, K as UserAttributeMap, Kt as JsonValue, Mt as FieldOutput, Nt as TailorFieldType, Ot as DefinedFieldMetadata, Q as Resolver, V as DefinedAuth, Vt as TailorInvoker, Wt as InferFieldsOutput, Y as TailorField$1, at as FunctionOperation$1, ct as IncomingWebhookTrigger$1, dt as TailorDBTrigger$1, et as GeneratorConfig, ft as WebhookOperation$1, it as ExecutorInput, jt as FieldOptions, lt as ResolverExecutedTrigger$1, mt as AuthInvoker$1, nt as AuthAccessTokenTrigger$1, o as Plugin, ot as GqlOperation$1, pt as WorkflowOperation$1, qt as Prettify, st as IdpUserTrigger$1, tt as BaseGeneratorConfig, ut as ScheduleTriggerInput, z as AuthServiceInput } from "./tailor-db-field-Bn8ZC5lK.mjs";
3
- import { C as IdPInput, D as TailorDBInstance, F as AllowedValues, I as AllowedValuesOutput, O as TailorDBType, f as StaticWebsiteDefinitionBrand, h as SecretsDefinitionBrand, n as RetryPolicy, p as StaticWebsiteInput, r as AppConfig, t as ConcurrencyPolicy, v as IdPUserField, y as IdpDefinitionBrand } from "./workflow.generated-i7PK4fg-.mjs";
4
- import { r as TailorEnv, t as TailorActor } from "./actor-jk4-f0yp.mjs";
2
+ import { $ as ResolverInput, At as FieldMetadata, Bt as InferredAttributeMap, Dt as ArrayFieldOutput, Ft as FieldValidateInput, G as UserAttributeListKey, Gt as JsonCompatible, Ht as TailorUser, Jt as output$1, K as UserAttributeMap, Kt as JsonValue, Mt as FieldOutput, Nt as TailorFieldType, Ot as DefinedFieldMetadata, Q as Resolver, V as DefinedAuth, Vt as TailorInvoker, Wt as InferFieldsOutput, Y as TailorField$1, at as FunctionOperation$1, ct as IncomingWebhookTrigger$1, dt as TailorDBTrigger$1, et as GeneratorConfig, ft as WebhookOperation$1, it as ExecutorInput, jt as FieldOptions, lt as ResolverExecutedTrigger$1, mt as AuthInvoker$1, nt as AuthAccessTokenTrigger$1, o as Plugin, ot as GqlOperation$1, pt as WorkflowOperation$1, qt as Prettify, st as IdpUserTrigger$1, tt as BaseGeneratorConfig, ut as ScheduleTriggerInput, z as AuthServiceInput } from "./tailor-db-field-4bMLe25-.mjs";
3
+ import { C as IdPInput, D as TailorDBInstance, F as AllowedValues, I as AllowedValuesOutput, O as TailorDBType, f as StaticWebsiteDefinitionBrand, h as SecretsDefinitionBrand, n as RetryPolicy, p as StaticWebsiteInput, r as AppConfig, t as ConcurrencyPolicy, v as IdPUserField, y as IdpDefinitionBrand } from "./workflow.generated-OYAu_6zX.mjs";
4
+ import { r as TailorEnv, t as TailorActor } from "./actor-BeIEiPYM.mjs";
5
5
  import { StandardSchemaV1 } from "@standard-schema/spec";
6
6
  import { Client } from "@urql/core";
7
7
  import { StandardCRON } from "ts-cron-validator";
@@ -289,7 +289,7 @@ interface CreateWorkflowJobConfig<Name extends string, I, O> {
289
289
  * },
290
290
  * });
291
291
  */
292
- declare const createWorkflowJob: <const Name extends string, I = undefined, O = undefined>(config: CreateWorkflowJobConfig<Name, I, O>) => WorkflowJob<Name, I, Awaited<O>>;
292
+ declare function createWorkflowJob<const Name extends string, I = undefined, O = undefined>(config: CreateWorkflowJobConfig<Name, I, O>): WorkflowJob<Name, I, Awaited<O>>;
293
293
  //#endregion
294
294
  //#region src/configure/services/workflow/workflow.d.ts
295
295
  interface WorkflowConfig<Job extends WorkflowJob<any, any, any> = WorkflowJob<any, any, any>> {
@@ -1121,4 +1121,4 @@ declare namespace t {
1121
1121
  }
1122
1122
  //#endregion
1123
1123
  export { recordDeletedTrigger as $, AuthAccessTokenRefreshedArgs as A, RecordUpdatedArgs as B, IncomingWebhookTriggerOptions as C, MachineUserNameRegistry as Ct, scheduleTrigger as D, ScheduleTrigger as E, IdpUserDeletedArgs as F, authAccessTokenRefreshedTrigger as G, ResolverExecutedTrigger as H, IdpUserTrigger as I, idpUserCreatedTrigger as J, authAccessTokenRevokedTrigger as K, IdpUserUpdatedArgs as L, AuthAccessTokenTrigger as M, IdpUserArgs as N, AuthAccessTokenArgs as O, IdpUserCreatedArgs as P, recordCreatedTrigger as Q, RecordCreatedArgs as R, IncomingWebhookTrigger as S, MachineUserName as St, ScheduleArgs as T, TailorDBTrigger as U, ResolverExecutedArgs as V, authAccessTokenIssuedTrigger as W, idpUserTrigger as X, idpUserDeletedTrigger as Y, idpUserUpdatedTrigger as Z, Trigger as _, AuthInvoker as _t, defineGenerators as a, Operation as at, IncomingWebhookResponse as b, IdpNameRegistry as bt, defineIdp as c, Workflow as ct, unsafeAllowAllIdPPermission as d, WORKFLOW_TEST_ENV_KEY as dt, recordTrigger as et, defineStaticWebSite as f, WorkflowJob as ft, createExecutor as g, createResolver as gt, defineWaitPoints as h, QueryType as ht, defineConfig as i, GqlOperation as it, AuthAccessTokenRevokedArgs as j, AuthAccessTokenIssuedArgs as k, IdPPermission as l, WorkflowConfig as lt, defineWaitPoint as m, createWorkflowJob as mt, output as n, resolverExecutedTrigger as nt, definePlugins as o, WebhookOperation as ot, WaitPointInstance as p, WorkflowJobContext as pt, authAccessTokenTrigger as q, t as r, FunctionOperation as rt, defineSecretManager as s, WorkflowOperation as st, infer as t, recordUpdatedTrigger as tt, IdPPermissionCondition as u, createWorkflow as ut, IncomingWebhookArgs as v, defineAuth as vt, incomingWebhookTrigger as w, IncomingWebhookResponseConfig as x, TailorField as xt, IncomingWebhookRequest as y, IdpName as yt, RecordDeletedArgs as z };
1124
- //# sourceMappingURL=index-DB8EapT-.d.mts.map
1124
+ //# sourceMappingURL=index-C--7W0UO.d.mts.map
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { o as Plugin } from "./tailor-db-field-Bn8ZC5lK.mjs";
2
+ import { o as Plugin } from "./tailor-db-field-4bMLe25-.mjs";
3
3
 
4
4
  //#region src/plugin/builtin/kysely-type/index.d.ts
5
5
  /** Unique identifier for the Kysely type generator plugin. */
@@ -16,4 +16,4 @@ type KyselyTypePluginOptions = {
16
16
  declare function kyselyTypePlugin(options: KyselyTypePluginOptions): Plugin<unknown, KyselyTypePluginOptions>;
17
17
  //#endregion
18
18
  export { kyselyTypePlugin as n, KyselyGeneratorID as t };
19
- //# sourceMappingURL=index-BRvNi5q9.d.mts.map
19
+ //# sourceMappingURL=index-VJW98BSy.d.mts.map
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { o as Plugin } from "./tailor-db-field-Bn8ZC5lK.mjs";
2
+ import { o as Plugin } from "./tailor-db-field-4bMLe25-.mjs";
3
3
 
4
4
  //#region src/plugin/builtin/file-utils/index.d.ts
5
5
  /** Unique identifier for the file utilities generator plugin. */
@@ -16,4 +16,4 @@ type FileUtilsPluginOptions = {
16
16
  declare function fileUtilsPlugin(options: FileUtilsPluginOptions): Plugin<unknown, FileUtilsPluginOptions>;
17
17
  //#endregion
18
18
  export { fileUtilsPlugin as n, FileUtilsGeneratorID as t };
19
- //# sourceMappingURL=index-iy-hNfGp.d.mts.map
19
+ //# sourceMappingURL=index-nV4ZC_Ve.d.mts.map
@@ -31,4 +31,4 @@ function createTracingInterceptor() {
31
31
 
32
32
  //#endregion
33
33
  export { createTracingInterceptor };
34
- //# sourceMappingURL=interceptor-CBsqEWDK.mjs.map
34
+ //# sourceMappingURL=interceptor-DTNS0EtF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor-CBsqEWDK.mjs","names":[],"sources":["../src/cli/telemetry/interceptor.ts"],"sourcesContent":["import { trace, SpanStatusCode } from \"@opentelemetry/api\";\nimport type { Interceptor } from \"@connectrpc/connect\";\n\n/**\n * Create a Connect-RPC interceptor that records OTLP spans for each RPC call.\n * When no TracerProvider is registered, the OTel API automatically provides\n * noop spans with zero overhead.\n * @returns Tracing interceptor\n */\nexport function createTracingInterceptor(): Interceptor {\n return (next) => async (req) => {\n const tracer = trace.getTracer(\"tailor-sdk\");\n\n return tracer.startActiveSpan(`rpc.${req.method.name}`, async (span) => {\n span.setAttribute(\"rpc.method\", req.method.name);\n span.setAttribute(\"rpc.service\", \"OperatorService\");\n span.setAttribute(\"rpc.system\", \"connect-rpc\");\n\n try {\n const response = await next(req);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n });\n };\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,2BAAwC;CACtD,QAAQ,SAAS,OAAO,QAAQ;EAG9B,OAFe,MAAM,UAAU,aAElB,CAAC,gBAAgB,OAAO,IAAI,OAAO,QAAQ,OAAO,SAAS;GACtE,KAAK,aAAa,cAAc,IAAI,OAAO,KAAK;GAChD,KAAK,aAAa,eAAe,kBAAkB;GACnD,KAAK,aAAa,cAAc,cAAc;GAE9C,IAAI;IACF,MAAM,WAAW,MAAM,KAAK,IAAI;IAChC,KAAK,UAAU,EAAE,MAAM,eAAe,IAAI,CAAC;IAC3C,OAAO;YACA,OAAO;IACd,KAAK,UAAU,EAAE,MAAM,eAAe,OAAO,CAAC;IAC9C,IAAI,iBAAiB,OACnB,KAAK,gBAAgB,MAAM;IAE7B,MAAM;aACE;IACR,KAAK,KAAK;;IAEZ"}
1
+ {"version":3,"file":"interceptor-DTNS0EtF.mjs","names":[],"sources":["../src/cli/telemetry/interceptor.ts"],"sourcesContent":["import { trace, SpanStatusCode } from \"@opentelemetry/api\";\nimport type { Interceptor } from \"@connectrpc/connect\";\n\n/**\n * Create a Connect-RPC interceptor that records OTLP spans for each RPC call.\n * When no TracerProvider is registered, the OTel API automatically provides\n * noop spans with zero overhead.\n * @returns Tracing interceptor\n */\nexport function createTracingInterceptor(): Interceptor {\n return (next) => async (req) => {\n const tracer = trace.getTracer(\"tailor-sdk\");\n\n return tracer.startActiveSpan(`rpc.${req.method.name}`, async (span) => {\n span.setAttribute(\"rpc.method\", req.method.name);\n span.setAttribute(\"rpc.service\", \"OperatorService\");\n span.setAttribute(\"rpc.system\", \"connect-rpc\");\n\n try {\n const response = await next(req);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n });\n };\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,2BAAwC;CACtD,QAAQ,SAAS,OAAO,QAAQ;EAG9B,OAFe,MAAM,UAAU,aAElB,CAAC,gBAAgB,OAAO,IAAI,OAAO,QAAQ,OAAO,SAAS;GACtE,KAAK,aAAa,cAAc,IAAI,OAAO,KAAK;GAChD,KAAK,aAAa,eAAe,kBAAkB;GACnD,KAAK,aAAa,cAAc,cAAc;GAE9C,IAAI;IACF,MAAM,WAAW,MAAM,KAAK,IAAI;IAChC,KAAK,UAAU,EAAE,MAAM,eAAe,IAAI,CAAC;IAC3C,OAAO;YACA,OAAO;IACd,KAAK,UAAU,EAAE,MAAM,eAAe,OAAO,CAAC;IAC9C,IAAI,iBAAiB,OACnB,KAAK,gBAAgB,MAAM;IAE7B,MAAM;aACE;IACR,KAAK,KAAK;;IAEZ"}
@@ -40,7 +40,8 @@ const WORKFLOW_TEST_ENV_KEY = "TAILOR_TEST_WORKFLOW_ENV";
40
40
  * },
41
41
  * });
42
42
  */
43
- const createWorkflowJob = (config) => {
43
+ /* @__NO_SIDE_EFFECTS__ */
44
+ function createWorkflowJob(config) {
44
45
  const body = config.body;
45
46
  return brandValue({
46
47
  name: config.name,
@@ -52,8 +53,8 @@ const createWorkflowJob = (config) => {
52
53
  },
53
54
  body
54
55
  }, "workflow-job");
55
- };
56
+ }
56
57
 
57
58
  //#endregion
58
59
  export { createWorkflowJob as n, WORKFLOW_TEST_ENV_KEY as t };
59
- //# sourceMappingURL=job-R5C2Hfcc.mjs.map
60
+ //# sourceMappingURL=job-M3Avv_SV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"job-R5C2Hfcc.mjs","names":[],"sources":["../src/configure/services/workflow/job.ts"],"sourcesContent":["import { brandValue } from \"@/utils/brand\";\nimport type { TailorEnv } from \"@/types/env\";\nimport type { JsonCompatible } from \"@/types/helpers\";\nimport type { TailorInvoker } from \"@/types/user\";\n\n/**\n * Context object passed as the second argument to workflow job body functions.\n */\nexport type WorkflowJobContext = {\n env: TailorEnv;\n invoker?: TailorInvoker;\n};\n\n/**\n * The body function type for a workflow job.\n * Resolves to the callable signature when `I` / `O` are JsonValue-compatible,\n * or to a template-literal error string that surfaces at the `body:` property.\n */\ntype JobBody<I, O> = [null] extends [I]\n ? \"ERROR: Input cannot be null at the top level\"\n : [I] extends [undefined]\n ? [O] extends [JsonCompatible<O> | undefined | void]\n ? (input: I, context: WorkflowJobContext) => O | Promise<O>\n : \"ERROR: Output must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\"\n : [undefined] extends [I]\n ? \"ERROR: Input cannot include undefined at the top level\"\n : [I] extends [JsonCompatible<I>]\n ? [O] extends [JsonCompatible<O> | undefined | void]\n ? (input: I, context: WorkflowJobContext) => O | Promise<O>\n : \"ERROR: Output must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\"\n : \"ERROR: Input must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\";\n\n/**\n * WorkflowJob represents a job that can be triggered in a workflow.\n *\n * Type constraints:\n * - Input: Must be JsonValue-compatible (plain objects/arrays; no class instances or functions) or undefined.\n * - Output: Must be JsonValue-compatible (plain objects/arrays; no class instances or functions), undefined, or void.\n * - Trigger returns `Awaited<Output>` as-is (no Jsonify transformation).\n */\nexport interface WorkflowJob<Name extends string = string, Input = undefined, Output = undefined> {\n name: Name;\n /**\n * Trigger this job with the given input. Returns a Promise that resolves\n * to the job's output value.\n * @example\n * body: async (input) => {\n * const a = await jobA.trigger({ id: input.id });\n * const b = await jobB.trigger({ id: input.id });\n * return { a, b };\n * }\n */\n trigger: [Input] extends [undefined]\n ? () => Promise<Awaited<Output>>\n : (input: Input) => Promise<Awaited<Output>>;\n body: (input: Input, context: WorkflowJobContext) => Output | Promise<Output>;\n}\n\n/**\n * Environment variable key for workflow testing.\n * Contains JSON-serialized TailorEnv object.\n */\nexport const WORKFLOW_TEST_ENV_KEY = \"TAILOR_TEST_WORKFLOW_ENV\";\n\ninterface CreateWorkflowJobConfig<Name extends string, I, O> {\n readonly name: Name;\n readonly body: JobBody<I, O>;\n}\n\n/**\n * Create a workflow job definition.\n *\n * All jobs must be named exports from the workflow file.\n * Job names must be unique across the entire project.\n *\n * Input and output must be JsonValue-compatible (primitives, plain objects, arrays).\n * Functions and objects with a `toJSON` method are rejected at the type level;\n * class instances exposing methods are rejected via the property walk.\n * @param config - Job configuration with name and body function.\n * @param config.name - Unique job name across the project.\n * @param config.body - Async function that processes the job input.\n * @returns A WorkflowJob that can be triggered from other jobs.\n * @example\n * // Simple job with async body:\n * export const fetchData = createWorkflowJob({\n * name: \"fetch-data\",\n * body: async (input: { id: string }) => {\n * const db = getDB(\"tailordb\");\n * return await db.selectFrom(\"Table\").selectAll().where(\"id\", \"=\", input.id).executeTakeFirst();\n * },\n * });\n * @example\n * // Orchestrator job that fans out to other jobs.\n * export const orchestrate = createWorkflowJob({\n * name: \"orchestrate\",\n * body: async (input: { orderId: string }) => {\n * const inventory = await checkInventory.trigger({ orderId: input.orderId });\n * const payment = await processPayment.trigger({ orderId: input.orderId });\n * return { inventory, payment };\n * },\n * });\n */\nexport const createWorkflowJob = <const Name extends string, I = undefined, O = undefined>(\n config: CreateWorkflowJobConfig<Name, I, O>,\n): WorkflowJob<Name, I, Awaited<O>> => {\n const body = config.body as (input: I, context: WorkflowJobContext) => O | Promise<O>;\n return brandValue(\n {\n name: config.name,\n trigger: async (args?: unknown) => {\n const env: TailorEnv = JSON.parse(process.env[WORKFLOW_TEST_ENV_KEY] || \"{}\");\n return await body(args as I, { env, invoker: null });\n },\n body,\n } as WorkflowJob<Name, I, Awaited<O>>,\n \"workflow-job\",\n );\n};\n"],"mappings":";;;;;;;;AA8DA,MAAa,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCrC,MAAa,qBACX,WACqC;CACrC,MAAM,OAAO,OAAO;CACpB,OAAO,WACL;EACE,MAAM,OAAO;EACb,SAAS,OAAO,SAAmB;GAEjC,OAAO,MAAM,KAAK,MAAW;IAAE,KADR,KAAK,MAAM,QAAQ,mCAA8B,KACtC;IAAE,SAAS;IAAM,CAAC;;EAEtD;EACD,EACD,eACD"}
1
+ {"version":3,"file":"job-M3Avv_SV.mjs","names":[],"sources":["../src/configure/services/workflow/job.ts"],"sourcesContent":["import { brandValue } from \"@/utils/brand\";\nimport type { TailorEnv } from \"@/types/env\";\nimport type { JsonCompatible } from \"@/types/helpers\";\nimport type { TailorInvoker } from \"@/types/user\";\n\n/**\n * Context object passed as the second argument to workflow job body functions.\n */\nexport type WorkflowJobContext = {\n env: TailorEnv;\n invoker?: TailorInvoker;\n};\n\n/**\n * The body function type for a workflow job.\n * Resolves to the callable signature when `I` / `O` are JsonValue-compatible,\n * or to a template-literal error string that surfaces at the `body:` property.\n */\ntype JobBody<I, O> = [null] extends [I]\n ? \"ERROR: Input cannot be null at the top level\"\n : [I] extends [undefined]\n ? [O] extends [JsonCompatible<O> | undefined | void]\n ? (input: I, context: WorkflowJobContext) => O | Promise<O>\n : \"ERROR: Output must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\"\n : [undefined] extends [I]\n ? \"ERROR: Input cannot include undefined at the top level\"\n : [I] extends [JsonCompatible<I>]\n ? [O] extends [JsonCompatible<O> | undefined | void]\n ? (input: I, context: WorkflowJobContext) => O | Promise<O>\n : \"ERROR: Output must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\"\n : \"ERROR: Input must be JsonValue-compatible (plain objects/arrays; no class instances or functions)\";\n\n/**\n * WorkflowJob represents a job that can be triggered in a workflow.\n *\n * Type constraints:\n * - Input: Must be JsonValue-compatible (plain objects/arrays; no class instances or functions) or undefined.\n * - Output: Must be JsonValue-compatible (plain objects/arrays; no class instances or functions), undefined, or void.\n * - Trigger returns `Awaited<Output>` as-is (no Jsonify transformation).\n */\nexport interface WorkflowJob<Name extends string = string, Input = undefined, Output = undefined> {\n name: Name;\n /**\n * Trigger this job with the given input. Returns a Promise that resolves\n * to the job's output value.\n * @example\n * body: async (input) => {\n * const a = await jobA.trigger({ id: input.id });\n * const b = await jobB.trigger({ id: input.id });\n * return { a, b };\n * }\n */\n trigger: [Input] extends [undefined]\n ? () => Promise<Awaited<Output>>\n : (input: Input) => Promise<Awaited<Output>>;\n body: (input: Input, context: WorkflowJobContext) => Output | Promise<Output>;\n}\n\n/**\n * Environment variable key for workflow testing.\n * Contains JSON-serialized TailorEnv object.\n */\nexport const WORKFLOW_TEST_ENV_KEY = \"TAILOR_TEST_WORKFLOW_ENV\";\n\ninterface CreateWorkflowJobConfig<Name extends string, I, O> {\n readonly name: Name;\n readonly body: JobBody<I, O>;\n}\n\n/**\n * Create a workflow job definition.\n *\n * All jobs must be named exports from the workflow file.\n * Job names must be unique across the entire project.\n *\n * Input and output must be JsonValue-compatible (primitives, plain objects, arrays).\n * Functions and objects with a `toJSON` method are rejected at the type level;\n * class instances exposing methods are rejected via the property walk.\n * @param config - Job configuration with name and body function.\n * @param config.name - Unique job name across the project.\n * @param config.body - Async function that processes the job input.\n * @returns A WorkflowJob that can be triggered from other jobs.\n * @example\n * // Simple job with async body:\n * export const fetchData = createWorkflowJob({\n * name: \"fetch-data\",\n * body: async (input: { id: string }) => {\n * const db = getDB(\"tailordb\");\n * return await db.selectFrom(\"Table\").selectAll().where(\"id\", \"=\", input.id).executeTakeFirst();\n * },\n * });\n * @example\n * // Orchestrator job that fans out to other jobs.\n * export const orchestrate = createWorkflowJob({\n * name: \"orchestrate\",\n * body: async (input: { orderId: string }) => {\n * const inventory = await checkInventory.trigger({ orderId: input.orderId });\n * const payment = await processPayment.trigger({ orderId: input.orderId });\n * return { inventory, payment };\n * },\n * });\n */\n/* @__NO_SIDE_EFFECTS__ */\nexport function createWorkflowJob<const Name extends string, I = undefined, O = undefined>(\n config: CreateWorkflowJobConfig<Name, I, O>,\n): WorkflowJob<Name, I, Awaited<O>> {\n const body = config.body as (input: I, context: WorkflowJobContext) => O | Promise<O>;\n return brandValue(\n {\n name: config.name,\n trigger: async (args?: unknown) => {\n const env: TailorEnv = JSON.parse(process.env[WORKFLOW_TEST_ENV_KEY] || \"{}\");\n return await body(args as I, { env, invoker: null });\n },\n body,\n } as WorkflowJob<Name, I, Awaited<O>>,\n \"workflow-job\",\n );\n}\n"],"mappings":";;;;;;;;AA8DA,MAAa,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCrC,SAAgB,kBACd,QACkC;CAClC,MAAM,OAAO,OAAO;CACpB,OAAO,WACL;EACE,MAAM,OAAO;EACb,SAAS,OAAO,SAAmB;GAEjC,OAAO,MAAM,KAAK,MAAW;IAAE,KADR,KAAK,MAAM,QAAQ,mCAA8B,KACtC;IAAE,SAAS;IAAM,CAAC;;EAEtD;EACD,EACD,eACD"}
@@ -793,4 +793,4 @@ function cleanupMocks(global) {
793
793
 
794
794
  //#endregion
795
795
  export { fileMock as a, injectMocks as c, workflowMock as d, cleanupMocks as i, secretmanagerMock as l, STATE_KEY as n, iconvMock as o, authconnectionMock as r, idpMock as s, RUNTIME_FLAG_KEY as t, tailordbMock as u };
796
- //# sourceMappingURL=mock-BP-9O5On.mjs.map
796
+ //# sourceMappingURL=mock-BfL09ULZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-BP-9O5On.mjs","names":["#record","#namespace","#fromEncoding","#toEncoding"],"sources":["../src/vitest/mock.ts"],"sourcesContent":["/**\n * Mock implementations for Tailor Platform APIs.\n *\n * Provides singleton mock objects that are automatically injected into\n * globalThis by the tailor-runtime Vitest environment. Tests can configure\n * responses and assert on recorded calls via the exported mock objects.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype QueryResolver = (query: string, params: unknown[]) => unknown[];\ntype JobHandler = (jobName: string, args: unknown) => unknown;\ntype IdpResolver = (method: string, args: unknown[], namespace: string) => unknown;\ntype FileResolver = (method: string, call: FileCall) => unknown;\ntype IconvResolver = (method: string, args: unknown[]) => unknown;\n\ntype TriggerWorkflowOptions = {\n authInvoker?: { namespace: string; machineUserName: string };\n};\ntype TriggerHandlerFn = (\n workflowName: string,\n args: unknown,\n options?: TriggerWorkflowOptions,\n) => string;\ntype WaitHandlerFn = (key: string, payload: unknown) => unknown;\ntype ResolveHandler = (\n executionId: string,\n key: string,\n callback: (payload: unknown) => unknown,\n) => unknown | Promise<unknown>;\n\n// Overloaded so TypeScript narrows to WaitHandlerFn first (giving inferred\n// `(key: string, payload: unknown) => …` for callers) before falling back\n// to the static-value form. A union type would let `unknown` swallow the\n// function variant and break inference.\ntype SetWaitHandler = {\n (handler: WaitHandlerFn): void;\n (handler: unknown): void;\n};\n\ninterface ExecutedQuery {\n query: string;\n params: unknown[];\n}\n\ninterface CreatedClient {\n namespace: string | undefined;\n ended: boolean;\n}\n\ninterface TriggeredJob {\n jobName: string;\n args: unknown;\n}\n\ninterface SecretCall {\n method: \"getSecret\" | \"getSecrets\";\n vault: string;\n name?: string;\n names?: readonly string[];\n}\n\ninterface AuthConnectionCall {\n connectionName: string;\n}\n\ninterface IdpCall {\n method: string;\n args: unknown[];\n namespace: string;\n}\n\ninterface FileCall {\n method: string;\n namespace: string;\n typeName: string;\n fieldName: string;\n recordId: string;\n}\n\ninterface IconvCall {\n method: string;\n args: unknown[];\n}\n\ninterface WorkflowCall {\n method: \"triggerWorkflow\" | \"wait\" | \"resolve\";\n args: unknown[];\n}\n\ninterface MockState {\n // TailorDB\n queryResolver: QueryResolver;\n queryResultQueue: unknown[][];\n executedQueries: ExecutedQuery[];\n createdClients: CreatedClient[];\n // Workflow\n jobHandler: JobHandler;\n jobResultQueue: unknown[];\n triggeredJobs: TriggeredJob[];\n triggerHandler: string | TriggerHandlerFn;\n waitHandler: unknown | WaitHandlerFn;\n resolveHandler: ResolveHandler | null;\n workflowCalls: WorkflowCall[];\n // SecretManager\n secretStore: Record<string, Record<string, string>>;\n secretCalls: SecretCall[];\n // AuthConnection\n authTokens: Record<string, unknown>;\n authCalls: AuthConnectionCall[];\n // IDP\n idpResolver: IdpResolver;\n idpResultQueue: unknown[];\n idpCalls: IdpCall[];\n // File\n fileResolver: FileResolver;\n fileResultQueue: unknown[];\n fileCalls: FileCall[];\n // Iconv\n iconvResolver: IconvResolver | null;\n iconvCalls: IconvCall[];\n}\n\n// ---------------------------------------------------------------------------\n// State management (shared via globalThis for environment/test interop)\n// ---------------------------------------------------------------------------\n\nexport const STATE_KEY = \"__tailorMockState\";\n\n// Sentinel set by the tailor-runtime environment in injectMocks() and cleared\n// in cleanupMocks(). Distinct from STATE_KEY, which is created lazily by\n// getState() whenever a mock helper runs (even from a non-tailor-runtime\n// project that happens to import the mocks). Use this flag to detect whether\n// the environment itself is active.\nexport const RUNTIME_FLAG_KEY = \"__tailorRuntimeActive\";\n\nfunction getState(): MockState {\n const g = globalThis as Record<string, unknown>;\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = createDefaultState();\n }\n return g[STATE_KEY] as MockState;\n}\n\nfunction createDefaultState(): MockState {\n return {\n queryResolver: () => [],\n queryResultQueue: [],\n executedQueries: [],\n createdClients: [],\n jobHandler: () => null,\n jobResultQueue: [],\n triggeredJobs: [],\n triggerHandler: \"mock-execution-id\",\n waitHandler: null,\n resolveHandler: null,\n workflowCalls: [],\n secretStore: {},\n secretCalls: [],\n authTokens: {},\n authCalls: [],\n idpResolver: () => null,\n idpResultQueue: [],\n idpCalls: [],\n fileResolver: () => null,\n fileResultQueue: [],\n fileCalls: [],\n iconvResolver: null,\n iconvCalls: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// TailorDB Mock\n// ---------------------------------------------------------------------------\n\n/**\n * Mock control object for TailorDB operations.\n *\n * Automatically injected into `globalThis.tailordb` by the tailor-runtime environment.\n * Use this object to configure query responses and assert on executed queries.\n * @example\n * ```typescript\n * import { tailordbMock } from \"@tailor-platform/sdk/vitest\";\n *\n * beforeEach(() => tailordbMock.reset());\n *\n * test(\"content-based\", () => {\n * tailordbMock.setQueryResolver((query) => {\n * if (query.includes(\"SELECT\")) return [{ id: \"1\" }];\n * return [];\n * });\n * });\n *\n * test(\"order-based\", () => {\n * tailordbMock.enqueueResults(\n * [], // BEGIN (empty result)\n * [{ age: 30 }], // SELECT (one row)\n * [], // COMMIT (empty result)\n * );\n * });\n * ```\n */\nexport const tailordbMock = {\n /**\n * Set a fallback query resolver. Called when the result queue is empty.\n * @param resolver - Function that returns rows for a given query and params\n */\n setQueryResolver(resolver: QueryResolver): void {\n getState().queryResolver = resolver;\n },\n\n /**\n * Enqueue rows for the next `queryObject` call. Arguments are the row objects returned\n * by that single query. Call with no arguments for an empty result. Consumed in FIFO\n * order; when the queue is exhausted, subsequent calls fall back to `setQueryResolver`\n * (default: empty rows). Use `enqueueResults` to stage rows for multiple queries in one\n * call.\n * @param rows - Row objects to return from the next `queryObject` call\n */\n enqueueResult(...rows: unknown[]): void {\n getState().queryResultQueue.push(rows);\n },\n\n /**\n * Enqueue rows for multiple subsequent `queryObject` calls. Each argument is a rows\n * array for one query, consumed in FIFO order.\n * @param rowsList - Rows arrays, one per upcoming query\n */\n enqueueResults(...rowsList: unknown[][]): void {\n getState().queryResultQueue.push(...rowsList);\n },\n\n /**\n * All queries executed via `queryObject`, in order.\n * @returns Executed queries array\n */\n get executedQueries(): ExecutedQuery[] {\n return getState().executedQueries;\n },\n\n /**\n * All TailorDB clients created, with their namespace and end state.\n * @returns Created clients array\n */\n get createdClients(): CreatedClient[] {\n return getState().createdClients;\n },\n\n /** Reset all TailorDB mock state. Call in `beforeEach`. */\n reset(): void {\n const state = getState();\n state.queryResolver = () => [];\n state.queryResultQueue.length = 0;\n state.executedQueries.length = 0;\n state.createdClients.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workflow Mock\n// ---------------------------------------------------------------------------\n\n/**\n * Mock control object for workflow operations.\n *\n * Automatically injected into `globalThis.tailor.workflow` by the tailor-runtime environment.\n * @example\n * ```typescript\n * import { workflowMock } from \"@tailor-platform/sdk/vitest\";\n *\n * beforeEach(() => workflowMock.reset());\n *\n * test(\"job handler\", () => {\n * workflowMock.setJobHandler((jobName, args) => {\n * if (jobName === \"validate\") return { valid: true };\n * return null;\n * });\n * });\n *\n * test(\"wait point\", () => {\n * workflowMock.setWaitHandler(() => ({ approved: true }));\n * // …\n * expect(workflowMock.waitCalls).toEqual([{ key: \"approval\", payload: undefined }]);\n * });\n *\n * test(\"resolve point\", () => {\n * workflowMock.setResolveHandler((_executionId, _key, callback) =>\n * callback({ approved: true }),\n * );\n * // …\n * expect(workflowMock.resolveCalls).toEqual([\n * { executionId: \"mock-execution-id\", key: \"approval\" },\n * ]);\n * });\n * ```\n */\nexport const workflowMock = {\n /**\n * Set a fallback job handler. Called when the result queue is empty.\n * @param handler - Function that returns a result for a given job name and args\n */\n setJobHandler(handler: JobHandler): void {\n getState().jobHandler = handler;\n },\n\n /**\n * Enqueue a single result for the next `triggerJobFunction` call. Consumed in FIFO\n * order; when the queue is exhausted, subsequent calls fall back to `setJobHandler`\n * (default: null). Use `enqueueResults` to stage multiple results in one call.\n * @param result - Result to return from the next `triggerJobFunction` call\n */\n enqueueResult(result: unknown): void {\n getState().jobResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent `triggerJobFunction` calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().jobResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n /**\n * All jobs triggered via `triggerJobFunction`, in order.\n * @returns Triggered jobs array\n */\n get triggeredJobs(): TriggeredJob[] {\n return getState().triggeredJobs;\n },\n\n /**\n * Configure what `tailor.workflow.triggerWorkflow` returns. Pass a string to return\n * the same execution ID for every call, or a function `(name, args, options) => string`\n * to compute one per call. Default: `\"mock-execution-id\"`.\n * @param handler - Static execution ID or a function that returns one\n */\n setTriggerHandler(handler: string | TriggerHandlerFn): void {\n getState().triggerHandler = handler;\n },\n\n /**\n * Configure what `tailor.workflow.wait` returns. Pass a function `(key, payload) => unknown`\n * to compute one per call, or any other value to return it for every call. Default: `null`.\n * @param handler - Static value or a function that returns one\n */\n setWaitHandler: ((handler: unknown) => {\n getState().waitHandler = handler;\n }) as SetWaitHandler,\n\n /**\n * Configure how `tailor.workflow.resolve` runs the user-supplied callback. The handler\n * receives `(executionId, key, callback)` — invoke `callback(payload)` to drive\n * resolve→wait wiring in tests. Default: callback is not invoked (records the call only).\n * @param handler - Function invoked per `resolve` call\n */\n setResolveHandler(handler: ResolveHandler): void {\n getState().resolveHandler = handler;\n },\n\n /**\n * Calls to triggerWorkflow, wait, resolve (not triggerJobFunction — use triggeredJobs).\n * @returns Workflow calls array\n */\n get calls(): WorkflowCall[] {\n return getState().workflowCalls;\n },\n\n /**\n * `tailor.workflow.wait` calls reshaped as `{ key, payload }` for assertions.\n * @returns Wait call records\n */\n get waitCalls(): { key: string; payload: unknown }[] {\n return getState()\n .workflowCalls.filter((c) => c.method === \"wait\")\n .map((c) => ({ key: c.args[0] as string, payload: c.args[1] }));\n },\n\n /**\n * `tailor.workflow.resolve` calls reshaped as `{ executionId, key }` for assertions.\n * @returns Resolve call records\n */\n get resolveCalls(): { executionId: string; key: string }[] {\n return getState()\n .workflowCalls.filter((c) => c.method === \"resolve\")\n .map((c) => ({ executionId: c.args[0] as string, key: c.args[1] as string }));\n },\n\n /** Reset all workflow mock state. Call in `beforeEach`. */\n reset(): void {\n const state = getState();\n state.jobHandler = () => null;\n state.jobResultQueue.length = 0;\n state.triggeredJobs.length = 0;\n state.triggerHandler = \"mock-execution-id\";\n state.waitHandler = null;\n state.resolveHandler = null;\n state.workflowCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// SecretManager Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.secretmanager` — secret store and call recording. */\nexport const secretmanagerMock = {\n setSecrets(secrets: Record<string, Record<string, string>>): void {\n getState().secretStore = secrets;\n },\n\n get calls(): SecretCall[] {\n return getState().secretCalls;\n },\n\n reset(): void {\n const state = getState();\n state.secretStore = {};\n state.secretCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// AuthConnection Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.authconnection` — token store and call recording. */\nexport const authconnectionMock = {\n setTokens(tokens: Record<string, unknown>): void {\n getState().authTokens = tokens;\n },\n\n get calls(): AuthConnectionCall[] {\n return getState().authCalls;\n },\n\n reset(): void {\n const state = getState();\n state.authTokens = {};\n state.authCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// IDP Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.idp` — IDP client responses and call recording. */\nexport const idpMock = {\n setResolver(resolver: IdpResolver): void {\n getState().idpResolver = resolver;\n },\n\n /**\n * Enqueue a single result for the next IDP call. Consumed in FIFO order; falls back\n * to `setResolver` when exhausted. Use `enqueueResults` to stage multiple in one call.\n * @param result - Result to return from the next IDP call\n */\n enqueueResult(result: unknown): void {\n getState().idpResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent IDP calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().idpResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n get calls(): IdpCall[] {\n return getState().idpCalls;\n },\n\n reset(): void {\n const state = getState();\n state.idpResolver = () => null;\n state.idpResultQueue.length = 0;\n state.idpCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// File Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailordb.file` — file operation responses and call recording. */\nexport const fileMock = {\n setResolver(resolver: FileResolver): void {\n getState().fileResolver = resolver;\n },\n\n /**\n * Enqueue a single result for the next `tailordb.file` call. Consumed in FIFO order;\n * falls back to `setResolver` when exhausted. Use `enqueueResults` to stage multiple\n * in one call.\n * @param result - Result to return from the next file call\n */\n enqueueResult(result: unknown): void {\n getState().fileResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent `tailordb.file` calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().fileResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n get calls(): FileCall[] {\n return getState().fileCalls;\n },\n\n reset(): void {\n const state = getState();\n state.fileResolver = () => null;\n state.fileResultQueue.length = 0;\n state.fileCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Iconv Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.iconv` — encoding call recording. */\nexport const iconvMock = {\n setResolver(resolver: IconvResolver): void {\n getState().iconvResolver = resolver;\n },\n\n get calls(): IconvCall[] {\n return getState().iconvCalls;\n },\n\n reset(): void {\n const state = getState();\n state.iconvResolver = null;\n state.iconvCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mock Client implementation (injected as globalThis.tailordb.Client)\n// ---------------------------------------------------------------------------\n\nclass MockQueryResult {\n command: string;\n rowCount: number;\n rows: unknown[];\n\n constructor(rows: unknown[]) {\n this.command = \"\";\n this.rowCount = rows.length;\n this.rows = rows;\n }\n}\n\nclass MockTransaction {\n async begin(): Promise<void> {\n /* noop */\n }\n async commit(): Promise<void> {\n /* noop */\n }\n async rollback(): Promise<void> {\n /* noop */\n }\n\n async queryObject(query: string, params: unknown[] = []): Promise<MockQueryResult> {\n return resolveQuery(query, params);\n }\n}\n\nclass MockTailordbClient {\n #record: CreatedClient;\n\n constructor(config?: { namespace?: string }) {\n this.#record = { namespace: config?.namespace, ended: false };\n getState().createdClients.push(this.#record);\n }\n\n async connect(): Promise<void> {\n /* noop */\n }\n\n async end(): Promise<void> {\n this.#record.ended = true;\n }\n\n async queryObject(query: string, params: unknown[] = []): Promise<MockQueryResult> {\n return resolveQuery(query, params);\n }\n\n createTransaction(name: string): MockTransaction {\n if (!name) {\n throw new Error(\"Transaction name must be a non-empty string\");\n }\n return new MockTransaction();\n }\n}\n\nfunction resolveQuery(query: string, params: unknown[]): MockQueryResult {\n const state = getState();\n state.executedQueries.push({ query, params });\n\n // 1. Queue takes priority (order-based)\n if (state.queryResultQueue.length > 0) {\n return new MockQueryResult(state.queryResultQueue.shift()!);\n }\n\n // 2. Fallback to query resolver (content-based)\n const rows = state.queryResolver(query, params) ?? [];\n return new MockQueryResult(rows);\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.workflow\n// ---------------------------------------------------------------------------\n\nfunction mockTriggerJobFunction(jobName: string, args?: unknown): unknown {\n const state = getState();\n state.triggeredJobs.push({ jobName, args });\n if (state.jobResultQueue.length > 0) return state.jobResultQueue.shift();\n return state.jobHandler(jobName, args);\n}\n\nasync function mockTriggerWorkflow(\n workflowName: string,\n args?: unknown,\n options?: TriggerWorkflowOptions,\n): Promise<string> {\n const state = getState();\n state.workflowCalls.push({ method: \"triggerWorkflow\", args: [workflowName, args, options] });\n const handler = state.triggerHandler;\n return typeof handler === \"function\" ? handler(workflowName, args, options) : handler;\n}\n\nfunction mockWait(key: string, payload?: unknown): unknown {\n const state = getState();\n state.workflowCalls.push({ method: \"wait\", args: [key, payload] });\n const handler = state.waitHandler;\n return typeof handler === \"function\" ? (handler as WaitHandlerFn)(key, payload) : handler;\n}\n\n// Records the resolve call. By default the callback is not invoked, mirroring\n// platform semantics where tailor.workflow.resolve enqueues the callback\n// against the wait point and returns immediately. Tests that need\n// resolve→wait wiring can register a handler via workflowMock.setResolveHandler\n// — the handler receives `(executionId, key, callback)` and decides whether to\n// invoke the callback (typically with a synthesized payload).\nasync function mockResolve(\n executionId: string,\n key: string,\n callback: (payload: unknown) => unknown | Promise<unknown>,\n): Promise<void> {\n const state = getState();\n state.workflowCalls.push({ method: \"resolve\", args: [executionId, key, callback] });\n if (state.resolveHandler) {\n await state.resolveHandler(executionId, key, callback);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.context\n// ---------------------------------------------------------------------------\n\nfunction mockGetInvoker(): tailor.context.Invoker | null {\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.secretmanager\n// ---------------------------------------------------------------------------\n\nasync function mockGetSecrets<const T extends readonly string[]>(\n vault: string,\n names: T,\n): Promise<Partial<Record<T[number], string>>> {\n const state = getState();\n state.secretCalls.push({ method: \"getSecrets\", vault, names });\n const vaultData = state.secretStore[vault] ?? {};\n const result: Record<string, string> = {};\n for (const name of names) {\n if (name in vaultData) {\n result[name] = vaultData[name];\n }\n }\n return result as Partial<Record<T[number], string>>;\n}\n\nasync function mockGetSecret(vault: string, name: string): Promise<string | undefined> {\n const state = getState();\n state.secretCalls.push({ method: \"getSecret\", vault, name });\n return state.secretStore[vault]?.[name];\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.authconnection\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function mockGetConnectionToken(connectionName: string): Promise<any> {\n const state = getState();\n state.authCalls.push({ connectionName });\n return state.authTokens[connectionName] ?? { access_token: \"mock-token\" };\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.idp\n// ---------------------------------------------------------------------------\n\nconst IDP_DEFAULTS: Record<string, unknown> = {\n users: { users: [], nextPageToken: null, totalCount: 0 },\n user: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n userByName: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n createUser: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n updateUser: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n deleteUser: true,\n sendPasswordResetEmail: true,\n};\n\nfunction resolveIdpCall(method: string, args: unknown[], namespace: string): unknown {\n const state = getState();\n state.idpCalls.push({ method, args, namespace });\n if (state.idpResultQueue.length > 0) return state.idpResultQueue.shift();\n const resolved = state.idpResolver(method, args, namespace);\n // Treat null and undefined alike as \"no override\" — resolvers commonly\n // `return null` for unmatched methods.\n if (resolved != null) return resolved;\n // Clone the default so a test mutating the returned value (e.g.\n // `result.users.push(x)`) cannot corrupt the shared module-level object\n // for subsequent tests in the same worker.\n const fallback = IDP_DEFAULTS[method];\n return fallback === undefined ? undefined : structuredClone(fallback);\n}\n\nclass MockIdpClient {\n #namespace: string;\n constructor(config: { namespace: string }) {\n this.#namespace = config.namespace;\n }\n async users(options?: {\n first?: number;\n after?: string;\n query?: { ids?: string[]; names?: string[] };\n }): Promise<{ users: tailor.idp.User[]; nextPageToken: string | null; totalCount: number }> {\n return resolveIdpCall(\"users\", [options], this.#namespace) as Awaited<\n ReturnType<typeof this.users>\n >;\n }\n async user(userId: string): Promise<tailor.idp.User> {\n return resolveIdpCall(\"user\", [userId], this.#namespace) as tailor.idp.User;\n }\n async userByName(name: string): Promise<tailor.idp.User> {\n return resolveIdpCall(\"userByName\", [name], this.#namespace) as tailor.idp.User;\n }\n async createUser(input: {\n name: string;\n password?: string;\n disabled?: boolean;\n }): Promise<tailor.idp.User> {\n return resolveIdpCall(\"createUser\", [input], this.#namespace) as tailor.idp.User;\n }\n async updateUser(input: {\n id: string;\n name?: string;\n password?: string;\n clearPassword?: boolean;\n disabled?: boolean;\n }): Promise<tailor.idp.User> {\n return resolveIdpCall(\"updateUser\", [input], this.#namespace) as tailor.idp.User;\n }\n async deleteUser(userId: string): Promise<boolean> {\n return resolveIdpCall(\"deleteUser\", [userId], this.#namespace) as boolean;\n }\n async sendPasswordResetEmail(input: { userId: string; redirectUri: string }): Promise<boolean> {\n return resolveIdpCall(\"sendPasswordResetEmail\", [input], this.#namespace) as boolean;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.iconv\n// ---------------------------------------------------------------------------\n\n// Iconv methods return `string` for UTF-8 target encodings and `Uint8Array`\n// for any other byte-producing encoding (the platform API mirrors this).\n// Default returns must respect that contract so tests that don't configure a\n// resolver still get type-consistent values.\nfunction isUtf8(encoding: unknown): boolean {\n return encoding === \"UTF8\" || encoding === \"UTF-8\";\n}\n\nfunction defaultIconvResult(method: string, args: unknown[]): unknown {\n switch (method) {\n case \"convert\":\n case \"convertBuffer\":\n return isUtf8(args[2]) ? \"\" : new Uint8Array();\n case \"decode\":\n return \"\";\n case \"encode\":\n return isUtf8(args[1]) ? \"\" : new Uint8Array();\n case \"encodings\":\n return [];\n default:\n return undefined;\n }\n}\n\nfunction resolveIconvCall(method: string, args: unknown[]): unknown {\n const state = getState();\n state.iconvCalls.push({ method, args: [...args] });\n if (state.iconvResolver) {\n const result = state.iconvResolver(method, args);\n // Treat both null and undefined as \"no override\" so resolvers using\n // implicit returns (e.g. early `return;` for unhandled methods) still\n // fall through to the type-consistent default.\n if (result != null) return result;\n }\n return defaultIconvResult(method, args);\n}\n\nfunction mockConvert<T extends string>(\n str: string | Uint8Array | ArrayBuffer,\n fromEncoding: string,\n toEncoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"convert\", [str, fromEncoding, toEncoding]) as any;\n}\n\nfunction mockConvertBuffer<T extends string>(\n buffer: Uint8Array | ArrayBuffer,\n fromEncoding: string,\n toEncoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"convertBuffer\", [buffer, fromEncoding, toEncoding]) as any;\n}\n\nfunction mockDecode(buffer: Uint8Array | ArrayBuffer, encoding: string): string {\n return resolveIconvCall(\"decode\", [buffer, encoding]) as string;\n}\n\nfunction mockEncode<T extends string>(\n str: string,\n encoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"encode\", [str, encoding]) as any;\n}\n\nfunction mockEncodings(): string[] {\n return resolveIconvCall(\"encodings\", []) as string[];\n}\n\nclass MockIconv {\n #fromEncoding: string;\n #toEncoding: string;\n\n constructor(fromEncoding: string, toEncoding: string) {\n this.#fromEncoding = fromEncoding;\n this.#toEncoding = toEncoding;\n }\n\n convert(input: string | Uint8Array | ArrayBuffer): string | Uint8Array {\n return resolveIconvCall(\"convert\", [input, this.#fromEncoding, this.#toEncoding]) as\n | string\n | Uint8Array;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailordb.file\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FILE_DEFAULTS: Record<string, any> = {\n upload: { metadata: { fileSize: 0, sha256sum: \"\" } },\n download: {\n data: new Uint8Array(),\n metadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", lastUploadedAt: \"\" },\n },\n downloadAsBase64: {\n data: \"\",\n metadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", lastUploadedAt: \"\" },\n },\n delete: undefined,\n getMetadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", urlPath: \"\" },\n};\n\nfunction resolveFileCall(\n method: string,\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n): unknown {\n const state = getState();\n const call: FileCall = { method, namespace, typeName, fieldName, recordId };\n state.fileCalls.push(call);\n if (state.fileResultQueue.length > 0) return state.fileResultQueue.shift();\n const resolved = state.fileResolver(method, call);\n // Treat null and undefined alike as \"no override\" — resolvers commonly\n // `return null` for unmatched methods.\n if (resolved != null) return resolved;\n // Clone the default so a test mutating the returned value (e.g. the\n // `data: Uint8Array` payload from `download`) cannot corrupt the shared\n // module-level object for subsequent tests in the same worker.\n const fallback = FILE_DEFAULTS[method];\n return fallback === undefined ? undefined : structuredClone(fallback);\n}\n\nconst mockTailordbFile = {\n async upload(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n _data: string | ArrayBuffer | Uint8Array | number[],\n _options?: { contentType?: string },\n ): Promise<{ metadata: { fileSize: number; sha256sum: string } }> {\n return resolveFileCall(\"upload\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.upload>\n >;\n },\n async download(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n data: Uint8Array;\n metadata: { contentType: string; fileSize: number; sha256sum: string; lastUploadedAt: string };\n }> {\n return resolveFileCall(\"download\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.download>\n >;\n },\n async downloadAsBase64(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n data: string;\n metadata: { contentType: string; fileSize: number; sha256sum: string; lastUploadedAt: string };\n }> {\n return resolveFileCall(\"downloadAsBase64\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.downloadAsBase64>\n >;\n },\n async delete(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<void> {\n resolveFileCall(\"delete\", namespace, typeName, fieldName, recordId);\n },\n async getMetadata(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n contentType: string;\n fileSize: number;\n sha256sum: string;\n urlPath: string;\n lastUploadedAt?: string;\n }> {\n return resolveFileCall(\"getMetadata\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.getMetadata>\n >;\n },\n openDownloadStream(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<AsyncIterableIterator<unknown> & { close(): Promise<void> }> {\n const resolved = resolveFileCall(\n \"openDownloadStream\",\n namespace,\n typeName,\n fieldName,\n recordId,\n );\n return Promise.resolve(toFileStream(resolved));\n },\n};\n\ntype FileStream = AsyncIterableIterator<unknown> & { close(): Promise<void> };\n\nfunction toFileStream(value: unknown): FileStream {\n // Already a complete stream-like object: pass through.\n if (\n value !== null &&\n typeof value === \"object\" &&\n Symbol.asyncIterator in value &&\n typeof (value as { close?: unknown }).close === \"function\"\n ) {\n return value as FileStream;\n }\n // Binary chunk shorthand: a single ArrayBuffer / TypedArray (e.g. Uint8Array)\n // should be delivered as one chunk, not iterated as a sequence of numbers.\n // Tests passing `[chunk1, chunk2]` continue to work via the iterable branch\n // below.\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return toFileStream([value]);\n }\n // Iterable (array, sync iterator, etc.): wrap as a chunked async iterator\n // so `fileMock.enqueueResult([chunk1, chunk2])` controls stream contents.\n if (\n value !== null &&\n typeof value === \"object\" &&\n (Symbol.iterator in value || Symbol.asyncIterator in value)\n ) {\n const source = value as Iterable<unknown> | AsyncIterable<unknown>;\n const inner =\n Symbol.asyncIterator in source\n ? (source as AsyncIterable<unknown>)[Symbol.asyncIterator]()\n : (source as Iterable<unknown>)[Symbol.iterator]();\n const stream: FileStream = {\n async next() {\n const r = await inner.next();\n return r.done ? { done: true as const, value: undefined } : r;\n },\n async close() {},\n [Symbol.asyncIterator]() {\n return stream;\n },\n };\n return stream;\n }\n const empty: FileStream = {\n async next() {\n return { done: true as const, value: undefined };\n },\n async close() {},\n [Symbol.asyncIterator]() {\n return empty;\n },\n };\n return empty;\n}\n\n// ---------------------------------------------------------------------------\n// Error class mocks\n// ---------------------------------------------------------------------------\n\ninterface TailorErrorItem {\n message: string;\n path: (string | number)[];\n}\n\nclass TailorErrorsMock extends Error {\n errors: TailorErrorItem[];\n\n constructor(errors: TailorErrorItem[]) {\n if (!Array.isArray(errors)) {\n throw new TypeError(\"TailorErrors: errors must be an array\");\n }\n const validated = errors.map((e, i) => {\n if (typeof e.message !== \"string\") {\n throw new TypeError(`TailorErrors: errors[${i}].message must be a string`);\n }\n if (!Array.isArray(e.path)) {\n throw new TypeError(`TailorErrors: errors[${i}].path must be an array`);\n }\n return { message: e.message, path: e.path };\n });\n // Match the PF runtime's TailorErrors serialization, which prefixes the\n // JSON payload with \"TailorErrors: \". Other SDK code (e.g. apply\n // integration fixtures) strips this prefix before JSON.parse.\n super(`TailorErrors: ${JSON.stringify({ errors: validated })}`);\n this.name = \"TailorErrors\";\n this.errors = validated;\n }\n}\n\nclass TailorErrorMessageMock extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TailorErrorMessage\";\n }\n}\n\nclass TailorDBFileErrorMock extends Error {\n code?: string;\n override cause: unknown;\n\n constructor(message: string, code?: string, cause?: unknown) {\n super(message);\n this.name = \"TailorDBFileError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Injection / Cleanup (called by environment.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Inject all platform API mocks into globalThis.\n * Called by the tailor-runtime Vitest environment during setup.\n * @param global - The global object to inject mocks into\n */\nexport function injectMocks(global: typeof globalThis): void {\n const g = global as Record<string, unknown>;\n\n // Ensure fresh state and mark the environment as active so setup.ts can\n // distinguish \"tailor-runtime is selected\" from \"some test code happened\n // to read a mock helper and lazily created STATE_KEY\".\n g[STATE_KEY] = createDefaultState();\n g[RUNTIME_FLAG_KEY] = true;\n\n g.tailordb = {\n Client: MockTailordbClient,\n file: mockTailordbFile,\n };\n\n g.tailor = {\n secretmanager: {\n getSecrets: mockGetSecrets,\n getSecret: mockGetSecret,\n },\n authconnection: {\n getConnectionToken: mockGetConnectionToken,\n },\n workflow: {\n triggerJobFunction: mockTriggerJobFunction,\n triggerWorkflow: mockTriggerWorkflow,\n wait: mockWait,\n resolve: mockResolve,\n },\n context: {\n getInvoker: mockGetInvoker,\n },\n idp: { Client: MockIdpClient },\n iconv: {\n convert: mockConvert,\n convertBuffer: mockConvertBuffer,\n decode: mockDecode,\n encode: mockEncode,\n encodings: mockEncodings,\n Iconv: MockIconv,\n },\n };\n\n g.TailorErrors = TailorErrorsMock;\n g.TailorErrorMessage = TailorErrorMessageMock;\n g.TailorDBFileError = TailorDBFileErrorMock;\n}\n\n/**\n * Remove all injected mocks from globalThis.\n * Called by the tailor-runtime Vitest environment during teardown.\n * @param global - The global object to clean up mocks from\n */\nexport function cleanupMocks(global: typeof globalThis): void {\n const g = global as Record<string, unknown>;\n delete g.tailordb;\n delete g.tailor;\n delete g.TailorErrors;\n delete g.TailorErrorMessage;\n delete g.TailorDBFileError;\n delete g[STATE_KEY];\n delete g[RUNTIME_FLAG_KEY];\n}\n"],"mappings":";;AAiIA,MAAa,YAAY;AAOzB,MAAa,mBAAmB;AAEhC,SAAS,WAAsB;CAC7B,MAAM,IAAI;CACV,IAAI,CAAC,wBACH,EAAE,aAAa,oBAAoB;CAErC,OAAO,EAAE;;AAGX,SAAS,qBAAgC;CACvC,OAAO;EACL,qBAAqB,EAAE;EACvB,kBAAkB,EAAE;EACpB,iBAAiB,EAAE;EACnB,gBAAgB,EAAE;EAClB,kBAAkB;EAClB,gBAAgB,EAAE;EAClB,eAAe,EAAE;EACjB,gBAAgB;EAChB,aAAa;EACb,gBAAgB;EAChB,eAAe,EAAE;EACjB,aAAa,EAAE;EACf,aAAa,EAAE;EACf,YAAY,EAAE;EACd,WAAW,EAAE;EACb,mBAAmB;EACnB,gBAAgB,EAAE;EAClB,UAAU,EAAE;EACZ,oBAAoB;EACpB,iBAAiB,EAAE;EACnB,WAAW,EAAE;EACb,eAAe;EACf,YAAY,EAAE;EACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCH,MAAa,eAAe;;;;;CAK1B,iBAAiB,UAA+B;EAC9C,UAAU,CAAC,gBAAgB;;;;;;;;;;CAW7B,cAAc,GAAG,MAAuB;EACtC,UAAU,CAAC,iBAAiB,KAAK,KAAK;;;;;;;CAQxC,eAAe,GAAG,UAA6B;EAC7C,UAAU,CAAC,iBAAiB,KAAK,GAAG,SAAS;;;;;;CAO/C,IAAI,kBAAmC;EACrC,OAAO,UAAU,CAAC;;;;;;CAOpB,IAAI,iBAAkC;EACpC,OAAO,UAAU,CAAC;;;CAIpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,sBAAsB,EAAE;EAC9B,MAAM,iBAAiB,SAAS;EAChC,MAAM,gBAAgB,SAAS;EAC/B,MAAM,eAAe,SAAS;;CAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCD,MAAa,eAAe;;;;;CAK1B,cAAc,SAA2B;EACvC,UAAU,CAAC,aAAa;;;;;;;;CAS1B,cAAc,QAAuB;EACnC,UAAU,CAAC,eAAe,KAAK,OAAO;;;;;;CAOxC,eAAe,GAAG,SAA0B;EAC1C,MAAM,QAAQ,UAAU,CAAC;EACzB,KAAK,MAAM,UAAU,SACnB,MAAM,KAAK,OAAO;;;;;;CAQtB,IAAI,gBAAgC;EAClC,OAAO,UAAU,CAAC;;;;;;;;CASpB,kBAAkB,SAA0C;EAC1D,UAAU,CAAC,iBAAiB;;;;;;;CAQ9B,kBAAkB,YAAqB;EACrC,UAAU,CAAC,cAAc;;;;;;;;CAS3B,kBAAkB,SAA+B;EAC/C,UAAU,CAAC,iBAAiB;;;;;;CAO9B,IAAI,QAAwB;EAC1B,OAAO,UAAU,CAAC;;;;;;CAOpB,IAAI,YAAiD;EACnD,OAAO,UAAU,CACd,cAAc,QAAQ,MAAM,EAAE,WAAW,OAAO,CAChD,KAAK,OAAO;GAAE,KAAK,EAAE,KAAK;GAAc,SAAS,EAAE,KAAK;GAAI,EAAE;;;;;;CAOnE,IAAI,eAAuD;EACzD,OAAO,UAAU,CACd,cAAc,QAAQ,MAAM,EAAE,WAAW,UAAU,CACnD,KAAK,OAAO;GAAE,aAAa,EAAE,KAAK;GAAc,KAAK,EAAE,KAAK;GAAc,EAAE;;;CAIjF,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,mBAAmB;EACzB,MAAM,eAAe,SAAS;EAC9B,MAAM,cAAc,SAAS;EAC7B,MAAM,iBAAiB;EACvB,MAAM,cAAc;EACpB,MAAM,iBAAiB;EACvB,MAAM,cAAc,SAAS;;CAEhC;;AAOD,MAAa,oBAAoB;CAC/B,WAAW,SAAuD;EAChE,UAAU,CAAC,cAAc;;CAG3B,IAAI,QAAsB;EACxB,OAAO,UAAU,CAAC;;CAGpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,cAAc,EAAE;EACtB,MAAM,YAAY,SAAS;;CAE9B;;AAOD,MAAa,qBAAqB;CAChC,UAAU,QAAuC;EAC/C,UAAU,CAAC,aAAa;;CAG1B,IAAI,QAA8B;EAChC,OAAO,UAAU,CAAC;;CAGpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,aAAa,EAAE;EACrB,MAAM,UAAU,SAAS;;CAE5B;;AAOD,MAAa,UAAU;CACrB,YAAY,UAA6B;EACvC,UAAU,CAAC,cAAc;;;;;;;CAQ3B,cAAc,QAAuB;EACnC,UAAU,CAAC,eAAe,KAAK,OAAO;;;;;;CAOxC,eAAe,GAAG,SAA0B;EAC1C,MAAM,QAAQ,UAAU,CAAC;EACzB,KAAK,MAAM,UAAU,SACnB,MAAM,KAAK,OAAO;;CAItB,IAAI,QAAmB;EACrB,OAAO,UAAU,CAAC;;CAGpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,oBAAoB;EAC1B,MAAM,eAAe,SAAS;EAC9B,MAAM,SAAS,SAAS;;CAE3B;;AAOD,MAAa,WAAW;CACtB,YAAY,UAA8B;EACxC,UAAU,CAAC,eAAe;;;;;;;;CAS5B,cAAc,QAAuB;EACnC,UAAU,CAAC,gBAAgB,KAAK,OAAO;;;;;;CAOzC,eAAe,GAAG,SAA0B;EAC1C,MAAM,QAAQ,UAAU,CAAC;EACzB,KAAK,MAAM,UAAU,SACnB,MAAM,KAAK,OAAO;;CAItB,IAAI,QAAoB;EACtB,OAAO,UAAU,CAAC;;CAGpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,qBAAqB;EAC3B,MAAM,gBAAgB,SAAS;EAC/B,MAAM,UAAU,SAAS;;CAE5B;;AAOD,MAAa,YAAY;CACvB,YAAY,UAA+B;EACzC,UAAU,CAAC,gBAAgB;;CAG7B,IAAI,QAAqB;EACvB,OAAO,UAAU,CAAC;;CAGpB,QAAc;EACZ,MAAM,QAAQ,UAAU;EACxB,MAAM,gBAAgB;EACtB,MAAM,WAAW,SAAS;;CAE7B;AAMD,IAAM,kBAAN,MAAsB;CACpB;CACA;CACA;CAEA,YAAY,MAAiB;EAC3B,KAAK,UAAU;EACf,KAAK,WAAW,KAAK;EACrB,KAAK,OAAO;;;AAIhB,IAAM,kBAAN,MAAsB;CACpB,MAAM,QAAuB;CAG7B,MAAM,SAAwB;CAG9B,MAAM,WAA0B;CAIhC,MAAM,YAAY,OAAe,SAAoB,EAAE,EAA4B;EACjF,OAAO,aAAa,OAAO,OAAO;;;AAItC,IAAM,qBAAN,MAAyB;CACvB;CAEA,YAAY,QAAiC;EAC3C,KAAKA,UAAU;GAAE,WAAW,QAAQ;GAAW,OAAO;GAAO;EAC7D,UAAU,CAAC,eAAe,KAAK,KAAKA,QAAQ;;CAG9C,MAAM,UAAyB;CAI/B,MAAM,MAAqB;EACzB,KAAKA,QAAQ,QAAQ;;CAGvB,MAAM,YAAY,OAAe,SAAoB,EAAE,EAA4B;EACjF,OAAO,aAAa,OAAO,OAAO;;CAGpC,kBAAkB,MAA+B;EAC/C,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,8CAA8C;EAEhE,OAAO,IAAI,iBAAiB;;;AAIhC,SAAS,aAAa,OAAe,QAAoC;CACvE,MAAM,QAAQ,UAAU;CACxB,MAAM,gBAAgB,KAAK;EAAE;EAAO;EAAQ,CAAC;CAG7C,IAAI,MAAM,iBAAiB,SAAS,GAClC,OAAO,IAAI,gBAAgB,MAAM,iBAAiB,OAAO,CAAE;CAK7D,OAAO,IAAI,gBADE,MAAM,cAAc,OAAO,OAAO,IAAI,EAAE,CACrB;;AAOlC,SAAS,uBAAuB,SAAiB,MAAyB;CACxE,MAAM,QAAQ,UAAU;CACxB,MAAM,cAAc,KAAK;EAAE;EAAS;EAAM,CAAC;CAC3C,IAAI,MAAM,eAAe,SAAS,GAAG,OAAO,MAAM,eAAe,OAAO;CACxE,OAAO,MAAM,WAAW,SAAS,KAAK;;AAGxC,eAAe,oBACb,cACA,MACA,SACiB;CACjB,MAAM,QAAQ,UAAU;CACxB,MAAM,cAAc,KAAK;EAAE,QAAQ;EAAmB,MAAM;GAAC;GAAc;GAAM;GAAQ;EAAE,CAAC;CAC5F,MAAM,UAAU,MAAM;CACtB,OAAO,OAAO,YAAY,aAAa,QAAQ,cAAc,MAAM,QAAQ,GAAG;;AAGhF,SAAS,SAAS,KAAa,SAA4B;CACzD,MAAM,QAAQ,UAAU;CACxB,MAAM,cAAc,KAAK;EAAE,QAAQ;EAAQ,MAAM,CAAC,KAAK,QAAQ;EAAE,CAAC;CAClE,MAAM,UAAU,MAAM;CACtB,OAAO,OAAO,YAAY,aAAc,QAA0B,KAAK,QAAQ,GAAG;;AASpF,eAAe,YACb,aACA,KACA,UACe;CACf,MAAM,QAAQ,UAAU;CACxB,MAAM,cAAc,KAAK;EAAE,QAAQ;EAAW,MAAM;GAAC;GAAa;GAAK;GAAS;EAAE,CAAC;CACnF,IAAI,MAAM,gBACR,MAAM,MAAM,eAAe,aAAa,KAAK,SAAS;;AAQ1D,SAAS,iBAAgD;CACvD,OAAO;;AAOT,eAAe,eACb,OACA,OAC6C;CAC7C,MAAM,QAAQ,UAAU;CACxB,MAAM,YAAY,KAAK;EAAE,QAAQ;EAAc;EAAO;EAAO,CAAC;CAC9D,MAAM,YAAY,MAAM,YAAY,UAAU,EAAE;CAChD,MAAM,SAAiC,EAAE;CACzC,KAAK,MAAM,QAAQ,OACjB,IAAI,QAAQ,WACV,OAAO,QAAQ,UAAU;CAG7B,OAAO;;AAGT,eAAe,cAAc,OAAe,MAA2C;CACrF,MAAM,QAAQ,UAAU;CACxB,MAAM,YAAY,KAAK;EAAE,QAAQ;EAAa;EAAO;EAAM,CAAC;CAC5D,OAAO,MAAM,YAAY,SAAS;;AAQpC,eAAe,uBAAuB,gBAAsC;CAC1E,MAAM,QAAQ,UAAU;CACxB,MAAM,UAAU,KAAK,EAAE,gBAAgB,CAAC;CACxC,OAAO,MAAM,WAAW,mBAAmB,EAAE,cAAc,cAAc;;AAO3E,MAAM,eAAwC;CAC5C,OAAO;EAAE,OAAO,EAAE;EAAE,eAAe;EAAM,YAAY;EAAG;CACxD,MAAM;EAAE,IAAI;EAAW,MAAM;EAAa,UAAU;EAAO;CAC3D,YAAY;EAAE,IAAI;EAAW,MAAM;EAAa,UAAU;EAAO;CACjE,YAAY;EAAE,IAAI;EAAW,MAAM;EAAa,UAAU;EAAO;CACjE,YAAY;EAAE,IAAI;EAAW,MAAM;EAAa,UAAU;EAAO;CACjE,YAAY;CACZ,wBAAwB;CACzB;AAED,SAAS,eAAe,QAAgB,MAAiB,WAA4B;CACnF,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,KAAK;EAAE;EAAQ;EAAM;EAAW,CAAC;CAChD,IAAI,MAAM,eAAe,SAAS,GAAG,OAAO,MAAM,eAAe,OAAO;CACxE,MAAM,WAAW,MAAM,YAAY,QAAQ,MAAM,UAAU;CAG3D,IAAI,YAAY,MAAM,OAAO;CAI7B,MAAM,WAAW,aAAa;CAC9B,OAAO,aAAa,SAAY,SAAY,gBAAgB,SAAS;;AAGvE,IAAM,gBAAN,MAAoB;CAClB;CACA,YAAY,QAA+B;EACzC,KAAKC,aAAa,OAAO;;CAE3B,MAAM,MAAM,SAIgF;EAC1F,OAAO,eAAe,SAAS,CAAC,QAAQ,EAAE,KAAKA,WAAW;;CAI5D,MAAM,KAAK,QAA0C;EACnD,OAAO,eAAe,QAAQ,CAAC,OAAO,EAAE,KAAKA,WAAW;;CAE1D,MAAM,WAAW,MAAwC;EACvD,OAAO,eAAe,cAAc,CAAC,KAAK,EAAE,KAAKA,WAAW;;CAE9D,MAAM,WAAW,OAIY;EAC3B,OAAO,eAAe,cAAc,CAAC,MAAM,EAAE,KAAKA,WAAW;;CAE/D,MAAM,WAAW,OAMY;EAC3B,OAAO,eAAe,cAAc,CAAC,MAAM,EAAE,KAAKA,WAAW;;CAE/D,MAAM,WAAW,QAAkC;EACjD,OAAO,eAAe,cAAc,CAAC,OAAO,EAAE,KAAKA,WAAW;;CAEhE,MAAM,uBAAuB,OAAkE;EAC7F,OAAO,eAAe,0BAA0B,CAAC,MAAM,EAAE,KAAKA,WAAW;;;AAY7E,SAAS,OAAO,UAA4B;CAC1C,OAAO,aAAa,UAAU,aAAa;;AAG7C,SAAS,mBAAmB,QAAgB,MAA0B;CACpE,QAAQ,QAAR;EACE,KAAK;EACL,KAAK,iBACH,OAAO,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,YAAY;EAChD,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,YAAY;EAChD,KAAK,aACH,OAAO,EAAE;EACX,SACE;;;AAIN,SAAS,iBAAiB,QAAgB,MAA0B;CAClE,MAAM,QAAQ,UAAU;CACxB,MAAM,WAAW,KAAK;EAAE;EAAQ,MAAM,CAAC,GAAG,KAAK;EAAE,CAAC;CAClD,IAAI,MAAM,eAAe;EACvB,MAAM,SAAS,MAAM,cAAc,QAAQ,KAAK;EAIhD,IAAI,UAAU,MAAM,OAAO;;CAE7B,OAAO,mBAAmB,QAAQ,KAAK;;AAGzC,SAAS,YACP,KACA,cACA,YACkD;CAElD,OAAO,iBAAiB,WAAW;EAAC;EAAK;EAAc;EAAW,CAAC;;AAGrE,SAAS,kBACP,QACA,cACA,YACkD;CAElD,OAAO,iBAAiB,iBAAiB;EAAC;EAAQ;EAAc;EAAW,CAAC;;AAG9E,SAAS,WAAW,QAAkC,UAA0B;CAC9E,OAAO,iBAAiB,UAAU,CAAC,QAAQ,SAAS,CAAC;;AAGvD,SAAS,WACP,KACA,UACkD;CAElD,OAAO,iBAAiB,UAAU,CAAC,KAAK,SAAS,CAAC;;AAGpD,SAAS,gBAA0B;CACjC,OAAO,iBAAiB,aAAa,EAAE,CAAC;;AAG1C,IAAM,YAAN,MAAgB;CACd;CACA;CAEA,YAAY,cAAsB,YAAoB;EACpD,KAAKC,gBAAgB;EACrB,KAAKC,cAAc;;CAGrB,QAAQ,OAA+D;EACrE,OAAO,iBAAiB,WAAW;GAAC;GAAO,KAAKD;GAAe,KAAKC;GAAY,CAAC;;;AAWrF,MAAM,gBAAqC;CACzC,QAAQ,EAAE,UAAU;EAAE,UAAU;EAAG,WAAW;EAAI,EAAE;CACpD,UAAU;EACR,MAAM,IAAI,YAAY;EACtB,UAAU;GAAE,aAAa;GAAI,UAAU;GAAG,WAAW;GAAI,gBAAgB;GAAI;EAC9E;CACD,kBAAkB;EAChB,MAAM;EACN,UAAU;GAAE,aAAa;GAAI,UAAU;GAAG,WAAW;GAAI,gBAAgB;GAAI;EAC9E;CACD,QAAQ;CACR,aAAa;EAAE,aAAa;EAAI,UAAU;EAAG,WAAW;EAAI,SAAS;EAAI;CAC1E;AAED,SAAS,gBACP,QACA,WACA,UACA,WACA,UACS;CACT,MAAM,QAAQ,UAAU;CACxB,MAAM,OAAiB;EAAE;EAAQ;EAAW;EAAU;EAAW;EAAU;CAC3E,MAAM,UAAU,KAAK,KAAK;CAC1B,IAAI,MAAM,gBAAgB,SAAS,GAAG,OAAO,MAAM,gBAAgB,OAAO;CAC1E,MAAM,WAAW,MAAM,aAAa,QAAQ,KAAK;CAGjD,IAAI,YAAY,MAAM,OAAO;CAI7B,MAAM,WAAW,cAAc;CAC/B,OAAO,aAAa,SAAY,SAAY,gBAAgB,SAAS;;AAGvE,MAAM,mBAAmB;CACvB,MAAM,OACJ,WACA,UACA,WACA,UACA,OACA,UACgE;EAChE,OAAO,gBAAgB,UAAU,WAAW,UAAU,WAAW,SAAS;;CAI5E,MAAM,SACJ,WACA,UACA,WACA,UAIC;EACD,OAAO,gBAAgB,YAAY,WAAW,UAAU,WAAW,SAAS;;CAI9E,MAAM,iBACJ,WACA,UACA,WACA,UAIC;EACD,OAAO,gBAAgB,oBAAoB,WAAW,UAAU,WAAW,SAAS;;CAItF,MAAM,OACJ,WACA,UACA,WACA,UACe;EACf,gBAAgB,UAAU,WAAW,UAAU,WAAW,SAAS;;CAErE,MAAM,YACJ,WACA,UACA,WACA,UAOC;EACD,OAAO,gBAAgB,eAAe,WAAW,UAAU,WAAW,SAAS;;CAIjF,mBACE,WACA,UACA,WACA,UACsE;EACtE,MAAM,WAAW,gBACf,sBACA,WACA,UACA,WACA,SACD;EACD,OAAO,QAAQ,QAAQ,aAAa,SAAS,CAAC;;CAEjD;AAID,SAAS,aAAa,OAA4B;CAEhD,IACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,iBAAiB,SACxB,OAAQ,MAA8B,UAAU,YAEhD,OAAO;CAMT,IAAI,iBAAiB,eAAe,YAAY,OAAO,MAAM,EAC3D,OAAO,aAAa,CAAC,MAAM,CAAC;CAI9B,IACE,UAAU,QACV,OAAO,UAAU,aAChB,OAAO,YAAY,SAAS,OAAO,iBAAiB,QACrD;EACA,MAAM,SAAS;EACf,MAAM,QACJ,OAAO,iBAAiB,SACnB,OAAkC,OAAO,gBAAgB,GACzD,OAA6B,OAAO,WAAW;EACtD,MAAM,SAAqB;GACzB,MAAM,OAAO;IACX,MAAM,IAAI,MAAM,MAAM,MAAM;IAC5B,OAAO,EAAE,OAAO;KAAE,MAAM;KAAe,OAAO;KAAW,GAAG;;GAE9D,MAAM,QAAQ;GACd,CAAC,OAAO,iBAAiB;IACvB,OAAO;;GAEV;EACD,OAAO;;CAET,MAAM,QAAoB;EACxB,MAAM,OAAO;GACX,OAAO;IAAE,MAAM;IAAe,OAAO;IAAW;;EAElD,MAAM,QAAQ;EACd,CAAC,OAAO,iBAAiB;GACvB,OAAO;;EAEV;CACD,OAAO;;AAYT,IAAM,mBAAN,cAA+B,MAAM;CACnC;CAEA,YAAY,QAA2B;EACrC,IAAI,CAAC,MAAM,QAAQ,OAAO,EACxB,MAAM,IAAI,UAAU,wCAAwC;EAE9D,MAAM,YAAY,OAAO,KAAK,GAAG,MAAM;GACrC,IAAI,OAAO,EAAE,YAAY,UACvB,MAAM,IAAI,UAAU,wBAAwB,EAAE,4BAA4B;GAE5E,IAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EACxB,MAAM,IAAI,UAAU,wBAAwB,EAAE,yBAAyB;GAEzE,OAAO;IAAE,SAAS,EAAE;IAAS,MAAM,EAAE;IAAM;IAC3C;EAIF,MAAM,iBAAiB,KAAK,UAAU,EAAE,QAAQ,WAAW,CAAC,GAAG;EAC/D,KAAK,OAAO;EACZ,KAAK,SAAS;;;AAIlB,IAAM,yBAAN,cAAqC,MAAM;CACzC,YAAY,SAAiB;EAC3B,MAAM,QAAQ;EACd,KAAK,OAAO;;;AAIhB,IAAM,wBAAN,cAAoC,MAAM;CACxC;CACA,AAAS;CAET,YAAY,SAAiB,MAAe,OAAiB;EAC3D,MAAM,QAAQ;EACd,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,KAAK,QAAQ;;;;;;;;AAajB,SAAgB,YAAY,QAAiC;CAC3D,MAAM,IAAI;CAKV,EAAE,aAAa,oBAAoB;CACnC,EAAE,oBAAoB;CAEtB,EAAE,WAAW;EACX,QAAQ;EACR,MAAM;EACP;CAED,EAAE,SAAS;EACT,eAAe;GACb,YAAY;GACZ,WAAW;GACZ;EACD,gBAAgB,EACd,oBAAoB,wBACrB;EACD,UAAU;GACR,oBAAoB;GACpB,iBAAiB;GACjB,MAAM;GACN,SAAS;GACV;EACD,SAAS,EACP,YAAY,gBACb;EACD,KAAK,EAAE,QAAQ,eAAe;EAC9B,OAAO;GACL,SAAS;GACT,eAAe;GACf,QAAQ;GACR,QAAQ;GACR,WAAW;GACX,OAAO;GACR;EACF;CAED,EAAE,eAAe;CACjB,EAAE,qBAAqB;CACvB,EAAE,oBAAoB;;;;;;;AAQxB,SAAgB,aAAa,QAAiC;CAC5D,MAAM,IAAI;CACV,OAAO,EAAE;CACT,OAAO,EAAE;CACT,OAAO,EAAE;CACT,OAAO,EAAE;CACT,OAAO,EAAE;CACT,OAAO,EAAE;CACT,OAAO,EAAE"}
1
+ {"version":3,"file":"mock-BfL09ULZ.mjs","names":["#record","#namespace","#fromEncoding","#toEncoding"],"sources":["../src/vitest/mock.ts"],"sourcesContent":["/**\n * Mock implementations for Tailor Platform APIs.\n *\n * Provides singleton mock objects that are automatically injected into\n * globalThis by the tailor-runtime Vitest environment. Tests can configure\n * responses and assert on recorded calls via the exported mock objects.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype QueryResolver = (query: string, params: unknown[]) => unknown[];\ntype JobHandler = (jobName: string, args: unknown) => unknown;\ntype IdpResolver = (method: string, args: unknown[], namespace: string) => unknown;\ntype FileResolver = (method: string, call: FileCall) => unknown;\ntype IconvResolver = (method: string, args: unknown[]) => unknown;\n\ntype TriggerWorkflowOptions = {\n authInvoker?: { namespace: string; machineUserName: string };\n};\ntype TriggerHandlerFn = (\n workflowName: string,\n args: unknown,\n options?: TriggerWorkflowOptions,\n) => string;\ntype WaitHandlerFn = (key: string, payload: unknown) => unknown;\ntype ResolveHandler = (\n executionId: string,\n key: string,\n callback: (payload: unknown) => unknown,\n) => unknown | Promise<unknown>;\n\n// Overloaded so TypeScript narrows to WaitHandlerFn first (giving inferred\n// `(key: string, payload: unknown) => …` for callers) before falling back\n// to the static-value form. A union type would let `unknown` swallow the\n// function variant and break inference.\ntype SetWaitHandler = {\n (handler: WaitHandlerFn): void;\n (handler: unknown): void;\n};\n\ninterface ExecutedQuery {\n query: string;\n params: unknown[];\n}\n\ninterface CreatedClient {\n namespace: string | undefined;\n ended: boolean;\n}\n\ninterface TriggeredJob {\n jobName: string;\n args: unknown;\n}\n\ninterface SecretCall {\n method: \"getSecret\" | \"getSecrets\";\n vault: string;\n name?: string;\n names?: readonly string[];\n}\n\ninterface AuthConnectionCall {\n connectionName: string;\n}\n\ninterface IdpCall {\n method: string;\n args: unknown[];\n namespace: string;\n}\n\ninterface FileCall {\n method: string;\n namespace: string;\n typeName: string;\n fieldName: string;\n recordId: string;\n}\n\ninterface IconvCall {\n method: string;\n args: unknown[];\n}\n\ninterface WorkflowCall {\n method: \"triggerWorkflow\" | \"wait\" | \"resolve\";\n args: unknown[];\n}\n\ninterface MockState {\n // TailorDB\n queryResolver: QueryResolver;\n queryResultQueue: unknown[][];\n executedQueries: ExecutedQuery[];\n createdClients: CreatedClient[];\n // Workflow\n jobHandler: JobHandler;\n jobResultQueue: unknown[];\n triggeredJobs: TriggeredJob[];\n triggerHandler: string | TriggerHandlerFn;\n waitHandler: unknown | WaitHandlerFn;\n resolveHandler: ResolveHandler | null;\n workflowCalls: WorkflowCall[];\n // SecretManager\n secretStore: Record<string, Record<string, string>>;\n secretCalls: SecretCall[];\n // AuthConnection\n authTokens: Record<string, unknown>;\n authCalls: AuthConnectionCall[];\n // IDP\n idpResolver: IdpResolver;\n idpResultQueue: unknown[];\n idpCalls: IdpCall[];\n // File\n fileResolver: FileResolver;\n fileResultQueue: unknown[];\n fileCalls: FileCall[];\n // Iconv\n iconvResolver: IconvResolver | null;\n iconvCalls: IconvCall[];\n}\n\n// ---------------------------------------------------------------------------\n// State management (shared via globalThis for environment/test interop)\n// ---------------------------------------------------------------------------\n\nexport const STATE_KEY = \"__tailorMockState\";\n\n// Sentinel set by the tailor-runtime environment in injectMocks() and cleared\n// in cleanupMocks(). Distinct from STATE_KEY, which is created lazily by\n// getState() whenever a mock helper runs (even from a non-tailor-runtime\n// project that happens to import the mocks). Use this flag to detect whether\n// the environment itself is active.\nexport const RUNTIME_FLAG_KEY = \"__tailorRuntimeActive\";\n\nfunction getState(): MockState {\n const g = globalThis as Record<string, unknown>;\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = createDefaultState();\n }\n return g[STATE_KEY] as MockState;\n}\n\nfunction createDefaultState(): MockState {\n return {\n queryResolver: () => [],\n queryResultQueue: [],\n executedQueries: [],\n createdClients: [],\n jobHandler: () => null,\n jobResultQueue: [],\n triggeredJobs: [],\n triggerHandler: \"mock-execution-id\",\n waitHandler: null,\n resolveHandler: null,\n workflowCalls: [],\n secretStore: {},\n secretCalls: [],\n authTokens: {},\n authCalls: [],\n idpResolver: () => null,\n idpResultQueue: [],\n idpCalls: [],\n fileResolver: () => null,\n fileResultQueue: [],\n fileCalls: [],\n iconvResolver: null,\n iconvCalls: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// TailorDB Mock\n// ---------------------------------------------------------------------------\n\n/**\n * Mock control object for TailorDB operations.\n *\n * Automatically injected into `globalThis.tailordb` by the tailor-runtime environment.\n * Use this object to configure query responses and assert on executed queries.\n * @example\n * ```typescript\n * import { tailordbMock } from \"@tailor-platform/sdk/vitest\";\n *\n * beforeEach(() => tailordbMock.reset());\n *\n * test(\"content-based\", () => {\n * tailordbMock.setQueryResolver((query) => {\n * if (query.includes(\"SELECT\")) return [{ id: \"1\" }];\n * return [];\n * });\n * });\n *\n * test(\"order-based\", () => {\n * tailordbMock.enqueueResults(\n * [], // BEGIN (empty result)\n * [{ age: 30 }], // SELECT (one row)\n * [], // COMMIT (empty result)\n * );\n * });\n * ```\n */\nexport const tailordbMock = {\n /**\n * Set a fallback query resolver. Called when the result queue is empty.\n * @param resolver - Function that returns rows for a given query and params\n */\n setQueryResolver(resolver: QueryResolver): void {\n getState().queryResolver = resolver;\n },\n\n /**\n * Enqueue rows for the next `queryObject` call. Arguments are the row objects returned\n * by that single query. Call with no arguments for an empty result. Consumed in FIFO\n * order; when the queue is exhausted, subsequent calls fall back to `setQueryResolver`\n * (default: empty rows). Use `enqueueResults` to stage rows for multiple queries in one\n * call.\n * @param rows - Row objects to return from the next `queryObject` call\n */\n enqueueResult(...rows: unknown[]): void {\n getState().queryResultQueue.push(rows);\n },\n\n /**\n * Enqueue rows for multiple subsequent `queryObject` calls. Each argument is a rows\n * array for one query, consumed in FIFO order.\n * @param rowsList - Rows arrays, one per upcoming query\n */\n enqueueResults(...rowsList: unknown[][]): void {\n getState().queryResultQueue.push(...rowsList);\n },\n\n /**\n * All queries executed via `queryObject`, in order.\n * @returns Executed queries array\n */\n get executedQueries(): ExecutedQuery[] {\n return getState().executedQueries;\n },\n\n /**\n * All TailorDB clients created, with their namespace and end state.\n * @returns Created clients array\n */\n get createdClients(): CreatedClient[] {\n return getState().createdClients;\n },\n\n /** Reset all TailorDB mock state. Call in `beforeEach`. */\n reset(): void {\n const state = getState();\n state.queryResolver = () => [];\n state.queryResultQueue.length = 0;\n state.executedQueries.length = 0;\n state.createdClients.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Workflow Mock\n// ---------------------------------------------------------------------------\n\n/**\n * Mock control object for workflow operations.\n *\n * Automatically injected into `globalThis.tailor.workflow` by the tailor-runtime environment.\n * @example\n * ```typescript\n * import { workflowMock } from \"@tailor-platform/sdk/vitest\";\n *\n * beforeEach(() => workflowMock.reset());\n *\n * test(\"job handler\", () => {\n * workflowMock.setJobHandler((jobName, args) => {\n * if (jobName === \"validate\") return { valid: true };\n * return null;\n * });\n * });\n *\n * test(\"wait point\", () => {\n * workflowMock.setWaitHandler(() => ({ approved: true }));\n * // …\n * expect(workflowMock.waitCalls).toEqual([{ key: \"approval\", payload: undefined }]);\n * });\n *\n * test(\"resolve point\", () => {\n * workflowMock.setResolveHandler((_executionId, _key, callback) =>\n * callback({ approved: true }),\n * );\n * // …\n * expect(workflowMock.resolveCalls).toEqual([\n * { executionId: \"mock-execution-id\", key: \"approval\" },\n * ]);\n * });\n * ```\n */\nexport const workflowMock = {\n /**\n * Set a fallback job handler. Called when the result queue is empty.\n * @param handler - Function that returns a result for a given job name and args\n */\n setJobHandler(handler: JobHandler): void {\n getState().jobHandler = handler;\n },\n\n /**\n * Enqueue a single result for the next `triggerJobFunction` call. Consumed in FIFO\n * order; when the queue is exhausted, subsequent calls fall back to `setJobHandler`\n * (default: null). Use `enqueueResults` to stage multiple results in one call.\n * @param result - Result to return from the next `triggerJobFunction` call\n */\n enqueueResult(result: unknown): void {\n getState().jobResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent `triggerJobFunction` calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().jobResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n /**\n * All jobs triggered via `triggerJobFunction`, in order.\n * @returns Triggered jobs array\n */\n get triggeredJobs(): TriggeredJob[] {\n return getState().triggeredJobs;\n },\n\n /**\n * Configure what `tailor.workflow.triggerWorkflow` returns. Pass a string to return\n * the same execution ID for every call, or a function `(name, args, options) => string`\n * to compute one per call. Default: `\"mock-execution-id\"`.\n * @param handler - Static execution ID or a function that returns one\n */\n setTriggerHandler(handler: string | TriggerHandlerFn): void {\n getState().triggerHandler = handler;\n },\n\n /**\n * Configure what `tailor.workflow.wait` returns. Pass a function `(key, payload) => unknown`\n * to compute one per call, or any other value to return it for every call. Default: `null`.\n * @param handler - Static value or a function that returns one\n */\n setWaitHandler: ((handler: unknown) => {\n getState().waitHandler = handler;\n }) as SetWaitHandler,\n\n /**\n * Configure how `tailor.workflow.resolve` runs the user-supplied callback. The handler\n * receives `(executionId, key, callback)` — invoke `callback(payload)` to drive\n * resolve→wait wiring in tests. Default: callback is not invoked (records the call only).\n * @param handler - Function invoked per `resolve` call\n */\n setResolveHandler(handler: ResolveHandler): void {\n getState().resolveHandler = handler;\n },\n\n /**\n * Calls to triggerWorkflow, wait, resolve (not triggerJobFunction — use triggeredJobs).\n * @returns Workflow calls array\n */\n get calls(): WorkflowCall[] {\n return getState().workflowCalls;\n },\n\n /**\n * `tailor.workflow.wait` calls reshaped as `{ key, payload }` for assertions.\n * @returns Wait call records\n */\n get waitCalls(): { key: string; payload: unknown }[] {\n return getState()\n .workflowCalls.filter((c) => c.method === \"wait\")\n .map((c) => ({ key: c.args[0] as string, payload: c.args[1] }));\n },\n\n /**\n * `tailor.workflow.resolve` calls reshaped as `{ executionId, key }` for assertions.\n * @returns Resolve call records\n */\n get resolveCalls(): { executionId: string; key: string }[] {\n return getState()\n .workflowCalls.filter((c) => c.method === \"resolve\")\n .map((c) => ({ executionId: c.args[0] as string, key: c.args[1] as string }));\n },\n\n /** Reset all workflow mock state. Call in `beforeEach`. */\n reset(): void {\n const state = getState();\n state.jobHandler = () => null;\n state.jobResultQueue.length = 0;\n state.triggeredJobs.length = 0;\n state.triggerHandler = \"mock-execution-id\";\n state.waitHandler = null;\n state.resolveHandler = null;\n state.workflowCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// SecretManager Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.secretmanager` — secret store and call recording. */\nexport const secretmanagerMock = {\n setSecrets(secrets: Record<string, Record<string, string>>): void {\n getState().secretStore = secrets;\n },\n\n get calls(): SecretCall[] {\n return getState().secretCalls;\n },\n\n reset(): void {\n const state = getState();\n state.secretStore = {};\n state.secretCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// AuthConnection Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.authconnection` — token store and call recording. */\nexport const authconnectionMock = {\n setTokens(tokens: Record<string, unknown>): void {\n getState().authTokens = tokens;\n },\n\n get calls(): AuthConnectionCall[] {\n return getState().authCalls;\n },\n\n reset(): void {\n const state = getState();\n state.authTokens = {};\n state.authCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// IDP Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.idp` — IDP client responses and call recording. */\nexport const idpMock = {\n setResolver(resolver: IdpResolver): void {\n getState().idpResolver = resolver;\n },\n\n /**\n * Enqueue a single result for the next IDP call. Consumed in FIFO order; falls back\n * to `setResolver` when exhausted. Use `enqueueResults` to stage multiple in one call.\n * @param result - Result to return from the next IDP call\n */\n enqueueResult(result: unknown): void {\n getState().idpResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent IDP calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().idpResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n get calls(): IdpCall[] {\n return getState().idpCalls;\n },\n\n reset(): void {\n const state = getState();\n state.idpResolver = () => null;\n state.idpResultQueue.length = 0;\n state.idpCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// File Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailordb.file` — file operation responses and call recording. */\nexport const fileMock = {\n setResolver(resolver: FileResolver): void {\n getState().fileResolver = resolver;\n },\n\n /**\n * Enqueue a single result for the next `tailordb.file` call. Consumed in FIFO order;\n * falls back to `setResolver` when exhausted. Use `enqueueResults` to stage multiple\n * in one call.\n * @param result - Result to return from the next file call\n */\n enqueueResult(result: unknown): void {\n getState().fileResultQueue.push(result);\n },\n\n /**\n * Enqueue results for multiple subsequent `tailordb.file` calls.\n * @param results - Results to enqueue, one per upcoming call\n */\n enqueueResults(...results: unknown[]): void {\n const queue = getState().fileResultQueue;\n for (const result of results) {\n queue.push(result);\n }\n },\n\n get calls(): FileCall[] {\n return getState().fileCalls;\n },\n\n reset(): void {\n const state = getState();\n state.fileResolver = () => null;\n state.fileResultQueue.length = 0;\n state.fileCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Iconv Mock\n// ---------------------------------------------------------------------------\n\n/** Mock control for `tailor.iconv` — encoding call recording. */\nexport const iconvMock = {\n setResolver(resolver: IconvResolver): void {\n getState().iconvResolver = resolver;\n },\n\n get calls(): IconvCall[] {\n return getState().iconvCalls;\n },\n\n reset(): void {\n const state = getState();\n state.iconvResolver = null;\n state.iconvCalls.length = 0;\n },\n};\n\n// ---------------------------------------------------------------------------\n// Mock Client implementation (injected as globalThis.tailordb.Client)\n// ---------------------------------------------------------------------------\n\nclass MockQueryResult {\n command: string;\n rowCount: number;\n rows: unknown[];\n\n constructor(rows: unknown[]) {\n this.command = \"\";\n this.rowCount = rows.length;\n this.rows = rows;\n }\n}\n\nclass MockTransaction {\n async begin(): Promise<void> {\n /* noop */\n }\n async commit(): Promise<void> {\n /* noop */\n }\n async rollback(): Promise<void> {\n /* noop */\n }\n\n async queryObject(query: string, params: unknown[] = []): Promise<MockQueryResult> {\n return resolveQuery(query, params);\n }\n}\n\nclass MockTailordbClient {\n #record: CreatedClient;\n\n constructor(config?: { namespace?: string }) {\n this.#record = { namespace: config?.namespace, ended: false };\n getState().createdClients.push(this.#record);\n }\n\n async connect(): Promise<void> {\n /* noop */\n }\n\n async end(): Promise<void> {\n this.#record.ended = true;\n }\n\n async queryObject(query: string, params: unknown[] = []): Promise<MockQueryResult> {\n return resolveQuery(query, params);\n }\n\n createTransaction(name: string): MockTransaction {\n if (!name) {\n throw new Error(\"Transaction name must be a non-empty string\");\n }\n return new MockTransaction();\n }\n}\n\nfunction resolveQuery(query: string, params: unknown[]): MockQueryResult {\n const state = getState();\n state.executedQueries.push({ query, params });\n\n // 1. Queue takes priority (order-based)\n if (state.queryResultQueue.length > 0) {\n return new MockQueryResult(state.queryResultQueue.shift()!);\n }\n\n // 2. Fallback to query resolver (content-based)\n const rows = state.queryResolver(query, params) ?? [];\n return new MockQueryResult(rows);\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.workflow\n// ---------------------------------------------------------------------------\n\nfunction mockTriggerJobFunction(jobName: string, args?: unknown): unknown {\n const state = getState();\n state.triggeredJobs.push({ jobName, args });\n if (state.jobResultQueue.length > 0) return state.jobResultQueue.shift();\n return state.jobHandler(jobName, args);\n}\n\nasync function mockTriggerWorkflow(\n workflowName: string,\n args?: unknown,\n options?: TriggerWorkflowOptions,\n): Promise<string> {\n const state = getState();\n state.workflowCalls.push({ method: \"triggerWorkflow\", args: [workflowName, args, options] });\n const handler = state.triggerHandler;\n return typeof handler === \"function\" ? handler(workflowName, args, options) : handler;\n}\n\nfunction mockWait(key: string, payload?: unknown): unknown {\n const state = getState();\n state.workflowCalls.push({ method: \"wait\", args: [key, payload] });\n const handler = state.waitHandler;\n return typeof handler === \"function\" ? (handler as WaitHandlerFn)(key, payload) : handler;\n}\n\n// Records the resolve call. By default the callback is not invoked, mirroring\n// platform semantics where tailor.workflow.resolve enqueues the callback\n// against the wait point and returns immediately. Tests that need\n// resolve→wait wiring can register a handler via workflowMock.setResolveHandler\n// — the handler receives `(executionId, key, callback)` and decides whether to\n// invoke the callback (typically with a synthesized payload).\nasync function mockResolve(\n executionId: string,\n key: string,\n callback: (payload: unknown) => unknown | Promise<unknown>,\n): Promise<void> {\n const state = getState();\n state.workflowCalls.push({ method: \"resolve\", args: [executionId, key, callback] });\n if (state.resolveHandler) {\n await state.resolveHandler(executionId, key, callback);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.context\n// ---------------------------------------------------------------------------\n\nfunction mockGetInvoker(): tailor.context.Invoker | null {\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.secretmanager\n// ---------------------------------------------------------------------------\n\nasync function mockGetSecrets<const T extends readonly string[]>(\n vault: string,\n names: T,\n): Promise<Partial<Record<T[number], string>>> {\n const state = getState();\n state.secretCalls.push({ method: \"getSecrets\", vault, names });\n const vaultData = state.secretStore[vault] ?? {};\n const result: Record<string, string> = {};\n for (const name of names) {\n if (name in vaultData) {\n result[name] = vaultData[name];\n }\n }\n return result as Partial<Record<T[number], string>>;\n}\n\nasync function mockGetSecret(vault: string, name: string): Promise<string | undefined> {\n const state = getState();\n state.secretCalls.push({ method: \"getSecret\", vault, name });\n return state.secretStore[vault]?.[name];\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.authconnection\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function mockGetConnectionToken(connectionName: string): Promise<any> {\n const state = getState();\n state.authCalls.push({ connectionName });\n return state.authTokens[connectionName] ?? { access_token: \"mock-token\" };\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.idp\n// ---------------------------------------------------------------------------\n\nconst IDP_DEFAULTS: Record<string, unknown> = {\n users: { users: [], nextPageToken: null, totalCount: 0 },\n user: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n userByName: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n createUser: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n updateUser: { id: \"mock-id\", name: \"mock-user\", disabled: false },\n deleteUser: true,\n sendPasswordResetEmail: true,\n};\n\nfunction resolveIdpCall(method: string, args: unknown[], namespace: string): unknown {\n const state = getState();\n state.idpCalls.push({ method, args, namespace });\n if (state.idpResultQueue.length > 0) return state.idpResultQueue.shift();\n const resolved = state.idpResolver(method, args, namespace);\n // Treat null and undefined alike as \"no override\" — resolvers commonly\n // `return null` for unmatched methods.\n if (resolved != null) return resolved;\n // Clone the default so a test mutating the returned value (e.g.\n // `result.users.push(x)`) cannot corrupt the shared module-level object\n // for subsequent tests in the same worker.\n const fallback = IDP_DEFAULTS[method];\n return fallback === undefined ? undefined : structuredClone(fallback);\n}\n\nclass MockIdpClient {\n #namespace: string;\n constructor(config: { namespace: string }) {\n this.#namespace = config.namespace;\n }\n async users(options?: {\n first?: number;\n after?: string;\n query?: { ids?: string[]; names?: string[] };\n }): Promise<{ users: tailor.idp.User[]; nextPageToken: string | null; totalCount: number }> {\n return resolveIdpCall(\"users\", [options], this.#namespace) as Awaited<\n ReturnType<typeof this.users>\n >;\n }\n async user(userId: string): Promise<tailor.idp.User> {\n return resolveIdpCall(\"user\", [userId], this.#namespace) as tailor.idp.User;\n }\n async userByName(name: string): Promise<tailor.idp.User> {\n return resolveIdpCall(\"userByName\", [name], this.#namespace) as tailor.idp.User;\n }\n async createUser(input: {\n name: string;\n password?: string;\n disabled?: boolean;\n }): Promise<tailor.idp.User> {\n return resolveIdpCall(\"createUser\", [input], this.#namespace) as tailor.idp.User;\n }\n async updateUser(input: {\n id: string;\n name?: string;\n password?: string;\n clearPassword?: boolean;\n disabled?: boolean;\n }): Promise<tailor.idp.User> {\n return resolveIdpCall(\"updateUser\", [input], this.#namespace) as tailor.idp.User;\n }\n async deleteUser(userId: string): Promise<boolean> {\n return resolveIdpCall(\"deleteUser\", [userId], this.#namespace) as boolean;\n }\n async sendPasswordResetEmail(input: { userId: string; redirectUri: string }): Promise<boolean> {\n return resolveIdpCall(\"sendPasswordResetEmail\", [input], this.#namespace) as boolean;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailor.iconv\n// ---------------------------------------------------------------------------\n\n// Iconv methods return `string` for UTF-8 target encodings and `Uint8Array`\n// for any other byte-producing encoding (the platform API mirrors this).\n// Default returns must respect that contract so tests that don't configure a\n// resolver still get type-consistent values.\nfunction isUtf8(encoding: unknown): boolean {\n return encoding === \"UTF8\" || encoding === \"UTF-8\";\n}\n\nfunction defaultIconvResult(method: string, args: unknown[]): unknown {\n switch (method) {\n case \"convert\":\n case \"convertBuffer\":\n return isUtf8(args[2]) ? \"\" : new Uint8Array();\n case \"decode\":\n return \"\";\n case \"encode\":\n return isUtf8(args[1]) ? \"\" : new Uint8Array();\n case \"encodings\":\n return [];\n default:\n return undefined;\n }\n}\n\nfunction resolveIconvCall(method: string, args: unknown[]): unknown {\n const state = getState();\n state.iconvCalls.push({ method, args: [...args] });\n if (state.iconvResolver) {\n const result = state.iconvResolver(method, args);\n // Treat both null and undefined as \"no override\" so resolvers using\n // implicit returns (e.g. early `return;` for unhandled methods) still\n // fall through to the type-consistent default.\n if (result != null) return result;\n }\n return defaultIconvResult(method, args);\n}\n\nfunction mockConvert<T extends string>(\n str: string | Uint8Array | ArrayBuffer,\n fromEncoding: string,\n toEncoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"convert\", [str, fromEncoding, toEncoding]) as any;\n}\n\nfunction mockConvertBuffer<T extends string>(\n buffer: Uint8Array | ArrayBuffer,\n fromEncoding: string,\n toEncoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"convertBuffer\", [buffer, fromEncoding, toEncoding]) as any;\n}\n\nfunction mockDecode(buffer: Uint8Array | ArrayBuffer, encoding: string): string {\n return resolveIconvCall(\"decode\", [buffer, encoding]) as string;\n}\n\nfunction mockEncode<T extends string>(\n str: string,\n encoding: T,\n): T extends \"UTF8\" | \"UTF-8\" ? string : Uint8Array {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return resolveIconvCall(\"encode\", [str, encoding]) as any;\n}\n\nfunction mockEncodings(): string[] {\n return resolveIconvCall(\"encodings\", []) as string[];\n}\n\nclass MockIconv {\n #fromEncoding: string;\n #toEncoding: string;\n\n constructor(fromEncoding: string, toEncoding: string) {\n this.#fromEncoding = fromEncoding;\n this.#toEncoding = toEncoding;\n }\n\n convert(input: string | Uint8Array | ArrayBuffer): string | Uint8Array {\n return resolveIconvCall(\"convert\", [input, this.#fromEncoding, this.#toEncoding]) as\n | string\n | Uint8Array;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock: tailordb.file\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FILE_DEFAULTS: Record<string, any> = {\n upload: { metadata: { fileSize: 0, sha256sum: \"\" } },\n download: {\n data: new Uint8Array(),\n metadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", lastUploadedAt: \"\" },\n },\n downloadAsBase64: {\n data: \"\",\n metadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", lastUploadedAt: \"\" },\n },\n delete: undefined,\n getMetadata: { contentType: \"\", fileSize: 0, sha256sum: \"\", urlPath: \"\" },\n};\n\nfunction resolveFileCall(\n method: string,\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n): unknown {\n const state = getState();\n const call: FileCall = { method, namespace, typeName, fieldName, recordId };\n state.fileCalls.push(call);\n if (state.fileResultQueue.length > 0) return state.fileResultQueue.shift();\n const resolved = state.fileResolver(method, call);\n // Treat null and undefined alike as \"no override\" — resolvers commonly\n // `return null` for unmatched methods.\n if (resolved != null) return resolved;\n // Clone the default so a test mutating the returned value (e.g. the\n // `data: Uint8Array` payload from `download`) cannot corrupt the shared\n // module-level object for subsequent tests in the same worker.\n const fallback = FILE_DEFAULTS[method];\n return fallback === undefined ? undefined : structuredClone(fallback);\n}\n\nconst mockTailordbFile = {\n async upload(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n _data: string | ArrayBuffer | Uint8Array | number[],\n _options?: { contentType?: string },\n ): Promise<{ metadata: { fileSize: number; sha256sum: string } }> {\n return resolveFileCall(\"upload\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.upload>\n >;\n },\n async download(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n data: Uint8Array;\n metadata: { contentType: string; fileSize: number; sha256sum: string; lastUploadedAt: string };\n }> {\n return resolveFileCall(\"download\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.download>\n >;\n },\n async downloadAsBase64(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n data: string;\n metadata: { contentType: string; fileSize: number; sha256sum: string; lastUploadedAt: string };\n }> {\n return resolveFileCall(\"downloadAsBase64\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.downloadAsBase64>\n >;\n },\n async delete(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<void> {\n resolveFileCall(\"delete\", namespace, typeName, fieldName, recordId);\n },\n async getMetadata(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<{\n contentType: string;\n fileSize: number;\n sha256sum: string;\n urlPath: string;\n lastUploadedAt?: string;\n }> {\n return resolveFileCall(\"getMetadata\", namespace, typeName, fieldName, recordId) as Awaited<\n ReturnType<typeof this.getMetadata>\n >;\n },\n openDownloadStream(\n namespace: string,\n typeName: string,\n fieldName: string,\n recordId: string,\n ): Promise<AsyncIterableIterator<unknown> & { close(): Promise<void> }> {\n const resolved = resolveFileCall(\n \"openDownloadStream\",\n namespace,\n typeName,\n fieldName,\n recordId,\n );\n return Promise.resolve(toFileStream(resolved));\n },\n};\n\ntype FileStream = AsyncIterableIterator<unknown> & { close(): Promise<void> };\n\nfunction toFileStream(value: unknown): FileStream {\n // Already a complete stream-like object: pass through.\n if (\n value !== null &&\n typeof value === \"object\" &&\n Symbol.asyncIterator in value &&\n typeof (value as { close?: unknown }).close === \"function\"\n ) {\n return value as FileStream;\n }\n // Binary chunk shorthand: a single ArrayBuffer / TypedArray (e.g. Uint8Array)\n // should be delivered as one chunk, not iterated as a sequence of numbers.\n // Tests passing `[chunk1, chunk2]` continue to work via the iterable branch\n // below.\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n return toFileStream([value]);\n }\n // Iterable (array, sync iterator, etc.): wrap as a chunked async iterator\n // so `fileMock.enqueueResult([chunk1, chunk2])` controls stream contents.\n if (\n value !== null &&\n typeof value === \"object\" &&\n (Symbol.iterator in value || Symbol.asyncIterator in value)\n ) {\n const source = value as Iterable<unknown> | AsyncIterable<unknown>;\n const inner =\n Symbol.asyncIterator in source\n ? (source as AsyncIterable<unknown>)[Symbol.asyncIterator]()\n : (source as Iterable<unknown>)[Symbol.iterator]();\n const stream: FileStream = {\n async next() {\n const r = await inner.next();\n return r.done ? { done: true as const, value: undefined } : r;\n },\n async close() {},\n [Symbol.asyncIterator]() {\n return stream;\n },\n };\n return stream;\n }\n const empty: FileStream = {\n async next() {\n return { done: true as const, value: undefined };\n },\n async close() {},\n [Symbol.asyncIterator]() {\n return empty;\n },\n };\n return empty;\n}\n\n// ---------------------------------------------------------------------------\n// Error class mocks\n// ---------------------------------------------------------------------------\n\ninterface TailorErrorItem {\n message: string;\n path: (string | number)[];\n}\n\nclass TailorErrorsMock extends Error {\n errors: TailorErrorItem[];\n\n constructor(errors: TailorErrorItem[]) {\n if (!Array.isArray(errors)) {\n throw new TypeError(\"TailorErrors: errors must be an array\");\n }\n const validated = errors.map((e, i) => {\n if (typeof e.message !== \"string\") {\n throw new TypeError(`TailorErrors: errors[${i}].message must be a string`);\n }\n if (!Array.isArray(e.path)) {\n throw new TypeError(`TailorErrors: errors[${i}].path must be an array`);\n }\n return { message: e.message, path: e.path };\n });\n // Match the PF runtime's TailorErrors serialization, which prefixes the\n // JSON payload with \"TailorErrors: \". Other SDK code (e.g. apply\n // integration fixtures) strips this prefix before JSON.parse.\n super(`TailorErrors: ${JSON.stringify({ errors: validated })}`);\n this.name = \"TailorErrors\";\n this.errors = validated;\n }\n}\n\nclass TailorErrorMessageMock extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TailorErrorMessage\";\n }\n}\n\nclass TailorDBFileErrorMock extends Error {\n code?: string;\n override cause: unknown;\n\n constructor(message: string, code?: string, cause?: unknown) {\n super(message);\n this.name = \"TailorDBFileError\";\n this.code = code;\n this.cause = cause;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Injection / Cleanup (called by environment.ts)\n// ---------------------------------------------------------------------------\n\n/**\n * Inject all platform API mocks into globalThis.\n * Called by the tailor-runtime Vitest environment during setup.\n * @param global - The global object to inject mocks into\n */\nexport function injectMocks(global: typeof globalThis): void {\n const g = global as Record<string, unknown>;\n\n // Ensure fresh state and mark the environment as active so setup.ts can\n // distinguish \"tailor-runtime is selected\" from \"some test code happened\n // to read a mock helper and lazily created STATE_KEY\".\n g[STATE_KEY] = createDefaultState();\n g[RUNTIME_FLAG_KEY] = true;\n\n g.tailordb = {\n Client: MockTailordbClient,\n file: mockTailordbFile,\n };\n\n g.tailor = {\n secretmanager: {\n getSecrets: mockGetSecrets,\n getSecret: mockGetSecret,\n },\n authconnection: {\n getConnectionToken: mockGetConnectionToken,\n },\n workflow: {\n triggerJobFunction: mockTriggerJobFunction,\n triggerWorkflow: mockTriggerWorkflow,\n wait: mockWait,\n resolve: mockResolve,\n },\n context: {\n getInvoker: mockGetInvoker,\n },\n idp: { Client: MockIdpClient },\n iconv: {\n convert: mockConvert,\n convertBuffer: mockConvertBuffer,\n decode: mockDecode,\n encode: mockEncode,\n encodings: mockEncodings,\n Iconv: MockIconv,\n },\n };\n\n g.TailorErrors = TailorErrorsMock;\n g.TailorErrorMessage = TailorErrorMessageMock;\n g.TailorDBFileError = TailorDBFileErrorMock;\n}\n\n/**\n * Remove all injected mocks from globalThis.\n * Called by the tailor-runtime Vitest environment during teardown.\n * @param global - The global object to clean up mocks from\n */\nexport function cleanupMocks(global: typeof globalThis): void {\n const g = global as Record<string, unknown>;\n delete g.tailordb;\n delete g.tailor;\n delete g.TailorErrors;\n delete g.TailorErrorMessage;\n delete g.TailorDBFileError;\n delete g[STATE_KEY];\n delete g[RUNTIME_FLAG_KEY];\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as enumConstantsPlugin, t as EnumConstantsGeneratorID } from "../../../index-BbOTbZFf.mjs";
2
+ import { n as enumConstantsPlugin, t as EnumConstantsGeneratorID } from "../../../index-BjXN1SdY.mjs";
3
3
  export { EnumConstantsGeneratorID, enumConstantsPlugin };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as fileUtilsPlugin, t as FileUtilsGeneratorID } from "../../../index-iy-hNfGp.mjs";
2
+ import { n as fileUtilsPlugin, t as FileUtilsGeneratorID } from "../../../index-nV4ZC_Ve.mjs";
3
3
  export { FileUtilsGeneratorID, fileUtilsPlugin };
@@ -1,3 +1,3 @@
1
1
  /// <reference types="@tailor-platform/function-types" />
2
- import { n as kyselyTypePlugin, t as KyselyGeneratorID } from "../../../index-BRvNi5q9.mjs";
2
+ import { n as kyselyTypePlugin, t as KyselyGeneratorID } from "../../../index-VJW98BSy.mjs";
3
3
  export { KyselyGeneratorID, kyselyTypePlugin };