@tailor-platform/sdk 2.0.0-next.6 → 2.0.0-next.7

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 (60) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/{application-BJXRpQj5.mjs → application-GzW98_Xr.mjs} +199 -172
  3. package/dist/application-GzW98_Xr.mjs.map +1 -0
  4. package/dist/application-OM0taSPn.mjs +3 -0
  5. package/dist/cli/index.mjs +12 -9
  6. package/dist/cli/index.mjs.map +1 -1
  7. package/dist/cli/lib.mjs +2 -2
  8. package/dist/completion/zsh-worker.zsh +1 -1
  9. package/dist/configure/config/types.d.mts +5 -1
  10. package/dist/configure/index.mjs +16 -16
  11. package/dist/configure/index.mjs.map +1 -1
  12. package/dist/configure/services/auth/types.d.mts +18 -23
  13. package/dist/configure/services/executor/operation.d.mts +1 -1
  14. package/dist/configure/services/workflow/job.d.mts +10 -10
  15. package/dist/configure/services/workflow/workflow.d.mts +6 -4
  16. package/dist/{globals-D-YbJKW-.mjs → globals-CBZ0egXT.mjs} +3 -6
  17. package/dist/globals-CBZ0egXT.mjs.map +1 -0
  18. package/dist/{register-ts-hook-DL31O2W9.mjs → register-ts-hook-DvEs6YsL.mjs} +35 -78
  19. package/dist/register-ts-hook-DvEs6YsL.mjs.map +1 -0
  20. package/dist/{registry-CC3CbQiF.mjs → registry-i7EdJ-D5.mjs} +10 -10
  21. package/dist/registry-i7EdJ-D5.mjs.map +1 -0
  22. package/dist/runtime/globals.d.mts +1 -4
  23. package/dist/runtime/index.mjs +1 -1
  24. package/dist/runtime/workflow.d.mts +1 -76
  25. package/dist/runtime/workflow.mjs +1 -1
  26. package/dist/service-BJAQ70e5.mjs +3 -0
  27. package/dist/{service-CnHz9rwz.mjs → service-Dmxa2I4i.mjs} +31 -17
  28. package/dist/service-Dmxa2I4i.mjs.map +1 -0
  29. package/dist/utils/test/index.mjs +11 -11
  30. package/dist/utils/test/index.mjs.map +1 -1
  31. package/dist/utils/test/mock.d.mts +6 -6
  32. package/dist/vitest/environment.mjs +1 -1
  33. package/dist/vitest/index.mjs +67 -99
  34. package/dist/vitest/index.mjs.map +1 -1
  35. package/dist/vitest/mocks/workflow.d.mts +21 -41
  36. package/dist/vitest/setup.mjs +1 -1
  37. package/dist/vitest/workflow-local.d.mts +2 -2
  38. package/dist/workflow-CsBvRE3g.mjs +34 -0
  39. package/dist/workflow-CsBvRE3g.mjs.map +1 -0
  40. package/docs/cli/application.md +2 -0
  41. package/docs/cli/function.md +2 -2
  42. package/docs/cli/tailordb.md +2 -2
  43. package/docs/cli-reference.md +1 -1
  44. package/docs/configuration.md +2 -0
  45. package/docs/github-actions.md +2 -2
  46. package/docs/migration/v2.md +128 -11
  47. package/docs/runtime.md +1 -1
  48. package/docs/services/auth.md +7 -7
  49. package/docs/services/workflow.md +43 -43
  50. package/docs/testing.md +9 -9
  51. package/package.json +2 -2
  52. package/dist/application-BJXRpQj5.mjs.map +0 -1
  53. package/dist/application-BV-AXawv.mjs +0 -3
  54. package/dist/globals-D-YbJKW-.mjs.map +0 -1
  55. package/dist/register-ts-hook-DL31O2W9.mjs.map +0 -1
  56. package/dist/registry-CC3CbQiF.mjs.map +0 -1
  57. package/dist/service-CnHz9rwz.mjs.map +0 -1
  58. package/dist/service-nU6ITOHL.mjs +0 -3
  59. package/dist/workflow-9kHGKxF2.mjs +0 -64
  60. package/dist/workflow-9kHGKxF2.mjs.map +0 -1
@@ -12,9 +12,9 @@ function jobs() {
12
12
  /**
13
13
  * Register a job body keyed by job name. Called as a side effect by
14
14
  * `createWorkflowJob` so `runWorkflowLocally()` can execute dependent job
15
- * bodies when `globalThis.tailor.workflow.triggerJobFunction(name, args)` is invoked.
15
+ * bodies when `globalThis.tailor.workflow.startJobFunction(name, args)` is invoked.
16
16
  *
17
- * In production builds the bundler rewrites `.trigger()` calls so this registry
17
+ * In production builds the bundler rewrites `.start()` calls so this registry
18
18
  * is never read; the gated write is dropped as dead code.
19
19
  * @param name - Job name
20
20
  * @param body - Job body function
@@ -38,17 +38,17 @@ function requirePlatformWorkflow() {
38
38
  if (!workflow) throw new Error("tailor.workflow is not available. Run tests in the `tailor-runtime` Vitest environment and use mockWorkflow(), or use runWorkflowLocally() from @tailor-platform/sdk/vitest for local workflow execution.");
39
39
  return workflow;
40
40
  }
41
- const TRIGGER_DEFAULT = "00000000-0000-4000-8000-000000000000";
42
- function dispatchTriggerJob(name, args, options) {
41
+ const START_DEFAULT = "00000000-0000-4000-8000-000000000000";
42
+ function dispatchStartJob(name, args, options) {
43
43
  const workflow = requirePlatformWorkflow();
44
- return arguments.length >= 3 ? workflow.triggerJobFunction(name, args, options) : workflow.triggerJobFunction(name, args);
44
+ return arguments.length >= 3 ? workflow.startJobFunction(name, args, options) : workflow.startJobFunction(name, args);
45
45
  }
46
- function dispatchTriggerWorkflow(name, args, options) {
46
+ function dispatchStartWorkflow(name, args, options) {
47
47
  const workflow = requirePlatformWorkflow();
48
- if (arguments.length < 3) return workflow.triggerWorkflow(name, args);
49
- return workflow.triggerWorkflow(name, args, options?.invoker === void 0 ? options : { authInvoker: options.invoker });
48
+ if (arguments.length < 3) return workflow.startWorkflow(name, args);
49
+ return workflow.startWorkflow(name, args, options?.invoker === void 0 ? options : { authInvoker: options.invoker });
50
50
  }
51
51
 
52
52
  //#endregion
53
- export { registerJob as a, getRegisteredJob as i, dispatchTriggerJob as n, dispatchTriggerWorkflow as r, TRIGGER_DEFAULT as t };
54
- //# sourceMappingURL=registry-CC3CbQiF.mjs.map
53
+ export { registerJob as a, getRegisteredJob as i, dispatchStartJob as n, dispatchStartWorkflow as r, START_DEFAULT as t };
54
+ //# sourceMappingURL=registry-i7EdJ-D5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-i7EdJ-D5.mjs","names":[],"sources":["../src/configure/services/workflow/registry.ts"],"sourcesContent":["import type { TailorEnv, TailorPrincipal } from \"#/runtime/types\";\nimport type { StartJobFunctionOptions, StartWorkflowOptions } from \"#/runtime/workflow\";\n\n/**\n * Body signature shared by workflow jobs at registry-write time.\n * The user's `createWorkflowJob`/`createWorkflow` body uses concrete types,\n * but the registry erases them for storage.\n */\nexport type RegisteredJobBody = (\n args: unknown,\n context: { env: TailorEnv; invoker: TailorPrincipal | null },\n) => unknown | Promise<unknown>;\n\nconst JOB_REGISTRY_KEY: unique symbol = Symbol.for(\"tailor-platform/sdk:job-registry\");\n\ntype PlatformWorkflow = {\n startWorkflow: (name: string, args?: unknown, options?: StartWorkflowOptions) => Promise<string>;\n startJobFunction: (name: string, args?: unknown, options?: StartJobFunctionOptions) => unknown;\n};\n\ntype GlobalWithRegistry = typeof globalThis & {\n [JOB_REGISTRY_KEY]?: Map<string, RegisteredJobBody>;\n tailor?: { workflow?: PlatformWorkflow };\n};\n\nfunction jobs(): Map<string, RegisteredJobBody> {\n const g = globalThis as GlobalWithRegistry;\n let map = g[JOB_REGISTRY_KEY];\n if (!map) {\n map = new Map();\n g[JOB_REGISTRY_KEY] = map;\n }\n return map;\n}\n\n/**\n * Register a job body keyed by job name. Called as a side effect by\n * `createWorkflowJob` so `runWorkflowLocally()` can execute dependent job\n * bodies when `globalThis.tailor.workflow.startJobFunction(name, args)` is invoked.\n *\n * In production builds the bundler rewrites `.start()` calls so this registry\n * is never read; the gated write is dropped as dead code.\n * @param name - Job name\n * @param body - Job body function\n */\nexport function registerJob(name: string, body: RegisteredJobBody): void {\n jobs().set(name, body);\n}\n\n/**\n * Look up a registered job body by name.\n * @param name - Job name\n * @returns The registered body, or undefined when no job is registered\n */\nexport function getRegisteredJob(name: string): RegisteredJobBody | undefined {\n return jobs().get(name);\n}\n\nfunction currentPlatformWorkflow(): PlatformWorkflow | undefined {\n // globalThis may not have the tailor property at runtime\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n return (globalThis as GlobalWithRegistry).tailor?.workflow;\n}\n\nfunction requirePlatformWorkflow(): PlatformWorkflow {\n const workflow = currentPlatformWorkflow();\n if (!workflow) {\n throw new Error(\n \"tailor.workflow is not available. Run tests in the `tailor-runtime` Vitest environment and use mockWorkflow(), or use runWorkflowLocally() from @tailor-platform/sdk/vitest for local workflow execution.\",\n );\n }\n return workflow;\n}\n\n// A valid placeholder UUID, so callers that validate the execution id behave the\n// same locally as against the platform.\nexport const START_DEFAULT = \"00000000-0000-4000-8000-000000000000\";\n\n// `.start()` routes through the installed `tailor.workflow` shim. Local body\n// execution is intentionally available only through `runWorkflowLocally()`.\n// Preserve arity: the shim sees a 2-argument call when the caller supplied no\n// options, and a 3-argument call otherwise, mirroring the bundler rewrite so\n// mocks observe the same shape in local execution and in bundled workflows.\nexport function dispatchStartJob(\n name: string,\n args?: unknown,\n options?: StartJobFunctionOptions,\n): unknown {\n const workflow = requirePlatformWorkflow();\n // oxlint-disable-next-line prefer-rest-params\n return arguments.length >= 3\n ? workflow.startJobFunction(name, args, options)\n : workflow.startJobFunction(name, args);\n}\n\n// Accepts `unknown` because the SDK-side `.start()` accepts a wider options\n// shape than the platform surface (e.g. `authInvoker` may be a machine-user\n// name string that the bundler normalizes at build time). Local execution\n// forwards the value verbatim; only the bundled path enforces the platform\n// contract.\nexport function dispatchStartWorkflow(\n name: string,\n args?: unknown,\n options?: { invoker?: unknown },\n): Promise<string> {\n const workflow = requirePlatformWorkflow();\n // oxlint-disable-next-line prefer-rest-params\n if (arguments.length < 3) {\n return workflow.startWorkflow(name, args);\n }\n return workflow.startWorkflow(\n name,\n args,\n options?.invoker === undefined\n ? (options as StartWorkflowOptions | undefined)\n : ({ authInvoker: options.invoker } as StartWorkflowOptions),\n );\n}\n"],"mappings":";AAaA,MAAM,mBAAkC,OAAO,IAAI,kCAAkC;AAYrF,SAAS,OAAuC;CAC9C,MAAM,IAAI;CACV,IAAI,MAAM,EAAE;CACZ,IAAI,CAAC,KAAK;EACR,sBAAM,IAAI,IAAI;EACd,EAAE,oBAAoB;CACxB;CACA,OAAO;AACT;;;;;;;;;;;AAYA,SAAgB,YAAY,MAAc,MAA+B;CACvE,KAAK,CAAC,CAAC,IAAI,MAAM,IAAI;AACvB;;;;;;AAOA,SAAgB,iBAAiB,MAA6C;CAC5E,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI;AACxB;AAEA,SAAS,0BAAwD;CAG/D,OAAQ,WAAkC,QAAQ;AACpD;AAEA,SAAS,0BAA4C;CACnD,MAAM,WAAW,wBAAwB;CACzC,IAAI,CAAC,UACH,MAAM,IAAI,MACR,2MACF;CAEF,OAAO;AACT;AAIA,MAAa,gBAAgB;AAO7B,SAAgB,iBACd,MACA,MACA,SACS;CACT,MAAM,WAAW,wBAAwB;CAEzC,OAAO,UAAU,UAAU,IACvB,SAAS,iBAAiB,MAAM,MAAM,OAAO,IAC7C,SAAS,iBAAiB,MAAM,IAAI;AAC1C;AAOA,SAAgB,sBACd,MACA,MACA,SACiB;CACjB,MAAM,WAAW,wBAAwB;CAEzC,IAAI,UAAU,SAAS,GACrB,OAAO,SAAS,cAAc,MAAM,IAAI;CAE1C,OAAO,SAAS,cACd,MACA,MACA,SAAS,YAAY,SAChB,UACA,EAAE,aAAa,QAAQ,QAAQ,CACtC;AACF"}
@@ -1,4 +1,4 @@
1
- import { Invoker, StartWorkflowOptions, TriggerWorkflowOptions } from "./workflow.mjs";
1
+ import { Invoker, StartWorkflowOptions } from "./workflow.mjs";
2
2
  import { ContextInvoker } from "./context.mjs";
