@tailor-platform/sdk 2.14.2 → 2.15.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 (75) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/bin/tailor.mjs +2 -2
  3. package/dist/{application-BAqZFMWP.mjs → application-BpoMu4Af.mjs} +18 -18
  4. package/dist/application-BpoMu4Af.mjs.map +1 -0
  5. package/dist/application-fIhVKX78.mjs +1 -0
  6. package/dist/cli/commands/deploy/app-id-lock.d.mts +97 -0
  7. package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +15 -1
  8. package/dist/cli/commands/tailordb/migrate/generate.d.mts +5 -2
  9. package/dist/cli/commands/tailordb/migrate/rename-detection.d.mts +13 -0
  10. package/dist/cli/commands/tailordb/migrate/snapshot-comparison.d.mts +7 -1
  11. package/dist/cli/commands/workflow/executions.d.mts +2 -0
  12. package/dist/cli/lib.d.mts +4 -2
  13. package/dist/cli/lib.mjs +1 -1
  14. package/dist/cli/lib.mjs.map +1 -1
  15. package/dist/cli/main.d.mts +8 -8
  16. package/dist/cli/main.mjs +42 -44
  17. package/dist/cli/main.mjs.map +1 -1
  18. package/dist/cli/shared/command.d.mts +1 -1
  19. package/dist/cli/shared/function-execution.d.mts +14 -0
  20. package/dist/completion/zsh-worker.zsh +8 -3
  21. package/dist/configure/config/types.d.mts +23 -6
  22. package/dist/configure/index.mjs +1 -1
  23. package/dist/configure/index.mjs.map +1 -1
  24. package/dist/configure/services/executor/trigger/event.d.mts +5 -2
  25. package/dist/date-CGBZbMW5.mjs +2 -0
  26. package/dist/date-CGBZbMW5.mjs.map +1 -0
  27. package/dist/file-DKBOj5q4.mjs +2 -0
  28. package/dist/file-DKBOj5q4.mjs.map +1 -0
  29. package/dist/plugin/builtin/file-utils/index.mjs +27 -1
  30. package/dist/plugin/builtin/file-utils/index.mjs.map +1 -1
  31. package/dist/register-ts-hook-CAUcxCt4.mjs +711 -0
  32. package/dist/register-ts-hook-CAUcxCt4.mjs.map +1 -0
  33. package/dist/runtime/file.d.mts +46 -2
  34. package/dist/runtime/file.mjs +1 -1
  35. package/dist/runtime/index.mjs +1 -1
  36. package/dist/{schema-DMlLMsWA.mjs → schema-BTioi2dP.mjs} +2 -2
  37. package/dist/{schema-DMlLMsWA.mjs.map → schema-BTioi2dP.mjs.map} +1 -1
  38. package/dist/service_pb-DKrsO1_u.mjs +1 -0
  39. package/dist/service_pb-DprmLNsq.mjs +2 -0
  40. package/dist/{service_pb-BdzjiHfC.mjs.map → service_pb-DprmLNsq.mjs.map} +1 -1
  41. package/dist/types/auth.generated.d.mts +1 -19
  42. package/dist/types/executor.generated.d.mts +5 -3
  43. package/dist/types/field.generated.d.mts +40 -0
  44. package/dist/types/helpers.d.mts +9 -1
  45. package/dist/types/resolver.generated.d.mts +5 -40
  46. package/dist/vitest/index.d.mts +2 -3
  47. package/dist/vitest/index.mjs +1 -1
  48. package/dist/vitest/index.mjs.map +1 -1
  49. package/dist/vitest/mocks/file.d.mts +2 -2
  50. package/dist/vitest/setup.d.mts +0 -37
  51. package/dist/vitest/setup.mjs +1 -1
  52. package/dist/vitest/setup.mjs.map +1 -1
  53. package/dist/{workspace_resource_pb-C4EY-Gns.mjs → workspace_resource_pb-BOoRts_z.mjs} +2 -2
  54. package/dist/{workspace_resource_pb-C4EY-Gns.mjs.map → workspace_resource_pb-BOoRts_z.mjs.map} +1 -1
  55. package/docs/cli/application.md +1 -1
  56. package/docs/cli/function.md +19 -6
  57. package/docs/cli/tailordb.md +11 -11
  58. package/docs/configuration.md +20 -3
  59. package/docs/github-actions.md +45 -13
  60. package/docs/migration/v3.md +38 -0
  61. package/docs/runtime.md +39 -0
  62. package/docs/services/resolver.md +3 -1
  63. package/docs/services/tailordb-migration.md +25 -5
  64. package/docs/testing.md +3 -7
  65. package/package.json +7 -7
  66. package/dist/application-BAqZFMWP.mjs.map +0 -1
  67. package/dist/application-BKlOiD1x.mjs +0 -1
  68. package/dist/date-DrUO8rOJ.mjs +0 -2
  69. package/dist/date-DrUO8rOJ.mjs.map +0 -1
  70. package/dist/file-COPYfju_.mjs +0 -2
  71. package/dist/file-COPYfju_.mjs.map +0 -1
  72. package/dist/register-ts-hook-Cphn4r8s.mjs +0 -642
  73. package/dist/register-ts-hook-Cphn4r8s.mjs.map +0 -1
  74. package/dist/service_pb-BdzjiHfC.mjs +0 -2
  75. package/dist/service_pb-p68oLtp9.mjs +0 -1
