@tailor-platform/sdk 1.60.3 → 1.63.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 (61) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/{application-pusdxz35.mjs → application-BezXGbrU.mjs} +73 -509
  3. package/dist/application-BezXGbrU.mjs.map +1 -0
  4. package/dist/application-DSXntqnV.mjs +4 -0
  5. package/dist/assert-CKfwrmCV.mjs +10 -0
  6. package/dist/assert-CKfwrmCV.mjs.map +1 -0
  7. package/dist/cli/index.mjs +819 -239
  8. package/dist/cli/index.mjs.map +1 -1
  9. package/dist/cli/lib.d.mts +3 -1
  10. package/dist/cli/lib.mjs +13 -6
  11. package/dist/cli/lib.mjs.map +1 -1
  12. package/dist/{client-B-jRdlC_.mjs → client-C68VWo4g.mjs} +1 -1
  13. package/dist/{client-W5P4NYYX.mjs → client-CobIRHl-.mjs} +207 -2
  14. package/dist/{client-W5P4NYYX.mjs.map → client-CobIRHl-.mjs.map} +1 -1
  15. package/dist/configure/index.mjs +2 -2
  16. package/dist/{crashreport-D3DvAzdg.mjs → crashreport-BhD0y14F.mjs} +2 -2
  17. package/dist/{crashreport-D3DvAzdg.mjs.map → crashreport-BhD0y14F.mjs.map} +1 -1
  18. package/dist/{crashreport-lnVTnbB5.mjs → crashreport-D1wKBJ8N.mjs} +1 -1
  19. package/dist/{mock-Dpu__UeJ.mjs → mock-DMgIygjE.mjs} +3 -2
  20. package/dist/mock-DMgIygjE.mjs.map +1 -0
  21. package/dist/plugin/builtin/seed/index.mjs +1 -1
  22. package/dist/plugin/index.mjs +1 -1
  23. package/dist/plugin/index.mjs.map +1 -1
  24. package/dist/registry-D0uB0OrK.mjs.map +1 -1
  25. package/dist/{repl-editor-Y9QJDL0K.mjs → repl-editor-CJG3sz7A.mjs} +11 -9
  26. package/dist/repl-editor-CJG3sz7A.mjs.map +1 -0
  27. package/dist/{runtime-C0_FZWdE.mjs → runtime-CW3jcQCc.mjs} +979 -584
  28. package/dist/runtime-CW3jcQCc.mjs.map +1 -0
  29. package/dist/{schema-DYKNTu-n.mjs → schema-1msIhXwA.mjs} +12 -7
  30. package/dist/schema-1msIhXwA.mjs.map +1 -0
  31. package/dist/{seed-C0fE2sJB.mjs → seed-BH2FbrPV.mjs} +4 -3
  32. package/dist/seed-BH2FbrPV.mjs.map +1 -0
  33. package/dist/service-BHQIerYh.mjs +4 -0
  34. package/dist/{service-aPT0fx3y.mjs → service-DMohAx8a2.mjs} +3 -3
  35. package/dist/service-DMohAx8a2.mjs.map +1 -0
  36. package/dist/service-wI3Hvrgx.mjs +460 -0
  37. package/dist/service-wI3Hvrgx.mjs.map +1 -0
  38. package/dist/{types-Ccwchyj5.mjs → types-2Be3wSMc.mjs} +1 -1
  39. package/dist/{types-BwGth3a1.mjs → types-CmzfQP_m.mjs} +3 -3
  40. package/dist/types-CmzfQP_m.mjs.map +1 -0
  41. package/dist/utils/test/index.mjs +1 -1
  42. package/dist/utils/test/index.mjs.map +1 -1
  43. package/dist/vitest/index.mjs +7 -4
  44. package/dist/vitest/index.mjs.map +1 -1
  45. package/dist/vitest/setup.mjs +1 -1
  46. package/docs/cli/application.md +11 -10
  47. package/docs/cli/setup.md +18 -12
  48. package/docs/cli/tailordb.md +54 -0
  49. package/docs/cli-reference.md +4 -3
  50. package/docs/github-actions.md +337 -0
  51. package/docs/services/tailordb-migration.md +17 -1
  52. package/package.json +4 -3
  53. package/dist/application-D4tRNn90.mjs +0 -4
  54. package/dist/application-pusdxz35.mjs.map +0 -1
  55. package/dist/mock-Dpu__UeJ.mjs.map +0 -1
  56. package/dist/repl-editor-Y9QJDL0K.mjs.map +0 -1
  57. package/dist/runtime-C0_FZWdE.mjs.map +0 -1
  58. package/dist/schema-DYKNTu-n.mjs.map +0 -1
  59. package/dist/seed-C0fE2sJB.mjs.map +0 -1
  60. package/dist/service-aPT0fx3y.mjs.map +0 -1
  61. package/dist/types-BwGth3a1.mjs.map +0 -1
