@tailor-platform/sdk 0.12.2 → 0.12.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"job-B8jI-poE.mjs","names":["type: TailorFieldType","fields: Record<string, TailorField<any>>","issues: StandardSchemaV1.Issue[]","createField","uuid","string","bool","int","float","date","datetime","time","_enum","values: AllowedValues","options: FieldOptions | undefined","object","unauthenticatedTailorUser: TailorUser","conditions: PermissionCondition[]","values: AllowedValues","options: FieldOptions | undefined","name: string","fields: Fields","indexes: Record<string, { fields: string[]; unique?: boolean }>","validators","description: string | undefined","fieldDef: F","distPath: string | null","createWorkflowJob: CreateWorkflowJobFunction"],"sources":["../src/configure/types/field.ts","../src/configure/types/type.ts","../src/configure/types/user.ts","../src/configure/services/tailordb/permission.ts","../src/configure/services/tailordb/schema.ts","../src/configure/config.ts","../src/configure/services/auth/index.ts","../src/configure/services/workflow/job.ts"],"sourcesContent":["import { type EnumValue } from \"@/configure/types/types\";\n\nexport type AllowedValue = EnumValue;\n\nexport type AllowedValues = [string | EnumValue, ...(string | EnumValue)[]];\n\nexport function mapAllowedValues(values: AllowedValues): AllowedValue[] {\n return values.map((value) => {\n if (typeof value === \"string\") {\n return { value, description: \"\" };\n }\n return { ...value, description: value.description ?? \"\" };\n });\n}\n\nexport type AllowedValuesOutput<V extends AllowedValues> =\n V[number] extends infer T\n ? T extends string\n ? T\n : T extends { value: infer K }\n ? K\n : never\n : never;\n","import {\n type AllowedValues,\n type AllowedValuesOutput,\n mapAllowedValues,\n} from \"./field\";\nimport {\n type TailorFieldType,\n type TailorToTs,\n type FieldMetadata,\n type DefinedFieldMetadata,\n type FieldOptions,\n type FieldOutput,\n} from \"./types\";\nimport type { Prettify, InferFieldsOutput } from \"./helpers\";\nimport type { FieldValidateInput } from \"./validation\";\nimport type { TailorUser } from \"@/configure/types\";\nimport type { TailorFieldInput } from \"@/parser/service/resolver/types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\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} as const;\n\nexport class TailorField<\n const Defined extends DefinedFieldMetadata = DefinedFieldMetadata,\n const Output = any,\n M extends FieldMetadata = FieldMetadata,\n> implements TailorFieldInput {\n protected _metadata: M;\n public readonly _defined: Defined = undefined as unknown as Defined;\n public readonly _output = undefined as Output;\n\n get metadata() {\n return { ...this._metadata };\n }\n\n protected constructor(\n public readonly type: TailorFieldType,\n options?: FieldOptions,\n public readonly fields: Record<string, TailorField<any>> = {},\n values?: AllowedValues,\n ) {\n this._metadata = { required: true } as M;\n if (options) {\n if (options.optional === true) {\n this._metadata.required = false;\n }\n if (options.array === true) {\n this._metadata.array = true;\n }\n }\n if (values) {\n this._metadata.allowedValues = mapAllowedValues(values);\n }\n }\n\n static create<\n const TType extends TailorFieldType,\n const TOptions extends FieldOptions,\n >(\n type: TType,\n options?: TOptions,\n fields?: Record<string, TailorField<any>>,\n values?: AllowedValues,\n ) {\n return new TailorField<\n { type: TType; array: TOptions extends { array: true } ? true : false },\n FieldOutput<TailorToTs[TType], TOptions>\n >(type, options, fields, values);\n }\n\n description<CurrentDefined extends Defined>(\n this: CurrentDefined extends { description: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n description: string,\n ) {\n this._metadata.description = description;\n return this as TailorField<\n Prettify<CurrentDefined & { description: true }>,\n Output\n >;\n }\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 ) {\n this._metadata.typeName = typeName;\n return this as TailorField<\n Prettify<CurrentDefined & { typeName: true }>,\n Output\n >;\n }\n\n validate<CurrentDefined extends Defined>(\n this: CurrentDefined extends { validate: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n ...validate: FieldValidateInput<Output>[]\n ) {\n this._metadata.validate = validate;\n return this as TailorField<\n Prettify<CurrentDefined & { validate: true }>,\n Output\n >;\n }\n\n /**\n * Parse and validate a value against this field's validation rules\n * Returns StandardSchema Result type with success or failure\n */\n parse(args: {\n value: any;\n data: any;\n user: TailorUser;\n }): StandardSchemaV1.Result<Output> {\n return this._parseInternal({\n value: args.value,\n data: args.data,\n user: args.user,\n pathArray: [],\n });\n }\n\n /**\n * Validate a single value (not an array element)\n * Used internally for array element validation\n * @private\n */\n private _validateValue(args: {\n value: any;\n data: any;\n user: TailorUser;\n pathArray: string[];\n }): StandardSchemaV1.Issue[] {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n\n // Type-specific validation\n switch (this.type) {\n case \"string\":\n if (typeof value !== \"string\") {\n issues.push({\n message: `Expected a string: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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:ss\" format`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n break;\n case \"enum\":\n if (this.metadata.allowedValues) {\n const allowedValues = this.metadata.allowedValues.map((v) => v.value);\n if (!allowedValues.includes(value)) {\n issues.push({\n message: `Must be one of [${allowedValues.join(\", \")}]: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n }\n break;\n\n case \"nested\":\n // Validate nested object fields\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n issues.push({\n message: `Expected an object: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n } else if (this.fields && Object.keys(this.fields).length > 0) {\n for (const [fieldName, field] of Object.entries(this.fields)) {\n const fieldValue = value?.[fieldName];\n const result = field._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 = this.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: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n }\n }\n\n return issues;\n }\n\n /**\n * Internal parse method that tracks field path for nested validation\n * @private\n */\n private _parseInternal(args: {\n value: any;\n data: any;\n user: TailorUser;\n pathArray: string[];\n }): StandardSchemaV1.Result<Output> {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n\n // 1. Check required/optional\n const isNullOrUndefined = value === null || value === undefined;\n if (this.metadata.required && isNullOrUndefined) {\n issues.push({\n message: \"Required field is missing\",\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n return { issues };\n }\n\n // If optional and null/undefined, skip further validation\n if (!this.metadata.required && isNullOrUndefined) {\n return { value };\n }\n\n // 2. Check array type\n if (this.metadata.array) {\n if (!Array.isArray(value)) {\n issues.push({\n message: \"Expected an array\",\n path: pathArray.length > 0 ? pathArray : undefined,\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 = this._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 Output };\n }\n\n // 3. Type-specific validation and custom validation\n const valueIssues = this._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\nconst createField = TailorField.create;\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"uuid\", options);\n}\n\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"string\", options);\n}\n\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"boolean\", options);\n}\n\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"integer\", options);\n}\n\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"float\", options);\n}\n\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"date\", options);\n}\n\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"datetime\", options);\n}\n\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"time\", options);\n}\n\nfunction _enum<const V extends AllowedValues>(\n ...values: V\n): TailorField<\n { type: \"enum\"; array: false },\n FieldOutput<AllowedValuesOutput<V>, { optional: false; array: false }>\n>;\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n ...args: [...V, Opt]\n): TailorField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n>;\nfunction _enum(\n ...args: (AllowedValues[number] | FieldOptions)[]\n): TailorField<{ type: \"enum\"; array: boolean }, any> {\n let values: AllowedValues;\n let options: FieldOptions | undefined;\n const lastArg = args[args.length - 1];\n if (typeof lastArg === \"object\" && !(\"value\" in lastArg)) {\n values = args.slice(0, -1) as AllowedValues;\n options = lastArg;\n } else {\n values = args as AllowedValues;\n options = undefined;\n }\n return createField(\"enum\", options, undefined, values);\n}\n\nfunction object<\n const F extends Record<string, TailorField<any>>,\n const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n const objectField = createField(\"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 date,\n datetime,\n time,\n enum: _enum,\n object,\n};\n","// Interfaces for module augmentation\n// Users can extend these via: declare module \"@tailor-platform/sdk\" { interface AttributeMap { ... } }\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AttributeMap {}\nexport interface AttributeList {\n __tuple?: []; // Marker for tuple type\n}\n\nexport type InferredAttributeMap = keyof AttributeMap extends never\n ? Record<string, string | string[] | boolean | boolean[] | undefined>\n : AttributeMap;\n\nexport type InferredAttributeList = AttributeList[\"__tuple\"] extends []\n ? string[]\n : AttributeList[\"__tuple\"];\n\n/** Represents a user in the Tailor platform. */\nexport type TailorUser = {\n /**\n * The ID of the user.\n * For unauthenticated users, this will be a nil UUID.\n */\n id: string;\n /**\n * The type of the user.\n * For unauthenticated users, this will be an empty string.\n */\n type: \"user\" | \"machine_user\" | \"\";\n /** The ID of the workspace the user belongs to. */\n workspaceId: string;\n /**\n * A map of the user's attributes.\n * For unauthenticated users, this will be null.\n */\n attributes: InferredAttributeMap | null;\n /**\n * A list of the user's attributes.\n * For unauthenticated users, this will be an empty array.\n */\n attributeList: InferredAttributeList;\n};\n\n/** Represents an unauthenticated user in the Tailor platform. */\nexport const unauthenticatedTailorUser: TailorUser = {\n id: \"00000000-0000-0000-0000-000000000000\",\n type: \"\",\n workspaceId: \"00000000-0000-0000-0000-000000000000\",\n attributes: null,\n attributeList: [],\n};\n\n// Since there's naming difference between platform and sdk,\n// use this mapping in all scripts to provide variables that match sdk types.\nexport const tailorUserMap = /* js */ `{ id: user.id, type: user.type, workspaceId: user.workspace_id, attributes: user.attribute_map, attributeList: user.attributes }`;\n","import type { InferredAttributeMap } from \"../../types\";\nimport type { ValueOperand } from \"../auth\";\n\nexport interface Permissions {\n record?: StandardTailorTypePermission;\n gql?: StandardTailorTypeGqlPermission;\n}\n\nexport type TailorTypePermission<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = {\n create: readonly ActionPermission<\"record\", User, Type, false>[];\n read: readonly ActionPermission<\"record\", User, Type, false>[];\n update: readonly ActionPermission<\"record\", User, Type, true>[];\n delete: readonly ActionPermission<\"record\", User, Type, false>[];\n};\n\nexport type StandardTailorTypePermission = {\n create: readonly StandardActionPermission<\"record\", false>[];\n read: readonly StandardActionPermission<\"record\", false>[];\n update: readonly StandardActionPermission<\"record\", true>[];\n delete: readonly StandardActionPermission<\"record\", false>[];\n};\n\ntype ActionPermission<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Type extends object = object,\n Update extends boolean = boolean,\n> =\n | {\n conditions:\n | PermissionCondition<Level, User, Update, Type>\n | readonly PermissionCondition<Level, User, Update, Type>[];\n description?: string | undefined;\n permit?: boolean;\n }\n | readonly [\n ...PermissionCondition<Level, User, Update, Type>,\n ...([] | [boolean]),\n ] // single array condition\n | readonly [\n ...PermissionCondition<Level, User, Update, Type>[],\n ...([] | [boolean]),\n ]; // multiple array condition\n\nexport type StandardActionPermission<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n> = {\n conditions: readonly StandardPermissionCondition<Level, Update>[];\n description?: string;\n permit: \"allow\" | \"deny\";\n};\n\nexport type TailorTypeGqlPermission<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = readonly GqlPermissionPolicy<User, Type>[];\n\nexport type StandardTailorTypeGqlPermission =\n readonly StandardGqlPermissionPolicy[];\n\ntype GqlPermissionPolicy<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = {\n conditions: readonly PermissionCondition<\"gql\", User, boolean, Type>[];\n actions: \"all\" | readonly GqlPermissionAction[];\n permit?: boolean;\n description?: string;\n};\n\nexport type StandardGqlPermissionPolicy = {\n conditions: readonly StandardPermissionCondition<\"gql\">[];\n actions: readonly [\"all\"] | readonly GqlPermissionAction[];\n permit: \"allow\" | \"deny\";\n description?: string;\n};\n\ntype GqlPermissionAction =\n | \"read\"\n | \"create\"\n | \"update\"\n | \"delete\"\n | \"aggregate\"\n | \"bulkUpsert\";\n\nexport type PermissionCondition<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Update extends boolean = boolean,\n Type extends object = object,\n> = readonly [\n PermissionOperand<Level, User, Type, Update>,\n PermissionOperator,\n PermissionOperand<Level, User, Type, Update>,\n];\n\nexport type StandardPermissionCondition<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n> = readonly [\n PermissionOperand<\n Level,\n Record<string, unknown>,\n Record<string, unknown>,\n Update\n >,\n StandardPermissionOperator,\n PermissionOperand<\n Level,\n Record<string, unknown>,\n Record<string, unknown>,\n Update\n >,\n];\n\ntype UserOperand<User extends object = InferredAttributeMap> = {\n user:\n | {\n [K in keyof User]: User[K] extends\n | string\n | string[]\n | boolean\n | boolean[]\n ? K\n : never;\n }[keyof User]\n | \"id\"\n | \"_loggedIn\";\n};\n\ntype RecordOperand<\n Type extends object,\n Update extends boolean = false,\n> = Update extends true\n ?\n | { oldRecord: (keyof Type & string) | \"id\" }\n | { newRecord: (keyof Type & string) | \"id\" }\n : { record: (keyof Type & string) | \"id\" };\n\nexport type PermissionOperand<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Type extends object = object,\n Update extends boolean = boolean,\n> =\n | UserOperand<User>\n | ValueOperand\n | (Level extends \"record\" ? RecordOperand<Type, Update> : never);\n\ntype PermissionOperator = \"=\" | \"!=\" | \"in\" | \"not in\";\nconst operatorMap = {\n \"=\": \"eq\",\n \"!=\": \"ne\",\n in: \"in\",\n \"not in\": \"nin\",\n} as const satisfies Record<PermissionOperator, string>;\ntype StandardPermissionOperator =\n (typeof operatorMap)[keyof typeof operatorMap];\n\nfunction normalizeOperand<T extends PermissionOperand<any, any, any, any>>(\n operand: T,\n): T {\n if (typeof operand === \"object\" && \"user\" in operand) {\n return { user: { id: \"_id\" }[operand.user] ?? operand.user } as T;\n }\n return operand;\n}\n\nfunction normalizeConditions<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n>(\n conditions: readonly PermissionCondition<Level, any, Update, any>[],\n): StandardPermissionCondition<Level, Update>[] {\n return conditions.map((cond) => {\n const [left, operator, right] = cond;\n return [\n normalizeOperand(left),\n operatorMap[operator],\n normalizeOperand(right),\n ];\n }) as StandardPermissionCondition<Level, Update>[];\n}\n\nfunction isObjectFormat(\n p: ActionPermission,\n): p is Extract<ActionPermission, { permit?: boolean }> {\n return typeof p === \"object\" && p !== null && \"conditions\" in p;\n}\n\nfunction isSingleArrayConditionFormat(\n cond: Exclude<ActionPermission, { permit?: boolean }>,\n): cond is PermissionCondition {\n return cond.length >= 2 && typeof cond[1] === \"string\"; // Check if middle element is an operator\n}\n\nexport function normalizePermission<\n User extends object = object,\n Type extends object = object,\n>(permission: TailorTypePermission<User, Type>): StandardTailorTypePermission {\n return Object.keys(permission).reduce((acc, action) => {\n (acc as any)[action] = (permission as any)[action].map((p: any) =>\n normalizeActionPermission(p),\n );\n return acc;\n }, {}) as StandardTailorTypePermission;\n}\n\nexport function normalizeGqlPermission<\n const P extends TailorTypeGqlPermission<any>,\n>(permission: P): StandardTailorTypeGqlPermission {\n return permission.map((policy) =>\n normalizeGqlPolicy(policy),\n ) as StandardTailorTypeGqlPermission;\n}\n\nfunction normalizeGqlPolicy(\n policy: GqlPermissionPolicy<any, any>,\n): StandardGqlPermissionPolicy {\n return {\n conditions: policy.conditions ? normalizeConditions(policy.conditions) : [],\n actions: policy.actions === \"all\" ? [\"all\"] : policy.actions,\n permit: policy.permit ? \"allow\" : \"deny\",\n description: policy.description,\n };\n}\nexport function normalizeActionPermission(\n permission: ActionPermission,\n): StandardActionPermission {\n // object format\n if (isObjectFormat(permission)) {\n return {\n conditions: normalizeConditions(\n isSingleArrayConditionFormat(permission.conditions)\n ? [permission.conditions]\n : permission.conditions,\n ),\n permit: permission.permit ? \"allow\" : \"deny\",\n description: permission.description,\n };\n }\n\n if (isSingleArrayConditionFormat(permission)) {\n const [op1, operator, op2, permit] = [...permission, true];\n return {\n conditions: normalizeConditions([[op1, operator, op2]]),\n permit: permit ? \"allow\" : \"deny\",\n };\n }\n\n // Array of conditions format\n const conditions: PermissionCondition[] = [];\n const conditionArray = permission;\n let conditionArrayPermit = true;\n\n for (const item of conditionArray) {\n if (typeof item === \"boolean\") {\n conditionArrayPermit = item;\n continue;\n }\n conditions.push(item as PermissionCondition);\n }\n\n return {\n conditions: normalizeConditions(conditions),\n permit: conditionArrayPermit ? \"allow\" : \"deny\",\n };\n}\n","import { clone } from \"es-toolkit\";\nimport { type InferredAttributeMap, tailorUserMap } from \"@/configure/types\";\nimport {\n type AllowedValues,\n type AllowedValuesOutput,\n} from \"@/configure/types/field\";\nimport { type OperatorFieldConfig } from \"@/configure/types/operator\";\nimport { TailorField } from \"@/configure/types/type\";\nimport {\n type FieldOptions,\n type FieldOutput,\n type TailorFieldType,\n type TailorToTs,\n} from \"@/configure/types/types\";\nimport { type TailorDBTypeConfig } from \"./operator-types\";\nimport {\n type Permissions,\n type TailorTypeGqlPermission,\n type TailorTypePermission,\n normalizePermission,\n normalizeGqlPermission,\n} from \"./permission\";\nimport {\n type DBFieldMetadata,\n type DefinedDBFieldMetadata,\n type Hooks,\n type Hook,\n type SerialConfig,\n type IndexDef,\n type TypeFeatures,\n type ExcludeNestedDBFields,\n} from \"./types\";\nimport type {\n Prettify,\n output,\n InferFieldsOutput,\n} from \"@/configure/types/helpers\";\nimport type {\n FieldValidateInput,\n ValidateConfig,\n Validators,\n} from \"@/configure/types/validation\";\n\ntype RelationType =\n | \"oneToOne\"\n | \"1-1\"\n | \"manyToOne\"\n | \"n-1\"\n | \"N-1\"\n | \"keyOnly\";\n\ninterface RelationConfig<S extends RelationType, T extends TailorDBType> {\n type: S;\n toward: {\n type: T;\n as?: string;\n key?: keyof T[\"fields\"] & string;\n };\n backward?: string;\n}\n\n// Special config variant for self-referencing relations\ntype RelationSelfConfig = {\n type: RelationType;\n toward: {\n type: \"self\";\n as?: string;\n key?: string;\n };\n backward?: string;\n};\n\ninterface PendingSelfRelation {\n type: RelationType;\n as?: string;\n key: string;\n backward: string;\n}\n\nfunction isRelationSelfConfig(\n config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig,\n): config is RelationSelfConfig {\n return config.toward.type === \"self\";\n}\n\ninterface ReferenceConfig<T extends TailorDBType<any, any>> {\n type: TailorDBType<any, any>;\n key: keyof T[\"fields\"] & string;\n nameMap: [string | undefined, string];\n}\n\nexport class TailorDBField<\n const Defined extends DefinedDBFieldMetadata,\n const Output,\n> extends TailorField<Defined, Output, DBFieldMetadata> {\n private _ref: ReferenceConfig<TailorDBType> | undefined = undefined;\n private _pendingSelfRelation: PendingSelfRelation | undefined = undefined;\n\n get reference(): Readonly<ReferenceConfig<TailorDBType>> | undefined {\n return clone(this._ref);\n }\n\n get metadata() {\n return { ...this._metadata };\n }\n\n get config(): OperatorFieldConfig {\n return {\n type: this.type,\n ...this._metadata,\n ...(this.type === \"nested\" && Object.keys(this.fields).length > 0\n ? {\n fields: Object.entries(this.fields).reduce(\n (acc, [key, field]) => {\n acc[key] = (field as TailorDBField<any, any>).config;\n return acc;\n },\n {} as Record<string, OperatorFieldConfig>,\n ),\n }\n : {}),\n validate: this._metadata.validate?.map((v) => {\n const { fn, message } =\n typeof v === \"function\"\n ? { fn: v, message: `failed by \\`${v.toString().trim()}\\`` }\n : { fn: v[0], message: v[1] };\n\n return {\n script: {\n expr: `(${fn.toString().trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n },\n errorMessage: message,\n };\n }),\n hooks: this._metadata.hooks\n ? {\n create: this._metadata.hooks.create\n ? {\n expr: `(${this._metadata.hooks.create\n .toString()\n .trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n }\n : undefined,\n update: this._metadata.hooks.update\n ? {\n expr: `(${this._metadata.hooks.update\n .toString()\n .trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n }\n : undefined,\n }\n : undefined,\n serial: this._metadata.serial\n ? {\n start: this._metadata.serial.start,\n maxValue: this._metadata.serial.maxValue,\n format:\n \"format\" in this._metadata.serial\n ? this._metadata.serial.format\n : undefined,\n }\n : undefined,\n };\n }\n\n private constructor(\n type: TailorFieldType,\n options?: FieldOptions,\n fields?: Record<string, TailorDBField<any, any>>,\n values?: AllowedValues,\n ) {\n super(type, options, fields, values);\n }\n\n static create<\n const T extends TailorFieldType,\n const TOptions extends FieldOptions,\n >(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorDBField<any, any>>,\n values?: AllowedValues,\n ) {\n return new TailorDBField<\n { type: T; array: TOptions extends { array: true } ? true : false },\n FieldOutput<TailorToTs[T], TOptions>\n >(type, options, fields, values);\n }\n\n description<CurrentDefined extends Defined>(\n this: CurrentDefined extends { description: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n description: string,\n ): TailorDBField<Prettify<CurrentDefined & { description: true }>, Output> {\n return super.description(description) as any;\n }\n\n relation<\n S extends RelationType,\n T extends TailorDBType<any, any>,\n CurrentDefined extends Defined,\n >(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: RelationConfig<S, T>,\n ): TailorDBField<\n S extends \"oneToOne\" | \"1-1\"\n ? Prettify<CurrentDefined & { unique: true; index: true; relation: true }>\n : Prettify<CurrentDefined & { index: true; relation: true }>,\n Output\n >;\n\n // Overload: self-referencing variant\n relation<S extends RelationSelfConfig, CurrentDefined extends Defined>(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: S,\n ): TailorDBField<\n S[\"type\"] extends \"oneToOne\" | \"1-1\"\n ? Prettify<CurrentDefined & { unique: true; index: true; relation: true }>\n : Prettify<CurrentDefined & { index: true; relation: true }>,\n Output\n >;\n\n // Implementation\n relation<CurrentDefined extends Defined>(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig,\n ): TailorDBField<DefinedDBFieldMetadata, Output> {\n this._metadata.index = true;\n this._metadata.foreignKey = true;\n this._metadata.unique = [\"oneToOne\", \"1-1\"].includes(config.type);\n\n const key = config.toward.key ?? \"id\";\n const backward = config.backward ?? \"\";\n\n if (isRelationSelfConfig(config)) {\n // Defer resolving the self reference until the type is constructed\n this._pendingSelfRelation = {\n type: config.type,\n as: config.toward.as,\n key,\n backward,\n };\n return this;\n }\n\n this._metadata.foreignKeyType = config.toward.type.name;\n this._metadata.foreignKeyField = key;\n if (config.type === \"keyOnly\") {\n return this;\n }\n\n const forward = config.toward.as;\n this._ref = {\n type: config.toward.type,\n nameMap: [forward, backward],\n key,\n };\n this._metadata.relation = true;\n return this;\n }\n\n index<CurrentDefined extends Defined>(\n this: CurrentDefined extends { index: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ) {\n this._metadata.index = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { index: true }>,\n Output\n >;\n }\n\n unique<CurrentDefined extends Defined>(\n this: CurrentDefined extends { unique: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ) {\n this._metadata.unique = true;\n this._metadata.index = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { unique: true; index: true }>,\n Output\n >;\n }\n\n vector<CurrentDefined extends Defined>(\n this: CurrentDefined extends { vector: unknown }\n ? never\n : CurrentDefined extends { type: \"string\"; array: false }\n ? TailorDBField<CurrentDefined, Output>\n : never,\n ) {\n this._metadata.vector = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { vector: true }>,\n Output\n >;\n }\n\n hooks<CurrentDefined extends Defined, const H extends Hook<unknown, Output>>(\n this: CurrentDefined extends { hooks: unknown }\n ? never\n : CurrentDefined extends { type: \"nested\" }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n hooks: H,\n ) {\n this._metadata.hooks = hooks;\n return this as TailorDBField<\n Prettify<\n CurrentDefined & {\n hooks?: {\n create: H extends { create: unknown } ? true : false;\n update: H extends { update: unknown } ? true : false;\n };\n serial: false;\n }\n >,\n Output\n >;\n }\n\n validate<CurrentDefined extends Defined>(\n this: CurrentDefined extends { validate: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ...validate: FieldValidateInput<Output>[]\n ) {\n this._metadata.validate = validate;\n return this as TailorDBField<\n Prettify<CurrentDefined & { validate: true }>,\n Output\n >;\n }\n\n serial<CurrentDefined extends Defined>(\n this: CurrentDefined extends { serial: unknown }\n ? never\n : Output extends null\n ? never\n : CurrentDefined extends { type: \"integer\" | \"string\"; array: false }\n ? TailorDBField<CurrentDefined, Output>\n : never,\n config: SerialConfig<CurrentDefined[\"type\"] & (\"integer\" | \"string\")>,\n ) {\n (this as TailorDBField<CurrentDefined, Output>)._metadata.serial = config;\n return this as TailorDBField<\n Prettify<\n CurrentDefined & {\n serial: true;\n hooks: { create: false; update: false };\n }\n >,\n Output\n >;\n }\n\n /**\n * Clone the field with optional overrides for field options\n * @param options - Optional field options to override\n * @returns A new TailorDBField instance with the same configuration\n */\n clone<const NewOpt extends FieldOptions>(\n options?: NewOpt,\n ): TailorDBField<\n Prettify<\n Omit<Defined, \"array\"> & {\n array: NewOpt extends { array: true } ? true : Defined[\"array\"];\n }\n >,\n FieldOutput<TailorToTs[Defined[\"type\"]], NewOpt>\n > {\n // Create a clone using Object.create to preserve prototype chain\n const clonedField = Object.create(\n Object.getPrototypeOf(this),\n ) as TailorDBField<Defined, Output>;\n\n // Copy all properties\n Object.assign(clonedField, {\n type: this.type,\n fields: this.fields,\n _defined: this._defined,\n _output: this._output,\n });\n\n // Clone and merge metadata with new options\n clonedField._metadata = { ...this._metadata };\n if (options) {\n if (options.optional !== undefined) {\n clonedField._metadata.required = !options.optional;\n }\n if (options.array !== undefined) {\n clonedField._metadata.array = options.array;\n }\n }\n\n // Copy internal state\n if (this._ref) {\n clonedField._ref = clone(this._ref);\n }\n if (this._pendingSelfRelation) {\n clonedField._pendingSelfRelation = { ...this._pendingSelfRelation };\n }\n\n return clonedField as TailorDBField<any, any>;\n }\n}\n\nconst createField = TailorDBField.create;\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"uuid\", options);\n}\n\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"string\", options);\n}\n\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"boolean\", options);\n}\n\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"integer\", options);\n}\n\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"float\", options);\n}\n\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"date\", options);\n}\n\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"datetime\", options);\n}\n\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"time\", options);\n}\n\nfunction _enum<const V extends AllowedValues>(\n ...values: V\n): TailorDBField<\n { type: \"enum\"; array: false },\n FieldOutput<AllowedValuesOutput<V>, { optional: false; array: false }>\n>;\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n ...args: [...V, Opt]\n): TailorDBField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n>;\nfunction _enum(\n ...args: (AllowedValues[number] | FieldOptions)[]\n): TailorDBField<{ type: \"enum\"; array: boolean }, any> {\n let values: AllowedValues;\n let options: FieldOptions | undefined;\n const lastArg = args[args.length - 1];\n if (typeof lastArg === \"object\" && !(\"value\" in lastArg)) {\n values = args.slice(0, -1) as AllowedValues;\n options = lastArg;\n } else {\n values = args as AllowedValues;\n options = undefined;\n }\n return createField(\"enum\", options, undefined, values);\n}\n\nfunction object<\n const F extends Record<string, TailorDBField<any, any>> &\n ExcludeNestedDBFields<F>,\n const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n return createField(\"nested\", options, fields) as unknown as TailorDBField<\n { type: \"nested\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<InferFieldsOutput<F>, Opt>\n >;\n}\n\nexport class TailorDBType<\n const Fields extends Record<string, TailorDBField<any, any>> = any,\n User extends object = InferredAttributeMap,\n> {\n public readonly _output = null as unknown as InferFieldsOutput<Fields>;\n public _description?: string;\n public readonly referenced: Record<string, [TailorDBType<any, any>, string]> =\n {};\n private _settings: TypeFeatures = {};\n private _indexes: IndexDef<this>[] = [];\n private _permissions: Permissions = {};\n private _files: Record<string, string> = {};\n\n constructor(\n public readonly name: string,\n public readonly fields: Fields,\n options: { pluralForm?: string; description?: string },\n ) {\n this._description = options.description;\n\n if (options.pluralForm) {\n if (name === options.pluralForm) {\n throw new Error(\n `The name and the plural form must be different. name=${name}`,\n );\n }\n this._settings.pluralForm = options.pluralForm;\n }\n\n // Resolve any pending self-references now that the type is constructed\n Object.entries(this.fields).forEach(([fieldName, field]) => {\n const f = field as unknown as {\n _pendingSelfRelation: PendingSelfRelation | undefined;\n _metadata: DBFieldMetadata;\n _ref: ReferenceConfig<TailorDBType<any, any>>;\n };\n const pending = f._pendingSelfRelation;\n if (pending) {\n f._metadata.foreignKeyType = this.name;\n f._metadata.foreignKeyField = pending.key;\n if (pending.type === \"keyOnly\") {\n return this;\n }\n\n const forward = pending.as ?? fieldName.replace(/(ID|Id|id)$/u, \"\");\n // Type conversion for manipulating private _ref.\n f._ref = {\n type: this,\n nameMap: [forward, pending.backward],\n key: pending.key,\n };\n }\n });\n\n Object.entries(this.fields).forEach(([fieldName, field]) => {\n if (field.reference && field.reference !== undefined) {\n const ref = field.reference;\n if (ref.type) {\n const backwardFieldName = ref.nameMap?.[1]; // Get backward field name from nameMap\n\n // Store backward reference with the field name (can be undefined)\n // The actual backward field name will be generated in the CLI layer\n if (backwardFieldName !== undefined) {\n ref.type.referenced[backwardFieldName] = [this, fieldName];\n }\n }\n }\n });\n }\n\n get metadata(): TailorDBTypeConfig {\n const metadataFields = Object.entries(this.fields).reduce(\n (acc, [key, field]) => {\n acc[key] = field.config;\n return acc;\n },\n {} as Record<string, OperatorFieldConfig>,\n );\n\n // Convert indexes to the format expected by the manifest\n const indexes: Record<string, { fields: string[]; unique?: boolean }> = {};\n if (this._indexes && this._indexes.length > 0) {\n this._indexes.forEach((index) => {\n const fieldNames = index.fields.map((field) => String(field));\n const key = index.name || `idx_${fieldNames.join(\"_\")}`;\n indexes[key] = {\n fields: fieldNames,\n unique: index.unique,\n };\n });\n }\n\n return {\n name: this.name,\n schema: {\n description: this._description,\n extends: false,\n fields: metadataFields,\n settings: this._settings,\n permissions: this._permissions,\n files: this._files,\n ...(Object.keys(indexes).length > 0 && { indexes }),\n },\n };\n }\n\n hooks(hooks: Hooks<Fields>) {\n Object.entries(hooks).forEach(([fieldName, fieldHooks]: [string, any]) => {\n (this.fields[fieldName] as any).hooks(fieldHooks);\n });\n return this;\n }\n\n validate(validators: Validators<Fields>) {\n Object.entries(validators).forEach(([fieldName, fieldValidators]) => {\n const field = this.fields[fieldName] as TailorDBField<any, any>;\n\n const validators = fieldValidators as\n | FieldValidateInput<unknown>\n | FieldValidateInput<unknown>[];\n\n const isValidateConfig = (v: unknown): v is ValidateConfig<unknown> => {\n return Array.isArray(v) && v.length === 2 && typeof v[1] === \"string\";\n };\n\n if (Array.isArray(validators)) {\n if (isValidateConfig(validators)) {\n field.validate(validators);\n } else {\n field.validate(...validators);\n }\n } else {\n field.validate(validators);\n }\n });\n return this;\n }\n\n features(features: Omit<TypeFeatures, \"pluralForm\">) {\n this._settings = { ...this._settings, ...features };\n return this;\n }\n\n indexes(...indexes: IndexDef<this>[]) {\n this._indexes = indexes;\n return this;\n }\n\n files<const F extends string>(\n files: Record<F, string> & Partial<Record<keyof output<this>, never>>,\n ) {\n this._files = files;\n return this;\n }\n\n permission<\n U extends object = User,\n P extends TailorTypePermission<U, output<this>> = TailorTypePermission<\n U,\n output<this>\n >,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n ret._permissions.record = normalizePermission(permission);\n return ret;\n }\n\n gqlPermission<\n U extends object = User,\n P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n ret._permissions.gql = normalizeGqlPermission(permission);\n return ret;\n }\n\n description(description: string) {\n this._description = description;\n return this;\n }\n\n /**\n * Pick specific fields from the type\n * @param keys - Array of field keys to pick\n * @param options - Optional field options to apply to picked fields\n * @returns An object containing only the specified fields\n */\n pickFields<K extends keyof Fields, const Opt extends FieldOptions>(\n keys: K[],\n options: Opt,\n ) {\n const result = {} as Record<K, TailorDBField<any, any>>;\n for (const key of keys) {\n if (options) {\n result[key] = this.fields[key].clone(options);\n } else {\n result[key] = this.fields[key];\n }\n }\n return result as {\n [P in K]: Fields[P] extends TailorDBField<infer D, infer _O>\n ? TailorDBField<\n Omit<D, \"array\"> & {\n array: Opt extends { array: true } ? true : D[\"array\"];\n },\n FieldOutput<TailorToTs[D[\"type\"]], Opt>\n >\n : never;\n };\n }\n\n /**\n * Omit specific fields from the type\n * @param keys - Array of field keys to omit\n * @returns An object containing all fields except the specified ones\n */\n omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K> {\n const keysSet = new Set(keys);\n const result = {} as Record<string, TailorDBField<any, any>>;\n for (const key in this.fields) {\n if (\n Object.hasOwn(this.fields, key) &&\n !keysSet.has(key as unknown as K)\n ) {\n result[key] = this.fields[key];\n }\n }\n return result as Omit<Fields, K>;\n }\n}\n\nexport type TailorDBInstance<\n Fields extends Record<string, TailorDBField<any, any>> = any,\n User extends object = InferredAttributeMap,\n> = InstanceType<typeof TailorDBType<Fields, User>>;\n\nconst idField = uuid();\ntype idField = typeof idField;\ntype DBType<\n F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n> = TailorDBInstance<{ id: idField } & F>;\n\n/**\n * Creates a new database type with the specified fields\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n */\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(name: string | [string, string], fields: F): DBType<F>;\n/**\n * Creates a new database type with the specified fields and description\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param description - A description of the type\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n */\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(name: string | [string, string], description: string, fields: F): DBType<F>;\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(\n name: string | [string, string],\n fieldsOrDescription: string | F,\n fields?: F,\n): DBType<F> {\n const typeName = Array.isArray(name) ? name[0] : name;\n const pluralForm = Array.isArray(name) ? name[1] : undefined;\n\n let description: string | undefined;\n let fieldDef: F;\n if (typeof fieldsOrDescription === \"string\") {\n description = fieldsOrDescription;\n fieldDef = fields as F;\n } else {\n fieldDef = fieldsOrDescription;\n }\n return new TailorDBType<{ id: idField } & F>(\n typeName,\n {\n id: idField,\n ...fieldDef,\n },\n { pluralForm, description },\n ) as DBType<F>;\n}\n\nexport const db = {\n type: dbType,\n uuid,\n string,\n bool,\n int,\n float,\n date,\n datetime,\n time,\n enum: _enum,\n object,\n fields: {\n timestamps: () => ({\n createdAt: datetime()\n .hooks({ create: () => new Date().toISOString() })\n .description(\"Record creation timestamp\"),\n updatedAt: datetime({ optional: true })\n .hooks({ update: () => new Date().toISOString() })\n .description(\"Record last update timestamp\"),\n }),\n },\n};\n","import type { AuthConfig } from \"@/configure/services/auth\";\nimport type { ExecutorServiceInput } from \"@/configure/services/executor/types\";\nimport type { IdPConfig } from \"@/configure/services/idp\";\nimport type { ResolverServiceInput } from \"@/configure/services/resolver/types\";\nimport type { StaticWebsiteConfig } from \"@/configure/services/staticwebsite\";\nimport type { TailorDBServiceInput } from \"@/configure/services/tailordb/types\";\nimport type { WorkflowServiceInput } from \"@/configure/services/workflow/types\";\nimport type { GeneratorConfig } from \"@/parser/generator-config/types\";\n\nexport interface AppConfig<\n Auth extends AuthConfig = AuthConfig,\n Idp extends IdPConfig[] = IdPConfig[],\n StaticWebsites extends StaticWebsiteConfig[] = StaticWebsiteConfig[],\n Env extends Record<string, string | number | boolean> = Record<\n string,\n string | number | boolean\n >,\n> {\n name: string;\n env?: Env;\n cors?: string[];\n allowedIPAddresses?: string[];\n disableIntrospection?: boolean;\n db?: TailorDBServiceInput;\n resolver?: ResolverServiceInput;\n idp?: Idp;\n auth?: Auth;\n executor?: ExecutorServiceInput;\n workflow?: WorkflowServiceInput;\n staticWebsites?: StaticWebsites;\n}\n\nlet distPath: string | null = null;\nexport const getDistDir = (): string => {\n const configured = process.env.TAILOR_SDK_OUTPUT_DIR;\n if (configured && configured !== distPath) {\n distPath = configured;\n } else if (distPath === null) {\n distPath = configured || \".tailor-sdk\";\n }\n return distPath;\n};\n\nexport function defineConfig<\n const Config extends AppConfig &\n // type-fest's Exact works recursively and causes type errors, so we use a shallow version here.\n Record<Exclude<keyof Config, keyof AppConfig>, never>,\n>(config: Config) {\n return config;\n}\n\nexport function defineGenerators(...configs: GeneratorConfig[]) {\n return configs;\n}\n","import { type TailorDBInstance } from \"../tailordb/schema\";\nimport type {\n AuthServiceInput,\n UserAttributeListKey,\n UserAttributeMap,\n} from \"@/parser/service/auth/types\";\n\ndeclare const authDefinitionBrand: unique symbol;\ntype AuthDefinitionBrand = { readonly [authDefinitionBrand]: true };\n\nexport type {\n OIDC,\n SAML,\n IDToken,\n BuiltinIdP,\n IdProviderConfig,\n OAuth2ClientGrantType,\n OAuth2Client,\n SCIMAuthorization,\n SCIMAttributeType,\n SCIMAttribute,\n SCIMAttributeMapping,\n SCIMResource,\n SCIMConfig,\n TenantProviderConfig,\n ValueOperand,\n UsernameFieldKey,\n UserAttributeKey,\n UserAttributeListKey,\n UserAttributeMap,\n AuthServiceInput,\n} from \"@/parser/service/auth/types\";\n\nexport function defineAuth<\n const Name extends string,\n const User extends TailorDBInstance,\n const AttributeMap extends UserAttributeMap<User>,\n const AttributeList extends UserAttributeListKey<User>[],\n const MachineUserNames extends string,\n>(\n name: Name,\n config: AuthServiceInput<User, AttributeMap, AttributeList, MachineUserNames>,\n) {\n const result = {\n ...config,\n name,\n invoker<M extends MachineUserNames>(machineUser: M) {\n return { authName: name, machineUser } as const;\n },\n } as const satisfies AuthServiceInput<\n User,\n AttributeMap,\n AttributeList,\n MachineUserNames\n > & {\n name: string;\n invoker<M extends MachineUserNames>(\n machineUser: M,\n ): { authName: string; machineUser: M };\n };\n\n return result as typeof result & AuthDefinitionBrand;\n}\n\nexport type AuthExternalConfig = { name: string; external: true };\n\nexport type AuthOwnConfig = ReturnType<\n typeof defineAuth<string, any, any, any, string>\n>;\n\nexport type AuthConfig = AuthOwnConfig | AuthExternalConfig;\n","/**\n * Symbol used to brand WorkflowJob objects created by createWorkflowJob.\n * This enables reliable runtime detection of workflow jobs regardless of\n * how they were imported or assigned (variable reassignment, destructuring, etc.)\n */\nexport const WORKFLOW_JOB_BRAND = Symbol.for(\"tailor:workflow-job\");\n\n/**\n * Replace hyphens and spaces with underscores in a string type.\n * This matches the runtime behavior of `jobName.replace(/[-\\s]/g, \"_\")`.\n */\ntype ReplaceWithUnderscore<S extends string> = S extends `${infer A}-${infer B}`\n ? ReplaceWithUnderscore<`${A}_${B}`>\n : S extends `${infer A} ${infer B}`\n ? ReplaceWithUnderscore<`${A}_${B}`>\n : S;\n\ntype JobsFromDeps<\n Deps extends readonly WorkflowJob<any, any, any, any>[],\n Set extends string = never,\n> = Deps extends [\n infer First extends WorkflowJob<any, any, any, any>,\n ...infer Rest extends readonly WorkflowJob<any, any, any, any>[],\n]\n ? First[\"name\"] extends Set\n ? JobsFromDeps<Rest, Set> // Skip duplicate jobs\n : First extends WorkflowJob<infer N, infer I, infer O, infer NestedDeps>\n ? {\n [K in ReplaceWithUnderscore<N>]: [I] extends [undefined]\n ? () => Promise<O>\n : (input: I) => Promise<O>;\n } & (NestedDeps extends []\n ? object\n : JobsFromDeps<NestedDeps, Set | N>) &\n JobsFromDeps<Rest, Set | N>\n : JobsFromDeps<Rest, Set>\n : object;\n\nexport interface WorkflowJob<\n Name extends string = string,\n Input = any,\n Output = any,\n Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n> {\n readonly [WORKFLOW_JOB_BRAND]?: true;\n name: Name;\n deps?: Deps;\n body: (input: Input, jobs: JobsFromDeps<Deps>) => Output | Promise<Output>;\n}\n\ntype WorkflowJobBody<\n I,\n O,\n Deps extends readonly WorkflowJob<any, any, any, any>[],\n> = (input: I, jobs: JobsFromDeps<Deps>) => O | Promise<O>;\n\ninterface CreateWorkflowJobFunction {\n <\n const Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n const Name extends string = string,\n const Body extends WorkflowJobBody<any, any, Deps> = WorkflowJobBody<\n any,\n any,\n Deps\n >,\n >(\n config: Deps extends readonly [any, ...any[]]\n ? {\n readonly name: Name;\n readonly deps: Deps;\n readonly body: Body;\n }\n : {\n readonly name: Name;\n readonly deps?: never;\n readonly body: Body;\n },\n ): WorkflowJob<Name, Parameters<Body>[0], ReturnType<Body>, Deps>;\n}\n\nexport const createWorkflowJob: CreateWorkflowJobFunction = function <\n const Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n const Name extends string = string,\n const Body extends WorkflowJobBody<any, any, Deps> = WorkflowJobBody<\n any,\n any,\n Deps\n >,\n>(\n config: Deps extends readonly [any, ...any[]]\n ? {\n readonly name: Name;\n readonly deps: Deps;\n readonly body: Body;\n }\n : {\n readonly name: Name;\n readonly deps?: never;\n readonly body: Body;\n },\n) {\n return {\n [WORKFLOW_JOB_BRAND]: true,\n name: config.name,\n deps: (config as any).deps,\n body: config.body,\n } as WorkflowJob<Name, Parameters<Body>[0], ReturnType<Body>, Deps>;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"job-wYkb6yMl.mjs","names":["type: TailorFieldType","fields: Record<string, TailorField<any>>","issues: StandardSchemaV1.Issue[]","createField","uuid","string","bool","int","float","date","datetime","time","_enum","values: AllowedValues","options: FieldOptions | undefined","object","unauthenticatedTailorUser: TailorUser","conditions: PermissionCondition[]","values: AllowedValues","options: FieldOptions | undefined","name: string","fields: Fields","indexes: Record<string, { fields: string[]; unique?: boolean }>","validators","description: string | undefined","fieldDef: F","distPath: string | null","createWorkflowJob: CreateWorkflowJobFunction"],"sources":["../src/configure/types/field.ts","../src/configure/types/type.ts","../src/configure/types/user.ts","../src/configure/services/tailordb/permission.ts","../src/configure/services/tailordb/schema.ts","../src/configure/config.ts","../src/configure/services/auth/index.ts","../src/configure/services/workflow/job.ts"],"sourcesContent":["import { type EnumValue } from \"@/configure/types/types\";\n\nexport type AllowedValue = EnumValue;\n\nexport type AllowedValues = [string | EnumValue, ...(string | EnumValue)[]];\n\nexport function mapAllowedValues(values: AllowedValues): AllowedValue[] {\n return values.map((value) => {\n if (typeof value === \"string\") {\n return { value, description: \"\" };\n }\n return { ...value, description: value.description ?? \"\" };\n });\n}\n\nexport type AllowedValuesOutput<V extends AllowedValues> =\n V[number] extends infer T\n ? T extends string\n ? T\n : T extends { value: infer K }\n ? K\n : never\n : never;\n","import {\n type AllowedValues,\n type AllowedValuesOutput,\n mapAllowedValues,\n} from \"./field\";\nimport {\n type TailorFieldType,\n type TailorToTs,\n type FieldMetadata,\n type DefinedFieldMetadata,\n type FieldOptions,\n type FieldOutput,\n} from \"./types\";\nimport type { Prettify, InferFieldsOutput } from \"./helpers\";\nimport type { FieldValidateInput } from \"./validation\";\nimport type { TailorUser } from \"@/configure/types\";\nimport type { TailorFieldInput } from \"@/parser/service/resolver/types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\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} as const;\n\nexport class TailorField<\n const Defined extends DefinedFieldMetadata = DefinedFieldMetadata,\n const Output = any,\n M extends FieldMetadata = FieldMetadata,\n> implements TailorFieldInput {\n protected _metadata: M;\n public readonly _defined: Defined = undefined as unknown as Defined;\n public readonly _output = undefined as Output;\n\n get metadata() {\n return { ...this._metadata };\n }\n\n protected constructor(\n public readonly type: TailorFieldType,\n options?: FieldOptions,\n public readonly fields: Record<string, TailorField<any>> = {},\n values?: AllowedValues,\n ) {\n this._metadata = { required: true } as M;\n if (options) {\n if (options.optional === true) {\n this._metadata.required = false;\n }\n if (options.array === true) {\n this._metadata.array = true;\n }\n }\n if (values) {\n this._metadata.allowedValues = mapAllowedValues(values);\n }\n }\n\n static create<\n const TType extends TailorFieldType,\n const TOptions extends FieldOptions,\n >(\n type: TType,\n options?: TOptions,\n fields?: Record<string, TailorField<any>>,\n values?: AllowedValues,\n ) {\n return new TailorField<\n { type: TType; array: TOptions extends { array: true } ? true : false },\n FieldOutput<TailorToTs[TType], TOptions>\n >(type, options, fields, values);\n }\n\n description<CurrentDefined extends Defined>(\n this: CurrentDefined extends { description: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n description: string,\n ) {\n this._metadata.description = description;\n return this as TailorField<\n Prettify<CurrentDefined & { description: true }>,\n Output\n >;\n }\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 ) {\n this._metadata.typeName = typeName;\n return this as TailorField<\n Prettify<CurrentDefined & { typeName: true }>,\n Output\n >;\n }\n\n validate<CurrentDefined extends Defined>(\n this: CurrentDefined extends { validate: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n ...validate: FieldValidateInput<Output>[]\n ) {\n this._metadata.validate = validate;\n return this as TailorField<\n Prettify<CurrentDefined & { validate: true }>,\n Output\n >;\n }\n\n /**\n * Parse and validate a value against this field's validation rules\n * Returns StandardSchema Result type with success or failure\n */\n parse(args: {\n value: any;\n data: any;\n user: TailorUser;\n }): StandardSchemaV1.Result<Output> {\n return this._parseInternal({\n value: args.value,\n data: args.data,\n user: args.user,\n pathArray: [],\n });\n }\n\n /**\n * Validate a single value (not an array element)\n * Used internally for array element validation\n * @private\n */\n private _validateValue(args: {\n value: any;\n data: any;\n user: TailorUser;\n pathArray: string[];\n }): StandardSchemaV1.Issue[] {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n\n // Type-specific validation\n switch (this.type) {\n case \"string\":\n if (typeof value !== \"string\") {\n issues.push({\n message: `Expected a string: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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: pathArray.length > 0 ? pathArray : undefined,\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:ss\" format`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n break;\n case \"enum\":\n if (this.metadata.allowedValues) {\n const allowedValues = this.metadata.allowedValues.map((v) => v.value);\n if (!allowedValues.includes(value)) {\n issues.push({\n message: `Must be one of [${allowedValues.join(\", \")}]: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n }\n break;\n\n case \"nested\":\n // Validate nested object fields\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n issues.push({\n message: `Expected an object: received ${String(value)}`,\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n } else if (this.fields && Object.keys(this.fields).length > 0) {\n for (const [fieldName, field] of Object.entries(this.fields)) {\n const fieldValue = value?.[fieldName];\n const result = field._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 = this.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: pathArray.length > 0 ? pathArray : undefined,\n });\n }\n }\n }\n\n return issues;\n }\n\n /**\n * Internal parse method that tracks field path for nested validation\n * @private\n */\n private _parseInternal(args: {\n value: any;\n data: any;\n user: TailorUser;\n pathArray: string[];\n }): StandardSchemaV1.Result<Output> {\n const { value, data, user, pathArray } = args;\n const issues: StandardSchemaV1.Issue[] = [];\n\n // 1. Check required/optional\n const isNullOrUndefined = value === null || value === undefined;\n if (this.metadata.required && isNullOrUndefined) {\n issues.push({\n message: \"Required field is missing\",\n path: pathArray.length > 0 ? pathArray : undefined,\n });\n return { issues };\n }\n\n // If optional and null/undefined, skip further validation\n if (!this.metadata.required && isNullOrUndefined) {\n return { value };\n }\n\n // 2. Check array type\n if (this.metadata.array) {\n if (!Array.isArray(value)) {\n issues.push({\n message: \"Expected an array\",\n path: pathArray.length > 0 ? pathArray : undefined,\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 = this._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 Output };\n }\n\n // 3. Type-specific validation and custom validation\n const valueIssues = this._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\nconst createField = TailorField.create;\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"uuid\", options);\n}\n\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"string\", options);\n}\n\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"boolean\", options);\n}\n\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"integer\", options);\n}\n\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"float\", options);\n}\n\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"date\", options);\n}\n\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"datetime\", options);\n}\n\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"time\", options);\n}\n\nfunction _enum<const V extends AllowedValues>(\n ...values: V\n): TailorField<\n { type: \"enum\"; array: false },\n FieldOutput<AllowedValuesOutput<V>, { optional: false; array: false }>\n>;\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n ...args: [...V, Opt]\n): TailorField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n>;\nfunction _enum(\n ...args: (AllowedValues[number] | FieldOptions)[]\n): TailorField<{ type: \"enum\"; array: boolean }, any> {\n let values: AllowedValues;\n let options: FieldOptions | undefined;\n const lastArg = args[args.length - 1];\n if (typeof lastArg === \"object\" && !(\"value\" in lastArg)) {\n values = args.slice(0, -1) as AllowedValues;\n options = lastArg;\n } else {\n values = args as AllowedValues;\n options = undefined;\n }\n return createField(\"enum\", options, undefined, values);\n}\n\nfunction object<\n const F extends Record<string, TailorField<any>>,\n const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n const objectField = createField(\"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 date,\n datetime,\n time,\n enum: _enum,\n object,\n};\n","// Interfaces for module augmentation\n// Users can extend these via: declare module \"@tailor-platform/sdk\" { interface AttributeMap { ... } }\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AttributeMap {}\nexport interface AttributeList {\n __tuple?: []; // Marker for tuple type\n}\n\nexport type InferredAttributeMap = keyof AttributeMap extends never\n ? Record<string, string | string[] | boolean | boolean[] | undefined>\n : AttributeMap;\n\nexport type InferredAttributeList = AttributeList[\"__tuple\"] extends []\n ? string[]\n : AttributeList[\"__tuple\"];\n\n/** Represents a user in the Tailor platform. */\nexport type TailorUser = {\n /**\n * The ID of the user.\n * For unauthenticated users, this will be a nil UUID.\n */\n id: string;\n /**\n * The type of the user.\n * For unauthenticated users, this will be an empty string.\n */\n type: \"user\" | \"machine_user\" | \"\";\n /** The ID of the workspace the user belongs to. */\n workspaceId: string;\n /**\n * A map of the user's attributes.\n * For unauthenticated users, this will be null.\n */\n attributes: InferredAttributeMap | null;\n /**\n * A list of the user's attributes.\n * For unauthenticated users, this will be an empty array.\n */\n attributeList: InferredAttributeList;\n};\n\n/** Represents an unauthenticated user in the Tailor platform. */\nexport const unauthenticatedTailorUser: TailorUser = {\n id: \"00000000-0000-0000-0000-000000000000\",\n type: \"\",\n workspaceId: \"00000000-0000-0000-0000-000000000000\",\n attributes: null,\n attributeList: [],\n};\n\n// Since there's naming difference between platform and sdk,\n// use this mapping in all scripts to provide variables that match sdk types.\nexport const tailorUserMap = /* js */ `{ id: user.id, type: user.type, workspaceId: user.workspace_id, attributes: user.attribute_map, attributeList: user.attributes }`;\n","import type { InferredAttributeMap } from \"../../types\";\nimport type { ValueOperand } from \"../auth\";\n\nexport interface Permissions {\n record?: StandardTailorTypePermission;\n gql?: StandardTailorTypeGqlPermission;\n}\n\nexport type TailorTypePermission<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = {\n create: readonly ActionPermission<\"record\", User, Type, false>[];\n read: readonly ActionPermission<\"record\", User, Type, false>[];\n update: readonly ActionPermission<\"record\", User, Type, true>[];\n delete: readonly ActionPermission<\"record\", User, Type, false>[];\n};\n\nexport type StandardTailorTypePermission = {\n create: readonly StandardActionPermission<\"record\", false>[];\n read: readonly StandardActionPermission<\"record\", false>[];\n update: readonly StandardActionPermission<\"record\", true>[];\n delete: readonly StandardActionPermission<\"record\", false>[];\n};\n\ntype ActionPermission<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Type extends object = object,\n Update extends boolean = boolean,\n> =\n | {\n conditions:\n | PermissionCondition<Level, User, Update, Type>\n | readonly PermissionCondition<Level, User, Update, Type>[];\n description?: string | undefined;\n permit?: boolean;\n }\n | readonly [\n ...PermissionCondition<Level, User, Update, Type>,\n ...([] | [boolean]),\n ] // single array condition\n | readonly [\n ...PermissionCondition<Level, User, Update, Type>[],\n ...([] | [boolean]),\n ]; // multiple array condition\n\nexport type StandardActionPermission<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n> = {\n conditions: readonly StandardPermissionCondition<Level, Update>[];\n description?: string;\n permit: \"allow\" | \"deny\";\n};\n\nexport type TailorTypeGqlPermission<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = readonly GqlPermissionPolicy<User, Type>[];\n\nexport type StandardTailorTypeGqlPermission =\n readonly StandardGqlPermissionPolicy[];\n\ntype GqlPermissionPolicy<\n User extends object = InferredAttributeMap,\n Type extends object = object,\n> = {\n conditions: readonly PermissionCondition<\"gql\", User, boolean, Type>[];\n actions: \"all\" | readonly GqlPermissionAction[];\n permit?: boolean;\n description?: string;\n};\n\nexport type StandardGqlPermissionPolicy = {\n conditions: readonly StandardPermissionCondition<\"gql\">[];\n actions: readonly [\"all\"] | readonly GqlPermissionAction[];\n permit: \"allow\" | \"deny\";\n description?: string;\n};\n\ntype GqlPermissionAction =\n | \"read\"\n | \"create\"\n | \"update\"\n | \"delete\"\n | \"aggregate\"\n | \"bulkUpsert\";\n\nexport type PermissionCondition<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Update extends boolean = boolean,\n Type extends object = object,\n> = readonly [\n PermissionOperand<Level, User, Type, Update>,\n PermissionOperator,\n PermissionOperand<Level, User, Type, Update>,\n];\n\nexport type StandardPermissionCondition<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n> = readonly [\n PermissionOperand<\n Level,\n Record<string, unknown>,\n Record<string, unknown>,\n Update\n >,\n StandardPermissionOperator,\n PermissionOperand<\n Level,\n Record<string, unknown>,\n Record<string, unknown>,\n Update\n >,\n];\n\ntype UserOperand<User extends object = InferredAttributeMap> = {\n user:\n | {\n [K in keyof User]: User[K] extends\n | string\n | string[]\n | boolean\n | boolean[]\n ? K\n : never;\n }[keyof User]\n | \"id\"\n | \"_loggedIn\";\n};\n\ntype RecordOperand<\n Type extends object,\n Update extends boolean = false,\n> = Update extends true\n ?\n | { oldRecord: (keyof Type & string) | \"id\" }\n | { newRecord: (keyof Type & string) | \"id\" }\n : { record: (keyof Type & string) | \"id\" };\n\nexport type PermissionOperand<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n User extends object = InferredAttributeMap,\n Type extends object = object,\n Update extends boolean = boolean,\n> =\n | UserOperand<User>\n | ValueOperand\n | (Level extends \"record\" ? RecordOperand<Type, Update> : never);\n\ntype PermissionOperator = \"=\" | \"!=\" | \"in\" | \"not in\";\nconst operatorMap = {\n \"=\": \"eq\",\n \"!=\": \"ne\",\n in: \"in\",\n \"not in\": \"nin\",\n} as const satisfies Record<PermissionOperator, string>;\ntype StandardPermissionOperator =\n (typeof operatorMap)[keyof typeof operatorMap];\n\nfunction normalizeOperand<T extends PermissionOperand<any, any, any, any>>(\n operand: T,\n): T {\n if (typeof operand === \"object\" && \"user\" in operand) {\n return { user: { id: \"_id\" }[operand.user] ?? operand.user } as T;\n }\n return operand;\n}\n\nfunction normalizeConditions<\n Level extends \"record\" | \"gql\" = \"record\" | \"gql\",\n Update extends boolean = boolean,\n>(\n conditions: readonly PermissionCondition<Level, any, Update, any>[],\n): StandardPermissionCondition<Level, Update>[] {\n return conditions.map((cond) => {\n const [left, operator, right] = cond;\n return [\n normalizeOperand(left),\n operatorMap[operator],\n normalizeOperand(right),\n ];\n }) as StandardPermissionCondition<Level, Update>[];\n}\n\nfunction isObjectFormat(\n p: ActionPermission,\n): p is Extract<ActionPermission, { permit?: boolean }> {\n return typeof p === \"object\" && p !== null && \"conditions\" in p;\n}\n\nfunction isSingleArrayConditionFormat(\n cond: Exclude<ActionPermission, { permit?: boolean }>,\n): cond is PermissionCondition {\n return cond.length >= 2 && typeof cond[1] === \"string\"; // Check if middle element is an operator\n}\n\nexport function normalizePermission<\n User extends object = object,\n Type extends object = object,\n>(permission: TailorTypePermission<User, Type>): StandardTailorTypePermission {\n return Object.keys(permission).reduce((acc, action) => {\n (acc as any)[action] = (permission as any)[action].map((p: any) =>\n normalizeActionPermission(p),\n );\n return acc;\n }, {}) as StandardTailorTypePermission;\n}\n\nexport function normalizeGqlPermission<\n const P extends TailorTypeGqlPermission<any>,\n>(permission: P): StandardTailorTypeGqlPermission {\n return permission.map((policy) =>\n normalizeGqlPolicy(policy),\n ) as StandardTailorTypeGqlPermission;\n}\n\nfunction normalizeGqlPolicy(\n policy: GqlPermissionPolicy<any, any>,\n): StandardGqlPermissionPolicy {\n return {\n conditions: policy.conditions ? normalizeConditions(policy.conditions) : [],\n actions: policy.actions === \"all\" ? [\"all\"] : policy.actions,\n permit: policy.permit ? \"allow\" : \"deny\",\n description: policy.description,\n };\n}\nexport function normalizeActionPermission(\n permission: ActionPermission,\n): StandardActionPermission {\n // object format\n if (isObjectFormat(permission)) {\n return {\n conditions: normalizeConditions(\n isSingleArrayConditionFormat(permission.conditions)\n ? [permission.conditions]\n : permission.conditions,\n ),\n permit: permission.permit ? \"allow\" : \"deny\",\n description: permission.description,\n };\n }\n\n if (isSingleArrayConditionFormat(permission)) {\n const [op1, operator, op2, permit] = [...permission, true];\n return {\n conditions: normalizeConditions([[op1, operator, op2]]),\n permit: permit ? \"allow\" : \"deny\",\n };\n }\n\n // Array of conditions format\n const conditions: PermissionCondition[] = [];\n const conditionArray = permission;\n let conditionArrayPermit = true;\n\n for (const item of conditionArray) {\n if (typeof item === \"boolean\") {\n conditionArrayPermit = item;\n continue;\n }\n conditions.push(item as PermissionCondition);\n }\n\n return {\n conditions: normalizeConditions(conditions),\n permit: conditionArrayPermit ? \"allow\" : \"deny\",\n };\n}\n","import { clone } from \"es-toolkit\";\nimport { type InferredAttributeMap, tailorUserMap } from \"@/configure/types\";\nimport {\n type AllowedValues,\n type AllowedValuesOutput,\n} from \"@/configure/types/field\";\nimport { type OperatorFieldConfig } from \"@/configure/types/operator\";\nimport { TailorField } from \"@/configure/types/type\";\nimport {\n type FieldOptions,\n type FieldOutput,\n type TailorFieldType,\n type TailorToTs,\n} from \"@/configure/types/types\";\nimport { type TailorDBTypeConfig } from \"./operator-types\";\nimport {\n type Permissions,\n type TailorTypeGqlPermission,\n type TailorTypePermission,\n normalizePermission,\n normalizeGqlPermission,\n} from \"./permission\";\nimport {\n type DBFieldMetadata,\n type DefinedDBFieldMetadata,\n type Hooks,\n type Hook,\n type SerialConfig,\n type IndexDef,\n type TypeFeatures,\n type ExcludeNestedDBFields,\n} from \"./types\";\nimport type {\n Prettify,\n output,\n InferFieldsOutput,\n} from \"@/configure/types/helpers\";\nimport type {\n FieldValidateInput,\n ValidateConfig,\n Validators,\n} from \"@/configure/types/validation\";\n\ntype RelationType =\n | \"oneToOne\"\n | \"1-1\"\n | \"manyToOne\"\n | \"n-1\"\n | \"N-1\"\n | \"keyOnly\";\n\ninterface RelationConfig<S extends RelationType, T extends TailorDBType> {\n type: S;\n toward: {\n type: T;\n as?: string;\n key?: keyof T[\"fields\"] & string;\n };\n backward?: string;\n}\n\n// Special config variant for self-referencing relations\ntype RelationSelfConfig = {\n type: RelationType;\n toward: {\n type: \"self\";\n as?: string;\n key?: string;\n };\n backward?: string;\n};\n\ninterface PendingSelfRelation {\n type: RelationType;\n as?: string;\n key: string;\n backward: string;\n}\n\nfunction isRelationSelfConfig(\n config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig,\n): config is RelationSelfConfig {\n return config.toward.type === \"self\";\n}\n\ninterface ReferenceConfig<T extends TailorDBType<any, any>> {\n type: TailorDBType<any, any>;\n key: keyof T[\"fields\"] & string;\n nameMap: [string | undefined, string];\n}\n\nexport class TailorDBField<\n const Defined extends DefinedDBFieldMetadata,\n const Output,\n> extends TailorField<Defined, Output, DBFieldMetadata> {\n private _ref: ReferenceConfig<TailorDBType> | undefined = undefined;\n private _pendingSelfRelation: PendingSelfRelation | undefined = undefined;\n\n get reference(): Readonly<ReferenceConfig<TailorDBType>> | undefined {\n return clone(this._ref);\n }\n\n get metadata() {\n return { ...this._metadata };\n }\n\n get config(): OperatorFieldConfig {\n return {\n type: this.type,\n ...this._metadata,\n ...(this.type === \"nested\" && Object.keys(this.fields).length > 0\n ? {\n fields: Object.entries(this.fields).reduce(\n (acc, [key, field]) => {\n acc[key] = (field as TailorDBField<any, any>).config;\n return acc;\n },\n {} as Record<string, OperatorFieldConfig>,\n ),\n }\n : {}),\n validate: this._metadata.validate?.map((v) => {\n const { fn, message } =\n typeof v === \"function\"\n ? { fn: v, message: `failed by \\`${v.toString().trim()}\\`` }\n : { fn: v[0], message: v[1] };\n\n return {\n script: {\n expr: `(${fn.toString().trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n },\n errorMessage: message,\n };\n }),\n hooks: this._metadata.hooks\n ? {\n create: this._metadata.hooks.create\n ? {\n expr: `(${this._metadata.hooks.create\n .toString()\n .trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n }\n : undefined,\n update: this._metadata.hooks.update\n ? {\n expr: `(${this._metadata.hooks.update\n .toString()\n .trim()})({ value: _value, data: _data, user: ${tailorUserMap} })`,\n }\n : undefined,\n }\n : undefined,\n serial: this._metadata.serial\n ? {\n start: this._metadata.serial.start,\n maxValue: this._metadata.serial.maxValue,\n format:\n \"format\" in this._metadata.serial\n ? this._metadata.serial.format\n : undefined,\n }\n : undefined,\n };\n }\n\n private constructor(\n type: TailorFieldType,\n options?: FieldOptions,\n fields?: Record<string, TailorDBField<any, any>>,\n values?: AllowedValues,\n ) {\n super(type, options, fields, values);\n }\n\n static create<\n const T extends TailorFieldType,\n const TOptions extends FieldOptions,\n >(\n type: T,\n options?: TOptions,\n fields?: Record<string, TailorDBField<any, any>>,\n values?: AllowedValues,\n ) {\n return new TailorDBField<\n { type: T; array: TOptions extends { array: true } ? true : false },\n FieldOutput<TailorToTs[T], TOptions>\n >(type, options, fields, values);\n }\n\n description<CurrentDefined extends Defined>(\n this: CurrentDefined extends { description: unknown }\n ? never\n : TailorField<CurrentDefined, Output>,\n description: string,\n ): TailorDBField<Prettify<CurrentDefined & { description: true }>, Output> {\n return super.description(description) as any;\n }\n\n relation<\n S extends RelationType,\n T extends TailorDBType<any, any>,\n CurrentDefined extends Defined,\n >(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: RelationConfig<S, T>,\n ): TailorDBField<\n S extends \"oneToOne\" | \"1-1\"\n ? Prettify<CurrentDefined & { unique: true; index: true; relation: true }>\n : Prettify<CurrentDefined & { index: true; relation: true }>,\n Output\n >;\n\n // Overload: self-referencing variant\n relation<S extends RelationSelfConfig, CurrentDefined extends Defined>(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: S,\n ): TailorDBField<\n S[\"type\"] extends \"oneToOne\" | \"1-1\"\n ? Prettify<CurrentDefined & { unique: true; index: true; relation: true }>\n : Prettify<CurrentDefined & { index: true; relation: true }>,\n Output\n >;\n\n // Implementation\n relation<CurrentDefined extends Defined>(\n this: CurrentDefined extends { relation: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n config: RelationConfig<RelationType, TailorDBType> | RelationSelfConfig,\n ): TailorDBField<DefinedDBFieldMetadata, Output> {\n this._metadata.index = true;\n this._metadata.foreignKey = true;\n this._metadata.unique = [\"oneToOne\", \"1-1\"].includes(config.type);\n\n const key = config.toward.key ?? \"id\";\n const backward = config.backward ?? \"\";\n\n if (isRelationSelfConfig(config)) {\n // Defer resolving the self reference until the type is constructed\n this._pendingSelfRelation = {\n type: config.type,\n as: config.toward.as,\n key,\n backward,\n };\n return this;\n }\n\n this._metadata.foreignKeyType = config.toward.type.name;\n this._metadata.foreignKeyField = key;\n if (config.type === \"keyOnly\") {\n return this;\n }\n\n const forward = config.toward.as;\n this._ref = {\n type: config.toward.type,\n nameMap: [forward, backward],\n key,\n };\n this._metadata.relation = true;\n return this;\n }\n\n index<CurrentDefined extends Defined>(\n this: CurrentDefined extends { index: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ) {\n this._metadata.index = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { index: true }>,\n Output\n >;\n }\n\n unique<CurrentDefined extends Defined>(\n this: CurrentDefined extends { unique: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ) {\n this._metadata.unique = true;\n this._metadata.index = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { unique: true; index: true }>,\n Output\n >;\n }\n\n vector<CurrentDefined extends Defined>(\n this: CurrentDefined extends { vector: unknown }\n ? never\n : CurrentDefined extends { type: \"string\"; array: false }\n ? TailorDBField<CurrentDefined, Output>\n : never,\n ) {\n this._metadata.vector = true;\n return this as TailorDBField<\n Prettify<CurrentDefined & { vector: true }>,\n Output\n >;\n }\n\n hooks<CurrentDefined extends Defined, const H extends Hook<unknown, Output>>(\n this: CurrentDefined extends { hooks: unknown }\n ? never\n : CurrentDefined extends { type: \"nested\" }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n hooks: H,\n ) {\n this._metadata.hooks = hooks;\n return this as TailorDBField<\n Prettify<\n CurrentDefined & {\n hooks?: {\n create: H extends { create: unknown } ? true : false;\n update: H extends { update: unknown } ? true : false;\n };\n serial: false;\n }\n >,\n Output\n >;\n }\n\n validate<CurrentDefined extends Defined>(\n this: CurrentDefined extends { validate: unknown }\n ? never\n : TailorDBField<CurrentDefined, Output>,\n ...validate: FieldValidateInput<Output>[]\n ) {\n this._metadata.validate = validate;\n return this as TailorDBField<\n Prettify<CurrentDefined & { validate: true }>,\n Output\n >;\n }\n\n serial<CurrentDefined extends Defined>(\n this: CurrentDefined extends { serial: unknown }\n ? never\n : Output extends null\n ? never\n : CurrentDefined extends { type: \"integer\" | \"string\"; array: false }\n ? TailorDBField<CurrentDefined, Output>\n : never,\n config: SerialConfig<CurrentDefined[\"type\"] & (\"integer\" | \"string\")>,\n ) {\n (this as TailorDBField<CurrentDefined, Output>)._metadata.serial = config;\n return this as TailorDBField<\n Prettify<\n CurrentDefined & {\n serial: true;\n hooks: { create: false; update: false };\n }\n >,\n Output\n >;\n }\n\n /**\n * Clone the field with optional overrides for field options\n * @param options - Optional field options to override\n * @returns A new TailorDBField instance with the same configuration\n */\n clone<const NewOpt extends FieldOptions>(\n options?: NewOpt,\n ): TailorDBField<\n Prettify<\n Omit<Defined, \"array\"> & {\n array: NewOpt extends { array: true } ? true : Defined[\"array\"];\n }\n >,\n FieldOutput<TailorToTs[Defined[\"type\"]], NewOpt>\n > {\n // Create a clone using Object.create to preserve prototype chain\n const clonedField = Object.create(\n Object.getPrototypeOf(this),\n ) as TailorDBField<Defined, Output>;\n\n // Copy all properties\n Object.assign(clonedField, {\n type: this.type,\n fields: this.fields,\n _defined: this._defined,\n _output: this._output,\n });\n\n // Clone and merge metadata with new options\n clonedField._metadata = { ...this._metadata };\n if (options) {\n if (options.optional !== undefined) {\n clonedField._metadata.required = !options.optional;\n }\n if (options.array !== undefined) {\n clonedField._metadata.array = options.array;\n }\n }\n\n // Copy internal state\n if (this._ref) {\n clonedField._ref = clone(this._ref);\n }\n if (this._pendingSelfRelation) {\n clonedField._pendingSelfRelation = { ...this._pendingSelfRelation };\n }\n\n return clonedField as TailorDBField<any, any>;\n }\n}\n\nconst createField = TailorDBField.create;\nfunction uuid<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"uuid\", options);\n}\n\nfunction string<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"string\", options);\n}\n\nfunction bool<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"boolean\", options);\n}\n\nfunction int<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"integer\", options);\n}\n\nfunction float<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"float\", options);\n}\n\nfunction date<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"date\", options);\n}\n\nfunction datetime<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"datetime\", options);\n}\n\nfunction time<const Opt extends FieldOptions>(options?: Opt) {\n return createField(\"time\", options);\n}\n\nfunction _enum<const V extends AllowedValues>(\n ...values: V\n): TailorDBField<\n { type: \"enum\"; array: false },\n FieldOutput<AllowedValuesOutput<V>, { optional: false; array: false }>\n>;\nfunction _enum<const V extends AllowedValues, const Opt extends FieldOptions>(\n ...args: [...V, Opt]\n): TailorDBField<\n { type: \"enum\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<AllowedValuesOutput<V>, Opt>\n>;\nfunction _enum(\n ...args: (AllowedValues[number] | FieldOptions)[]\n): TailorDBField<{ type: \"enum\"; array: boolean }, any> {\n let values: AllowedValues;\n let options: FieldOptions | undefined;\n const lastArg = args[args.length - 1];\n if (typeof lastArg === \"object\" && !(\"value\" in lastArg)) {\n values = args.slice(0, -1) as AllowedValues;\n options = lastArg;\n } else {\n values = args as AllowedValues;\n options = undefined;\n }\n return createField(\"enum\", options, undefined, values);\n}\n\nfunction object<\n const F extends Record<string, TailorDBField<any, any>> &\n ExcludeNestedDBFields<F>,\n const Opt extends FieldOptions,\n>(fields: F, options?: Opt) {\n return createField(\"nested\", options, fields) as unknown as TailorDBField<\n { type: \"nested\"; array: Opt extends { array: true } ? true : false },\n FieldOutput<InferFieldsOutput<F>, Opt>\n >;\n}\n\nexport class TailorDBType<\n const Fields extends Record<string, TailorDBField<any, any>> = any,\n User extends object = InferredAttributeMap,\n> {\n public readonly _output = null as unknown as InferFieldsOutput<Fields>;\n public _description?: string;\n private _settings: TypeFeatures = {};\n private _indexes: IndexDef<this>[] = [];\n private _permissions: Permissions = {};\n private _files: Record<string, string> = {};\n\n constructor(\n public readonly name: string,\n public readonly fields: Fields,\n options: { pluralForm?: string; description?: string },\n ) {\n this._description = options.description;\n\n if (options.pluralForm) {\n if (name === options.pluralForm) {\n throw new Error(\n `The name and the plural form must be different. name=${name}`,\n );\n }\n this._settings.pluralForm = options.pluralForm;\n }\n\n // Resolve any pending self-references now that the type is constructed\n Object.entries(this.fields).forEach(([fieldName, field]) => {\n const f = field as unknown as {\n _pendingSelfRelation: PendingSelfRelation | undefined;\n _metadata: DBFieldMetadata;\n _ref: ReferenceConfig<TailorDBType<any, any>>;\n };\n const pending = f._pendingSelfRelation;\n if (pending) {\n f._metadata.foreignKeyType = this.name;\n f._metadata.foreignKeyField = pending.key;\n if (pending.type === \"keyOnly\") {\n return this;\n }\n\n const forward = pending.as ?? fieldName.replace(/(ID|Id|id)$/u, \"\");\n // Type conversion for manipulating private _ref.\n f._ref = {\n type: this,\n nameMap: [forward, pending.backward],\n key: pending.key,\n };\n }\n });\n }\n\n get metadata(): TailorDBTypeConfig {\n const metadataFields = Object.entries(this.fields).reduce(\n (acc, [key, field]) => {\n acc[key] = field.config;\n return acc;\n },\n {} as Record<string, OperatorFieldConfig>,\n );\n\n // Convert indexes to the format expected by the manifest\n const indexes: Record<string, { fields: string[]; unique?: boolean }> = {};\n if (this._indexes && this._indexes.length > 0) {\n this._indexes.forEach((index) => {\n const fieldNames = index.fields.map((field) => String(field));\n const key = index.name || `idx_${fieldNames.join(\"_\")}`;\n indexes[key] = {\n fields: fieldNames,\n unique: index.unique,\n };\n });\n }\n\n return {\n name: this.name,\n schema: {\n description: this._description,\n extends: false,\n fields: metadataFields,\n settings: this._settings,\n permissions: this._permissions,\n files: this._files,\n ...(Object.keys(indexes).length > 0 && { indexes }),\n },\n };\n }\n\n hooks(hooks: Hooks<Fields>) {\n Object.entries(hooks).forEach(([fieldName, fieldHooks]: [string, any]) => {\n (this.fields[fieldName] as any).hooks(fieldHooks);\n });\n return this;\n }\n\n validate(validators: Validators<Fields>) {\n Object.entries(validators).forEach(([fieldName, fieldValidators]) => {\n const field = this.fields[fieldName] as TailorDBField<any, any>;\n\n const validators = fieldValidators as\n | FieldValidateInput<unknown>\n | FieldValidateInput<unknown>[];\n\n const isValidateConfig = (v: unknown): v is ValidateConfig<unknown> => {\n return Array.isArray(v) && v.length === 2 && typeof v[1] === \"string\";\n };\n\n if (Array.isArray(validators)) {\n if (isValidateConfig(validators)) {\n field.validate(validators);\n } else {\n field.validate(...validators);\n }\n } else {\n field.validate(validators);\n }\n });\n return this;\n }\n\n features(features: Omit<TypeFeatures, \"pluralForm\">) {\n this._settings = { ...this._settings, ...features };\n return this;\n }\n\n indexes(...indexes: IndexDef<this>[]) {\n this._indexes = indexes;\n return this;\n }\n\n files<const F extends string>(\n files: Record<F, string> & Partial<Record<keyof output<this>, never>>,\n ) {\n this._files = files;\n return this;\n }\n\n permission<\n U extends object = User,\n P extends TailorTypePermission<U, output<this>> = TailorTypePermission<\n U,\n output<this>\n >,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n ret._permissions.record = normalizePermission(permission);\n return ret;\n }\n\n gqlPermission<\n U extends object = User,\n P extends TailorTypeGqlPermission<U> = TailorTypeGqlPermission<U>,\n >(permission: P) {\n const ret = this as TailorDBType<Fields, U>;\n ret._permissions.gql = normalizeGqlPermission(permission);\n return ret;\n }\n\n description(description: string) {\n this._description = description;\n return this;\n }\n\n /**\n * Pick specific fields from the type\n * @param keys - Array of field keys to pick\n * @param options - Optional field options to apply to picked fields\n * @returns An object containing only the specified fields\n */\n pickFields<K extends keyof Fields, const Opt extends FieldOptions>(\n keys: K[],\n options: Opt,\n ) {\n const result = {} as Record<K, TailorDBField<any, any>>;\n for (const key of keys) {\n if (options) {\n result[key] = this.fields[key].clone(options);\n } else {\n result[key] = this.fields[key];\n }\n }\n return result as {\n [P in K]: Fields[P] extends TailorDBField<infer D, infer _O>\n ? TailorDBField<\n Omit<D, \"array\"> & {\n array: Opt extends { array: true } ? true : D[\"array\"];\n },\n FieldOutput<TailorToTs[D[\"type\"]], Opt>\n >\n : never;\n };\n }\n\n /**\n * Omit specific fields from the type\n * @param keys - Array of field keys to omit\n * @returns An object containing all fields except the specified ones\n */\n omitFields<K extends keyof Fields>(keys: K[]): Omit<Fields, K> {\n const keysSet = new Set(keys);\n const result = {} as Record<string, TailorDBField<any, any>>;\n for (const key in this.fields) {\n if (\n Object.hasOwn(this.fields, key) &&\n !keysSet.has(key as unknown as K)\n ) {\n result[key] = this.fields[key];\n }\n }\n return result as Omit<Fields, K>;\n }\n}\n\nexport type TailorDBInstance<\n Fields extends Record<string, TailorDBField<any, any>> = any,\n User extends object = InferredAttributeMap,\n> = InstanceType<typeof TailorDBType<Fields, User>>;\n\nconst idField = uuid();\ntype idField = typeof idField;\ntype DBType<\n F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n> = TailorDBInstance<{ id: idField } & F>;\n\n/**\n * Creates a new database type with the specified fields\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n */\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(name: string | [string, string], fields: F): DBType<F>;\n/**\n * Creates a new database type with the specified fields and description\n * @param name - The name of the type, or a tuple of [name, pluralForm]\n * @param description - A description of the type\n * @param fields - The field definitions for the type\n * @returns A new TailorDBType instance\n */\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(name: string | [string, string], description: string, fields: F): DBType<F>;\nfunction dbType<\n const F extends { id?: never } & Record<string, TailorDBField<any, any>>,\n>(\n name: string | [string, string],\n fieldsOrDescription: string | F,\n fields?: F,\n): DBType<F> {\n const typeName = Array.isArray(name) ? name[0] : name;\n const pluralForm = Array.isArray(name) ? name[1] : undefined;\n\n let description: string | undefined;\n let fieldDef: F;\n if (typeof fieldsOrDescription === \"string\") {\n description = fieldsOrDescription;\n fieldDef = fields as F;\n } else {\n fieldDef = fieldsOrDescription;\n }\n return new TailorDBType<{ id: idField } & F>(\n typeName,\n {\n id: idField,\n ...fieldDef,\n },\n { pluralForm, description },\n ) as DBType<F>;\n}\n\nexport const db = {\n type: dbType,\n uuid,\n string,\n bool,\n int,\n float,\n date,\n datetime,\n time,\n enum: _enum,\n object,\n fields: {\n timestamps: () => ({\n createdAt: datetime()\n .hooks({ create: () => new Date().toISOString() })\n .description(\"Record creation timestamp\"),\n updatedAt: datetime({ optional: true })\n .hooks({ update: () => new Date().toISOString() })\n .description(\"Record last update timestamp\"),\n }),\n },\n};\n","import type { AuthConfig } from \"@/configure/services/auth\";\nimport type { ExecutorServiceInput } from \"@/configure/services/executor/types\";\nimport type { IdPConfig } from \"@/configure/services/idp\";\nimport type { ResolverServiceInput } from \"@/configure/services/resolver/types\";\nimport type { StaticWebsiteConfig } from \"@/configure/services/staticwebsite\";\nimport type { TailorDBServiceInput } from \"@/configure/services/tailordb/types\";\nimport type { WorkflowServiceInput } from \"@/configure/services/workflow/types\";\nimport type { GeneratorConfig } from \"@/parser/generator-config/types\";\n\nexport interface AppConfig<\n Auth extends AuthConfig = AuthConfig,\n Idp extends IdPConfig[] = IdPConfig[],\n StaticWebsites extends StaticWebsiteConfig[] = StaticWebsiteConfig[],\n Env extends Record<string, string | number | boolean> = Record<\n string,\n string | number | boolean\n >,\n> {\n name: string;\n env?: Env;\n cors?: string[];\n allowedIPAddresses?: string[];\n disableIntrospection?: boolean;\n db?: TailorDBServiceInput;\n resolver?: ResolverServiceInput;\n idp?: Idp;\n auth?: Auth;\n executor?: ExecutorServiceInput;\n workflow?: WorkflowServiceInput;\n staticWebsites?: StaticWebsites;\n}\n\nlet distPath: string | null = null;\nexport const getDistDir = (): string => {\n const configured = process.env.TAILOR_SDK_OUTPUT_DIR;\n if (configured && configured !== distPath) {\n distPath = configured;\n } else if (distPath === null) {\n distPath = configured || \".tailor-sdk\";\n }\n return distPath;\n};\n\nexport function defineConfig<\n const Config extends AppConfig &\n // type-fest's Exact works recursively and causes type errors, so we use a shallow version here.\n Record<Exclude<keyof Config, keyof AppConfig>, never>,\n>(config: Config) {\n return config;\n}\n\nexport function defineGenerators(...configs: GeneratorConfig[]) {\n return configs;\n}\n","import { type TailorDBInstance } from \"../tailordb/schema\";\nimport type {\n AuthServiceInput,\n UserAttributeListKey,\n UserAttributeMap,\n} from \"@/parser/service/auth/types\";\n\ndeclare const authDefinitionBrand: unique symbol;\ntype AuthDefinitionBrand = { readonly [authDefinitionBrand]: true };\n\nexport type {\n OIDC,\n SAML,\n IDToken,\n BuiltinIdP,\n IdProviderConfig,\n OAuth2ClientGrantType,\n OAuth2Client,\n SCIMAuthorization,\n SCIMAttributeType,\n SCIMAttribute,\n SCIMAttributeMapping,\n SCIMResource,\n SCIMConfig,\n TenantProviderConfig,\n ValueOperand,\n UsernameFieldKey,\n UserAttributeKey,\n UserAttributeListKey,\n UserAttributeMap,\n AuthServiceInput,\n} from \"@/parser/service/auth/types\";\n\nexport function defineAuth<\n const Name extends string,\n const User extends TailorDBInstance,\n const AttributeMap extends UserAttributeMap<User>,\n const AttributeList extends UserAttributeListKey<User>[],\n const MachineUserNames extends string,\n>(\n name: Name,\n config: AuthServiceInput<User, AttributeMap, AttributeList, MachineUserNames>,\n) {\n const result = {\n ...config,\n name,\n invoker<M extends MachineUserNames>(machineUser: M) {\n return { authName: name, machineUser } as const;\n },\n } as const satisfies AuthServiceInput<\n User,\n AttributeMap,\n AttributeList,\n MachineUserNames\n > & {\n name: string;\n invoker<M extends MachineUserNames>(\n machineUser: M,\n ): { authName: string; machineUser: M };\n };\n\n return result as typeof result & AuthDefinitionBrand;\n}\n\nexport type AuthExternalConfig = { name: string; external: true };\n\nexport type AuthOwnConfig = ReturnType<\n typeof defineAuth<string, any, any, any, string>\n>;\n\nexport type AuthConfig = AuthOwnConfig | AuthExternalConfig;\n","/**\n * Symbol used to brand WorkflowJob objects created by createWorkflowJob.\n * This enables reliable runtime detection of workflow jobs regardless of\n * how they were imported or assigned (variable reassignment, destructuring, etc.)\n */\nexport const WORKFLOW_JOB_BRAND = Symbol.for(\"tailor:workflow-job\");\n\n/**\n * Replace hyphens and spaces with underscores in a string type.\n * This matches the runtime behavior of `jobName.replace(/[-\\s]/g, \"_\")`.\n */\ntype ReplaceWithUnderscore<S extends string> = S extends `${infer A}-${infer B}`\n ? ReplaceWithUnderscore<`${A}_${B}`>\n : S extends `${infer A} ${infer B}`\n ? ReplaceWithUnderscore<`${A}_${B}`>\n : S;\n\ntype JobsFromDeps<\n Deps extends readonly WorkflowJob<any, any, any, any>[],\n Set extends string = never,\n> = Deps extends [\n infer First extends WorkflowJob<any, any, any, any>,\n ...infer Rest extends readonly WorkflowJob<any, any, any, any>[],\n]\n ? First[\"name\"] extends Set\n ? JobsFromDeps<Rest, Set> // Skip duplicate jobs\n : First extends WorkflowJob<infer N, infer I, infer O, infer NestedDeps>\n ? {\n [K in ReplaceWithUnderscore<N>]: [I] extends [undefined]\n ? () => Promise<O>\n : (input: I) => Promise<O>;\n } & (NestedDeps extends []\n ? object\n : JobsFromDeps<NestedDeps, Set | N>) &\n JobsFromDeps<Rest, Set | N>\n : JobsFromDeps<Rest, Set>\n : object;\n\nexport interface WorkflowJob<\n Name extends string = string,\n Input = any,\n Output = any,\n Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n> {\n readonly [WORKFLOW_JOB_BRAND]?: true;\n name: Name;\n deps?: Deps;\n body: (input: Input, jobs: JobsFromDeps<Deps>) => Output | Promise<Output>;\n}\n\ntype WorkflowJobBody<\n I,\n O,\n Deps extends readonly WorkflowJob<any, any, any, any>[],\n> = (input: I, jobs: JobsFromDeps<Deps>) => O | Promise<O>;\n\ninterface CreateWorkflowJobFunction {\n <\n const Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n const Name extends string = string,\n const Body extends WorkflowJobBody<any, any, Deps> = WorkflowJobBody<\n any,\n any,\n Deps\n >,\n >(\n config: Deps extends readonly [any, ...any[]]\n ? {\n readonly name: Name;\n readonly deps: Deps;\n readonly body: Body;\n }\n : {\n readonly name: Name;\n readonly deps?: never;\n readonly body: Body;\n },\n ): WorkflowJob<Name, Parameters<Body>[0], ReturnType<Body>, Deps>;\n}\n\nexport const createWorkflowJob: CreateWorkflowJobFunction = function <\n const Deps extends readonly [...WorkflowJob<any, any, any, any>[]] = [],\n const Name extends string = string,\n const Body extends WorkflowJobBody<any, any, Deps> = WorkflowJobBody<\n any,\n any,\n Deps\n >,\n>(\n config: Deps extends readonly [any, ...any[]]\n ? {\n readonly name: Name;\n readonly deps: Deps;\n readonly body: Body;\n }\n : {\n readonly name: Name;\n readonly deps?: never;\n readonly body: Body;\n },\n) {\n return {\n [WORKFLOW_JOB_BRAND]: true,\n name: config.name,\n deps: (config as any).deps,\n body: config.body,\n } as WorkflowJob<Name, Parameters<Body>[0], ReturnType<Body>, Deps>;\n};\n"],"mappings":"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"}