@@ -1,4 +1,4 @@
1
- import { FileDownloadAsBase64Response, FileDownloadResponse, FileDownloadStreamResponse, FileMetadata, FileUploadOptions, FileUploadResponse, FileUploadStreamOptions } from "../../runtime/file.mjs";
1
+ import { FileDownloadAsBase64Response, FileDownloadResponse, FileDownloadStreamResponse, FileMetadata, FileUploadBytes, FileUploadOptions, FileUploadResponse, FileUploadStreamOptions } from "../../runtime/file.mjs";
2
2
  import { Mock } from "vitest";
3
3
  //#region src/vitest/mocks/file.d.ts
4
4
  type FileResolver = (method: string, call: FileCall) => unknown;
@@ -47,11 +47,11 @@ export declare function mockFile(options?: MockFileOptions): {
47
47
  clear(): void;
48
48
  reset(): void;
49
49
  delete: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string) => Promise<void>>;
50
- upload: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string, data: string | ArrayBuffer | Uint8Array | number[], options?: FileUploadOptions) => Promise<FileUploadResponse>>;
51
50
  download: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string) => Promise<FileDownloadResponse>>;
52
51
  downloadAsBase64: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string) => Promise<FileDownloadAsBase64Response>>;
53
52
  getMetadata: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string) => Promise<FileMetadata>>;
54
53
  downloadStream: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string) => Promise<FileDownloadStreamResponse>>;
55
54
  uploadStream: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string, readableStream: ReadableStream<Uint8Array | ArrayBuffer>, options?: FileUploadStreamOptions) => Promise<FileUploadResponse>>;
55
+ upload: Mock<(namespace: string, tableName: string, fieldName: string, recordId: string, data: string | FileUploadBytes, options?: Omit<FileUploadOptions, "encoding">) => Promise<FileUploadResponse>>;
56
56
  } & Disposable;
57
57
  //#endregion
@@ -1,21 +1,4 @@
1
1
  //#region src/vitest/setup.d.ts
2
- type SavedGlobals = Record<string, PropertyDescriptor | undefined>;
3
- /**
4
- * Reference-counted lifecycle for blocked globals.
5
- *
6
- * Concurrent tests in the same Vitest worker (`test.concurrent`) interleave
7
- * their beforeEach/afterEach hooks: a naive `let saved` shared across hooks
8
- * would let one test's `afterEach` restore `performance` mid-execution of
9
- * another test. Reference counting keeps the globals removed for the union
10
- * of all overlapping test scopes — the property is removed on first entry
11
- * and restored only when the last test exits.
12
- * @returns Lifecycle hooks
13
- */
14
- export declare function createBlockedGlobalsLifecycle(): {
15
- enter: (globalObj: Record<string, unknown>, keys: readonly string[]) => void;
16
- exit: (globalObj: Record<string, unknown>) => void;
17
- readonly active: number;
18
- };
19
2
  /**
20
3
  * Extract a vault store from a secrets-shaped value.
21
4
  *
@@ -38,24 +21,4 @@ export declare function extractVaultStore(secrets: unknown): Record<string, Reco
38
21
  * @returns Vault store keyed by vault name, or null if unavailable
39
22
  */