@@ -0,0 +1,460 @@
1
+
2
+ import { n as isSdkBranded } from "./brand-DlnJ375c.mjs";
3
+ import { n as logger, r as styles } from "./logger-DpJyJvNz.mjs";
4
+ import { z } from "zod";
5
+ import * as fs from "node:fs";
6
+ import * as path from "pathe";
7
+ import { pathToFileURL } from "node:url";
8
+
9
+ //#region src/parser/service/common.ts
10
+ const functionSchema = z.custom((val) => typeof val === "function");
11
+
12
+ //#endregion
13
+ //#region src/cli/services/file-loader.ts
14
+ const DEFAULT_IGNORE_PATTERNS = ["**/*.test.ts", "**/*.spec.ts"];
15
+ /**
16
+ * Load files matching the given patterns, excluding files that match ignore patterns.
17
+ * By default, test files (*.test.ts, *.spec.ts) are excluded unless ignores is explicitly specified.
18
+ * @param config - Configuration with files patterns and optional ignores patterns
19
+ * @returns Array of absolute file paths
20
+ */
21
+ function loadFilesWithIgnores(config) {
22
+ const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;
23
+ const ignoreFiles = /* @__PURE__ */ new Set();
24
+ for (const ignorePattern of ignorePatterns) {
25
+ const absoluteIgnorePattern = path.resolve(process.cwd(), ignorePattern);
26
+ try {
27
+ fs.globSync(absoluteIgnorePattern).forEach((file) => ignoreFiles.add(file));
28
+ } catch (error) {
29
+ logger.warn(`Failed to glob ignore pattern "${ignorePattern}": ${String(error)}`);
30
+ }
31
+ }
32
+ const files = [];
33
+ for (const pattern of config.files) {
34
+ const absolutePattern = path.resolve(process.cwd(), pattern);
35
+ try {
36
+ const filteredFiles = fs.globSync(absolutePattern).filter((file) => !ignoreFiles.has(file));
37
+ files.push(...filteredFiles);
38
+ } catch (error) {
39
+ logger.warn(`Failed to glob pattern "${pattern}": ${String(error)}`);
40
+ }
41
+ }
42
+ return files;
43
+ }
44
+
45
+ //#endregion
46
+ //#region src/parser/service/auth-connection/schema.ts
47
+ const AuthConnectionOAuth2ConfigSchema = z.object({
48
+ providerUrl: z.string().describe("OAuth2 provider URL"),
49
+ issuerUrl: z.string().describe("OAuth2 issuer URL"),
50
+ clientId: z.string().describe("OAuth2 client ID"),
51
+ clientSecret: z.string().describe("OAuth2 client secret"),
52
+ authUrl: z.string().optional().describe("OAuth2 authorization endpoint override"),
53
+ tokenUrl: z.string().optional().describe("OAuth2 token endpoint override")
54
+ });
55
+ const AuthConnectionConfigSchema = z.object({ type: z.literal("oauth2").describe("Connection type") }).and(AuthConnectionOAuth2ConfigSchema);
56
+
57
+ //#endregion
58
+ //#region src/parser/service/field/schema.ts
59
+ const TailorFieldTypeSchema = z.enum([
60
+ "uuid",
61
+ "string",
62
+ "boolean",
63
+ "integer",
64
+ "float",
65
+ "decimal",
66
+ "enum",
67
+ "date",
68
+ "datetime",
69
+ "time",
70
+ "nested"
71
+ ]);
72
+ const AllowedValueSchema = z.object({
73
+ value: z.string().describe("The allowed value"),
74
+ description: z.string().optional().describe("Description of the allowed value")
75
+ });
76
+ const FieldMetadataSchema = z.object({
77
+ required: z.boolean().optional().describe("Whether the field is required"),
78
+ array: z.boolean().optional().describe("Whether the field is an array"),
79
+ description: z.string().optional().describe("Field description"),
80
+ allowedValues: z.array(AllowedValueSchema).optional().describe("Allowed values for enum fields"),
81
+ hooks: z.object({
82
+ create: functionSchema.optional().describe("Hook function called on creation"),
83
+ update: functionSchema.optional().describe("Hook function called on update")
84
+ }).optional().describe("Lifecycle hooks"),
85
+ typeName: z.string().optional().describe("Type name for nested or enum fields")
86
+ });
87
+ const TailorFieldSchema = z.object({
88
+ type: TailorFieldTypeSchema.describe("Field data type"),
89
+ metadata: FieldMetadataSchema.describe("Field metadata configuration"),
90
+ get fields() {
91
+ return z.record(z.string(), TailorFieldSchema);
92
+ }
93
+ });
94
+
95
+ //#endregion
96
+ //#region src/parser/service/auth/schema.ts
97
+ const AuthInvokerObjectSchema = z.object({
98
+ namespace: z.string().describe("Auth namespace"),
99
+ machineUserName: z.string().describe("Machine user name for authentication")
100
+ });
101
+ const AuthInvokerSchema = z.union([z.string().describe("Machine user name (namespace auto-resolved from auth service)"), AuthInvokerObjectSchema]);
102
+ const secretValueSchema = z.object({
103
+ vaultName: z.string().describe("Vault name containing the secret"),
104
+ secretKey: z.string().describe("Key of the secret in the vault")
105
+ });
106
+ const OIDCSchema = z.object({
107
+ name: z.string().describe("Identity provider name"),
108
+ kind: z.literal("OIDC"),
109
+ clientID: z.string().describe("OAuth2 client ID"),
110
+ clientSecret: secretValueSchema.describe("OAuth2 client secret"),
111
+ providerURL: z.string().describe("OIDC provider URL"),
112
+ issuerURL: z.string().optional().describe("OIDC issuer URL (defaults to providerURL)"),
113
+ usernameClaim: z.string().optional().describe("JWT claim to use as username")
114
+ });
115
+ const SAMLSchema = z.object({
116
+ name: z.string().describe("Identity provider name"),
117
+ kind: z.literal("SAML"),
118
+ enableSignRequest: z.boolean().default(false).describe("Enable signing of SAML requests"),
119
+ metadataURL: z.string().optional().describe("URL to fetch SAML metadata (mutually exclusive with rawMetadata)"),
120
+ rawMetadata: z.string().optional().describe("Raw SAML metadata XML (mutually exclusive with metadataURL)"),
121
+ defaultRedirectURL: z.string().optional().describe("URL to redirect to when SAML ACS receives a response with an empty RelayState.")
122
+ }).refine((value) => {
123
+ return value.metadataURL !== void 0 !== (value.rawMetadata !== void 0);
124
+ }, "Provide either metadataURL or rawMetadata");
125
+ const IDTokenSchema = z.object({
126
+ name: z.string().describe("Identity provider name"),
127
+ kind: z.literal("IDToken"),
128
+ providerURL: z.string().describe("ID token provider URL"),
129
+ issuerURL: z.string().optional().describe("ID token issuer URL"),
130
+ clientID: z.string().describe("Client ID for ID token validation"),
131
+ usernameClaim: z.string().optional().describe("JWT claim to use as username")
132
+ });
133
+ const BuiltinIdPSchema = z.object({
134
+ name: z.string().describe("Identity provider name"),
135
+ kind: z.literal("BuiltInIdP"),
136
+ namespace: z.string().describe("IdP namespace"),
137
+ clientName: z.string().describe("OAuth2 client name in the IdP")
138
+ });
139
+ const IdProviderSchema = z.discriminatedUnion("kind", [
140
+ OIDCSchema,
141
+ SAMLSchema,
142
+ IDTokenSchema,
143
+ BuiltinIdPSchema
144
+ ]);
145
+ const OAuth2ClientGrantTypeSchema = z.union([z.literal("authorization_code"), z.literal("refresh_token")]).describe("OAuth2 grant type");
146
+ const OAuth2ClientSchema = z.object({
147
+ description: z.string().optional().describe("Client description"),
148
+ grantTypes: z.array(OAuth2ClientGrantTypeSchema).default(["authorization_code", "refresh_token"]).describe("Allowed OAuth2 grant types"),
149
+ redirectURIs: z.array(z.union([
150
+ z.templateLiteral(["https://", z.string()]),
151
+ z.templateLiteral(["http://", z.string()]),
152
+ z.templateLiteral([z.string(), ":url"]),
153
+ z.templateLiteral([
154
+ z.string(),
155
+ ":url/",
156
+ z.string()
157
+ ])
158
+ ])).describe("Allowed redirect URIs"),
159
+ clientType: z.union([
160
+ z.literal("confidential"),
161
+ z.literal("public"),
162
+ z.literal("browser")
163
+ ]).optional().describe("OAuth2 client type"),
164
+ accessTokenLifetimeSeconds: z.number().int().min(60, "Minimum access token lifetime is 60 seconds").max(86400, "Maximum access token lifetime is 1 day (86400 seconds)").optional().describe("Access token lifetime in seconds (60-86400)").transform((val) => val ? {
165
+ seconds: BigInt(val),
166
+ nanos: 0
167
+ } : void 0),
168
+ refreshTokenLifetimeSeconds: z.number().int().min(60, "Minimum refresh token lifetime is 60 seconds").max(604800, "Maximum refresh token lifetime is 7 days (604800 seconds)").optional().describe("Refresh token lifetime in seconds (60-604800)").transform((val) => val ? {
169
+ seconds: BigInt(val),
170
+ nanos: 0
171
+ } : void 0),
172
+ requireDpop: z.boolean().optional().describe("Require DPoP (Demonstrating Proof-of-Possession) for token requests")
173
+ }).refine((data) => !(data.clientType === "browser" && data.requireDpop === true), {
174
+ message: "requireDpop cannot be set to true for browser clients as they don't support DPoP",
175
+ path: ["requireDpop"]
176
+ });
177
+ const SCIMAuthorizationSchema = z.object({
178
+ type: z.union([z.literal("oauth2"), z.literal("bearer")]).describe("SCIM authorization type"),
179
+ bearerSecret: secretValueSchema.optional().describe("Bearer token secret (required for bearer type)")
180
+ });
181
+ const SCIMAttributeTypeSchema = z.union([
182
+ z.literal("string"),
183
+ z.literal("number"),
184
+ z.literal("boolean"),
185
+ z.literal("datetime"),
186
+ z.literal("complex")
187
+ ]).describe("SCIM attribute data type");
188
+ const SCIMAttributeSchema = z.object({
189
+ type: SCIMAttributeTypeSchema.describe("Attribute data type"),
190
+ name: z.string().describe("Attribute name"),
191
+ description: z.string().optional().describe("Attribute description"),
192
+ mutability: z.union([
193
+ z.literal("readOnly"),
194
+ z.literal("readWrite"),
195
+ z.literal("writeOnly")
196
+ ]).optional().describe("Attribute mutability"),
197
+ required: z.boolean().optional().describe("Whether the attribute is required"),
198
+ multiValued: z.boolean().optional().describe("Whether the attribute can have multiple values"),
199
+ uniqueness: z.union([
200
+ z.literal("none"),
201
+ z.literal("server"),
202
+ z.literal("global")
203
+ ]).optional().describe("Uniqueness constraint"),
204
+ canonicalValues: z.array(z.string()).nullable().optional().describe("List of canonical values"),
205
+ get subAttributes() {
206
+ return z.array(SCIMAttributeSchema).nullable().optional();
207
+ }
208
+ });
209
+ const SCIMSchemaSchema = z.object({
210
+ name: z.string().describe("SCIM schema name"),
211
+ attributes: z.array(SCIMAttributeSchema).describe("Schema attributes")
212
+ });
213
+ const SCIMAttributeMappingSchema = z.object({
214
+ tailorDBField: z.string().describe("TailorDB field name to map to"),
215
+ scimPath: z.string().describe("SCIM attribute path")
216
+ });
217
+ const SCIMResourceSchema = z.object({
218
+ name: z.string().describe("SCIM resource name"),
219
+ tailorDBNamespace: z.string().describe("TailorDB namespace for the resource"),
220
+ tailorDBType: z.string().describe("TailorDB type name for the resource"),
221
+ coreSchema: SCIMSchemaSchema.describe("Core SCIM schema definition"),
222
+ attributeMapping: z.array(SCIMAttributeMappingSchema).describe("Attribute mapping configuration")
223
+ });
224
+ const SCIMSchema = z.object({
225
+ machineUserName: z.string().describe("Machine user name for SCIM operations"),
226
+ authorization: SCIMAuthorizationSchema.describe("SCIM authorization configuration"),
227
+ resources: z.array(SCIMResourceSchema).describe("SCIM resource definitions")
228
+ });
229
+ const TenantProviderSchema = z.object({
230
+ namespace: z.string().describe("TailorDB namespace for the tenant type"),
231
+ type: z.string().describe("TailorDB type name for tenants"),
232
+ signatureField: z.string().describe("Field used as the tenant signature")
233
+ });
234
+ const UserProfileSchema = z.object({
235
+ namespace: z.string().optional().describe("TailorDB namespace where the user type is defined"),
236
+ type: z.object({
237
+ name: z.string(),
238
+ fields: z.any(),
239
+ metadata: z.any(),
240
+ hooks: z.any(),
241
+ validate: z.any(),
242
+ features: z.any(),
243
+ indexes: z.any(),
244
+ files: z.any(),
245
+ permission: z.any(),
246
+ gqlPermission: z.any(),
247
+ _output: z.any()
248
+ }),
249
+ usernameField: z.string(),
250
+ attributes: z.record(z.string(), z.literal(true)).optional(),
251
+ attributeList: z.array(z.string()).optional()
252
+ });
253
+ const ValueOperandSchema = z.union([
254
+ z.string(),
255
+ z.boolean(),
256
+ z.array(z.string()),
257
+ z.array(z.boolean())
258
+ ]);
259
+ const MachineUserSchema = z.object({
260
+ attributes: z.record(z.string(), ValueOperandSchema).optional(),
261
+ attributeList: z.array(z.uuid()).optional()
262
+ });
263
+ const BeforeLoginHookSchema = z.object({
264
+ handler: z.function(),
265
+ invoker: z.string()
266
+ });
267
+ const AuthConfigBaseSchema = z.object({
268
+ name: z.string().describe("Auth service name"),
269
+ hooks: z.object({ beforeLogin: BeforeLoginHookSchema.optional().describe("Before login auth hook") }).optional().describe("Auth hooks"),
270
+ machineUsers: z.record(z.string(), MachineUserSchema).optional().describe("Machine user definitions"),
271
+ oauth2Clients: z.record(z.string(), OAuth2ClientSchema).optional().describe("OAuth2 client definitions"),
272
+ idProvider: IdProviderSchema.optional().describe("Identity provider configuration"),
273
+ scim: SCIMSchema.optional().describe("SCIM provisioning configuration"),
274
+ tenantProvider: TenantProviderSchema.optional().describe("Multi-tenant provider configuration"),
275
+ connections: z.record(z.string(), AuthConnectionConfigSchema).optional().describe("Auth connection definitions for external OAuth2 providers"),
276
+ publishSessionEvents: z.boolean().optional().describe("Enable publishing session events")
277
+ });
278
+ const AuthConfigSchema = z.xor([AuthConfigBaseSchema.extend({
279
+ userProfile: UserProfileSchema.optional().describe("User profile configuration"),
280
+ machineUserAttributes: z.undefined().optional()
281
+ }), AuthConfigBaseSchema.extend({
282
+ userProfile: z.undefined().optional(),
283
+ machineUserAttributes: z.record(z.string(), TailorFieldSchema).describe("Machine user attribute fields")
284
+ })], { error: (iss) => {
285
+ if (iss.code !== "invalid_union") return void 0;
286
+ if (iss.errors.length < 2) return void 0;
287
+ if (iss.errors.every((variantErrors) => variantErrors.every((e) => e.path.length === 1 && (e.path[0] === "userProfile" || e.path[0] === "machineUserAttributes")))) return "Specify either `userProfile` or `machineUserAttributes`, not both.";
288
+ } }).brand("AuthConfig");
289
+
290
+ //#endregion
291
+ //#region src/parser/service/executor/schema.ts
292
+ const TailorDBTriggerSchema = z.object({
293
+ kind: z.literal("tailordb").describe("TailorDB record event trigger"),
294
+ events: z.array(z.enum([
295
+ "tailordb.type_record.created",
296
+ "tailordb.type_record.updated",
297
+ "tailordb.type_record.deleted"
298
+ ])).min(1).transform((arr) => [...new Set(arr)]).describe("TailorDB event types to trigger on"),
299
+ typeName: z.string().describe("TailorDB type name to watch for events"),
300
+ condition: functionSchema.optional().describe("Condition function to filter events")
301
+ });
302
+ const ResolverExecutedTriggerSchema = z.object({
303
+ kind: z.literal("resolverExecuted"),
304
+ resolverName: z.string().describe("Name of the resolver to trigger on"),
305
+ condition: functionSchema.optional().describe("Condition function to filter events")
306
+ });
307
+ const ScheduleTriggerSchema = z.object({
308
+ kind: z.literal("schedule"),
309
+ cron: z.string().describe("CRON expression for the schedule"),
310
+ timezone: z.string().optional().default("UTC").describe("Timezone for the CRON schedule (default: UTC)")
311
+ });
312
+ const IncomingWebhookTriggerResponseSchema = z.object({
313
+ body: functionSchema.optional().describe("Function returning the response body"),
314
+ statusCode: z.number().int().optional().describe("HTTP status code for the response")
315
+ });
316
+ const IncomingWebhookTriggerSchema = z.object({
317
+ kind: z.literal("incomingWebhook"),
318
+ response: IncomingWebhookTriggerResponseSchema.optional().describe("Response configuration")
319
+ });
320
+ const IdpUserTriggerSchema = z.object({
321
+ kind: z.literal("idpUser").describe("IdP user event trigger"),
322
+ events: z.array(z.enum([
323
+ "idp.user.created",
324
+ "idp.user.updated",
325
+ "idp.user.deleted"
326
+ ])).min(1).transform((arr) => [...new Set(arr)]).describe("IdP user event types to trigger on"),
327
+ idp: z.string().optional().describe("IdP namespace name to subscribe to. If omitted, the project's only IdP is used; throws when multiple IdPs exist.")
328
+ });
329
+ const AuthAccessTokenTriggerSchema = z.object({
330
+ kind: z.literal("authAccessToken").describe("Auth access token event trigger"),
331
+ events: z.array(z.enum([
332
+ "auth.access_token.issued",
333
+ "auth.access_token.refreshed",
334
+ "auth.access_token.revoked"
335
+ ])).min(1).transform((arr) => [...new Set(arr)]).describe("Auth access token event types to trigger on")
336
+ });
337
+ const TriggerSchema = z.discriminatedUnion("kind", [
338
+ TailorDBTriggerSchema,
339
+ ResolverExecutedTriggerSchema,
340
+ ScheduleTriggerSchema,
341
+ IncomingWebhookTriggerSchema,
342
+ IdpUserTriggerSchema,
343
+ AuthAccessTokenTriggerSchema
344
+ ]);
345
+ const FunctionOperationSchema = z.object({
346
+ kind: z.enum(["function", "jobFunction"]),
347
+ body: functionSchema.describe("Function implementation"),
348
+ authInvoker: AuthInvokerSchema.optional().describe("Auth invoker for the function execution")
349
+ });
350
+ const GqlOperationSchema = z.object({
351
+ kind: z.literal("graphql"),
352
+ appName: z.string().optional().describe("Target application name for the GraphQL query"),
353
+ query: z.preprocess((val) => String(val), z.string().describe("GraphQL query string")),
354
+ variables: functionSchema.optional().describe("Function to compute GraphQL variables"),
355
+ authInvoker: AuthInvokerSchema.optional().describe("Auth invoker for the GraphQL execution")
356
+ });
357
+ const WebhookOperationSchema = z.object({
358
+ kind: z.literal("webhook"),
359
+ url: functionSchema.describe("Function returning the webhook URL"),
360
+ requestBody: functionSchema.optional().describe("Function to compute the request body"),
361
+ headers: z.record(z.string(), z.union([z.string(), z.object({
362
+ vault: z.string(),
363
+ key: z.string()
364
+ })])).optional().describe("HTTP headers for the webhook request")
365
+ });
366
+ const WorkflowOperationSchema = z.preprocess((val) => {
367
+ if (val == null || typeof val !== "object" || !("workflow" in val) || typeof val.workflow !== "object" || val.workflow === null) return val;
368
+ const { workflow, ...rest } = val;
369
+ return {
370
+ ...rest,
371
+ workflowName: workflow.name
372
+ };
373
+ }, z.object({
374
+ kind: z.literal("workflow"),
375
+ workflowName: z.string().describe("Name of the workflow to execute"),
376
+ args: z.union([z.record(z.string(), z.unknown()), functionSchema]).optional().describe("Arguments to pass to the workflow"),
377
+ authInvoker: AuthInvokerSchema.optional().describe("Auth invoker for the workflow execution")
378
+ }));
379
+ const OperationSchema = z.union([
380
+ FunctionOperationSchema,
381
+ GqlOperationSchema,
382
+ WebhookOperationSchema,
383
+ WorkflowOperationSchema
384
+ ]);
385
+ const ExecutorSchema = z.object({
386
+ name: z.string().describe("Executor name"),
387
+ description: z.string().optional().describe("Executor description"),
388
+ disabled: z.boolean().optional().default(false).describe("Whether the executor is disabled"),
389
+ trigger: TriggerSchema.describe("Event trigger configuration"),
390
+ operation: OperationSchema.describe("Operation to execute when triggered")
391
+ });
392
+
393
+ //#endregion
394
+ //#region src/cli/services/executor/service.ts
395
+ /**
396
+ * Creates a new ExecutorService instance.
397
+ * @param params - Parameters for creating the service
398
+ * @returns A new ExecutorService instance
399
+ */
400
+ function createExecutorService(params) {
401
+ const { config } = params;
402
+ const executors = {};
403
+ const pluginExecutors = [];
404
+ let loadPromise;
405
+ const loadExecutorForFile = async (executorFile) => {
406
+ try {
407
+ const executorModule = await import(pathToFileURL(executorFile).href);
408
+ const result = ExecutorSchema.safeParse(executorModule.default);
409
+ if (result.success) {
410
+ const relativePath = path.relative(process.cwd(), executorFile);
411
+ logger.log(`Executor: ${styles.successBright(`"${result.data.name}"`)} loaded from ${styles.path(relativePath)}`);
412
+ executors[executorFile] = result.data;
413
+ return result.data;
414
+ }
415
+ if (isSdkBranded(executorModule.default, "executor")) throw result.error;
416
+ } catch (error) {
417
+ const relativePath = path.relative(process.cwd(), executorFile);
418
+ logger.error(`Failed to load executor from ${styles.bold(relativePath)}`);
419
+ logger.error(String(error));
420
+ throw error;
421
+ }
422
+ };
423
+ return {
424
+ config,
425
+ get executors() {
426
+ return executors;
427
+ },
428
+ get pluginExecutors() {
429
+ return pluginExecutors;
430
+ },
431
+ loadExecutors: async () => {
432
+ if (!loadPromise) loadPromise = (async () => {
433
+ if (config.files.length === 0) return;
434
+ const executorFiles = loadFilesWithIgnores(config);
435
+ logger.newline();
436
+ logger.log(`Found ${styles.highlight(executorFiles.length.toString())} executor files`);
437
+ await Promise.all(executorFiles.map((executorFile) => loadExecutorForFile(executorFile)));
438
+ return executors;
439
+ })();
440
+ return loadPromise;
441
+ },
442
+ loadPluginExecutorFiles: async (filePaths) => {
443
+ if (filePaths.length === 0) return;
444
+ logger.newline();
445
+ logger.log(`Loading ${styles.highlight(filePaths.length.toString())} plugin-generated executor files`);
446
+ for (const filePath of filePaths) {
447
+ const executor = await loadExecutorForFile(filePath);
448
+ if (executor) pluginExecutors.push({
449
+ executor,
450
+ pluginId: "plugin-generated",
451
+ sourceTypeName: void 0
452
+ });
453
+ }
454
+ }
455
+ };
456
+ }
457
+
458
+ //#endregion
459
+ export { TailorFieldSchema as a, AuthInvokerSchema as i, ExecutorSchema as n, loadFilesWithIgnores as o, AuthConfigSchema as r, functionSchema as s, createExecutorService as t };
460
+ //# sourceMappingURL=service-wI3Hvrgx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-wI3Hvrgx.mjs","names":[],"sources":["../src/parser/service/common.ts","../src/cli/services/file-loader.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/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.custom<Function>((val) => typeof val === \"function\");\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/**\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 * @returns Array of absolute file paths\n */\nexport function loadFilesWithIgnores(config: FileLoadConfig): string[] {\n // Use user-provided patterns if specified, otherwise use defaults\n const ignorePatterns = config.ignores ?? DEFAULT_IGNORE_PATTERNS;\n\n const ignoreFiles = new Set<string>();\n for (const ignorePattern of ignorePatterns) {\n const absoluteIgnorePattern = path.resolve(process.cwd(), ignorePattern);\n try {\n const matchedIgnoreFiles = fs.globSync(absoluteIgnorePattern);\n matchedIgnoreFiles.forEach((file) => ignoreFiles.add(file));\n } catch (error) {\n logger.warn(`Failed to glob ignore pattern \"${ignorePattern}\": ${String(error)}`);\n }\n }\n\n const files: string[] = [];\n for (const pattern of config.files) {\n const absolutePattern = path.resolve(process.cwd(), pattern);\n try {\n const matchedFiles = fs.globSync(absolutePattern);\n // Filter out ignored files\n const filteredFiles = matchedFiles.filter((file) => !ignoreFiles.has(file));\n files.push(...filteredFiles);\n } catch (error) {\n logger.warn(`Failed to glob pattern \"${pattern}\": ${String(error)}`);\n }\n }\n\n return files;\n}\n","import { z } from \"zod\";\n\nexport const AuthConnectionOAuth2ConfigSchema = z.object({\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 = z\n .object({\n type: z.literal(\"oauth2\").describe(\"Connection type\"),\n })\n .and(AuthConnectionOAuth2ConfigSchema);\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.object({\n value: z.string().describe(\"The allowed value\"),\n description: z.string().optional().describe(\"Description of the allowed value\"),\n});\n\nconst FieldMetadataSchema = z.object({\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 .object({\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 typeName: z.string().optional().describe(\"Type name for nested or enum fields\"),\n});\n\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\";\nimport { TailorFieldSchema } from \"@/parser/service/field/schema\";\nimport type { ValueOperand } from \"@/types/auth\";\n\nexport const AuthInvokerObjectSchema = z.object({\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.object({\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.object({\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 .object({\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 .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.object({\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.object({\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 .object({\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 .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.object({\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.object({\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.object({\n name: z.string().describe(\"SCIM schema name\"),\n attributes: z.array(SCIMAttributeSchema).describe(\"Schema attributes\"),\n});\n\nexport const SCIMAttributeMappingSchema = z.object({\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.object({\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.object({\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.object({\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.object({\n namespace: z.string().optional().describe(\"TailorDB namespace where the user type is defined\"),\n // FIXME: improve TailorDBInstance schema validation\n type: z.object({\n name: z.string(),\n fields: z.any(),\n metadata: z.any(),\n hooks: z.any(),\n validate: z.any(),\n features: z.any(),\n indexes: z.any(),\n files: z.any(),\n permission: z.any(),\n gqlPermission: z.any(),\n _output: z.any(),\n }),\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.object({\n attributes: z.record(z.string(), ValueOperandSchema).optional(),\n attributeList: z.array(z.uuid()).optional(),\n});\n\nconst BeforeLoginHookSchema = z.object({\n handler: z.function(),\n invoker: z.string(),\n});\n\nconst AuthConfigBaseSchema = z.object({\n name: z.string().describe(\"Auth service name\"),\n hooks: z\n .object({\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\";\n\nexport const TailorDBTriggerSchema = z.object({\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.object({\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.object({\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.object({\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.object({\n kind: z.literal(\"incomingWebhook\"),\n response: IncomingWebhookTriggerResponseSchema.optional().describe(\"Response configuration\"),\n});\n\nexport const IdpUserTriggerSchema = z.object({\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.object({\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.object({\n kind: z.enum([\"function\", \"jobFunction\"]),\n body: functionSchema.describe(\"Function implementation\"),\n authInvoker: AuthInvokerSchema.optional().describe(\"Auth invoker for the function execution\"),\n});\n\nexport const GqlOperationSchema = z.object({\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 authInvoker: AuthInvokerSchema.optional().describe(\"Auth invoker for the GraphQL execution\"),\n});\n\nexport const WebhookOperationSchema = z.object({\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(z.string(), z.union([z.string(), z.object({ vault: z.string(), key: z.string() })]))\n .optional()\n .describe(\"HTTP headers for the webhook request\"),\n});\n\nexport const WorkflowOperationSchema = z.preprocess(\n (val) => {\n if (\n val == null ||\n typeof val !== \"object\" ||\n !(\"workflow\" in val) ||\n typeof val.workflow !== \"object\" ||\n val.workflow === null\n ) {\n return val;\n }\n\n const { workflow, ...rest } = val as { workflow: { name: string } };\n return { ...rest, workflowName: workflow.name };\n },\n z.object({\n kind: z.literal(\"workflow\"),\n workflowName: z.string().describe(\"Name of the workflow to execute\"),\n args: z\n .union([z.record(z.string(), z.unknown()), functionSchema])\n .optional()\n .describe(\"Arguments to pass to the workflow\"),\n authInvoker: AuthInvokerSchema.optional().describe(\"Auth invoker for the workflow execution\"),\n }),\n);\n\nconst OperationSchema = z.union([\n FunctionOperationSchema,\n GqlOperationSchema,\n WebhookOperationSchema,\n WorkflowOperationSchema,\n]);\n\nexport const ExecutorSchema = z.object({\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 * as path from \"pathe\";\nimport { loadFilesWithIgnores } from \"@/cli/services/file-loader\";\nimport { logger, styles } from \"@/cli/shared/logger\";\nimport { ExecutorSchema } from \"@/parser/service/executor\";\nimport { isSdkBranded } from \"@/utils/brand\";\nimport type { ExecutorServiceConfig } from \"@/types/app-config\";\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}\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 } = 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(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);\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 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-sdk/plugin/{executor-name}.ts\n pluginExecutors.push({\n executor,\n pluginId: \"plugin-generated\",\n sourceTypeName: undefined,\n });\n }\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
 