3
3
  import { TailorDBFileErrorCode } from "./file.mjs";
4
4
  import { IconvInstance } from "./iconv.mjs";
@@ -16,7 +16,6 @@ type TailorIdpUpdateUserInput = UpdateUserInput;
16
16
  type TailorIdpUser = User;
17
17
  type TailorIdpUserQuery = UserQuery;
18
18
  type TailorWorkflowInvoker = Invoker;
19
- type TailorWorkflowTriggerWorkflowOptions = TriggerWorkflowOptions;
20
19
  type TailorWorkflowStartWorkflowOptions = StartWorkflowOptions;
21
20
  declare global {
22
21
  namespace tailordb {
@@ -44,8 +43,6 @@ declare global {
44
43
  namespace workflow {
45
44
  type Invoker = TailorWorkflowInvoker;
46
45
  type StartWorkflowOptions = TailorWorkflowStartWorkflowOptions;
47
- /** @deprecated Use `StartWorkflowOptions` instead. */
48
- type TriggerWorkflowOptions = TailorWorkflowTriggerWorkflowOptions;
49
46
  }
50
47
  namespace context {
51
48
  type Invoker = ContextInvoker;
@@ -2,7 +2,7 @@ import { t as iconv } from "../iconv-QWaZh0TT.mjs";
2
2
  import { t as secretmanager } from "../secretmanager-CYlpffsz.mjs";
3
3
  import { t as authconnection } from "../authconnection-CZvi9ANm.mjs";
4
4
  import { t as idp } from "../idp-RA_swu-h.mjs";
5
- import { t as workflow } from "../workflow-9kHGKxF2.mjs";
5
+ import { t as workflow } from "../workflow-CsBvRE3g.mjs";
6
6
  import { t as context } from "../context-DYQVYWqZ.mjs";
7
7
  import { t as file } from "../file-BUcmVIH2.mjs";
8
8
  import { t as aigateway } from "../aigateway-DR4Kwuik.mjs";
@@ -5,12 +5,6 @@
5
5
  * Thin typed wrapper around the platform-provided `tailor.workflow` runtime API.
6
6
  * At runtime this delegates to `globalThis.tailor.workflow`. Use `mockWorkflow`
7
7
  * from `@tailor-platform/sdk/vitest` to mock these calls in unit tests.
8
- *
9
- * The canonical names (`startWorkflow`, `startJobFunction`,
10
- * `resumeWorkflowExecution`) mirror the public `tailor.v1` RPC vocabulary.
11
- * The pre-alignment names (`triggerWorkflow`, `triggerJobFunction`,
12
- * `resumeWorkflow`) are kept as frozen aliases that reference the same platform
13
- * implementations, so existing code continues to work unchanged.
14
8
  * @example
15
9
  * import { workflow } from "@tailor-platform/sdk/runtime";
16
10
  *
@@ -31,19 +25,6 @@ interface StartWorkflowOptions {
31
25
  /** Optional authentication invoker to specify which machine user should execute the workflow */
32
26
  authInvoker?: Invoker;
33
27
  }
34
- /**
35
- * Options for the legacy {@link triggerWorkflow} alias, using the SDK-facing
36
- * `invoker` key that {@link triggerWorkflow} converts to `authInvoker` before
37
- * calling the platform.
38
- * @deprecated Use {@link startWorkflow} and {@link StartWorkflowOptions} instead.
39
- */
40
- interface TriggerWorkflowOptions {
41
- /** Optional invoker to specify which machine user should execute the workflow */
42
- invoker?: Invoker;
43
- }
44
- interface PlatformTriggerWorkflowOptions {
45
- authInvoker?: Invoker;
46
- }
47
28
  declare const executionPolicyKeyBrand: unique symbol;
48
29
  /**
49
30
  * A concrete runtime key produced by an execution policy instance — either an
@@ -62,11 +43,6 @@ interface StartJobFunctionOptions {
62
43
  */
63
44
  executionPolicyKey?: ExecutionPolicyKey;
64
45
  }
65
- /**
66
- * Frozen alias for {@link StartJobFunctionOptions}. Kept for backward compatibility.
67
- * @deprecated Use {@link StartJobFunctionOptions} instead.
68
- */
69
- type TriggerJobFunctionOptions = StartJobFunctionOptions;
70
46
  /**
71
47
  * Platform API surface for `tailor.workflow`. Describes the shape the platform
72
48
  * runtime injects on `globalThis.tailor.workflow`.
@@ -74,53 +50,26 @@ type TriggerJobFunctionOptions = StartJobFunctionOptions;
74
50
  interface PlatformWorkflowAPI {
75
51
  /**
76
52
  * Starts a workflow and returns its execution ID.
77
- *
78
- * Canonical name that mirrors the `tailor.v1` RPC vocabulary.
79
- * {@link triggerWorkflow} is a frozen alias that resolves to the same
80
- * platform implementation.
81
53
  * @param workflowName - Workflow name as defined in tailor.config
82
54
  * @param args - Arguments forwarded to the workflow's main job
83
55
  * @param options - Optional start options (e.g. `authInvoker`)
84
56
  * @returns The execution ID of the started workflow
85
57
  */
86
58
  startWorkflow(workflowName: string, args?: any, options?: StartWorkflowOptions): Promise<string>;
87
- /**
88
- * Frozen alias for {@link startWorkflow}. Kept for backward compatibility.
89
- * @deprecated Use {@link startWorkflow} instead.
90
- */
91
- triggerWorkflow(workflowName: string, args?: any, options?: PlatformTriggerWorkflowOptions): Promise<string>;
92
59
  /**
93
60
  * Resumes a failed or pending-retry workflow execution and returns its execution ID.
94
- *
95
- * Canonical name that mirrors the `tailor.v1` RPC vocabulary.
96
- * {@link resumeWorkflow} is a frozen alias that resolves to the same
97
- * platform implementation.
98
61
  * @param executionId - The execution to resume
99
62
  * @returns The execution ID of the resumed workflow
100
63
  */
101
64
  resumeWorkflowExecution(executionId: string): Promise<string>;
102
- /**
103
- * Frozen alias for {@link resumeWorkflowExecution}. Kept for backward compatibility.
104
- * @deprecated Use {@link resumeWorkflowExecution} instead.
105
- */
106
- resumeWorkflow(executionId: string): Promise<string>;
107
65
  /**
108
66
  * Starts a job function and returns its result.
109
- *
110
- * Canonical name that mirrors the `tailor.v1` RPC vocabulary.
111
- * {@link triggerJobFunction} is a frozen alias that resolves to the same
112
- * platform implementation.
113
67
  * @param jobName - Job name as defined in the workflow
114
68
  * @param args - Arguments forwarded to the job
115
69
  * @param options - Optional start options (e.g. `executionPolicyKey`)
116
70
  * @returns The job's return value
117
71
  */
118
72
  startJobFunction(jobName: string, args?: any, options?: StartJobFunctionOptions): any;
119
- /**
120
- * Frozen alias for {@link startJobFunction}. Kept for backward compatibility.
121
- * @deprecated Use {@link startJobFunction} instead.
122
- */
123
- triggerJobFunction(jobName: string, args?: any, options?: TriggerJobFunctionOptions): any;
124
73
  /**
125
74
  * Suspends the current workflow execution and waits for an external signal to resume.
126
75
  * @param key - Wait point key
@@ -137,37 +86,13 @@ interface PlatformWorkflowAPI {
137
86
  */
138
87
  resolve(executionId: string, key: string, callback: (waitPayload: any) => any): Promise<void>;
139
88
  }
140
- /** Runtime wrapper API for workflow and job control. */
141
- interface TailorWorkflowAPI extends Omit<PlatformWorkflowAPI, "triggerWorkflow"> {
142
- /**
143
- * Triggers a workflow and returns its execution ID.
144
- * @param workflowName - Workflow name as defined in tailor.config
145
- * @param args - Arguments forwarded to the workflow's main job
146
- * @param options - Optional SDK trigger options
147
- * @returns The execution ID of the triggered workflow
148
- */
149
- triggerWorkflow(workflowName: string, args?: any, options?: TriggerWorkflowOptions): Promise<string>;
150
- }
151
- /**
152
- * Frozen alias for {@link startWorkflow}. Kept for backward compatibility.
153
- * Converts the SDK-facing `invoker` option to the platform's `authInvoker`.
154
- * @param workflowName - Workflow name as defined in tailor.config
155
- * @param args - Arguments forwarded to the workflow's main job
156
- * @param options - Optional SDK trigger options
157
- * @returns The execution ID of the triggered workflow
158
- * @deprecated Use {@link startWorkflow} instead.
159
- */
160
- declare function triggerWorkflow(workflowName: string, args?: any, options?: TriggerWorkflowOptions): Promise<string>;
161
89
  /** Runtime wrapper namespace for `tailor.workflow`. */
162
90
  declare const workflow: {
163
91
  readonly startWorkflow: (workflowName: string, args?: any, options?: StartWorkflowOptions) => Promise<string>;
164
- readonly triggerWorkflow: typeof triggerWorkflow;
165
92
  readonly resumeWorkflowExecution: (executionId: string) => Promise<string>;
166
- readonly resumeWorkflow: (executionId: string) => Promise<string>;
167
93
  readonly startJobFunction: (jobName: string, args?: any, options?: StartJobFunctionOptions) => any;
168
- readonly triggerJobFunction: (jobName: string, args?: any, options?: TriggerJobFunctionOptions) => any;
169
94
  readonly wait: (key: string, payload?: any) => any;
170
95
  readonly resolve: (executionId: string, key: string, callback: (waitPayload: any) => any) => Promise<void>;
171
96
  };
172
97
  //#endregion
173
- export { ExecutionPolicyKey, Invoker, PlatformTriggerWorkflowOptions, PlatformWorkflowAPI, StartJobFunctionOptions, StartWorkflowOptions, TailorWorkflowAPI, TriggerJobFunctionOptions, TriggerWorkflowOptions, workflow };
98
+ export { ExecutionPolicyKey, Invoker, PlatformWorkflowAPI, StartJobFunctionOptions, StartWorkflowOptions, workflow };
@@ -1,3 +1,3 @@
1
- import { t as workflow } from "../workflow-9kHGKxF2.mjs";
1
+ import { t as workflow } from "../workflow-CsBvRE3g.mjs";
2
2
 
3
3
  export { workflow };
@@ -0,0 +1,3 @@
1
+ import { t as createExecutorService } from "./service-Dmxa2I4i.mjs";
2
+
3
+ export { createExecutorService };
@@ -11,34 +11,48 @@ const functionSchema = z.custom((val) => typeof val === "function");
11
11
  //#endregion
12
12
  //#region src/cli/services/file-loader.ts
13
13
  const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
14
+ const warnedFallbacks = /* @__PURE__ */ new Set();
14
15
  /**
15
16
  * Load files matching the given patterns, excluding files that match ignore patterns.
16
17
  * By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.
17
18
  * @param config - Configuration with files patterns and optional ignores patterns
19
+ * @param baseDir - Directory relative patterns are resolved against
18
20
  * @returns Array of absolute file paths
19
21
  */
20
- function loadFilesWithIgnores(config) {
21
- const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
22
- const ignoreFiles = /* @__PURE__ */ new Set();
23
- for (const ignorePattern of ignorePatterns) {
24
- const absoluteIgnorePattern = path.resolve(process.cwd(), ignorePattern);
25
- try {
26
- fs.globSync(absoluteIgnorePattern).forEach((file) => ignoreFiles.add(file));
27
- } catch (error) {
28
- logger.warn(`Failed to glob ignore pattern "${ignorePattern}": ${String(error)}`);
29
- }
22
+ function loadFilesWithIgnores(config, baseDir) {
23
+ if (config.files.length === 0) return [];
24
+ const resolved = resolveFiles(config, baseDir);
25
+ const allPatternsAbsolute = config.files.every((pattern) => path.isAbsolute(pattern));
26
+ if (resolved.matchedAnyPattern || baseDir === process.cwd() || allPatternsAbsolute) return resolved.files;
27
+ const fallbackKey = `${baseDir}\0${config.files.join("\0")}`;
28
+ if (!warnedFallbacks.has(fallbackKey)) {
29
+ warnedFallbacks.add(fallbackKey);
30
+ logger.warn(`No files matched "${config.files.join(", ")}" relative to "${baseDir}"; falling back to process.cwd(). Update this config's file patterns to be relative to its own directory before v2, when this fallback will be removed.`);
30
31
  }
32
+ return resolveFiles(config, process.cwd()).files;
33
+ }
34
+ function resolveFiles(config, baseDir) {
35
+ const isDefaultIgnores = config.ignores === void 0;
36
+ const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
37
+ const resolvedIgnorePatterns = isDefaultIgnores ? ignorePatterns : ignorePatterns.map((ignorePattern) => path.resolve(baseDir, ignorePattern));
31
38
  const files = [];
39
+ let matchedAnyPattern = false;
32
40
  for (const pattern of config.files) {
33
- const absolutePattern = path.resolve(process.cwd(), pattern);
41
+ const absolutePattern = path.resolve(baseDir, pattern);
34
42
  try {
35
- const filteredFiles = fs.globSync(absolutePattern).filter((file) => !ignoreFiles.has(file));
43
+ const matchedFiles = fs.globSync(absolutePattern);
44
+ if (matchedFiles.length > 0) matchedAnyPattern = true;
45
+ const filteredFiles = matchedFiles.filter((file) => !resolvedIgnorePatterns.some((ignorePattern) => path.matchesGlob(file, ignorePattern)));
36
46
  files.push(...filteredFiles);
37
47
  } catch (error) {
48
+ matchedAnyPattern = true;
38
49
  logger.warn(`Failed to glob pattern "${pattern}": ${String(error)}`);
39
50
  }
40
51
  }
41
- return files;
52
+ return {
53
+ files,
54
+ matchedAnyPattern
55
+ };
42
56
  }
43
57
 
44
58
  //#endregion
@@ -558,7 +572,7 @@ const ValueOperandSchema = z.union([
558
572
  z.array(z.boolean())
559
573
  ]);
560
574
  const MachineUserSchema = z.strictObject({
561
- attributes: z.record(z.string(), ValueOperandSchema).optional(),
575
+ attributes: z.record(z.string(), ValueOperandSchema.nullish()).transform((attributes) => Object.fromEntries(Object.entries(attributes).filter((entry) => entry[1] != null))).optional(),
562
576
  attributeList: z.array(z.uuid()).optional()
563
577
  });
564
578
  const BeforeLoginHookSchema = z.strictObject({
@@ -745,7 +759,7 @@ async function loadExecutor(executorFilePath) {
745
759
  * @returns A new ExecutorService instance
746
760
  */
747
761
  function createExecutorService(params) {
748
- const { config } = params;
762
+ const { config, baseDir } = params;
749
763
  const executors = {};
750
764
  const pluginExecutors = [];
751
765
  let loadPromise;
@@ -778,7 +792,7 @@ function createExecutorService(params) {
778
792
  loadExecutors: async () => {
779
793
  if (!loadPromise) loadPromise = (async () => {
780
794
  if (config.files.length === 0) return;
781
- const executorFiles = loadFilesWithIgnores(config);
795
+ const executorFiles = loadFilesWithIgnores(config, baseDir);
782
796
  logger.newline();
783
797
  logger.log(`Found ${styles.highlight(executorFiles.length.toString())} executor files`);
784
798
  await Promise.all(executorFiles.map((executorFile) => loadExecutorForFile(executorFile)));
@@ -821,4 +835,4 @@ function assertUniqueExecutorNames(executors) {
821
835
 
822
836
  //#endregion
823
837
  export { AuthConfigSchema as a, stripTailorDBTypeBuilderHelpers as c, applyRelationMetadataToFieldConfig as d, buildRelationInfo as f, functionSchema as g, loadFilesWithIgnores as h, ExecutorSchema as i, TailorDBServiceConfigSchema as l, validateRelationConfig as m, loadExecutor as n, AuthInvokerSchema as o, processRelationMetadata as p, stripExecutorTriggerArgs as r, TailorFieldSchema as s, createExecutorService as t, TailorDBTypeSchema as u };
824
- //# sourceMappingURL=service-CnHz9rwz.mjs.map
838
+ //# sourceMappingURL=service-Dmxa2I4i.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-Dmxa2I4i.mjs","names":["TailorFieldTypeSchema","AllowedValueSchema"],"sources":["../src/parser/service/common.ts","../src/cli/services/file-loader.ts","../src/parser/service/tailordb/relation.ts","../src/parser/service/tailordb/schema.ts","../src/parser/service/tailordb/builder-helpers.ts","../src/parser/service/auth-connection/schema.ts","../src/parser/service/field/schema.ts","../src/parser/service/auth/schema.ts","../src/parser/service/executor/schema.ts","../src/cli/services/executor/loader.ts","../src/cli/services/executor/service.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// Use `z.custom` instead of `z.function`, since `z.function` changes `toString` representation.\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const functionSchema: z.ZodType<Function, Function> = z.custom<Function>(\n (val) => typeof val === \"function\",\n);\n","import * as fs from \"node:fs\";\nimport * as path from \"pathe\";\nimport { logger } from \"#/cli/shared/logger\";\n\nexport interface FileLoadConfig {\n files: string[];\n ignores?: string[];\n}\n\nconst DEFAULT_IGNORE_PATTERNS = [\"**/*.test.ts\", \"**/*.spec.ts\"];\n\n// loadFilesWithIgnores is called once per service/bundler, so a single\n// generate/apply run can call it multiple times for the same baseDir (once\n// per resolver/executor/tailordb/etc. config sharing that directory). Track\n// which (baseDir, patterns) pairs have already warned so each one only warns\n// once per run — keyed by patterns too, since different services sharing a\n// baseDir can have different `files` patterns each needing their own warning.\nconst warnedFallbacks = new Set<string>();\n\n/**\n * Load files matching the given patterns, excluding files that match ignore patterns.\n * By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.\n * @param config - Configuration with files patterns and optional ignores patterns\n * @param baseDir - Directory relative patterns are resolved against\n * @returns Array of absolute file paths\n */\nexport function loadFilesWithIgnores(config: FileLoadConfig, baseDir: string): string[] {\n if (config.files.length === 0) {\n return [];\n }\n\n const resolved = resolveFiles(config, baseDir);\n const allPatternsAbsolute = config.files.every((pattern) => path.isAbsolute(pattern));\n if (resolved.matchedAnyPattern || baseDir === process.cwd() || allPatternsAbsolute) {\n return resolved.files;\n }\n\n // v1 compatibility fallback: pre-existing configs may have relative\n // patterns written against the invocation cwd rather than baseDir. Only\n // triggers when baseDir's patterns matched nothing at all (not merely\n // \"matched, but every hit got filtered out by ignores\") — otherwise this\n // fallback would reintroduce the same cross-app file bleed this baseDir\n // resolution is meant to prevent. Also skipped when every pattern is\n // already absolute, since baseDir can't change an absolute pattern's\n // resolution — re-running against cwd would just repeat the same glob.\n // Remove this fallback in v2, once such configs are expected to have\n // migrated.\n const fallbackKey = `${baseDir}\\0${config.files.join(\"\\0\")}`;\n if (!warnedFallbacks.has(fallbackKey)) {\n warnedFallbacks.add(fallbackKey);\n logger.warn(\n `No files matched \"${config.files.join(\", \")}\" relative to \"${baseDir}\"; falling back to ` +\n `process.cwd(). Update this config's file patterns to be relative to its own directory ` +\n `before v2, when this fallback will be removed.`,\n );\n }\n return resolveFiles(config, process.cwd()).files;\n}\n\ninterface ResolvedFiles {\n files: string[];\n /** Whether any `files` pattern matched anything under baseDir, before ignore filtering. */\n matchedAnyPattern: boolean;\n}\n\nfunction resolveFiles(config: FileLoadConfig, baseDir: string): ResolvedFiles {\n // Use user-provided patterns if specified, otherwise use defaults. Default\n // patterns are left unanchored (\"**/*.test.ts\") so they match a test file\n // regardless of which directory a `files` pattern's matches actually came\n // from — this matters when a pattern is absolute or otherwise escapes\n // baseDir. User-provided patterns are baseDir-relative, matching `files`.\n const isDefaultIgnores = config.ignores === undefined;\n const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;\n const resolvedIgnorePatterns = isDefaultIgnores\n ? ignorePatterns\n : ignorePatterns.map((ignorePattern) => path.resolve(baseDir, ignorePattern));\n\n const files: string[] = [];\n let matchedAnyPattern = false;\n for (const pattern of config.files) {\n const absolutePattern = path.resolve(baseDir, pattern);\n try {\n const matchedFiles = fs.globSync(absolutePattern);\n if (matchedFiles.length > 0) {\n matchedAnyPattern = true;\n }\n // Filter out ignored files\n const filteredFiles = matchedFiles.filter(\n (file) =>\n !resolvedIgnorePatterns.some((ignorePattern) => path.matchesGlob(file, ignorePattern)),\n );\n files.push(...filteredFiles);\n } catch (error) {\n // A glob failure means we don't know whether baseDir has matching\n // files, not that it has none — treat it as a match so it can't\n // trigger the v1 compatibility fallback below.\n matchedAnyPattern = true;\n logger.warn(`Failed to glob pattern \"${pattern}\": ${String(error)}`);\n }\n }\n\n return { files, matchedAnyPattern };\n}\n","import type { RawRelationConfig } from \"#/configure/services/tailordb/types\";\nimport type { OperatorFieldConfig } from \"#/parser/service/tailordb/types\";\nimport type { UnionToTuple } from \"type-fest\";\n\nconst relationTypes = {\n \"1-1\": \"1-1\",\n oneToOne: \"1-1\",\n \"n-1\": \"n-1\",\n manyToOne: \"n-1\",\n \"N-1\": \"n-1\",\n keyOnly: \"keyOnly\",\n} as const;\nexport const relationTypesKeys = Object.keys(relationTypes) as UnionToTuple<\n keyof typeof relationTypes\n>;\n\nexport interface RelationProcessingContext {\n typeName: string;\n fieldName: string;\n allTypeNames: Set<string>;\n}\n\nexport interface ProcessedRelationMetadata {\n index: boolean;\n foreignKey: boolean;\n relationType: string;\n unique: boolean;\n foreignKeyType: string;\n foreignKeyField: string;\n}\n\nexport interface RelationInfo {\n targetType: string;\n forwardName: string;\n backwardName: string;\n key: string;\n unique: boolean;\n}\n\nfunction fieldRef(context: RelationProcessingContext): string {\n return `Field \"${context.fieldName}\" on type \"${context.typeName}\"`;\n}\n\n/**\n * Validate relation configuration.\n * @param rawRelation - Raw relation configuration from TailorDB type definition\n * @param context - Context information for the relation (type name, field name, all type names)\n */\nexport function validateRelationConfig(\n rawRelation: RawRelationConfig,\n context: RelationProcessingContext,\n): void {\n // raw user config may omit the field\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (!rawRelation.type) {\n throw new Error(\n `${fieldRef(context)} has a relation but is missing the required 'type' property. ` +\n `Valid values: ${relationTypesKeys.join(\", \")}.`,\n );\n }\n if (!(rawRelation.type in relationTypes)) {\n throw new Error(\n `${fieldRef(context)} has invalid relation type '${rawRelation.type}'. ` +\n `Valid values: ${relationTypesKeys.join(\", \")}.`,\n );\n }\n\n // Validate target type exists (for non-self relations)\n if (rawRelation.toward.type !== \"self\" && !context.allTypeNames.has(rawRelation.toward.type)) {\n throw new Error(`${fieldRef(context)} references unknown type \"${rawRelation.toward.type}\".`);\n }\n}\n\n/**\n * Process raw relation config and compute derived metadata values.\n * @param rawRelation - Raw relation configuration\n * @param context - Context information for the relation\n * @param isArrayField - Whether the target field is an array field\n * @returns Computed relation metadata to apply to field config\n */\nexport function processRelationMetadata(\n rawRelation: RawRelationConfig,\n context: RelationProcessingContext,\n isArrayField: boolean = false,\n): ProcessedRelationMetadata {\n const isUnique = relationTypes[rawRelation.type] === \"1-1\";\n const key = rawRelation.toward.key ?? \"id\";\n\n // Resolve target type name (handle \"self\" reference)\n const targetTypeName =\n rawRelation.toward.type === \"self\" ? context.typeName : rawRelation.toward.type;\n\n // Index and unique are not supported on array fields\n const shouldSetIndex = !isArrayField;\n const shouldSetUnique = !isArrayField && isUnique;\n\n return {\n index: shouldSetIndex,\n foreignKey: true,\n relationType: rawRelation.type,\n unique: shouldSetUnique,\n foreignKeyType: targetTypeName,\n foreignKeyField: key,\n };\n}\n\n/**\n * Build relation info for creating forward/backward relationships.\n * Returns undefined for keyOnly relations.\n * @param rawRelation - Raw relation configuration\n * @param context - Context information for the relation\n * @returns Relation information or undefined for keyOnly relations\n */\nexport function buildRelationInfo(\n rawRelation: RawRelationConfig,\n context: RelationProcessingContext,\n): RelationInfo | undefined {\n // keyOnly relations don't create forward/backward relationships\n if (rawRelation.type === \"keyOnly\") {\n return undefined;\n }\n\n const isUnique = relationTypes[rawRelation.type] === \"1-1\";\n const key = rawRelation.toward.key ?? \"id\";\n\n // Resolve target type name (handle \"self\" reference)\n const targetTypeName =\n rawRelation.toward.type === \"self\" ? context.typeName : rawRelation.toward.type;\n\n let forwardName = rawRelation.toward.as;\n if (!forwardName) {\n forwardName = context.fieldName.replace(/(ID|Id|id)$/u, \"\");\n }\n\n return {\n targetType: targetTypeName,\n forwardName,\n backwardName: rawRelation.backward ?? \"\",\n key,\n unique: isUnique,\n };\n}\n\n/**\n * Apply processed relation metadata to field config.\n * @param fieldConfig - Original operator field configuration\n * @param metadata - Processed relation metadata to apply\n * @returns Field config with relation metadata applied\n */\nexport function applyRelationMetadataToFieldConfig(\n fieldConfig: OperatorFieldConfig,\n metadata: ProcessedRelationMetadata,\n): OperatorFieldConfig {\n return {\n ...fieldConfig,\n index: metadata.index,\n foreignKey: metadata.foreignKey,\n unique: metadata.unique,\n foreignKeyType: metadata.foreignKeyType,\n foreignKeyField: metadata.foreignKeyField,\n };\n}\n","import { z } from \"zod\";\nimport { functionSchema } from \"../common\";\nimport { relationTypesKeys } from \"./relation\";\nimport type { TailorDBFieldOutput } from \"#/parser/service/tailordb/types\";\n\n/**\n * Normalize GqlOperationsConfig (alias or object) to GqlOperations object.\n * \"query\" alias expands to read-only mode: { create: false, update: false, delete: false, read: true }\n * @param config - The config to normalize\n * @returns The normalized GqlOperations object\n */\nfunction normalizeGqlOperations(\n config: \"query\" | { create?: boolean; update?: boolean; delete?: boolean; read?: boolean },\n) {\n if (config === \"query\") {\n return { create: false, update: false, delete: false, read: true };\n }\n return config;\n}\n\n/**\n * Zod schema for GqlOperations configuration with normalization transform.\n * Accepts \"query\" alias or detailed object, normalizes to GqlOperations object.\n */\nexport const GqlOperationsSchema = z\n .union([\n z.literal(\"query\"),\n z.strictObject({\n create: z.boolean().optional().describe(\"Enable create mutation (default: true)\"),\n update: z.boolean().optional().describe(\"Enable update mutation (default: true)\"),\n delete: z.boolean().optional().describe(\"Enable delete mutation (default: true)\"),\n read: z\n .boolean()\n .optional()\n .describe(\"Enable read queries - get, list, aggregation (default: true)\"),\n }),\n ])\n .describe(\n \"Configuration for GraphQL operations on a TailorDB type.\\nAll operations are enabled by default (undefined or true = enabled, false = disabled).\",\n )\n .transform((val) => normalizeGqlOperations(val));\n\nconst TailorFieldTypeSchema = z.enum([\n \"uuid\",\n \"string\",\n \"boolean\",\n \"integer\",\n \"float\",\n \"decimal\",\n \"enum\",\n \"date\",\n \"datetime\",\n \"time\",\n \"nested\",\n]);\n\nconst AllowedValueSchema = z.strictObject({\n value: z.string(),\n description: z.string().optional(),\n});\n\nexport const DBFieldMetadataSchema = z.strictObject({\n required: z.boolean().optional().describe(\"Whether the field is required\"),\n array: z.boolean().optional().describe(\"Whether the field is an array\"),\n description: z.string().optional().describe(\"Field description\"),\n typeName: z.string().optional().describe(\"Type name for nested or enum fields\"),\n allowedValues: z.array(AllowedValueSchema).optional().describe(\"Allowed values for enum fields\"),\n index: z.boolean().optional().describe(\"Whether the field is indexed for faster queries\"),\n unique: z.boolean().optional().describe(\"Whether the field value must be unique\"),\n vector: z\n .boolean()\n .optional()\n .describe(\"Whether the field is a vector field for similarity search\"),\n foreignKey: z.boolean().optional().describe(\"Whether the field is a foreign key\"),\n foreignKeyType: z.string().optional().describe(\"Target type name for foreign key relations\"),\n foreignKeyField: z.string().optional().describe(\"Target field name for foreign key relations\"),\n hooks: z\n .strictObject({\n create: functionSchema.optional().describe(\"Hook function called on record creation\"),\n update: functionSchema.optional().describe(\"Hook function called on record update\"),\n })\n .optional()\n .describe(\"Lifecycle hooks for the field\"),\n validate: z.array(functionSchema).optional().describe(\"Validation functions for the field\"),\n serial: z\n .strictObject({\n start: z.number().describe(\"Starting value for the serial sequence\"),\n maxValue: z.number().optional().describe(\"Maximum value for the serial sequence\"),\n format: z.string().optional().describe(\"Format string for serial value (string type only)\"),\n })\n .optional()\n .describe(\"Serial (auto-increment) configuration\"),\n scale: z\n .number()\n .int()\n .min(0)\n .max(12)\n .optional()\n .describe(\"Decimal scale (number of digits after decimal point, 0-12)\"),\n default: z.unknown().optional().describe(\"Default value for the field on create\"),\n});\n\nconst RelationTypeSchema = z.enum(relationTypesKeys);\n\nexport const RawRelationConfigSchema = z.strictObject({\n type: RelationTypeSchema.describe(\"Relation cardinality type\"),\n toward: z.strictObject({\n type: z.string().describe(\"Target type name, or 'self' for self-relations\"),\n as: z.string().optional().describe(\"Custom forward relation name\"),\n key: z.string().optional().describe(\"Target field to join on (default: 'id')\"),\n }),\n backward: z.string().optional().describe(\"Backward relation name on the target type\"),\n});\n\nconst TailorDBFieldSchema: z.ZodType<TailorDBFieldOutput> = z.lazy(() =>\n // strip unknown keys\n z.object({\n type: TailorFieldTypeSchema,\n fields: z.record(z.string(), TailorDBFieldSchema).optional(),\n metadata: DBFieldMetadataSchema,\n rawRelation: RawRelationConfigSchema.optional(),\n }),\n);\n\n/**\n * Schema for TailorDB type settings.\n * Normalizes gqlOperations from alias (\"query\") to object format.\n */\nexport const TailorDBTypeSettingsSchema = z.strictObject({\n pluralForm: z.string().optional().describe(\"Custom plural form of the type name for GraphQL\"),\n aggregation: z.boolean().optional().describe(\"Enable aggregation queries for this type\"),\n bulkUpsert: z.boolean().optional().describe(\"Enable bulk upsert mutation for this type\"),\n gqlOperations: GqlOperationsSchema.optional().describe(\n 'Configure GraphQL operations for this type. Use \"query\" for read-only mode, or an object for granular control.',\n ),\n publishEvents: z\n .boolean()\n .optional()\n .describe(\n \"Enable publishing events for this type.\\nWhen enabled, record creation/update/deletion events are published.\\nIf not specified, this is automatically set to true when an executor uses this type\\nwith recordCreated/recordUpdated/recordDeleted triggers. If explicitly set to false\\nwhile an executor uses this type, an error will be thrown during apply.\",\n ),\n});\n\nexport const GQL_PERMISSION_INVALID_OPERAND_MESSAGE =\n \"operand is not supported in gqlPermission. Use permission() for record-level conditions.\";\n\nconst GqlPermissionOperandSchema = z.union(\n [\n z.strictObject({ user: z.string() }),\n z.string(),\n z.boolean(),\n z.array(z.string()),\n z.array(z.boolean()),\n ],\n {\n error: (issue) => {\n if (typeof issue.input === \"object\" && issue.input !== null) {\n const keys = Object.keys(issue.input);\n if (keys.length === 1) {\n return `\"${keys[0]}\" ${GQL_PERMISSION_INVALID_OPERAND_MESSAGE}`;\n }\n return \"Operand object must have exactly 1 key\";\n }\n return \"Invalid operand in gqlPermission\";\n },\n },\n);\n\nconst RecordPermissionOperandSchema = z.union([\n GqlPermissionOperandSchema,\n z.strictObject({ record: z.string() }),\n z.strictObject({ oldRecord: z.string() }),\n z.strictObject({ newRecord: z.string() }),\n]);\n\nconst PermissionOperatorSchema = z.enum([\"=\", \"!=\", \"in\", \"not in\", \"hasAny\", \"not hasAny\"]);\n\nconst RecordPermissionConditionSchema = z\n .tuple([RecordPermissionOperandSchema, PermissionOperatorSchema, RecordPermissionOperandSchema])\n .readonly();\n\nconst GqlPermissionConditionSchema = z\n .tuple([GqlPermissionOperandSchema, PermissionOperatorSchema, GqlPermissionOperandSchema])\n .readonly();\n\nconst ActionPermissionSchema = z.union([\n // Object format: { conditions, description?, permit? }\n z.strictObject({\n conditions: z.union([\n RecordPermissionConditionSchema,\n z.array(RecordPermissionConditionSchema).readonly(),\n ]),\n description: z.string().optional(),\n permit: z.boolean().optional(),\n }),\n // Single condition tuple: [operand, operator, operand]\n z\n .tuple([RecordPermissionOperandSchema, PermissionOperatorSchema, RecordPermissionOperandSchema])\n .readonly(),\n // Single condition tuple with permit: [operand, operator, operand, permit]\n z\n .tuple([\n RecordPermissionOperandSchema,\n PermissionOperatorSchema,\n RecordPermissionOperandSchema,\n z.boolean(),\n ])\n .readonly(),\n // Multiple conditions with optional trailing permit\n z\n .array(z.union([RecordPermissionConditionSchema, z.boolean()]))\n .refine(\n (arr) => {\n const boolIndex = arr.findIndex((item) => typeof item === \"boolean\");\n return boolIndex === -1 || boolIndex === arr.length - 1;\n },\n { message: \"Boolean permit flag must only appear at the end\" },\n )\n .readonly(),\n]);\n\nconst GqlPermissionActionSchema = z.enum([\n \"read\",\n \"create\",\n \"update\",\n \"delete\",\n \"aggregate\",\n \"bulkUpsert\",\n]);\n\nconst GqlPermissionPolicySchema = z.strictObject({\n conditions: z.array(GqlPermissionConditionSchema).readonly(),\n actions: z.union([z.literal(\"all\"), z.array(GqlPermissionActionSchema).readonly()]),\n permit: z.boolean().optional(),\n description: z.string().optional(),\n});\n\nexport const RawPermissionsSchema = z.strictObject({\n record: z\n .strictObject({\n create: z.array(ActionPermissionSchema).readonly(),\n read: z.array(ActionPermissionSchema).readonly(),\n update: z.array(ActionPermissionSchema).readonly(),\n delete: z.array(ActionPermissionSchema).readonly(),\n })\n .optional(),\n gql: z.array(GqlPermissionPolicySchema).readonly().optional(),\n});\n\nexport const TailorDBTypeSchema = z.strictObject({\n name: z.string(),\n fields: z.record(z.string(), TailorDBFieldSchema),\n // oxlint-disable-next-line zod/prefer-strict-object, tailor-zod/require-object-policy-comment -- Keep z.object().strict() so zinfer preserves the RawPermissions alias in generated types.\n metadata: z\n .object({\n name: z.string(),\n description: z.string().optional(),\n settings: TailorDBTypeSettingsSchema.optional(),\n permissions: RawPermissionsSchema,\n files: z.record(z.string(), z.string()),\n indexes: z\n .record(\n z.string(),\n z.strictObject({\n fields: z.array(z.string()),\n unique: z.boolean().optional(),\n }),\n )\n .optional(),\n typeHook: z\n .strictObject({\n create: functionSchema.optional(),\n update: functionSchema.optional(),\n })\n .optional(),\n typeValidate: functionSchema.optional(),\n })\n .strict(),\n});\n\nconst TailorDBMigrationConfigSchema = z.strictObject({\n directory: z.string().describe(\"Directory containing migration files\"),\n machineUser: z.string().optional().describe(\"Machine user name for migration execution\"),\n});\n\n/**\n * Schema for TailorDB service configuration.\n * Normalizes gqlOperations from alias (\"query\") to object format.\n */\nexport const TailorDBServiceConfigSchema = z.strictObject({\n files: z.array(z.string()).describe(\"Glob patterns for TailorDB type definition files\"),\n ignores: z.array(z.string()).optional().describe(\"Glob patterns to exclude from type discovery\"),\n erdSite: z.string().optional().describe(\"URL for the ERD (Entity Relationship Diagram) site\"),\n migration: TailorDBMigrationConfigSchema.optional().describe(\"Migration configuration\"),\n gqlOperations: GqlOperationsSchema.optional().describe(\n \"Default GraphQL operations for all types in this service\",\n ),\n});\n","import { isSdkBranded } from \"#/utils/brand\";\nimport { TailorDBTypeSchema } from \"./schema\";\n\nconst TAILORDB_TYPE_SCHEMA_KEYS = TailorDBTypeSchema.keyof().options;\n\nexport function stripTailorDBTypeBuilderHelpers(type: unknown): unknown {\n if (!isSdkBranded(type, \"tailordb-type\")) {\n return type;\n }\n\n const config: Record<string, unknown> = {};\n const input = type as Record<string, unknown>;\n for (const key of TAILORDB_TYPE_SCHEMA_KEYS) {\n if (Object.prototype.hasOwnProperty.call(input, key)) {\n config[key] = input[key];\n }\n }\n return config;\n}\n","import { z } from \"zod\";\n\nexport const AuthConnectionOAuth2ConfigSchema = z.strictObject({\n providerUrl: z.string().describe(\"OAuth2 provider URL\"),\n issuerUrl: z.string().describe(\"OAuth2 issuer URL\"),\n clientId: z.string().describe(\"OAuth2 client ID\"),\n clientSecret: z.string().describe(\"OAuth2 client secret\"),\n authUrl: z.string().optional().describe(\"OAuth2 authorization endpoint override\"),\n tokenUrl: z.string().optional().describe(\"OAuth2 token endpoint override\"),\n});\n\nexport const AuthConnectionConfigSchema = AuthConnectionOAuth2ConfigSchema.extend({\n type: z.literal(\"oauth2\").describe(\"Connection type\"),\n});\n","import { z } from \"zod\";\nimport { functionSchema } from \"../common\";\n\nconst TailorFieldTypeSchema = z.enum([\n \"uuid\",\n \"string\",\n \"boolean\",\n \"integer\",\n \"float\",\n \"decimal\",\n \"enum\",\n \"date\",\n \"datetime\",\n \"time\",\n \"nested\",\n]);\n\nconst AllowedValueSchema = z.strictObject({\n value: z.string().describe(\"The allowed value\"),\n description: z.string().optional().describe(\"Description of the allowed value\"),\n});\n\nconst FieldMetadataSchema = z.strictObject({\n required: z.boolean().optional().describe(\"Whether the field is required\"),\n array: z.boolean().optional().describe(\"Whether the field is an array\"),\n description: z.string().optional().describe(\"Field description\"),\n allowedValues: z.array(AllowedValueSchema).optional().describe(\"Allowed values for enum fields\"),\n hooks: z\n .strictObject({\n create: functionSchema.optional().describe(\"Hook function called on creation\"),\n update: functionSchema.optional().describe(\"Hook function called on update\"),\n })\n .optional()\n .describe(\"Lifecycle hooks\"),\n validate: z.array(functionSchema).optional().describe(\"Validation functions for the field\"),\n typeName: z.string().optional().describe(\"Type name for nested or enum fields\"),\n default: z.unknown().optional().describe(\"Default value for the field on create\"),\n});\n\n// strip unknown keys\nexport const TailorFieldSchema = z.object({\n type: TailorFieldTypeSchema.describe(\"Field data type\"),\n metadata: FieldMetadataSchema.describe(\"Field metadata configuration\"),\n get fields() {\n return z.record(z.string(), TailorFieldSchema);\n },\n});\n","import { z } from \"zod\";\nimport { AuthConnectionConfigSchema } from \"#/parser/service/auth-connection/index\";\nimport { TailorFieldSchema } from \"#/parser/service/field/schema\";\nimport { stripTailorDBTypeBuilderHelpers } from \"#/parser/service/tailordb/builder-helpers\";\nimport { TailorDBTypeSchema } from \"#/parser/service/tailordb/index\";\nimport type { ValueOperand } from \"#/configure/services/auth/types\";\nimport type { TailorDBInstance } from \"#/configure/services/tailordb/types\";\n\nexport const AuthInvokerObjectSchema = z.strictObject({\n namespace: z.string().describe(\"Auth namespace\"),\n machineUserName: z.string().describe(\"Machine user name for authentication\"),\n});\n\nexport const AuthInvokerSchema = z.union([\n z.string().describe(\"Machine user name (namespace auto-resolved from auth service)\"),\n AuthInvokerObjectSchema,\n]);\n\nconst secretValueSchema = z.strictObject({\n vaultName: z.string().describe(\"Vault name containing the secret\"),\n secretKey: z.string().describe(\"Key of the secret in the vault\"),\n});\n\nexport const OIDCSchema = z.strictObject({\n name: z.string().describe(\"Identity provider name\"),\n kind: z.literal(\"OIDC\"),\n clientID: z.string().describe(\"OAuth2 client ID\"),\n clientSecret: secretValueSchema.describe(\"OAuth2 client secret\"),\n providerURL: z.string().describe(\"OIDC provider URL\"),\n issuerURL: z.string().optional().describe(\"OIDC issuer URL (defaults to providerURL)\"),\n usernameClaim: z.string().optional().describe(\"JWT claim to use as username\"),\n});\n\nexport const SAMLSchema = z\n .strictObject({\n name: z.string().describe(\"Identity provider name\"),\n kind: z.literal(\"SAML\"),\n enableSignRequest: z.boolean().default(false).describe(\"Enable signing of SAML requests\"),\n metadataURL: z\n .string()\n .optional()\n .describe(\"URL to fetch SAML metadata (mutually exclusive with rawMetadata)\"),\n rawMetadata: z\n .string()\n .optional()\n .describe(\"Raw SAML metadata XML (mutually exclusive with metadataURL)\"),\n defaultRedirectURL: z\n .string()\n .optional()\n .describe(\"URL to redirect to when SAML ACS receives a response with an empty RelayState.\"),\n })\n\n .refine((value) => {\n const hasMetadata = value.metadataURL !== undefined;\n const hasRaw = value.rawMetadata !== undefined;\n return hasMetadata !== hasRaw;\n }, \"Provide either metadataURL or rawMetadata\");\n\nexport const IDTokenSchema = z.strictObject({\n name: z.string().describe(\"Identity provider name\"),\n kind: z.literal(\"IDToken\"),\n providerURL: z.string().describe(\"ID token provider URL\"),\n issuerURL: z.string().optional().describe(\"ID token issuer URL\"),\n clientID: z.string().describe(\"Client ID for ID token validation\"),\n usernameClaim: z.string().optional().describe(\"JWT claim to use as username\"),\n});\n\nexport const BuiltinIdPSchema = z.strictObject({\n name: z.string().describe(\"Identity provider name\"),\n kind: z.literal(\"BuiltInIdP\"),\n namespace: z.string().describe(\"IdP namespace\"),\n clientName: z.string().describe(\"OAuth2 client name in the IdP\"),\n});\n\nexport const IdProviderSchema = z.discriminatedUnion(\"kind\", [\n OIDCSchema,\n SAMLSchema,\n IDTokenSchema,\n BuiltinIdPSchema,\n]);\n\nexport const OAuth2ClientGrantTypeSchema = z\n .union([z.literal(\"authorization_code\"), z.literal(\"refresh_token\")])\n .describe(\"OAuth2 grant type\");\n\nexport const OAuth2ClientSchema = z\n .strictObject({\n description: z.string().optional().describe(\"Client description\"),\n grantTypes: z\n .array(OAuth2ClientGrantTypeSchema)\n .default([\"authorization_code\", \"refresh_token\"])\n .describe(\"Allowed OAuth2 grant types\"),\n redirectURIs: z\n .array(\n z.union([\n z.templateLiteral([\"https://\", z.string()]),\n z.templateLiteral([\"http://\", z.string()]),\n z.templateLiteral([z.string(), \":url\"]),\n z.templateLiteral([z.string(), \":url/\", z.string()]),\n ]),\n )\n .describe(\"Allowed redirect URIs\"),\n clientType: z\n .union([z.literal(\"confidential\"), z.literal(\"public\"), z.literal(\"browser\")])\n .optional()\n .describe(\"OAuth2 client type\"),\n accessTokenLifetimeSeconds: z\n .number()\n .int()\n .min(60, \"Minimum access token lifetime is 60 seconds\")\n .max(86400, \"Maximum access token lifetime is 1 day (86400 seconds)\")\n .optional()\n .describe(\"Access token lifetime in seconds (60-86400)\")\n .transform((val) => (val ? { seconds: BigInt(val), nanos: 0 } : undefined)),\n refreshTokenLifetimeSeconds: z\n .number()\n .int()\n .min(60, \"Minimum refresh token lifetime is 60 seconds\")\n .max(604800, \"Maximum refresh token lifetime is 7 days (604800 seconds)\")\n .optional()\n .describe(\"Refresh token lifetime in seconds (60-604800)\")\n .transform((val) => (val ? { seconds: BigInt(val), nanos: 0 } : undefined)),\n requireDpop: z\n .boolean()\n .optional()\n .describe(\"Require DPoP (Demonstrating Proof-of-Possession) for token requests\"),\n })\n\n .refine((data) => !(data.clientType === \"browser\" && data.requireDpop === true), {\n message: \"requireDpop cannot be set to true for browser clients as they don't support DPoP\",\n path: [\"requireDpop\"],\n });\n\nexport const SCIMAuthorizationSchema = z.strictObject({\n type: z.union([z.literal(\"oauth2\"), z.literal(\"bearer\")]).describe(\"SCIM authorization type\"),\n bearerSecret: secretValueSchema\n .optional()\n .describe(\"Bearer token secret (required for bearer type)\"),\n});\n\nexport const SCIMAttributeTypeSchema = z\n .union([\n z.literal(\"string\"),\n z.literal(\"number\"),\n z.literal(\"boolean\"),\n z.literal(\"datetime\"),\n z.literal(\"complex\"),\n ])\n .describe(\"SCIM attribute data type\");\n\nexport const SCIMAttributeSchema = z.strictObject({\n type: SCIMAttributeTypeSchema.describe(\"Attribute data type\"),\n name: z.string().describe(\"Attribute name\"),\n description: z.string().optional().describe(\"Attribute description\"),\n mutability: z\n .union([z.literal(\"readOnly\"), z.literal(\"readWrite\"), z.literal(\"writeOnly\")])\n .optional()\n .describe(\"Attribute mutability\"),\n required: z.boolean().optional().describe(\"Whether the attribute is required\"),\n multiValued: z.boolean().optional().describe(\"Whether the attribute can have multiple values\"),\n uniqueness: z\n .union([z.literal(\"none\"), z.literal(\"server\"), z.literal(\"global\")])\n .optional()\n .describe(\"Uniqueness constraint\"),\n canonicalValues: z.array(z.string()).nullable().optional().describe(\"List of canonical values\"),\n get subAttributes() {\n return z.array(SCIMAttributeSchema).nullable().optional();\n },\n});\n\nconst SCIMSchemaSchema = z.strictObject({\n name: z.string().describe(\"SCIM schema name\"),\n attributes: z.array(SCIMAttributeSchema).describe(\"Schema attributes\"),\n});\n\nexport const SCIMAttributeMappingSchema = z.strictObject({\n tailorDBField: z.string().describe(\"TailorDB field name to map to\"),\n scimPath: z.string().describe(\"SCIM attribute path\"),\n});\n\nexport const SCIMResourceSchema = z.strictObject({\n name: z.string().describe(\"SCIM resource name\"),\n tailorDBNamespace: z.string().describe(\"TailorDB namespace for the resource\"),\n tailorDBType: z.string().describe(\"TailorDB type name for the resource\"),\n coreSchema: SCIMSchemaSchema.describe(\"Core SCIM schema definition\"),\n attributeMapping: z.array(SCIMAttributeMappingSchema).describe(\"Attribute mapping configuration\"),\n});\n\nexport const SCIMSchema = z.strictObject({\n machineUserName: z.string().describe(\"Machine user name for SCIM operations\"),\n authorization: SCIMAuthorizationSchema.describe(\"SCIM authorization configuration\"),\n resources: z.array(SCIMResourceSchema).describe(\"SCIM resource definitions\"),\n});\n\nexport const TenantProviderSchema = z.strictObject({\n namespace: z.string().describe(\"TailorDB namespace for the tenant type\"),\n type: z.string().describe(\"TailorDB type name for tenants\"),\n signatureField: z.string().describe(\"Field used as the tenant signature\"),\n});\n\nconst UserProfileSchema = z.strictObject({\n namespace: z.string().optional().describe(\"TailorDB namespace where the user type is defined\"),\n type: z\n .custom<TailorDBInstance>()\n .transform(stripTailorDBTypeBuilderHelpers)\n .pipe(TailorDBTypeSchema),\n usernameField: z.string(),\n attributes: z.record(z.string(), z.literal(true)).optional(),\n attributeList: z.array(z.string()).optional(),\n});\n\nconst ValueOperandSchema: z.ZodType<ValueOperand> = z.union([\n z.string(),\n z.boolean(),\n z.array(z.string()),\n z.array(z.boolean()),\n]);\n\nconst MachineUserSchema = z.strictObject({\n // null/undefined values mean \"attribute not set\" and are dropped so\n // downstream (deploy, drift diff) only ever sees concrete values.\n attributes: z\n .record(z.string(), ValueOperandSchema.nullish())\n .transform(\n (attributes): Record<string, ValueOperand> =>\n Object.fromEntries(\n Object.entries(attributes).filter(\n (entry): entry is [string, ValueOperand] => entry[1] != null,\n ),\n ),\n )\n .optional(),\n attributeList: z.array(z.uuid()).optional(),\n});\n\nconst BeforeLoginHookSchema = z.strictObject({\n handler: z.function(),\n invoker: z.string(),\n});\n\nconst AuthConfigBaseSchema = z.strictObject({\n name: z.string().describe(\"Auth service name\"),\n hooks: z\n .strictObject({\n beforeLogin: BeforeLoginHookSchema.optional().describe(\"Before login auth hook\"),\n })\n .optional()\n .describe(\"Auth hooks\"),\n machineUsers: z\n .record(z.string(), MachineUserSchema)\n .optional()\n .describe(\"Machine user definitions\"),\n oauth2Clients: z\n .record(z.string(), OAuth2ClientSchema)\n .optional()\n .describe(\"OAuth2 client definitions\"),\n idProvider: IdProviderSchema.optional().describe(\"Identity provider configuration\"),\n scim: SCIMSchema.optional().describe(\"SCIM provisioning configuration\"),\n tenantProvider: TenantProviderSchema.optional().describe(\"Multi-tenant provider configuration\"),\n connections: z\n .record(z.string(), AuthConnectionConfigSchema)\n .optional()\n .describe(\"Auth connection definitions for external OAuth2 providers\"),\n publishSessionEvents: z.boolean().optional().describe(\"Enable publishing session events\"),\n});\n\nexport const AuthConfigSchema = z\n .xor(\n [\n AuthConfigBaseSchema.extend({\n userProfile: UserProfileSchema.optional().describe(\"User profile configuration\"),\n machineUserAttributes: z.undefined().optional(),\n }),\n AuthConfigBaseSchema.extend({\n userProfile: z.undefined().optional(),\n machineUserAttributes: z\n .record(z.string(), TailorFieldSchema)\n .describe(\"Machine user attribute fields\"),\n }),\n ],\n {\n error: (iss) => {\n // zod may report error codes not covered by its type definitions\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (iss.code !== \"invalid_union\") return undefined;\n // zod may report error codes not covered by its type definitions\n // oxlint-disable-next-line typescript/no-unnecessary-condition\n if (iss.errors.length < 2) return undefined;\n const isOnlyMutexViolation = iss.errors.every((variantErrors) =>\n variantErrors.every(\n (e) =>\n e.path.length === 1 &&\n (e.path[0] === \"userProfile\" || e.path[0] === \"machineUserAttributes\"),\n ),\n );\n if (isOnlyMutexViolation) {\n return \"Specify either `userProfile` or `machineUserAttributes`, not both.\";\n }\n return undefined;\n },\n },\n )\n .brand(\"AuthConfig\");\n","import { z } from \"zod\";\nimport { AuthInvokerSchema } from \"../auth\";\nimport { functionSchema } from \"../common\";\nimport type { JsonValue } from \"#/types/helpers\";\n\nexport const TailorDBTriggerSchema = z.strictObject({\n kind: z.literal(\"tailordb\").describe(\"TailorDB record event trigger\"),\n events: z\n .array(\n z.enum([\n \"tailordb.type_record.created\",\n \"tailordb.type_record.updated\",\n \"tailordb.type_record.deleted\",\n ]),\n )\n .min(1)\n .transform((arr) => [...new Set(arr)])\n .describe(\"TailorDB event types to trigger on\"),\n typeName: z.string().describe(\"TailorDB type name to watch for events\"),\n condition: functionSchema.optional().describe(\"Condition function to filter events\"),\n});\n\nexport const ResolverExecutedTriggerSchema = z.strictObject({\n kind: z.literal(\"resolverExecuted\"),\n resolverName: z.string().describe(\"Name of the resolver to trigger on\"),\n condition: functionSchema.optional().describe(\"Condition function to filter events\"),\n});\n\nexport const ScheduleTriggerSchema = z.strictObject({\n kind: z.literal(\"schedule\"),\n cron: z.string().describe(\"CRON expression for the schedule\"),\n timezone: z\n .string()\n .optional()\n .default(\"UTC\")\n .describe(\"Timezone for the CRON schedule (default: UTC)\"),\n});\n\nexport const IncomingWebhookTriggerResponseSchema = z.strictObject({\n body: functionSchema.optional().describe(\"Function returning the response body\"),\n statusCode: z.number().int().optional().describe(\"HTTP status code for the response\"),\n});\n\nexport const IncomingWebhookTriggerSchema = z.strictObject({\n kind: z.literal(\"incomingWebhook\"),\n response: IncomingWebhookTriggerResponseSchema.optional().describe(\"Response configuration\"),\n});\n\nexport const IdpUserTriggerSchema = z.strictObject({\n kind: z.literal(\"idpUser\").describe(\"IdP user event trigger\"),\n events: z\n .array(z.enum([\"idp.user.created\", \"idp.user.updated\", \"idp.user.deleted\"]))\n .min(1)\n .transform((arr) => [...new Set(arr)])\n .describe(\"IdP user event types to trigger on\"),\n idp: z\n .string()\n .optional()\n .describe(\n \"IdP namespace name to subscribe to. If omitted, the project's only IdP is used; throws when multiple IdPs exist.\",\n ),\n});\n\nexport const AuthAccessTokenTriggerSchema = z.strictObject({\n kind: z.literal(\"authAccessToken\").describe(\"Auth access token event trigger\"),\n events: z\n .array(\n z.enum([\n \"auth.access_token.issued\",\n \"auth.access_token.refreshed\",\n \"auth.access_token.revoked\",\n ]),\n )\n .min(1)\n .transform((arr) => [...new Set(arr)])\n .describe(\"Auth access token event types to trigger on\"),\n});\n\nexport const TriggerSchema = z.discriminatedUnion(\"kind\", [\n TailorDBTriggerSchema,\n ResolverExecutedTriggerSchema,\n ScheduleTriggerSchema,\n IncomingWebhookTriggerSchema,\n IdpUserTriggerSchema,\n AuthAccessTokenTriggerSchema,\n]);\n\nexport const FunctionOperationSchema = z.strictObject({\n kind: z.enum([\"function\", \"jobFunction\"]),\n body: functionSchema.describe(\"Function implementation\"),\n invoker: AuthInvokerSchema.optional().describe(\"Invoker for the function execution\"),\n});\n\nexport const GqlOperationSchema = z.strictObject({\n kind: z.literal(\"graphql\"),\n appName: z.string().optional().describe(\"Target application name for the GraphQL query\"),\n query: z.preprocess((val) => String(val), z.string().describe(\"GraphQL query string\")),\n variables: functionSchema.optional().describe(\"Function to compute GraphQL variables\"),\n invoker: AuthInvokerSchema.optional().describe(\"Invoker for the GraphQL execution\"),\n});\n\nexport const WebhookOperationSchema = z.strictObject({\n kind: z.literal(\"webhook\"),\n url: functionSchema.describe(\"Function returning the webhook URL\"),\n requestBody: functionSchema.optional().describe(\"Function to compute the request body\"),\n headers: z\n .record(\n z.string(),\n z.union([z.string(), z.strictObject({ vault: z.string(), key: z.string() })]),\n )\n .optional()\n .describe(\"HTTP headers for the webhook request\"),\n});\n\nexport const JsonValueSchema: z.ZodType<JsonValue, JsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(JsonValueSchema),\n z.record(z.string(), JsonValueSchema),\n ]),\n);\n\nexport const WorkflowInputSchema: z.ZodType<\n Exclude<JsonValue, null>,\n Exclude<JsonValue, null>\n> = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(JsonValueSchema),\n z.record(z.string(), JsonValueSchema),\n]);\n\nexport const WorkflowOperationArgsSchema = z\n .union([WorkflowInputSchema, functionSchema])\n .describe(\"Arguments to pass to the workflow\");\n\nconst workflowOperationShape = {\n kind: z.literal(\"workflow\"),\n args: WorkflowOperationArgsSchema.optional(),\n invoker: AuthInvokerSchema.optional().describe(\"Invoker for the workflow execution\"),\n};\n\nconst WorkflowOperationByNameSchema = z.strictObject({\n ...workflowOperationShape,\n workflowName: z.string().describe(\"Name of the workflow to execute\"),\n workflow: z.never().optional(),\n});\n\nconst WorkflowOperationByReferenceSchema = z\n .strictObject({\n ...workflowOperationShape,\n workflow: z.looseObject({ name: z.string() }),\n workflowName: z.string().optional(),\n })\n .transform(({ workflow, ...operation }) => ({\n ...operation,\n workflowName: workflow.name,\n }));\n\nexport const WorkflowOperationSchema = z.union([\n WorkflowOperationByReferenceSchema,\n WorkflowOperationByNameSchema,\n]);\n\nexport const OperationSchema = z.union([\n FunctionOperationSchema,\n GqlOperationSchema,\n WebhookOperationSchema,\n WorkflowOperationSchema,\n]);\n\nexport const ExecutorSchema = z.strictObject({\n name: z.string().describe(\"Executor name\"),\n description: z.string().optional().describe(\"Executor description\"),\n disabled: z.boolean().optional().default(false).describe(\"Whether the executor is disabled\"),\n trigger: TriggerSchema.describe(\"Event trigger configuration\"),\n operation: OperationSchema.describe(\"Operation to execute when triggered\"),\n});\n","import { pathToFileURL } from \"node:url\";\nimport { ExecutorSchema } from \"#/parser/service/executor/index\";\nimport { isSdkBranded } from \"#/utils/brand\";\nimport type { Executor } from \"#/types/executor.generated\";\n\nexport function stripExecutorTriggerArgs(executor: unknown): unknown {\n if (!isSdkBranded(executor, \"executor\")) {\n return executor;\n }\n\n const trigger = (executor as { trigger?: unknown }).trigger;\n if (trigger === null || typeof trigger !== \"object\" || !(\"__args\" in trigger)) {\n return executor;\n }\n\n const { __args: _args, ...triggerConfig } = trigger as Record<string, unknown>;\n return { ...(executor as Record<string, unknown>), trigger: triggerConfig };\n}\n\n/**\n * Load and validate an executor definition from a file.\n * @param executorFilePath - Path to the executor file\n * @returns Parsed executor or null if invalid\n */\nexport async function loadExecutor(executorFilePath: string): Promise<Executor | null> {\n const executorModule = await import(pathToFileURL(executorFilePath).href);\n const executor = executorModule.default;\n\n const parseResult = ExecutorSchema.safeParse(stripExecutorTriggerArgs(executor));\n if (!parseResult.success) {\n return null;\n }\n\n return parseResult.data;\n}\n","import { pathToFileURL } from \"node:url\";\nimport * as path from \"pathe\";\nimport { loadFilesWithIgnores } from \"#/cli/services/file-loader\";\nimport { logger, styles } from \"#/cli/shared/logger\";\nimport { ExecutorSchema } from \"#/parser/service/executor/index\";\nimport { isSdkBranded } from \"#/utils/brand\";\nimport { stripExecutorTriggerArgs } from \"./loader\";\nimport type { ExecutorServiceConfig } from \"#/configure/config/types\";\nimport type { Executor } from \"#/types/executor.generated\";\n\n/**\n * Information about a plugin-generated executor converted to Executor format\n */\nexport interface PluginExecutor {\n /** The executor in standard Executor format */\n executor: Executor;\n /** Plugin ID that generated this executor */\n pluginId: string;\n /** Source type name (for type-attached executors) */\n sourceTypeName?: string;\n}\n\nexport type ExecutorService = {\n readonly config: ExecutorServiceConfig;\n readonly executors: Record<string, Executor>;\n readonly pluginExecutors: ReadonlyArray<PluginExecutor>;\n loadExecutors: () => Promise<Record<string, Executor> | undefined>;\n loadPluginExecutorFiles: (filePaths: string[]) => Promise<void>;\n};\n\n/**\n * Parameters for creating an ExecutorService\n */\nexport interface CreateExecutorServiceParams {\n /** The executor service configuration */\n config: ExecutorServiceConfig;\n /** Directory the config's file patterns are resolved against */\n baseDir: string;\n}\n\n/**\n * Creates a new ExecutorService instance.\n * @param params - Parameters for creating the service\n * @returns A new ExecutorService instance\n */\nexport function createExecutorService(params: CreateExecutorServiceParams): ExecutorService {\n const { config, baseDir } = params;\n const executors: Record<string, Executor> = {};\n const pluginExecutors: PluginExecutor[] = [];\n let loadPromise: Promise<Record<string, Executor> | undefined> | undefined;\n\n const loadExecutorForFile = async (executorFile: string): Promise<Executor | undefined> => {\n try {\n const executorModule = await import(pathToFileURL(executorFile).href);\n const result = ExecutorSchema.safeParse(stripExecutorTriggerArgs(executorModule.default));\n if (result.success) {\n const relativePath = path.relative(process.cwd(), executorFile);\n logger.log(\n `Executor: ${styles.successBright(`\"${result.data.name}\"`)} loaded from ${styles.path(relativePath)}`,\n );\n executors[executorFile] = result.data;\n return result.data;\n }\n if (isSdkBranded(executorModule.default, \"executor\")) {\n throw result.error;\n }\n } catch (error) {\n const relativePath = path.relative(process.cwd(), executorFile);\n logger.error(`Failed to load executor from ${styles.bold(relativePath)}`);\n logger.error(String(error));\n throw error;\n }\n return undefined;\n };\n\n return {\n config,\n get executors() {\n return executors;\n },\n get pluginExecutors() {\n return pluginExecutors;\n },\n loadExecutors: async () => {\n if (!loadPromise) {\n loadPromise = (async () => {\n if (config.files.length === 0) {\n return undefined;\n }\n\n const executorFiles = loadFilesWithIgnores(config, baseDir);\n\n logger.newline();\n logger.log(`Found ${styles.highlight(executorFiles.length.toString())} executor files`);\n\n await Promise.all(executorFiles.map((executorFile) => loadExecutorForFile(executorFile)));\n assertUniqueExecutorNames(executors);\n return executors;\n })();\n }\n return loadPromise;\n },\n loadPluginExecutorFiles: async (filePaths: string[]) => {\n if (filePaths.length === 0) return;\n\n logger.newline();\n logger.log(\n `Loading ${styles.highlight(filePaths.length.toString())} plugin-generated executor files`,\n );\n\n for (const filePath of filePaths) {\n const executor = await loadExecutorForFile(filePath);\n if (executor) {\n // Track as plugin executor (plugin ID is extracted from file path)\n // File path format: .tailor/plugin/{executor-name}.ts\n pluginExecutors.push({\n executor,\n pluginId: \"plugin-generated\",\n sourceTypeName: undefined,\n });\n }\n }\n assertUniqueExecutorNames(executors);\n },\n };\n}\n\n/**\n * Assert that every loaded executor has a unique name.\n * Executors are stored by source file, so two files declaring the same\n * `name` would otherwise silently share a single bundle cache entry.\n * @param executors - Loaded executors keyed by source file\n */\nfunction assertUniqueExecutorNames(executors: Record<string, Executor>): void {\n const seenNames = new Map<string, string>();\n for (const [file, executor] of Object.entries(executors)) {\n const relativePath = path.relative(process.cwd(), file);\n const existing = seenNames.get(executor.name);\n if (existing) {\n throw new Error(\n `Duplicate executor name \"${executor.name}\" found:\\n` +\n ` - ${existing}\\n` +\n ` - ${relativePath}\\n` +\n `Each executor must have a unique name.`,\n );\n }\n seenNames.set(executor.name, relativePath);\n }\n}\n"],"mappings":"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"}
@@ -40,15 +40,15 @@ function setupTailordbMock(resolver = () => []) {
40
40
  };
41
41
  }
42
42
  /**
43
- * Sets up a mock for `globalThis.tailor.workflow.triggerJobFunction` used in bundled workflow tests.
43
+ * Sets up a mock for `globalThis.tailor.workflow.startJobFunction` used in bundled workflow tests.
44
44
  * `wait`/`resolve` are stubbed to throw a helpful error directing to `mockWorkflow`,
45
45
  * so mistakenly calling wait without wait-point mocks produces a clear message instead of a TypeError.
46
46
  * @deprecated Use `mockWorkflow` from `@tailor-platform/sdk/vitest` with the `tailor-runtime` environment instead.
47
- * @param handler - Function that handles triggered job calls and returns results.
48
- * @returns Object containing an array of triggered jobs for assertions.
47
+ * @param handler - Function that handles started job calls and returns results.
48
+ * @returns Object containing an array of started jobs for assertions.
49
49
  */
50
50
  function setupWorkflowMock(handler) {
51
- const triggeredJobs = [];
51
+ const startedJobs = [];
52
52
  GlobalThis.tailor = {
53
53
  ...GlobalThis.tailor,
54
54
  workflow: {
@@ -59,8 +59,8 @@ function setupWorkflowMock(handler) {
59
59
  throw new Error("tailor.workflow.resolve is not mocked. Use mockWorkflow from @tailor-platform/sdk/vitest in tests.");
60
60
  },
61
61
  ...GlobalThis.tailor?.workflow,
62
- triggerJobFunction: (jobName, args) => {
63
- triggeredJobs.push({
62
+ startJobFunction: (jobName, args) => {
63
+ startedJobs.push({
64
64
  jobName,
65
65
  args
66
66
  });
@@ -68,7 +68,7 @@ function setupWorkflowMock(handler) {
68
68
  }
69
69
  }
70
70
  };
71
- return { triggeredJobs };
71
+ return { startedJobs };
72
72
  }
73
73
  /**
74
74
  * Sets up a mock for `globalThis.tailor.context.getInvoker` used in bundled
@@ -106,8 +106,8 @@ function setupTailorErrorsMock() {
106
106
  }
107
107
  /**
108
108
  * Sets up mocks for `globalThis.tailor.workflow.wait` and `.resolve` used in bundled workflow tests.
109
- * `triggerJobFunction` is stubbed to throw a helpful error directing to `setupWorkflowMock()`,
110
- * so mistakenly triggering a job without job mocks produces a clear message instead of silently returning undefined.
109
+ * `startJobFunction` is stubbed to throw a helpful error directing to `setupWorkflowMock()`,
110
+ * so mistakenly starting a job without job mocks produces a clear message instead of silently returning undefined.
111
111
  * @deprecated Use `mockWorkflow` from `@tailor-platform/sdk/vitest` with the `tailor-runtime` environment instead.
112
112
  * `setWaitHandler` / `setResolveHandler` cover wait/resolve, and `waitCalls` / `resolveCalls` give the same assertion shape.
113
113
  * @param config - Optional handlers for wait and resolve calls.
@@ -121,8 +121,8 @@ function setupWaitPointMock(config) {
121
121
  GlobalThis.tailor = {
122
122
  ...GlobalThis.tailor,
123
123
  workflow: {
124
- triggerJobFunction: () => {
125
- throw new Error("tailor.workflow.triggerJobFunction is not mocked. Use setupWorkflowMock() in tests.");
124
+ startJobFunction: () => {
125
+ throw new Error("tailor.workflow.startJobFunction is not mocked. Use setupWorkflowMock() in tests.");
126
126
  },
127
127
  ...GlobalThis.tailor?.workflow,
128
128
  wait: (key, payload) => {