40
23
  export declare function loadSecretsFromConfig(configPath: string): Promise<Record<string, Record<string, string>> | null>;
41
- /**
42
- * Remove the given globals from `globalObj`, returning the descriptors that
43
- * were actually deleted so `restoreBlockedGlobals` can put them back.
44
- *
45
- * Mirrors environment.ts: non-configurable properties are skipped instead of
46
- * deleted, so `delete` never throws in strict-mode runtimes that lock them
47
- * down. Only properties whose deletion actually happened are returned, so the
48
- * caller restores nothing for the skipped case.
49
- * @param globalObj - Target object (typically `globalThis`)
50
- * @param keys - Property names to remove
51
- * @returns Map of removed descriptors keyed by property name
52
- */
53
- export declare function removeBlockedGlobals(globalObj: Record<string, unknown>, keys: readonly string[]): SavedGlobals;
54
- /**
55
- * Restore previously-removed globals onto `globalObj` from a `SavedGlobals`
56
- * map produced by `removeBlockedGlobals`.
57
- * @param globalObj - Target object (typically `globalThis`)
58
- * @param saved - Descriptors to re-define
59
- */
60
- export declare function restoreBlockedGlobals(globalObj: Record<string, unknown>, saved: SavedGlobals): void;
61
24
  //#endregion