2
2
  import { t as mapAllowedValues } from "./field-C4zdJLW5.mjs";
3
- import { t } from "./types-BwGth3a1.mjs";
3
+ import { t } from "./types-CmzfQP_m.mjs";
4
4
 
5
5
  export { t };
@@ -112,8 +112,8 @@ function createTailorField(type, options, fields, values, metadata) {
112
112
  message: `Expected an object: received ${String(value)}`,
113
113
  path
114
114
  });
115
- else if (field.fields && Object.keys(field.fields).length > 0) for (const [fieldName, nestedField] of Object.entries(field.fields)) {
116
- const fieldValue = value?.[fieldName];
115
+ else if (Object.keys(field.fields).length > 0) for (const [fieldName, nestedField] of Object.entries(field.fields)) {
116
+ const fieldValue = value[fieldName];
117
117
  const result = nestedField._parseInternal({
118
118
  value: fieldValue,
119
119
  data,
@@ -369,4 +369,4 @@ const t = {
369
369
 
370
370
  //#endregion
371
371
  export { t };
372
- //# sourceMappingURL=types-BwGth3a1.mjs.map
372
+ //# sourceMappingURL=types-CmzfQP_m.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CmzfQP_m.mjs","names":[],"sources":["../src/configure/types/type.ts"],"sourcesContent":["import { type AllowedValues, type AllowedValuesOutput, mapAllowedValues } from \"./field\";\nimport type {\n DefinedFieldMetadata,\n TailorFieldType,\n TailorToTs,\n FieldMetadata,\n FieldOptions,\n FieldOutput,\n} from \"@/types/field-types\";\nimport type { InferFieldsOutput, Prettify } from \"@/types/helpers\";\nimport type { TailorField as TailorFieldBase } from \"@/types/tailor-field\";\nimport type { TailorUser } from \"@/types/user\";\nimport type { FieldValidateInput } from \"@/types/validation\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n// This helper type intentionally uses `any` as a placeholder for unknown field output.\n// oxlint-disable-next-line no-explicit-any\nexport type TailorAnyField = TailorField<any>;\n\n/**\n * Full TailorField interface with builder methods.\n * Extends the minimal structural interface from types/ with fluent API methods.\n */\nexport interface TailorField<\n Defined extends DefinedFieldMetadata = DefinedFieldMetadata,\n // Generic default output type (kept loose on purpose for library ergonomics).\n // oxlint-disable-next-line no-explicit-any\n Output = any,\n M extends FieldMetadata = FieldMetadata,\n T extends TailorFieldType = TailorFieldType,\n> extends TailorFieldBase<Defined, Output, M, T> {\n readonly fields: Record<string, TailorAnyField>;\n _metadata: M;\n\n /**\n * Set a description for the field\n * @param description - The description text\n * @returns The field with updated metadata\n */\n description<CurrentDefined extends Defined>(\n this: CurrentDefined extends { description: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n description: string,\n ): TailorField<Prettify<CurrentDefined & { description: true }>, Output>;\n\n /**\n * Set a custom type name for enum or nested types\n * @param typeName - The custom type name\n * @returns The field with updated metadata\n */\n typeName<CurrentDefined extends Defined>(\n this: CurrentDefined extends { typeName: unknown }\n ? never\n : CurrentDefined extends { type: \"enum\" | \"nested\" }\n ? TailorField<CurrentDefined, Output>\n : never,\n typeName: string,\n ): TailorField<Prettify<CurrentDefined & { typeName: true }>, Output>;\n\n /**\n * Add validation functions to the field\n * @param validate - One or more validation functions\n * @returns The field with updated metadata\n */\n validate<CurrentDefined extends Defined>(\n this: CurrentDefined extends { validate: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n ...validate: FieldValidateInput<Output>[]\n ): TailorField<Prettify<CurrentDefined & { validate: true }>, Output>;\n\n /**\n * Parse and validate a value against this field's validation rules\n * Returns StandardSchema Result type with success or failure\n * @param args - Value, context data, and user\n * @returns Validation result\n */\n parse(args: FieldParseArgs): StandardSchemaV1.Result<Output>;\n\n /**\n * Internal parse method that tracks field path for nested validation\n * @private\n * @param args - Parse arguments\n * @returns Validation result\n */\n _parseInternal(args: FieldParseInternalArgs): StandardSchemaV1.Result<Output>;\n}\n\n/**\n * Internal shape carried by every runtime field for clone-on-write support.\n *\n * `clone()` is intentionally kept off the public {@link TailorField} interface:\n * adding it there would force `TailorDBField` (which has a differently-typed\n * `clone`) to stop being assignable to `TailorField`, breaking the supported\n * `t.object({ field: db.string() })` usage. Every `t.*` and `db.*` field carries\n * a `clone()` at runtime, so the internal cast in `clone()` is safe.\n */\ntype CloneableField = { clone(): TailorAnyField };\n\nconst regex = {\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,\n date: /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})$/,\n time: /^(?<hour>\\d{2}):(?<minute>\\d{2})$/,\n datetime:\n /^(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})T(?<hour>\\d{2}):(?<minute>\\d{2}):(?<second>\\d{2})(.(?<millisec>\\d{3}))?Z$/,\n decimal: /^-?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/,\n} as const;\n\ntype FieldParseArgs = {\n value: unknown;\n data: unknown;\n user: TailorUser;\n};\n\ntype FieldValidateValueArgs<T extends TailorFieldType> = {\n value: TailorToTs[T];\n data: unknown;\n user: TailorUser;\n pathArray: string[];\n};\n\ntype FieldParseInternalArgs = {\n // Runtime input is unknown/untyped; we validate and narrow it inside the parser.\n // oxlint-disable-next-line no-explicit-any\n value: any;\n data: unknown;\n user: TailorUser;\n pathArray: string[];\n};\n\n/**\n * Creates a new TailorField instance.\n * @param type - Field type\n * @param options - Field options\n * @param fields - Nested fields for object-like types\n * @param values - Allowed values for enum-like fields\n * @param metadata - Pre-built metadata to clone from (used by `clone()`); when\n * given, the mutable containers are deep-copied here and `options`/`values` are\n * ignored for metadata construction\n * @returns A new TailorField\n */\nfunction createTailorField<\n const T extends TailorFieldType,\n const TOptions extends FieldOptions,\n const OutputBase = TailorToTs[T],\n>(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorAnyField>,\n values?: AllowedValues,\n metadata?: FieldMetadata,\n): TailorField<\n { type: T; array: TOptions extends { array: true } ? true : false },\n FieldOutput<OutputBase, TOptions>\n> {\n // When cloning, take ownership of the source metadata and deep-copy its mutable\n // containers (enum value objects and `[fn, message]` validator tuples; validator\n // functions are kept by reference) so no two instances share mutable state.\n const _metadata: FieldMetadata = metadata\n ? {\n ...metadata,\n ...(metadata.allowedValues && {\n allowedValues: metadata.allowedValues.map((v) => ({ ...v })),\n }),\n ...(metadata.validate && {\n validate: metadata.validate.map((v) => (Array.isArray(v) ? ([...v] as typeof v) : v)),\n }),\n }\n : { required: true };\n\n if (!metadata) {\n if (options) {\n if (options.optional === true) {\n _metadata.required = false;\n }\n if (options.array === true) {\n _metadata.array = true;\n }\n }\n if (values) {\n _metadata.allowedValues = mapAllowedValues(values);\n }\n }\n\n /**\n * Validate a single value (not an array element)\n * Used internally for array element validation\n * @param args - Value, context data, and user\n * @returns Array of validation issues\n */\n function validateValue(args: FieldValidateValueArgs<T>): StandardSchemaV1.Issue[] {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n const path = pathArray.length > 0 ? pathArray : undefined;\n\n // Type-specific validation\n switch (type) {\n case \"string\":\n if (typeof value !== \"string\") {\n issues.push({\n message: `Expected a string: received ${String(value)}`,\n path,\n });\n }\n break;\n\n case \"integer\":\n if (typeof value !== \"number\" || !Number.isInteger(value)) {\n issues.push({\n message: `Expected an integer: received ${String(value)}`,\n path,\n });\n }\n break;\n\n case \"float\":\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n issues.push({\n message: `Expected a number: received ${String(value)}`,\n path,\n });\n }\n break;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n issues.push({\n message: `Expected a boolean: received ${String(value)}`,\n path,\n });\n }\n break;\n\n case \"uuid\":\n if (typeof value !== \"string\" || !regex.uuid.test(value)) {\n issues.push({\n message: `Expected a valid UUID: received ${String(value)}`,\n path,\n });\n }\n break;\n case \"date\":\n if (typeof value !== \"string\" || !regex.date.test(value)) {\n issues.push({\n message: `Expected to match \"yyyy-MM-dd\" format: received ${String(value)}`,\n path,\n });\n }\n break;\n case \"datetime\":\n if (typeof value !== \"string\" || !regex.datetime.test(value)) {\n issues.push({\n message: `Expected to match ISO format: received ${String(value)}`,\n path,\n });\n }\n break;\n case \"time\":\n if (typeof value !== \"string\" || !regex.time.test(value)) {\n issues.push({\n message: `Expected to match \"HH:mm\" format: received ${String(value)}`,\n path,\n });\n }\n break;\n case \"decimal\":\n if (typeof value !== \"string\" || !regex.decimal.test(value)) {\n issues.push({\n message: `Expected a decimal string: received ${String(value)}`,\n path,\n });\n }\n break;\n\n case \"enum\":\n if (field._metadata.allowedValues) {\n const allowedValues = field._metadata.allowedValues.map((v) => v.value);\n if (typeof value !== \"string\" || !allowedValues.includes(value)) {\n issues.push({\n message: `Must be one of [${allowedValues.join(\", \")}]: received ${String(value)}`,\n path,\n });\n }\n }\n break;\n\n case \"nested\":\n // Validate nested object fields\n // runtime value may not match the declared type\n // oxlint-disable typescript/no-unnecessary-condition\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n value instanceof Date\n ) {\n // oxlint-enable typescript/no-unnecessary-condition\n issues.push({\n message: `Expected an object: received ${String(value)}`,\n path,\n });\n } else if (Object.keys(field.fields).length > 0) {\n for (const [fieldName, nestedField] of Object.entries(field.fields)) {\n const fieldValue = (value as Record<string, unknown>)[fieldName];\n const result = nestedField._parseInternal({\n value: fieldValue,\n data,\n user,\n pathArray: pathArray.concat(fieldName),\n });\n if (result.issues) {\n issues.push(...result.issues);\n }\n }\n }\n break;\n }\n\n // Custom validation functions\n const validateFns = field._metadata.validate;\n if (validateFns && validateFns.length > 0) {\n for (const validateInput of validateFns) {\n const { fn, message } =\n typeof validateInput === \"function\"\n ? { fn: validateInput, message: \"Validation failed\" }\n : { fn: validateInput[0], message: validateInput[1] };\n\n if (!fn({ value, data, user })) {\n issues.push({\n message,\n path,\n });\n }\n }\n }\n\n return issues;\n }\n\n /**\n * Internal parse method that tracks field path for nested validation\n * @param args - Parse arguments\n * @returns Parse result with value or issues\n */\n function parseInternal(\n args: FieldParseInternalArgs,\n ): StandardSchemaV1.Result<FieldOutput<OutputBase, TOptions>> {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n const path = pathArray.length > 0 ? pathArray : undefined;\n\n // 1. Check required/optional\n const isNullOrUndefined = value === null || value === undefined;\n if (field._metadata.required && isNullOrUndefined) {\n issues.push({\n message: \"Required field is missing\",\n path,\n });\n return { issues };\n }\n\n // If optional and null/undefined, skip further validation and normalize to null\n if (!field._metadata.required && isNullOrUndefined) {\n return { value: value ?? null };\n }\n\n // 2. Check array type\n if (field._metadata.array) {\n if (!Array.isArray(value)) {\n issues.push({\n message: \"Expected an array\",\n path,\n });\n return { issues };\n }\n\n // Validate each array element (without array flag)\n for (let i = 0; i < value.length; i++) {\n const elementValue = value[i];\n const elementPath = pathArray.concat(`[${i}]`);\n\n // Validate element with same type but without array flag\n const elementIssues = validateValue({\n value: elementValue,\n data,\n user,\n pathArray: elementPath,\n });\n if (elementIssues.length > 0) {\n issues.push(...elementIssues);\n }\n }\n\n if (issues.length > 0) {\n return { issues };\n }\n return { value: value as FieldOutput<OutputBase, TOptions> };\n }\n\n // 3. Type-specific validation and custom validation\n const valueIssues = validateValue({ value, data, user, pathArray });\n issues.push(...valueIssues);\n\n if (issues.length > 0) {\n return { issues };\n }\n\n return { value };\n }\n\n /**\n * Clone the field and apply metadata updates to the clone.\n * The original instance is never mutated, so a field shared across places\n * cannot leak metadata between them.\n * @param metadataUpdates - Metadata properties to overwrite on the clone\n * @returns A new field with the updated metadata\n */\n function cloneWith(metadataUpdates: Partial<FieldMetadata>) {\n const cloned = field.clone();\n Object.assign(cloned._metadata, metadataUpdates);\n return cloned;\n }\n\n const field: TailorField<\n { type: T; array: TOptions extends { array: true } ? true : false },\n FieldOutput<OutputBase, TOptions>\n > &\n CloneableField = {\n type,\n fields: fields ?? {},\n _defined: undefined as unknown as {\n type: T;\n array: TOptions extends { array: true } ? true : false;\n },\n _output: undefined as FieldOutput<OutputBase, TOptions>,\n _metadata,\n\n get metadata() {\n return { ...this._metadata };\n },\n\n description(description: string) {\n // Clone-on-write so a shared field instance never leaks metadata.\n // oxlint-disable-next-line no-explicit-any\n return cloneWith({ description }) as any;\n },\n\n typeName(typeName: string) {\n // Clone-on-write so a shared field instance never leaks metadata.\n // oxlint-disable-next-line no-explicit-any\n return cloneWith({ typeName }) as any;\n },\n\n validate(...validateInputs: FieldValidateInput<FieldOutput<OutputBase, TOptions>>[]) {\n // Clone-on-write so a shared field instance never leaks metadata.\n // oxlint-disable-next-line no-explicit-any\n return cloneWith({ validate: validateInputs }) as any;\n },\n\n parse(args: FieldParseArgs): StandardSchemaV1.Result<FieldOutput<OutputBase, TOptions>> {\n return parseInternal({\n value: args.value,\n data: args.data,\n user: args.user,\n pathArray: [],\n });\n },\n\n _parseInternal: parseInternal,\n\n clone() {\n // Deep clone nested object fields so the new instance shares no mutable state.\n let clonedFields = fields;\n if (fields) {\n const cloned: Record<string, TailorAnyField> = {};\n for (const [key, nestedField] of Object.entries(fields)) {\n // Both t.* and db.* fields carry clone() at runtime (see CloneableField).\n cloned[key] = (nestedField as TailorAnyField & CloneableField).clone();\n }\n clonedFields = cloned;\n }\n\n // Rebuild via the factory, handing it this field's metadata so the new\n // parseInternal/validateValue closures rebind to the clone and the factory\n // owns the metadata deep-copy.\n // oxlint-disable-next-line no-explicit-any\n return createTailorField(type, options, clonedFields, values, this._metadata) as any;\n },\n };\n\n return field;\n}\n\n/**\n * Create a UUID field for resolver input/output.\n * @param options - Field configuration options\n * @returns A UUID field\n * @example t.uuid()\n */\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"uuid\", options);\n}\n\n/**\n * Create a string field for resolver input/output.\n * @param options - Field configuration options\n * @returns A string field\n * @example t.string()\n * @example t.string({ optional: true })\n * @example t.string({ array: true })\n */\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"string\", options);\n}\n\n/**\n * Create a boolean field for resolver input/output.\n * @param options - Field configuration options\n * @returns A boolean field\n * @example t.bool()\n */\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"boolean\", options);\n}\n\n/**\n * Create an integer field for resolver input/output.\n * @param options - Field configuration options\n * @returns An integer field\n * @example t.int()\n */\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"integer\", options);\n}\n\n/**\n * Create a float field for resolver input/output.\n * @param options - Field configuration options\n * @returns A float field\n * @example t.float()\n */\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"float\", options);\n}\n\n/**\n * Create a decimal field for resolver input/output (stored as string for precision).\n * @param options - Field configuration options\n * @returns A decimal field\n * @example t.decimal()\n * @example t.decimal({ optional: true })\n */\nfunction decimal<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"decimal\", options);\n}\n\n/**\n * Create a date field for resolver input/output.\n * @param options - Field configuration options\n * @returns A date field\n * @example t.date()\n */\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"date\", options);\n}\n\n/**\n * Create a datetime field for resolver input/output.\n * @param options - Field configuration options\n * @returns A datetime field\n * @example t.datetime()\n */\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"datetime\", options);\n}\n\n/**\n * Create a time field for resolver input/output.\n * @param options - Field configuration options\n * @returns A time field\n * @example t.time()\n */\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createTailorField(\"time\", options);\n}\n\n/**\n * Create an enum field for resolver input/output.\n * @param values - Array of allowed string values\n * @param options - Field configuration options\n * @returns An enum field\n * @example t.enum([\"active\", \"inactive\"])\n */\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n values: V,\n options?: Opt,\n): TailorField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n> {\n return createTailorField<\"enum\", Opt, AllowedValuesOutput<V>>(\"enum\", options, undefined, values);\n}\n\n/**\n * Create a nested object field for resolver input/output.\n * @param fields - Record of field definitions\n * @param options - Field options (optional, array)\n * @returns A nested object field\n * @example\n * // Single object:\n * output: t.object({ name: t.string(), email: t.string() })\n * @example\n * // Array of objects:\n * items: t.object({ name: t.string() }, { array: true })\n */\nfunction object<const F extends Record<string, TailorAnyField>, const Opt extends FieldOptions>(\n fields: F,\n options?: Opt,\n) {\n const objectField = createTailorField(\"nested\", options, fields) as TailorField<\n { type: \"nested\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<InferFieldsOutput<F>, Opt>\n >;\n return objectField;\n}\n\nexport const t = {\n uuid,\n string,\n bool,\n int,\n float,\n decimal,\n date,\n datetime,\n time,\n enum: _enum,\n object,\n};\n"],"mappings":"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"}