@@ -1,2 +1,2 @@
1
- import{t as e}from"../globals-CMHSnj4w.mjs";import{t}from"../secretmanager-5olfnI1b.mjs";import{pathToFileURL as n}from"node:url";import{afterEach as r,beforeAll as i,beforeEach as a}from"vitest";const o=[`performance`];function createBlockedGlobalsLifecycle(){let e=0,t={};return{get active(){return e},enter(n,r){e===0&&(t=removeBlockedGlobals(n,r)),e++},exit(n){e!==0&&(e--,e===0&&(restoreBlockedGlobals(n,t),t={}))}}}const s=createBlockedGlobalsLifecycle();function isTailorRuntime(){return e in globalThis}function extractVaultStore(e){if(!e||typeof e!=`object`)return null;let t=`vaults`in e&&typeof e.vaults==`object`&&e.vaults!==null?e.vaults:e,n={};for(let[e,r]of Object.entries(t))typeof r==`object`&&r&&(n[e]={...r});return Object.keys(n).length>0?n:null}async function loadSecretsFromConfig(e){try{let t=await import(n(e).href);return extractVaultStore(t.default?.secrets??t.secrets)}catch{return null}}i(async()=>{if(!isTailorRuntime())return;let e=process.env.__TAILOR_RUNTIME_CONFIG;if(!e)return;let n=await loadSecretsFromConfig(e);n&&t().setSecrets(n)});function removeBlockedGlobals(e,t){let n={};for(let r of t){let t=Object.getOwnPropertyDescriptor(e,r);t?.configurable&&(n[r]=t,delete e[r])}return n}function restoreBlockedGlobals(e,t){for(let[n,r]of Object.entries(t))r&&Object.defineProperty(e,n,r)}a(()=>{isTailorRuntime()&&s.enter(globalThis,o)}),r(()=>{isTailorRuntime()&&s.exit(globalThis)});export{createBlockedGlobalsLifecycle,extractVaultStore,loadSecretsFromConfig,removeBlockedGlobals,restoreBlockedGlobals};
1
+ import{t as e}from"../globals-CMHSnj4w.mjs";import{t}from"../secretmanager-5olfnI1b.mjs";import{pathToFileURL as n}from"node:url";import{beforeAll as r}from"vitest";function isTailorRuntime(){return e in globalThis}function extractVaultStore(e){if(!e||typeof e!=`object`)return null;let t=`vaults`in e&&typeof e.vaults==`object`&&e.vaults!==null?e.vaults:e,n={};for(let[e,r]of Object.entries(t))typeof r==`object`&&r&&(n[e]={...r});return Object.keys(n).length>0?n:null}async function loadSecretsFromConfig(e){try{let t=await import(n(e).href);return extractVaultStore(t.default?.secrets??t.secrets)}catch{return null}}r(async()=>{if(!isTailorRuntime())return;let e=process.env.__TAILOR_RUNTIME_CONFIG;if(!e)return;let n=await loadSecretsFromConfig(e);n&&t().setSecrets(n)});export{extractVaultStore,loadSecretsFromConfig};
2
2
  //# sourceMappingURL=setup.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup.mjs","names":[],"sources":["../../src/vitest/setup.ts"],"sourcesContent":["/**\n * Vitest setup file that removes Node.js globals which Vitest depends on\n * but are not available in the Tailor Platform runtime.\n *\n * These globals cannot be removed in the environment's setup() because\n * Vitest's runner needs them during initialization. By using beforeEach/afterEach,\n * they are only removed during user test code execution.\n *\n * This file is auto-injected by tailorRuntime() but only activates when\n * the tailor-runtime environment is active (detected via __tailorRuntimeActive,\n * a flag set by injectMocks() during environment setup).\n */\nimport { pathToFileURL } from \"node:url\";\nimport { afterEach, beforeAll, beforeEach } from \"vitest\";\nimport { RUNTIME_FLAG_KEY, mockSecretmanager } from \"./mock\";\n\n// Globals that Vitest internals depend on but don't exist in the platform runtime.\n// Removed before each test, restored after.\nconst BLOCKED_GLOBALS = [\"performance\"] as const;\n\ntype SavedGlobals = Record<string, PropertyDescriptor | undefined>;\n\n/**\n * Reference-counted lifecycle for blocked globals.\n *\n * Concurrent tests in the same Vitest worker (`test.concurrent`) interleave\n * their beforeEach/afterEach hooks: a naive `let saved` shared across hooks\n * would let one test's `afterEach` restore `performance` mid-execution of\n * another test. Reference counting keeps the globals removed for the union\n * of all overlapping test scopes — the property is removed on first entry\n * and restored only when the last test exits.\n * @returns Lifecycle hooks\n */\nexport function createBlockedGlobalsLifecycle(): {\n enter: (globalObj: Record<string, unknown>, keys: readonly string[]) => void;\n exit: (globalObj: Record<string, unknown>) => void;\n readonly active: number;\n} {\n let active = 0;\n let saved: SavedGlobals = {};\n return {\n get active() {\n return active;\n },\n enter(globalObj, keys) {\n if (active === 0) saved = removeBlockedGlobals(globalObj, keys);\n active++;\n },\n exit(globalObj) {\n // Defensive guard — in practice every `enter` is paired with `exit`,\n // but a hook crash could desync the counter.\n if (active === 0) return;\n active--;\n if (active === 0) {\n restoreBlockedGlobals(globalObj, saved);\n saved = {};\n }\n },\n };\n}\n\nconst lifecycle = createBlockedGlobalsLifecycle();\n\nfunction isTailorRuntime(): boolean {\n return RUNTIME_FLAG_KEY in globalThis;\n}\n\n/**\n * Extract a vault store from a secrets-shaped value.\n *\n * `defineSecretManager()` returns `{ vaults, options, get, getAll }` (get/getAll\n * are non-enumerable). When that shape is present, the actual vaults live\n * under `.vaults`. Otherwise fall back to treating the object itself as the\n * vault map (for plain object configs).\n * @param secrets - Value from `appConfig.secrets` or `config.secrets`\n * @returns Vault store, or null if the value is unusable\n */\nexport function extractVaultStore(secrets: unknown): Record<string, Record<string, string>> | null {\n if (!secrets || typeof secrets !== \"object\") return null;\n\n const source =\n \"vaults\" in secrets &&\n typeof (secrets as { vaults?: unknown }).vaults === \"object\" &&\n (secrets as { vaults?: unknown }).vaults !== null\n ? (secrets as { vaults: Record<string, unknown> }).vaults\n : (secrets as Record<string, unknown>);\n\n const store: Record<string, Record<string, string>> = {};\n for (const [vaultName, vaultData] of Object.entries(source)) {\n if (typeof vaultData === \"object\" && vaultData !== null) {\n store[vaultName] = { ...(vaultData as Record<string, string>) };\n }\n }\n return Object.keys(store).length > 0 ? store : null;\n}\n\n/**\n * Load and parse secrets from a tailor.config.ts file.\n *\n * Returns a vault store on success, or `null` on any failure (missing config,\n * import failure, missing/invalid secrets shape). Errors are swallowed so a\n * misconfigured project still boots — the user can set secrets manually via\n * `mockSecretmanager().setSecrets()`.\n * @param configPath - Absolute path to tailor.config.ts\n * @returns Vault store keyed by vault name, or null if unavailable\n */\nexport async function loadSecretsFromConfig(\n configPath: string,\n): Promise<Record<string, Record<string, string>> | null> {\n try {\n // Convert to file URL so absolute Windows paths (e.g. \"C:\\...\") parse as\n // valid ESM specifiers.\n const config = await import(pathToFileURL(configPath).href);\n const appConfig = config.default;\n const secrets = appConfig?.secrets ?? config.secrets;\n return extractVaultStore(secrets);\n } catch {\n return null;\n }\n}\n\n// Load secrets from tailor.config.ts if config path is provided via env var\nbeforeAll(async () => {\n if (!isTailorRuntime()) return;\n const configPath = process.env.__TAILOR_RUNTIME_CONFIG;\n if (!configPath) return;\n\n const store = await loadSecretsFromConfig(configPath);\n if (store) {\n // Acquire without `using`: this is a one-time global seed that must persist\n // across tests, so we deliberately do not dispose (which would reset it).\n mockSecretmanager().setSecrets(store);\n }\n});\n\n/**\n * Remove the given globals from `globalObj`, returning the descriptors that\n * were actually deleted so `restoreBlockedGlobals` can put them back.\n *\n * Mirrors environment.ts: non-configurable properties are skipped instead of\n * deleted, so `delete` never throws in strict-mode runtimes that lock them\n * down. Only properties whose deletion actually happened are returned, so the\n * caller restores nothing for the skipped case.\n * @param globalObj - Target object (typically `globalThis`)\n * @param keys - Property names to remove\n * @returns Map of removed descriptors keyed by property name\n */\nexport function removeBlockedGlobals(\n globalObj: Record<string, unknown>,\n keys: readonly string[],\n): SavedGlobals {\n const removed: SavedGlobals = {};\n for (const key of keys) {\n const descriptor = Object.getOwnPropertyDescriptor(globalObj, key);\n if (descriptor?.configurable) {\n removed[key] = descriptor;\n delete globalObj[key];\n }\n }\n return removed;\n}\n\n/**\n * Restore previously-removed globals onto `globalObj` from a `SavedGlobals`\n * map produced by `removeBlockedGlobals`.\n * @param globalObj - Target object (typically `globalThis`)\n * @param saved - Descriptors to re-define\n */\nexport function restoreBlockedGlobals(\n globalObj: Record<string, unknown>,\n saved: SavedGlobals,\n): void {\n for (const [key, descriptor] of Object.entries(saved)) {\n if (descriptor) {\n Object.defineProperty(globalObj, key, descriptor);\n }\n }\n}\n\nbeforeEach(() => {\n if (!isTailorRuntime()) return;\n lifecycle.enter(globalThis, BLOCKED_GLOBALS);\n});\n\nafterEach(() => {\n if (!isTailorRuntime()) return;\n lifecycle.exit(globalThis);\n});\n"],"mappings":"oMAkBA,MAAM,EAAkB,CAAC,aAAa,EAetC,SAAgB,+BAId,CACA,IAAI,EAAS,EACT,EAAsB,CAAC,EAC3B,MAAO,CACL,IAAI,QAAS,CACX,OAAO,CACT,EACA,MAAM,EAAW,EAAM,CACjB,IAAW,IAAG,EAAQ,qBAAqB,EAAW,CAAI,GAC9D,GACF,EACA,KAAK,EAAW,CAGV,IAAW,IACf,IACI,IAAW,IACb,sBAAsB,EAAW,CAAK,EACtC,EAAQ,CAAC,GAEb,CACF,CACF,CAEA,MAAM,EAAY,8BAA8B,EAEhD,SAAS,iBAA2B,CAClC,OAAO,KAAoB,UAC7B,CAYA,SAAgB,kBAAkB,EAAiE,CACjG,GAAI,CAAC,GAAW,OAAO,GAAY,SAAU,OAAO,KAEpD,IAAM,EACJ,WAAY,GACZ,OAAQ,EAAiC,QAAW,UACnD,EAAiC,SAAW,KACxC,EAAgD,OAChD,EAED,EAAgD,CAAC,EACvD,IAAK,GAAM,CAAC,EAAW,KAAc,OAAO,QAAQ,CAAM,EACpD,OAAO,GAAc,UAAY,IACnC,EAAM,GAAa,CAAE,GAAI,CAAqC,GAGlE,OAAO,OAAO,KAAK,CAAK,CAAC,CAAC,OAAS,EAAI,EAAQ,IACjD,CAYA,eAAsB,sBACpB,EACwD,CACxD,GAAI,CAGF,IAAM,EAAS,MAAM,OAAO,EAAc,CAAU,CAAC,CAAC,MAGtD,OAAO,kBAFW,EAAO,SACE,SAAW,EAAO,OACb,CAClC,MAAQ,CACN,OAAO,IACT,CACF,CAGA,EAAU,SAAY,CACpB,GAAI,CAAC,gBAAgB,EAAG,OACxB,IAAM,EAAa,QAAQ,IAAI,wBAC/B,GAAI,CAAC,EAAY,OAEjB,IAAM,EAAQ,MAAM,sBAAsB,CAAU,EAChD,GAGF,EAAkB,CAAC,CAAC,WAAW,CAAK,CAExC,CAAC,EAcD,SAAgB,qBACd,EACA,EACc,CACd,IAAM,EAAwB,CAAC,EAC/B,IAAK,IAAM,KAAO,EAAM,CACtB,IAAM,EAAa,OAAO,yBAAyB,EAAW,CAAG,EAC7D,GAAY,eACd,EAAQ,GAAO,EACf,OAAO,EAAU,GAErB,CACA,OAAO,CACT,CAQA,SAAgB,sBACd,EACA,EACM,CACN,IAAK,GAAM,CAAC,EAAK,KAAe,OAAO,QAAQ,CAAK,EAC9C,GACF,OAAO,eAAe,EAAW,EAAK,CAAU,CAGtD,CAEA,MAAiB,CACV,gBAAgB,GACrB,EAAU,MAAM,WAAY,CAAe,CAC7C,CAAC,EAED,MAAgB,CACT,gBAAgB,GACrB,EAAU,KAAK,UAAU,CAC3B,CAAC"}
1
+ {"version":3,"file":"setup.mjs","names":[],"sources":["../../src/vitest/setup.ts"],"sourcesContent":["/**\n * Vitest setup file that seeds the SecretManager mock from `tailor.config.ts`.\n *\n * This file is auto-injected by tailorRuntime() but only activates when\n * the tailor-runtime environment is active (detected via __tailorRuntimeActive,\n * a flag set by injectMocks() during environment setup).\n */\nimport { pathToFileURL } from \"node:url\";\nimport { beforeAll } from \"vitest\";\nimport { RUNTIME_FLAG_KEY, mockSecretmanager } from \"./mock\";\n\nfunction isTailorRuntime(): boolean {\n return RUNTIME_FLAG_KEY in globalThis;\n}\n\n/**\n * Extract a vault store from a secrets-shaped value.\n *\n * `defineSecretManager()` returns `{ vaults, options, get, getAll }` (get/getAll\n * are non-enumerable). When that shape is present, the actual vaults live\n * under `.vaults`. Otherwise fall back to treating the object itself as the\n * vault map (for plain object configs).\n * @param secrets - Value from `appConfig.secrets` or `config.secrets`\n * @returns Vault store, or null if the value is unusable\n */\nexport function extractVaultStore(secrets: unknown): Record<string, Record<string, string>> | null {\n if (!secrets || typeof secrets !== \"object\") return null;\n\n const source =\n \"vaults\" in secrets &&\n typeof (secrets as { vaults?: unknown }).vaults === \"object\" &&\n (secrets as { vaults?: unknown }).vaults !== null\n ? (secrets as { vaults: Record<string, unknown> }).vaults\n : (secrets as Record<string, unknown>);\n\n const store: Record<string, Record<string, string>> = {};\n for (const [vaultName, vaultData] of Object.entries(source)) {\n if (typeof vaultData === \"object\" && vaultData !== null) {\n store[vaultName] = { ...(vaultData as Record<string, string>) };\n }\n }\n return Object.keys(store).length > 0 ? store : null;\n}\n\n/**\n * Load and parse secrets from a tailor.config.ts file.\n *\n * Returns a vault store on success, or `null` on any failure (missing config,\n * import failure, missing/invalid secrets shape). Errors are swallowed so a\n * misconfigured project still boots — the user can set secrets manually via\n * `mockSecretmanager().setSecrets()`.\n * @param configPath - Absolute path to tailor.config.ts\n * @returns Vault store keyed by vault name, or null if unavailable\n */\nexport async function loadSecretsFromConfig(\n configPath: string,\n): Promise<Record<string, Record<string, string>> | null> {\n try {\n // Convert to file URL so absolute Windows paths (e.g. \"C:\\...\") parse as\n // valid ESM specifiers.\n const config = await import(pathToFileURL(configPath).href);\n const appConfig = config.default;\n const secrets = appConfig?.secrets ?? config.secrets;\n return extractVaultStore(secrets);\n } catch {\n return null;\n }\n}\n\n// Load secrets from tailor.config.ts if config path is provided via env var\nbeforeAll(async () => {\n if (!isTailorRuntime()) return;\n const configPath = process.env.__TAILOR_RUNTIME_CONFIG;\n if (!configPath) return;\n\n const store = await loadSecretsFromConfig(configPath);\n if (store) {\n // Acquire without `using`: this is a one-time global seed that must persist\n // across tests, so we deliberately do not dispose (which would reset it).\n mockSecretmanager().setSecrets(store);\n }\n});\n"],"mappings":"qKAWA,SAAS,iBAA2B,CAClC,OAAO,KAAoB,UAC7B,CAYA,SAAgB,kBAAkB,EAAiE,CACjG,GAAI,CAAC,GAAW,OAAO,GAAY,SAAU,OAAO,KAEpD,IAAM,EACJ,WAAY,GACZ,OAAQ,EAAiC,QAAW,UACnD,EAAiC,SAAW,KACxC,EAAgD,OAChD,EAED,EAAgD,CAAC,EACvD,IAAK,GAAM,CAAC,EAAW,KAAc,OAAO,QAAQ,CAAM,EACpD,OAAO,GAAc,UAAY,IACnC,EAAM,GAAa,CAAE,GAAI,CAAqC,GAGlE,OAAO,OAAO,KAAK,CAAK,CAAC,CAAC,OAAS,EAAI,EAAQ,IACjD,CAYA,eAAsB,sBACpB,EACwD,CACxD,GAAI,CAGF,IAAM,EAAS,MAAM,OAAO,EAAc,CAAU,CAAC,CAAC,MAGtD,OAAO,kBAFW,EAAO,SACE,SAAW,EAAO,OACb,CAClC,MAAQ,CACN,OAAO,IACT,CACF,CAGA,EAAU,SAAY,CACpB,GAAI,CAAC,gBAAgB,EAAG,OACxB,IAAM,EAAa,QAAQ,IAAI,wBAC/B,GAAI,CAAC,EAAY,OAEjB,IAAM,EAAQ,MAAM,sBAAsB,CAAU,EAChD,GAGF,EAAkB,CAAC,CAAC,WAAW,CAAK,CAExC,CAAC"}