@famgia/omnify-typescript 0.0.55 → 0.0.56
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.
- package/dist/{chunk-EAN65KQ2.js → chunk-AJ7N7MPX.js} +2 -1
- package/dist/{chunk-EAN65KQ2.js.map → chunk-AJ7N7MPX.js.map} +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/plugin.cjs +1 -0
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.js +1 -1
- package/package.json +2 -2
|
@@ -889,6 +889,7 @@ function generateRulesFiles(schemas, options = {}) {
|
|
|
889
889
|
const templates = mergeValidationTemplates(options.validationTemplates);
|
|
890
890
|
for (const schema of Object.values(schemas)) {
|
|
891
891
|
if (schema.kind === "enum") continue;
|
|
892
|
+
if (schema.options?.hidden === true) continue;
|
|
892
893
|
const rules = generateModelRules(schema, locales, fallbackLocale, templates);
|
|
893
894
|
const content = formatRulesFile(schema.name, rules);
|
|
894
895
|
files.push({
|
|
@@ -1231,4 +1232,4 @@ export {
|
|
|
1231
1232
|
generateRulesFiles,
|
|
1232
1233
|
generateTypeScript
|
|
1233
1234
|
};
|
|
1234
|
-
//# sourceMappingURL=chunk-
|
|
1235
|
+
//# sourceMappingURL=chunk-AJ7N7MPX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interface-generator.ts","../src/enum-generator.ts","../src/validation-templates.ts","../src/rules-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-laravel - TypeScript Interface Generator\n *\n * Generates TypeScript interfaces from schemas.\n */\n\nimport type { LoadedSchema, PropertyDefinition, SchemaCollection, LocalizedString } from '@famgia/omnify-types';\nimport { resolveLocalizedString } from '@famgia/omnify-types';\nimport type { TSInterface, TSProperty, TypeScriptOptions } from './types.js';\n\n/**\n * Convert a string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/^_/, '')\n .toLowerCase();\n}\n\n/**\n * Maps Omnify property types to TypeScript types.\n */\nconst TYPE_MAP: Record<string, string> = {\n String: 'string',\n TinyInt: 'number',\n Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n MediumText: 'string',\n LongText: 'string',\n Date: 'DateString',\n Time: 'string',\n DateTime: 'DateTimeString',\n Timestamp: 'DateTimeString',\n Json: 'unknown',\n Email: 'string',\n Password: 'string',\n Enum: 'string',\n Select: 'string',\n Lookup: 'number',\n};\n\n/**\n * File interface name (references the File.yaml schema).\n * The File schema is auto-generated by ensureFileSchema() when File type is used.\n */\nexport const FILE_INTERFACE_NAME = 'File';\n\n/**\n * Maps primary key types to TypeScript types.\n */\nconst PK_TYPE_MAP: Record<string, string> = {\n Int: 'number',\n BigInt: 'number',\n Uuid: 'string',\n String: 'string',\n};\n\n/**\n * Resolves a localized string using the given options.\n * Returns undefined if the value is undefined or cannot be resolved.\n */\nfunction resolveDisplayName(\n value: LocalizedString | undefined,\n options: TypeScriptOptions = {}\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return resolveLocalizedString(value, {\n locale: options.locale,\n config: options.localeConfig,\n });\n}\n\n/**\n * Converts property name to TypeScript property name.\n * Preserves camelCase.\n */\nexport function toPropertyName(name: string): string {\n return name;\n}\n\n/**\n * Converts schema name to TypeScript interface name.\n * Preserves PascalCase.\n */\nexport function toInterfaceName(schemaName: string): string {\n return schemaName;\n}\n\n/**\n * Gets TypeScript type for a property.\n */\nexport function getPropertyType(\n property: PropertyDefinition,\n _allSchemas: SchemaCollection\n): string {\n // Handle File type specially (polymorphic relation to files table)\n // References the File interface generated from File.yaml schema\n if (property.type === 'File') {\n const fileProp = property as { multiple?: boolean };\n if (fileProp.multiple) {\n return `${FILE_INTERFACE_NAME}[]`;\n }\n return `${FILE_INTERFACE_NAME} | null`;\n }\n\n // Handle associations\n if (property.type === 'Association') {\n const assocProp = property as {\n relation?: string;\n target?: string;\n targets?: readonly string[];\n };\n\n const targetName = assocProp.target ?? 'unknown';\n\n switch (assocProp.relation) {\n // Standard relations\n case 'OneToOne':\n case 'ManyToOne':\n return targetName;\n case 'OneToMany':\n case 'ManyToMany':\n return `${targetName}[]`;\n\n // Polymorphic relations\n case 'MorphTo':\n // Union type of all possible targets\n if (assocProp.targets && assocProp.targets.length > 0) {\n return assocProp.targets.join(' | ');\n }\n return 'unknown';\n case 'MorphOne':\n return targetName;\n case 'MorphMany':\n case 'MorphToMany':\n case 'MorphedByMany':\n return `${targetName}[]`;\n\n default:\n return 'unknown';\n }\n }\n\n // Handle enum types\n if (property.type === 'Enum') {\n const enumProp = property as { enum?: string | readonly string[] };\n if (typeof enumProp.enum === 'string') {\n // Reference to a named enum\n return enumProp.enum;\n }\n if (Array.isArray(enumProp.enum)) {\n // Inline enum - create union type\n return enumProp.enum.map(v => `'${v}'`).join(' | ');\n }\n }\n\n // Handle Select with options\n if (property.type === 'Select') {\n const selectProp = property as { options?: readonly string[] };\n if (selectProp.options && selectProp.options.length > 0) {\n return selectProp.options.map(v => `'${v}'`).join(' | ');\n }\n }\n\n // Standard type mapping\n return TYPE_MAP[property.type] ?? 'unknown';\n}\n\n/**\n * Converts a property to TypeScript property definition.\n * For MorphTo, returns multiple properties (_type, _id, and relation).\n * For compound custom types, expands to multiple properties.\n */\nexport function propertyToTSProperties(\n propertyName: string,\n property: PropertyDefinition,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSProperty[] {\n const baseProp = property as { nullable?: boolean; displayName?: LocalizedString; fields?: Record<string, { nullable?: boolean }> };\n const isReadonly = options.readonly ?? true;\n // Resolve displayName using locale config\n const displayName = resolveDisplayName(baseProp.displayName, options);\n\n // Handle custom compound types from plugins (e.g., JapaneseName, JapaneseAddress)\n if (options.customTypes) {\n const customType = options.customTypes.get(property.type);\n if (customType?.compound && customType.expand) {\n const expandedProps: TSProperty[] = [];\n for (const field of customType.expand) {\n const fieldName = `${propertyName}_${toSnakeCase(field.suffix)}`;\n const fieldOverride = baseProp.fields?.[field.suffix];\n const isNullable = fieldOverride?.nullable ?? baseProp.nullable ?? false;\n const tsType = field.typescript?.type ?? 'string';\n\n expandedProps.push({\n name: fieldName,\n type: tsType,\n optional: isNullable,\n readonly: isReadonly,\n comment: `${displayName ?? propertyName} (${field.suffix})`,\n });\n }\n\n // Add accessor properties (computed properties like full_name)\n if (customType.accessors) {\n for (const accessor of customType.accessors) {\n const accessorName = `${propertyName}_${toSnakeCase(accessor.name)}`;\n expandedProps.push({\n name: accessorName,\n type: 'string | null',\n optional: true,\n readonly: isReadonly,\n comment: `${displayName ?? propertyName} (computed)`,\n });\n }\n }\n\n return expandedProps;\n }\n // Handle simple custom types (non-compound)\n if (customType && !customType.compound) {\n const tsType = customType.typescript?.type ?? 'string';\n return [{\n name: toPropertyName(propertyName),\n type: tsType,\n optional: baseProp.nullable ?? false,\n readonly: isReadonly,\n comment: displayName,\n }];\n }\n }\n\n // Handle MorphTo specially - it creates _type and _id columns\n if (property.type === 'Association') {\n const assocProp = property as {\n relation?: string;\n targets?: readonly string[];\n };\n\n if (assocProp.relation === 'MorphTo' && assocProp.targets && assocProp.targets.length > 0) {\n const propBaseName = toPropertyName(propertyName);\n const targetUnion = assocProp.targets.map(t => `'${t}'`).join(' | ');\n const relationUnion = assocProp.targets.join(' | ');\n\n return [\n {\n name: `${propBaseName}Type`,\n type: targetUnion,\n optional: true, // Polymorphic columns are nullable\n readonly: isReadonly,\n comment: `Polymorphic type for ${propertyName}`,\n },\n {\n name: `${propBaseName}Id`,\n type: 'number',\n optional: true,\n readonly: isReadonly,\n comment: `Polymorphic ID for ${propertyName}`,\n },\n {\n name: propBaseName,\n type: `${relationUnion} | null`,\n optional: true,\n readonly: isReadonly,\n comment: displayName ?? `Polymorphic relation to ${assocProp.targets.join(', ')}`,\n },\n ];\n }\n }\n\n // Default: single property\n const type = getPropertyType(property, allSchemas);\n\n return [{\n name: toPropertyName(propertyName),\n type,\n optional: baseProp.nullable ?? false,\n readonly: isReadonly,\n comment: displayName,\n }];\n}\n\n/**\n * Converts a property to TypeScript property definition (legacy - returns single property).\n */\nexport function propertyToTSProperty(\n propertyName: string,\n property: PropertyDefinition,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSProperty {\n return propertyToTSProperties(propertyName, property, allSchemas, options)[0]!;\n}\n\n/**\n * Extracts referenced interface names from a TypeScript type string.\n * Returns only interface names (not primitives like string, number, boolean, unknown).\n */\nfunction extractTypeReferences(type: string, allSchemaNames: Set<string>): string[] {\n const primitives = new Set(['string', 'number', 'boolean', 'unknown', 'null', 'undefined', 'void', 'never', 'any']);\n const refs: string[] = [];\n\n // Remove array notation and split by | for union types\n const cleanType = type.replace(/\\[\\]/g, '').replace(/\\s*\\|\\s*null/g, '');\n const parts = cleanType.split(/\\s*\\|\\s*/);\n\n for (const part of parts) {\n // Remove quotes (for string literal types like 'Post')\n const trimmed = part.trim().replace(/^['\"]|['\"]$/g, '');\n if (!primitives.has(trimmed) && allSchemaNames.has(trimmed)) {\n refs.push(trimmed);\n }\n }\n\n return refs;\n}\n\n/**\n * Generates TypeScript interface from schema.\n */\nexport function schemaToInterface(\n schema: LoadedSchema,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSInterface {\n const properties: TSProperty[] = [];\n const allSchemaNames = new Set(Object.keys(allSchemas).filter(name => allSchemas[name]!.kind !== 'enum'));\n\n // ID property (only if id is not disabled)\n if (schema.options?.id !== false) {\n const pkType = (schema.options?.idType ?? 'BigInt') as keyof typeof PK_TYPE_MAP;\n properties.push({\n name: 'id',\n type: PK_TYPE_MAP[pkType] ?? 'number',\n optional: false,\n readonly: options.readonly ?? true,\n comment: 'Primary key',\n });\n }\n\n // Schema properties\n if (schema.properties) {\n for (const [propName, property] of Object.entries(schema.properties)) {\n // Use propertyToTSProperties which handles MorphTo returning multiple properties\n properties.push(...propertyToTSProperties(propName, property, allSchemas, options));\n }\n }\n\n // Timestamps (snake_case to match database columns)\n if (schema.options?.timestamps !== false) {\n properties.push(\n {\n name: 'created_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updated_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Last update timestamp',\n }\n );\n }\n\n // Soft delete (snake_case to match database columns)\n if (schema.options?.softDelete) {\n properties.push({\n name: 'deleted_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\n });\n }\n\n // Collect dependencies from property types\n const dependencySet = new Set<string>();\n for (const prop of properties) {\n for (const ref of extractTypeReferences(prop.type, allSchemaNames)) {\n if (ref !== schema.name) { // Don't include self-references\n dependencySet.add(ref);\n }\n }\n }\n\n // Resolve schema displayName using locale config\n const schemaDisplayName = resolveDisplayName(schema.displayName, options);\n\n return {\n name: toInterfaceName(schema.name),\n properties,\n comment: schemaDisplayName ?? schema.name,\n dependencies: dependencySet.size > 0 ? Array.from(dependencySet).sort() : undefined,\n };\n}\n\n/**\n * Formats a TypeScript property.\n */\nexport function formatProperty(property: TSProperty): string {\n const readonly = property.readonly ? 'readonly ' : '';\n const optional = property.optional ? '?' : '';\n const comment = property.comment ? ` /** ${property.comment} */\\n` : '';\n return `${comment} ${readonly}${property.name}${optional}: ${property.type};`;\n}\n\n/**\n * Formats a TypeScript interface.\n */\nexport function formatInterface(iface: TSInterface): string {\n const comment = iface.comment ? `/**\\n * ${iface.comment}\\n */\\n` : '';\n const extendsClause = iface.extends && iface.extends.length > 0\n ? ` extends ${iface.extends.join(', ')}`\n : '';\n const properties = iface.properties.map(formatProperty).join('\\n');\n\n return `${comment}export interface ${iface.name}${extendsClause} {\\n${properties}\\n}`;\n}\n\n/**\n * Generates interfaces for all schemas.\n * Note: File interface is now generated from File.yaml schema (use ensureFileSchema() to auto-create it).\n */\nexport function generateInterfaces(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSInterface[] {\n const interfaces: TSInterface[] = [];\n\n for (const schema of Object.values(schemas)) {\n // Skip enum schemas\n if (schema.kind === 'enum') {\n continue;\n }\n\n // Skip hidden schemas (e.g., cache, jobs, sessions)\n if (schema.options?.hidden === true) {\n continue;\n }\n\n interfaces.push(schemaToInterface(schema, schemas, options));\n }\n\n return interfaces;\n}\n","/**\n * @famgia/omnify-typescript - TypeScript Enum Generator\n *\n * Generates TypeScript enums with helper methods from schema enum definitions.\n */\n\nimport type { LoadedSchema, SchemaCollection, LocalizedString } from '@famgia/omnify-types';\nimport { resolveLocalizedString } from '@famgia/omnify-types';\nimport type { TSEnum, TSEnumValue, TSTypeAlias, TypeScriptOptions } from './types.js';\n\n/**\n * Resolves a localized string using the given options.\n */\nfunction resolveDisplayName(\n value: LocalizedString | undefined,\n options: TypeScriptOptions = {}\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return resolveLocalizedString(value, {\n locale: options.locale,\n config: options.localeConfig,\n });\n}\n\n/**\n * Inline enum value from schema (can be string or object with value/label/extra).\n */\ninterface InlineEnumValue {\n readonly value: string;\n /** Display label - supports multi-language (string or locale map) */\n readonly label?: LocalizedString;\n readonly extra?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Converts enum value to valid TypeScript enum member name.\n */\nexport function toEnumMemberName(value: string): string {\n // Convert to PascalCase and remove invalid characters\n return value\n .split(/[-_\\s]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts schema name to TypeScript enum name.\n */\nexport function toEnumName(schemaName: string): string {\n return schemaName;\n}\n\n/**\n * Parses enum value from schema (can be string or object).\n * If multiLocale is true, keeps all locales. Otherwise resolves to single locale.\n */\nfunction parseEnumValue(\n value: string | InlineEnumValue,\n options: TypeScriptOptions = {}\n): TSEnumValue {\n if (typeof value === 'string') {\n return {\n name: toEnumMemberName(value),\n value,\n // No label or extra - will fallback to value\n };\n }\n\n // Handle label - either multi-locale or resolved single locale\n let label: string | Record<string, string> | undefined;\n if (value.label !== undefined) {\n if (options.multiLocale && typeof value.label === 'object') {\n // Keep all locales as object\n label = value.label as Record<string, string>;\n } else {\n // Resolve to single locale\n label = resolveDisplayName(value.label, options);\n }\n }\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label,\n extra: value.extra,\n };\n}\n\n/**\n * Generates TypeScript enum from schema enum.\n */\nexport function schemaToEnum(schema: LoadedSchema, options: TypeScriptOptions = {}): TSEnum | null {\n if (schema.kind !== 'enum' || !schema.values) {\n return null;\n }\n\n const values: TSEnumValue[] = schema.values.map(value =>\n parseEnumValue(value as string | InlineEnumValue, options)\n );\n const displayName = resolveDisplayName(schema.displayName, options);\n\n return {\n name: toEnumName(schema.name),\n values,\n comment: displayName ?? schema.name,\n };\n}\n\n/**\n * Generates enums for all enum schemas.\n */\nexport function generateEnums(schemas: SchemaCollection, options: TypeScriptOptions = {}): TSEnum[] {\n const enums: TSEnum[] = [];\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') {\n const enumDef = schemaToEnum(schema, options);\n if (enumDef) {\n enums.push(enumDef);\n }\n }\n }\n\n return enums;\n}\n\n/**\n * Check if label is multi-locale (object) or single string.\n */\nfunction isMultiLocaleLabel(label: string | Record<string, string> | undefined): label is Record<string, string> {\n return label !== undefined && typeof label === 'object';\n}\n\n/**\n * Formats a TypeScript enum with helper methods.\n */\nexport function formatEnum(enumDef: TSEnum): string {\n const { name, values, comment } = enumDef;\n const parts: string[] = [];\n\n // JSDoc comment\n if (comment) {\n parts.push(`/**\\n * ${comment}\\n */\\n`);\n }\n\n // Enum definition\n const enumValues = values\n .map(v => ` ${v.name} = '${v.value}',`)\n .join('\\n');\n parts.push(`export enum ${name} {\\n${enumValues}\\n}\\n\\n`);\n\n // Values array\n parts.push(`/** All ${name} values */\\n`);\n parts.push(`export const ${name}Values = Object.values(${name});\\n\\n`);\n\n // Type guard\n parts.push(`/** Type guard for ${name} */\\n`);\n parts.push(`export function is${name}(value: unknown): value is ${name} {\\n`);\n parts.push(` return ${name}Values.includes(value as ${name});\\n`);\n parts.push(`}\\n\\n`);\n\n // Check if we have multi-locale labels or single-locale labels\n const hasLabels = values.some(v => v.label !== undefined);\n const hasMultiLocale = values.some(v => isMultiLocaleLabel(v.label));\n\n if (hasLabels) {\n if (hasMultiLocale) {\n // Multi-locale labels: Record<Enum, Record<string, string>>\n const labelEntries = values\n .filter(v => v.label !== undefined)\n .map(v => {\n if (isMultiLocaleLabel(v.label)) {\n const locales = Object.entries(v.label)\n .map(([locale, text]) => `${locale}: '${text}'`)\n .join(', ');\n return ` [${name}.${v.name}]: { ${locales} },`;\n }\n return ` [${name}.${v.name}]: { default: '${v.label}' },`;\n })\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Labels: Partial<Record<${name}, Record<string, string>>> = {\\n${labelEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get label for ${name} value with locale support */\\n`);\n parts.push(`export function get${name}Label(value: ${name}, locale?: string): string {\\n`);\n parts.push(` const labels = ${lowerFirst(name)}Labels[value];\\n`);\n parts.push(` if (!labels) return value;\\n`);\n parts.push(` if (locale && labels[locale]) return labels[locale];\\n`);\n parts.push(` return Object.values(labels)[0] ?? value;\\n`);\n parts.push(`}\\n\\n`);\n } else {\n // Single-locale labels: Record<Enum, string>\n const labelEntries = values\n .filter(v => v.label !== undefined)\n .map(v => ` [${name}.${v.name}]: '${v.label}',`)\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Labels: Partial<Record<${name}, string>> = {\\n${labelEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get label for ${name} value (fallback to value if no label) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n parts.push(`}\\n\\n`);\n }\n } else {\n parts.push(`/** Get label for ${name} value (returns value as-is) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return value;\\n`);\n parts.push(`}\\n\\n`);\n }\n\n // Extra - only generate if at least one value has extra\n const hasExtra = values.some(v => v.extra !== undefined);\n if (hasExtra) {\n const extraEntries = values\n .filter(v => v.extra !== undefined)\n .map(v => ` [${name}.${v.name}]: ${JSON.stringify(v.extra)},`)\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Extra: Partial<Record<${name}, Record<string, unknown>>> = {\\n${extraEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get extra metadata for ${name} value (undefined if not defined) */\\n`);\n parts.push(`export function get${name}Extra(value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return ${lowerFirst(name)}Extra[value];\\n`);\n parts.push(`}`);\n } else {\n parts.push(`/** Get extra metadata for ${name} value (undefined if not defined) */\\n`);\n parts.push(`export function get${name}Extra(_value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return undefined;\\n`);\n parts.push(`}`);\n }\n\n return parts.join('');\n}\n\n/**\n * Convert first character to lowercase.\n */\nfunction lowerFirst(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n * Generates a union type alias as an alternative to enum.\n */\nexport function enumToUnionType(enumDef: TSEnum): TSTypeAlias {\n const type = enumDef.values\n .map(v => `'${v.value}'`)\n .join(' | ');\n\n return {\n name: enumDef.name,\n type,\n comment: enumDef.comment,\n };\n}\n\n/**\n * Formats a TypeScript type alias with helper methods.\n */\nexport function formatTypeAlias(alias: TSTypeAlias): string {\n const { name, type, comment } = alias;\n const parts: string[] = [];\n\n // JSDoc comment\n if (comment) {\n parts.push(`/**\\n * ${comment}\\n */\\n`);\n }\n\n // Type alias\n parts.push(`export type ${name} = ${type};\\n\\n`);\n\n // Values array\n const values = type.split(' | ').map(v => v.trim());\n parts.push(`/** All ${name} values */\\n`);\n parts.push(`export const ${name}Values: ${name}[] = [${values.join(', ')}];\\n\\n`);\n\n // Type guard\n parts.push(`/** Type guard for ${name} */\\n`);\n parts.push(`export function is${name}(value: unknown): value is ${name} {\\n`);\n parts.push(` return ${name}Values.includes(value as ${name});\\n`);\n parts.push(`}\\n\\n`);\n\n // Label getter (fallback to value for type aliases - no labels)\n parts.push(`/** Get label for ${name} value (returns value as-is) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return value;\\n`);\n parts.push(`}\\n\\n`);\n\n // Extra getter (always undefined for type aliases)\n parts.push(`/** Get extra metadata for ${name} value (always undefined for type aliases) */\\n`);\n parts.push(`export function get${name}Extra(_value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return undefined;\\n`);\n parts.push(`}`);\n\n return parts.join('');\n}\n\n/**\n * Extracts inline enums from properties for type generation.\n */\nexport function extractInlineEnums(schemas: SchemaCollection, options: TypeScriptOptions = {}): TSTypeAlias[] {\n const typeAliases: TSTypeAlias[] = [];\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum' || !schema.properties) {\n continue;\n }\n\n for (const [propName, property] of Object.entries(schema.properties)) {\n if (property.type === 'Enum') {\n const enumProp = property as { enum?: readonly (string | InlineEnumValue)[]; displayName?: LocalizedString };\n\n // Only handle inline array enums (not references to named enums)\n if (Array.isArray(enumProp.enum) && enumProp.enum.length > 0) {\n const typeName = `${schema.name}${propName.charAt(0).toUpperCase() + propName.slice(1)}`;\n const values = enumProp.enum.map(v =>\n typeof v === 'string' ? v : v.value\n );\n const displayName = resolveDisplayName(enumProp.displayName, options);\n typeAliases.push({\n name: typeName,\n type: values.map(v => `'${v}'`).join(' | '),\n comment: displayName ?? `${schema.name} ${propName} enum`,\n });\n }\n }\n\n if (property.type === 'Select') {\n const selectProp = property as { options?: readonly string[]; displayName?: LocalizedString };\n\n if (selectProp.options && selectProp.options.length > 0) {\n const typeName = `${schema.name}${propName.charAt(0).toUpperCase() + propName.slice(1)}`;\n const displayName = resolveDisplayName(selectProp.displayName, options);\n typeAliases.push({\n name: typeName,\n type: selectProp.options.map(v => `'${v}'`).join(' | '),\n comment: displayName ?? `${schema.name} ${propName} options`,\n });\n }\n }\n }\n }\n\n return typeAliases;\n}\n","/**\n * Built-in validation message templates for common languages.\n * Templates use ${displayName}, ${min}, ${max}, ${pattern} placeholders.\n */\n\nexport interface ValidationTemplates {\n readonly required: Record<string, string>;\n readonly minLength: Record<string, string>;\n readonly maxLength: Record<string, string>;\n readonly min: Record<string, string>;\n readonly max: Record<string, string>;\n readonly email: Record<string, string>;\n readonly url: Record<string, string>;\n readonly pattern: Record<string, string>;\n readonly enum: Record<string, string>;\n}\n\n/**\n * Default validation message templates.\n * Supports: ja (Japanese), en (English), vi (Vietnamese), ko (Korean), zh (Chinese)\n */\nexport const DEFAULT_VALIDATION_TEMPLATES: ValidationTemplates = {\n required: {\n ja: '${displayName}は必須です',\n en: '${displayName} is required',\n vi: '${displayName} là bắt buộc',\n ko: '${displayName}은(는) 필수입니다',\n zh: '${displayName}为必填项',\n },\n minLength: {\n ja: '${displayName}は${min}文字以上で入力してください',\n en: '${displayName} must be at least ${min} characters',\n vi: '${displayName} phải có ít nhất ${min} ký tự',\n ko: '${displayName}은(는) ${min}자 이상이어야 합니다',\n zh: '${displayName}至少需要${min}个字符',\n },\n maxLength: {\n ja: '${displayName}は${max}文字以内で入力してください',\n en: '${displayName} must be at most ${max} characters',\n vi: '${displayName} tối đa ${max} ký tự',\n ko: '${displayName}은(는) ${max}자 이하여야 합니다',\n zh: '${displayName}不能超过${max}个字符',\n },\n min: {\n ja: '${displayName}は${min}以上の値を入力してください',\n en: '${displayName} must be at least ${min}',\n vi: '${displayName} phải lớn hơn hoặc bằng ${min}',\n ko: '${displayName}은(는) ${min} 이상이어야 합니다',\n zh: '${displayName}不能小于${min}',\n },\n max: {\n ja: '${displayName}は${max}以下の値を入力してください',\n en: '${displayName} must be at most ${max}',\n vi: '${displayName} phải nhỏ hơn hoặc bằng ${max}',\n ko: '${displayName}은(는) ${max} 이하여야 합니다',\n zh: '${displayName}不能大于${max}',\n },\n email: {\n ja: '${displayName}の形式が正しくありません',\n en: '${displayName} is not a valid email address',\n vi: '${displayName} không phải là địa chỉ email hợp lệ',\n ko: '${displayName} 형식이 올바르지 않습니다',\n zh: '${displayName}不是有效的邮箱地址',\n },\n url: {\n ja: '${displayName}は有効なURLではありません',\n en: '${displayName} is not a valid URL',\n vi: '${displayName} không phải là URL hợp lệ',\n ko: '${displayName}은(는) 유효한 URL이 아닙니다',\n zh: '${displayName}不是有效的URL',\n },\n pattern: {\n ja: '${displayName}の形式が正しくありません',\n en: '${displayName} format is invalid',\n vi: '${displayName} không đúng định dạng',\n ko: '${displayName} 형식이 올바르지 않습니다',\n zh: '${displayName}格式不正确',\n },\n enum: {\n ja: '${displayName}の値が無効です',\n en: '${displayName} has an invalid value',\n vi: '${displayName} có giá trị không hợp lệ',\n ko: '${displayName} 값이 유효하지 않습니다',\n zh: '${displayName}的值无效',\n },\n};\n\n/**\n * Merge user templates with default templates.\n */\nexport function mergeValidationTemplates(\n userTemplates?: Partial<ValidationTemplates>\n): ValidationTemplates {\n if (!userTemplates) {\n return DEFAULT_VALIDATION_TEMPLATES;\n }\n\n // Create mutable copies of each template category\n const merged: Record<keyof ValidationTemplates, Record<string, string>> = {\n required: { ...DEFAULT_VALIDATION_TEMPLATES.required },\n minLength: { ...DEFAULT_VALIDATION_TEMPLATES.minLength },\n maxLength: { ...DEFAULT_VALIDATION_TEMPLATES.maxLength },\n min: { ...DEFAULT_VALIDATION_TEMPLATES.min },\n max: { ...DEFAULT_VALIDATION_TEMPLATES.max },\n email: { ...DEFAULT_VALIDATION_TEMPLATES.email },\n url: { ...DEFAULT_VALIDATION_TEMPLATES.url },\n pattern: { ...DEFAULT_VALIDATION_TEMPLATES.pattern },\n enum: { ...DEFAULT_VALIDATION_TEMPLATES.enum },\n };\n\n // Merge user templates\n for (const [key, value] of Object.entries(userTemplates)) {\n if (value && key in merged) {\n merged[key as keyof ValidationTemplates] = {\n ...merged[key as keyof ValidationTemplates],\n ...value,\n };\n }\n }\n\n return merged as ValidationTemplates;\n}\n\n/**\n * Format a validation message with placeholders.\n */\nexport function formatValidationMessage(\n template: string,\n vars: Record<string, string | number>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replace(new RegExp(`\\\\$\\\\{${key}\\\\}`, 'g'), String(value));\n }\n return result;\n}\n\n/**\n * Get validation messages for all configured locales.\n * Fallback order: locale -> fallbackLocale -> 'en'\n */\nexport function getValidationMessages(\n templates: ValidationTemplates,\n ruleType: keyof ValidationTemplates,\n locales: string[],\n vars: Record<string, string | number>,\n fallbackLocale?: string\n): Record<string, string> {\n const ruleTemplates = templates[ruleType];\n const messages: Record<string, string> = {};\n\n for (const locale of locales) {\n // Try: locale -> fallbackLocale -> 'en'\n const template = ruleTemplates[locale]\n ?? (fallbackLocale ? ruleTemplates[fallbackLocale] : undefined)\n ?? ruleTemplates['en']\n ?? '';\n messages[locale] = formatValidationMessage(template, vars);\n }\n\n return messages;\n}\n","/**\n * Generates Ant Design compatible validation rules from schemas.\n */\n\nimport type { LoadedSchema, SchemaCollection, PropertyDefinition, LocalizedString, LocaleConfig } from '@famgia/omnify-types';\nimport type { TypeScriptFile, TypeScriptOptions, LocaleMap } from './types.js';\nimport {\n DEFAULT_VALIDATION_TEMPLATES,\n mergeValidationTemplates,\n getValidationMessages,\n type ValidationTemplates,\n} from './validation-templates.js';\n\n/**\n * Ant Design rule structure with multi-locale message.\n */\ninterface AntdRule {\n required?: boolean;\n type?: 'string' | 'number' | 'email' | 'url' | 'integer';\n min?: number;\n max?: number;\n len?: number;\n pattern?: string;\n message: LocaleMap;\n}\n\n/**\n * Property rules for a model.\n */\ninterface PropertyRules {\n displayName: LocaleMap;\n rules: AntdRule[];\n}\n\n/**\n * Model rules structure.\n */\ninterface ModelRules {\n displayName: LocaleMap;\n properties: Record<string, PropertyRules>;\n}\n\n/**\n * Get localized display name as object with all locales.\n */\nfunction getMultiLocaleDisplayName(\n value: LocalizedString | undefined,\n locales: string[],\n fallbackLocale: string,\n defaultValue: string\n): LocaleMap {\n if (!value) {\n // Return default value for all locales\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = defaultValue;\n }\n return result;\n }\n\n if (typeof value === 'string') {\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = value;\n }\n return result;\n }\n\n // It's a locale map\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = value[locale] ?? value[fallbackLocale] ?? value['en'] ?? defaultValue;\n }\n return result;\n}\n\n/**\n * Generate validation rules for a property.\n */\nfunction generatePropertyRules(\n propName: string,\n property: PropertyDefinition,\n displayName: LocaleMap,\n locales: string[],\n fallbackLocale: string,\n templates: ValidationTemplates\n): AntdRule[] {\n const rules: AntdRule[] = [];\n const propDef = property as {\n nullable?: boolean;\n length?: number;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n pattern?: string;\n };\n\n // Required rule (if not nullable)\n if (!propDef.nullable) {\n rules.push({\n required: true,\n message: getValidationMessages(templates, 'required', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Type-specific rules\n if (property.type === 'Email') {\n rules.push({\n type: 'email',\n message: getValidationMessages(templates, 'email', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Length rules for strings\n if (property.type === 'String' || property.type === 'Text' || property.type === 'LongText') {\n if (propDef.minLength) {\n rules.push({\n min: propDef.minLength,\n message: getValidationMessages(templates, 'minLength', locales, { displayName: '${displayName}', min: propDef.minLength }, fallbackLocale),\n });\n }\n if (propDef.maxLength || propDef.length) {\n const max = propDef.maxLength ?? propDef.length!;\n rules.push({\n max,\n message: getValidationMessages(templates, 'maxLength', locales, { displayName: '${displayName}', max }, fallbackLocale),\n });\n }\n }\n\n // Numeric range rules\n if (property.type === 'Int' || property.type === 'BigInt' || property.type === 'Float') {\n if (propDef.min !== undefined) {\n rules.push({\n type: property.type === 'Float' ? 'number' : 'integer',\n min: propDef.min,\n message: getValidationMessages(templates, 'min', locales, { displayName: '${displayName}', min: propDef.min }, fallbackLocale),\n });\n }\n if (propDef.max !== undefined) {\n rules.push({\n type: property.type === 'Float' ? 'number' : 'integer',\n max: propDef.max,\n message: getValidationMessages(templates, 'max', locales, { displayName: '${displayName}', max: propDef.max }, fallbackLocale),\n });\n }\n }\n\n // Pattern rule\n if (propDef.pattern) {\n rules.push({\n pattern: propDef.pattern,\n message: getValidationMessages(templates, 'pattern', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Replace ${displayName} placeholder with actual display name per locale\n for (const rule of rules) {\n const newMessage: Record<string, string> = {};\n for (const locale of locales) {\n const msg = rule.message[locale];\n if (msg) {\n newMessage[locale] = msg.replace(/\\$\\{displayName\\}/g, displayName[locale] ?? propName);\n }\n }\n (rule as { message: Record<string, string> }).message = newMessage;\n }\n\n return rules;\n}\n\n/**\n * Generate rules for a schema.\n */\nexport function generateModelRules(\n schema: LoadedSchema,\n locales: string[],\n fallbackLocale: string,\n templates: ValidationTemplates\n): ModelRules {\n const modelDisplayName = getMultiLocaleDisplayName(\n schema.displayName,\n locales,\n fallbackLocale,\n schema.name\n );\n\n const properties: Record<string, PropertyRules> = {};\n\n if (schema.properties) {\n for (const [propName, property] of Object.entries(schema.properties)) {\n const propDef = property as { displayName?: LocalizedString };\n const displayName = getMultiLocaleDisplayName(\n propDef.displayName,\n locales,\n fallbackLocale,\n propName\n );\n\n properties[propName] = {\n displayName,\n rules: generatePropertyRules(propName, property, displayName, locales, fallbackLocale, templates),\n };\n }\n }\n\n return {\n displayName: modelDisplayName,\n properties,\n };\n}\n\n/**\n * Format rules as TypeScript code.\n */\nfunction formatRulesFile(\n schemaName: string,\n rules: ModelRules\n): string {\n const parts: string[] = [];\n\n parts.push(`/**\n * Auto-generated validation rules and metadata for ${schemaName}.\n * DO NOT EDIT - This file is automatically generated and will be overwritten.\n */\n\nimport type { LocaleMap, ValidationRule } from '../common.js';\n\n`);\n\n // Model display name\n parts.push(`/** Display name for ${schemaName} */\\n`);\n parts.push(`export const ${schemaName}DisplayName: LocaleMap = ${JSON.stringify(rules.displayName, null, 2)};\\n\\n`);\n\n // Property metadata and rules\n parts.push(`/** Property display names for ${schemaName} */\\n`);\n parts.push(`export const ${schemaName}PropertyDisplayNames: Record<string, LocaleMap> = {\\n`);\n for (const [propName, propRules] of Object.entries(rules.properties)) {\n parts.push(` ${propName}: ${JSON.stringify(propRules.displayName)},\\n`);\n }\n parts.push(`};\\n\\n`);\n\n // Validation rules\n parts.push(`/** Validation rules for ${schemaName} (Ant Design compatible) */\\n`);\n parts.push(`export const ${schemaName}Rules: Record<string, ValidationRule[]> = {\\n`);\n for (const [propName, propRules] of Object.entries(rules.properties)) {\n if (propRules.rules.length > 0) {\n parts.push(` ${propName}: [\\n`);\n for (const rule of propRules.rules) {\n const ruleObj: Record<string, unknown> = {};\n if (rule.required) ruleObj.required = true;\n if (rule.type) ruleObj.type = `'${rule.type}'`;\n if (rule.min !== undefined) ruleObj.min = rule.min;\n if (rule.max !== undefined) ruleObj.max = rule.max;\n if (rule.pattern) ruleObj.pattern = `/${rule.pattern}/`;\n ruleObj.message = rule.message;\n\n // Format as JS object\n const ruleStr = Object.entries(ruleObj)\n .map(([k, v]) => {\n if (k === 'type') return `${k}: ${v}`;\n if (k === 'pattern') return `${k}: ${v}`;\n return `${k}: ${JSON.stringify(v)}`;\n })\n .join(', ');\n parts.push(` { ${ruleStr} },\\n`);\n }\n parts.push(` ],\\n`);\n }\n }\n parts.push(`};\\n\\n`);\n\n // Helper function to get rules with locale-specific messages\n parts.push(`/** Get validation rules with messages for a specific locale */\\n`);\n parts.push(`export function get${schemaName}Rules(locale: string): Record<string, Array<{ required?: boolean; type?: string; min?: number; max?: number; pattern?: RegExp; message: string }>> {\n const result: Record<string, Array<{ required?: boolean; type?: string; min?: number; max?: number; pattern?: RegExp; message: string }>> = {};\n for (const [prop, rules] of Object.entries(${schemaName}Rules)) {\n result[prop] = rules.map(rule => ({\n ...rule,\n message: rule.message[locale] ?? rule.message['en'] ?? '',\n }));\n }\n return result;\n}\\n\\n`);\n\n // Helper function to get display name\n parts.push(`/** Get display name for a specific locale */\\n`);\n parts.push(`export function get${schemaName}DisplayName(locale: string): string {\n return ${schemaName}DisplayName[locale] ?? ${schemaName}DisplayName['en'] ?? '${schemaName}';\n}\\n\\n`);\n\n parts.push(`/** Get property display name for a specific locale */\\n`);\n parts.push(`export function get${schemaName}PropertyDisplayName(property: string, locale: string): string {\n const names = ${schemaName}PropertyDisplayNames[property];\n return names?.[locale] ?? names?.['en'] ?? property;\n}\\n`);\n\n return parts.join('');\n}\n\n/**\n * Generate rules files for all schemas.\n */\nexport function generateRulesFiles(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TypeScriptFile[] {\n const files: TypeScriptFile[] = [];\n const localeConfig = options.localeConfig;\n const locales = [...(localeConfig?.locales ?? ['en'])]; // Convert readonly to mutable\n const fallbackLocale = localeConfig?.fallbackLocale ?? 'en';\n\n // Merge user templates with defaults\n const templates = mergeValidationTemplates(options.validationTemplates as Partial<ValidationTemplates> | undefined);\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n\n const rules = generateModelRules(schema, locales, fallbackLocale, templates);\n const content = formatRulesFile(schema.name, rules);\n\n files.push({\n filePath: `rules/${schema.name}.rules.ts`,\n content,\n types: [`${schema.name}Rules`, `${schema.name}DisplayName`],\n overwrite: true,\n });\n }\n\n return files;\n}\n","/**\n * @famgia/omnify-typescript - TypeScript Generator\n *\n * Generates TypeScript models with base/model pattern:\n * - models/base/[SchemaName].ts - Auto-generated base interfaces, DO NOT EDIT\n * - models/enum/[EnumName].ts - Auto-generated enums/type aliases, DO NOT EDIT\n * - models/[SchemaName].ts - Extends base, user can customize\n * - models/index.ts - Re-exports all\n */\n\nimport type { SchemaCollection } from '@famgia/omnify-types';\nimport type { TypeScriptFile, TypeScriptOptions, TSEnum, TSTypeAlias } from './types.js';\nimport { generateInterfaces, formatInterface } from './interface-generator.js';\nimport { generateEnums, formatEnum, formatTypeAlias, extractInlineEnums } from './enum-generator.js';\nimport { generateRulesFiles } from './rules-generator.js';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: false, // Changed: interfaces should be mutable for forms/mutations\n strictNullChecks: true,\n};\n\n/**\n * Generates the base file header comment (DO NOT EDIT).\n */\nfunction generateBaseHeader(): string {\n return `/**\n * Auto-generated TypeScript types from Omnify schemas.\n * DO NOT EDIT - This file is automatically generated and will be overwritten.\n */\n\n`;\n}\n\n/**\n * Generates the model file header comment (user can edit).\n */\nfunction generateModelHeader(schemaName: string): string {\n return `/**\n * ${schemaName} Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types here.\n * This file will NOT be overwritten by the generator.\n */\n\n`;\n}\n\n/**\n * Generates utility types for a schema.\n * - Create: For POST requests (excludes id, timestamps)\n * - Update: For PUT/PATCH requests (all fields optional)\n */\nfunction generateUtilityTypes(schemaName: string, schema: { options?: { id?: boolean; timestamps?: boolean; softDelete?: boolean } }): string {\n const parts: string[] = [];\n const excludeFields: string[] = [];\n\n // Exclude id if auto-generated\n if (schema.options?.id !== false) {\n excludeFields.push(\"'id'\");\n }\n\n // Exclude timestamps if enabled\n if (schema.options?.timestamps !== false) {\n excludeFields.push(\"'created_at'\", \"'updated_at'\");\n }\n\n // Exclude soft delete if enabled\n if (schema.options?.softDelete) {\n excludeFields.push(\"'deleted_at'\");\n }\n\n const omitType = excludeFields.length > 0\n ? `Omit<${schemaName}, ${excludeFields.join(' | ')}>`\n : schemaName;\n\n // Create type - for POST requests\n parts.push(`\\n/** For creating new ${schemaName} (POST requests) */`);\n parts.push(`\\nexport type ${schemaName}Create = ${omitType};\\n`);\n\n // Update type - for PUT/PATCH requests (all optional)\n parts.push(`\\n/** For updating ${schemaName} (PUT/PATCH requests) */`);\n parts.push(`\\nexport type ${schemaName}Update = Partial<${schemaName}Create>;\\n`);\n\n return parts.join('');\n}\n\n/**\n * Checks if interface uses DateTimeString or DateString types.\n */\nfunction needsDateTimeImports(iface: { properties: readonly { type: string }[] }): { dateTime: boolean; date: boolean } {\n let dateTime = false;\n let date = false;\n for (const prop of iface.properties) {\n if (prop.type === 'DateTimeString' || prop.type.includes('DateTimeString')) {\n dateTime = true;\n }\n if (prop.type === 'DateString' || prop.type.includes('DateString')) {\n date = true;\n }\n }\n return { dateTime, date };\n}\n\n/**\n * Generates a single base interface file.\n */\nfunction generateBaseInterfaceFile(\n schemaName: string,\n schemas: SchemaCollection,\n options: TypeScriptOptions\n): TypeScriptFile {\n const interfaces = generateInterfaces(schemas, options);\n const iface = interfaces.find(i => i.name === schemaName);\n const schema = schemas[schemaName];\n\n if (!iface || !schema) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n\n // Check if we need to import DateTimeString or DateString\n const dateImports = needsDateTimeImports(iface);\n const commonImports: string[] = [];\n if (dateImports.dateTime) commonImports.push('DateTimeString');\n if (dateImports.date) commonImports.push('DateString');\n if (commonImports.length > 0) {\n parts.push(`import type { ${commonImports.join(', ')} } from '../common.js';\\n`);\n }\n\n // Add imports for dependencies\n if (iface.dependencies && iface.dependencies.length > 0) {\n for (const dep of iface.dependencies) {\n parts.push(`import type { ${dep} } from './${dep}.js';\\n`);\n }\n parts.push('\\n');\n } else if (commonImports.length > 0) {\n parts.push('\\n');\n }\n\n // Main interface\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n // Utility types (Create, Update)\n parts.push(generateUtilityTypes(schemaName, schema));\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName, `${schemaName}Create`, `${schemaName}Update`],\n overwrite: true,\n };\n}\n\n/**\n * Generates a single enum file.\n */\nfunction generateEnumFile(enumDef: TSEnum): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatEnum(enumDef));\n parts.push('\\n');\n\n return {\n filePath: `enum/${enumDef.name}.ts`,\n content: parts.join(''),\n types: [enumDef.name],\n overwrite: true,\n };\n}\n\n/**\n * Generates a single type alias file.\n */\nfunction generateTypeAliasFile(alias: TSTypeAlias): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatTypeAlias(alias));\n parts.push('\\n');\n\n return {\n filePath: `enum/${alias.name}.ts`,\n content: parts.join(''),\n types: [alias.name],\n overwrite: true,\n };\n}\n\n/**\n * Generates model file content that extends base.\n */\nfunction generateModelFile(schemaName: string): TypeScriptFile {\n const parts: string[] = [generateModelHeader(schemaName)];\n\n // Import base interface\n parts.push(`import type { ${schemaName} as ${schemaName}Base } from './base/${schemaName}.js';\\n\\n`);\n\n // Export interface that extends base\n parts.push(`/**\\n * ${schemaName} model interface.\\n * Add custom properties or methods here.\\n */\\n`);\n parts.push(`export interface ${schemaName} extends ${schemaName}Base {\\n`);\n parts.push(` // Add custom properties here\\n`);\n parts.push(`}\\n\\n`);\n\n // Re-export base for convenience\n parts.push(`// Re-export base type for internal use\\n`);\n parts.push(`export type { ${schemaName}Base };\\n`);\n\n return {\n filePath: `${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\n overwrite: false, // Never overwrite user models\n };\n}\n\n/**\n * Generates common.ts with shared types.\n */\nfunction generateCommonFile(options: TypeScriptOptions): TypeScriptFile {\n const locales = options.localeConfig?.locales ?? ['ja', 'en'];\n const localeUnion = locales.map(l => `'${l}'`).join(' | ');\n\n const content = `${generateBaseHeader()}\n/**\n * Locale map for multi-language support.\n */\nexport interface LocaleMap {\n [locale: string]: string;\n}\n\n/**\n * Supported locales in this project.\n */\nexport type Locale = ${localeUnion};\n\n/**\n * Ant Design compatible validation rule.\n */\nexport interface ValidationRule {\n required?: boolean;\n type?: 'string' | 'number' | 'email' | 'url' | 'integer' | 'array' | 'object';\n min?: number;\n max?: number;\n len?: number;\n pattern?: RegExp;\n message: string;\n}\n\n/**\n * ISO 8601 date-time string.\n */\nexport type DateTimeString = string;\n\n/**\n * ISO 8601 date string (YYYY-MM-DD).\n */\nexport type DateString = string;\n`;\n\n return {\n filePath: 'common.ts',\n content,\n types: ['LocaleMap', 'Locale', 'ValidationRule', 'DateTimeString', 'DateString'],\n overwrite: true,\n };\n}\n\n/**\n * Generates index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[],\n options: TypeScriptOptions\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n\n // Export common types\n parts.push(`// Common Types\\n`);\n parts.push(`export type { LocaleMap, Locale, ValidationRule, DateTimeString, DateString } from './common.js';\\n\\n`);\n\n // Export enums (enum + Values + isX + getXLabel + getXExtra)\n if (enums.length > 0 || typeAliases.length > 0) {\n parts.push(`// Enums\\n`);\n for (const enumDef of enums) {\n parts.push(`export {\\n`);\n parts.push(` ${enumDef.name},\\n`);\n parts.push(` ${enumDef.name}Values,\\n`);\n parts.push(` is${enumDef.name},\\n`);\n parts.push(` get${enumDef.name}Label,\\n`);\n parts.push(` get${enumDef.name}Extra,\\n`);\n parts.push(`} from './enum/${enumDef.name}.js';\\n`);\n }\n for (const alias of typeAliases) {\n parts.push(`export {\\n`);\n parts.push(` type ${alias.name},\\n`);\n parts.push(` ${alias.name}Values,\\n`);\n parts.push(` is${alias.name},\\n`);\n parts.push(` get${alias.name}Label,\\n`);\n parts.push(` get${alias.name}Extra,\\n`);\n parts.push(`} from './enum/${alias.name}.js';\\n`);\n }\n parts.push('\\n');\n }\n\n // Export all models with utility types\n parts.push(`// Models (with Create/Update utility types)\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\n`);\n parts.push(`export type { ${schema.name}Create, ${schema.name}Update } from './base/${schema.name}.js';\\n`);\n }\n\n // Export rules functions if enabled\n if (options.generateRules) {\n parts.push(`\\n// Validation Rules\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n parts.push(`export {\\n`);\n parts.push(` get${schema.name}Rules,\\n`);\n parts.push(` get${schema.name}DisplayName,\\n`);\n parts.push(` get${schema.name}PropertyDisplayName,\\n`);\n parts.push(`} from './rules/${schema.name}.rules.js';\\n`);\n }\n }\n\n return {\n filePath: 'index.ts',\n content: parts.join(''),\n types: [],\n overwrite: true,\n };\n}\n\n/**\n * Generates TypeScript files with base/model pattern.\n *\n * Output structure:\n * - models/base/[SchemaName].ts - Auto-generated base interfaces (always overwritten)\n * - models/enum/[EnumName].ts - Auto-generated enums/type aliases (always overwritten)\n * - models/[SchemaName].ts - User-editable models that extend base (created once, never overwritten)\n * - models/index.ts - Re-exports (always overwritten)\n */\nexport function generateTypeScript(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TypeScriptFile[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const files: TypeScriptFile[] = [];\n\n // Generate enum files\n const enums = generateEnums(schemas, opts);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas, opts);\n for (const alias of typeAliases) {\n files.push(generateTypeAliasFile(alias));\n }\n\n // Generate base interface files\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n files.push(generateBaseInterfaceFile(schema.name, schemas, opts));\n }\n\n // Generate model files (only created if not exists)\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n files.push(generateModelFile(schema.name));\n }\n\n // Generate validation rules files (if enabled)\n if (opts.generateRules) {\n const rulesFiles = generateRulesFiles(schemas, opts);\n files.push(...rulesFiles);\n }\n\n // Generate common.ts\n files.push(generateCommonFile(opts));\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases, opts));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["resolveLocalizedString","resolveDisplayName","result"]}
|
|
1
|
+
{"version":3,"sources":["../src/interface-generator.ts","../src/enum-generator.ts","../src/validation-templates.ts","../src/rules-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-laravel - TypeScript Interface Generator\n *\n * Generates TypeScript interfaces from schemas.\n */\n\nimport type { LoadedSchema, PropertyDefinition, SchemaCollection, LocalizedString } from '@famgia/omnify-types';\nimport { resolveLocalizedString } from '@famgia/omnify-types';\nimport type { TSInterface, TSProperty, TypeScriptOptions } from './types.js';\n\n/**\n * Convert a string to snake_case.\n */\nfunction toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/^_/, '')\n .toLowerCase();\n}\n\n/**\n * Maps Omnify property types to TypeScript types.\n */\nconst TYPE_MAP: Record<string, string> = {\n String: 'string',\n TinyInt: 'number',\n Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n MediumText: 'string',\n LongText: 'string',\n Date: 'DateString',\n Time: 'string',\n DateTime: 'DateTimeString',\n Timestamp: 'DateTimeString',\n Json: 'unknown',\n Email: 'string',\n Password: 'string',\n Enum: 'string',\n Select: 'string',\n Lookup: 'number',\n};\n\n/**\n * File interface name (references the File.yaml schema).\n * The File schema is auto-generated by ensureFileSchema() when File type is used.\n */\nexport const FILE_INTERFACE_NAME = 'File';\n\n/**\n * Maps primary key types to TypeScript types.\n */\nconst PK_TYPE_MAP: Record<string, string> = {\n Int: 'number',\n BigInt: 'number',\n Uuid: 'string',\n String: 'string',\n};\n\n/**\n * Resolves a localized string using the given options.\n * Returns undefined if the value is undefined or cannot be resolved.\n */\nfunction resolveDisplayName(\n value: LocalizedString | undefined,\n options: TypeScriptOptions = {}\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return resolveLocalizedString(value, {\n locale: options.locale,\n config: options.localeConfig,\n });\n}\n\n/**\n * Converts property name to TypeScript property name.\n * Preserves camelCase.\n */\nexport function toPropertyName(name: string): string {\n return name;\n}\n\n/**\n * Converts schema name to TypeScript interface name.\n * Preserves PascalCase.\n */\nexport function toInterfaceName(schemaName: string): string {\n return schemaName;\n}\n\n/**\n * Gets TypeScript type for a property.\n */\nexport function getPropertyType(\n property: PropertyDefinition,\n _allSchemas: SchemaCollection\n): string {\n // Handle File type specially (polymorphic relation to files table)\n // References the File interface generated from File.yaml schema\n if (property.type === 'File') {\n const fileProp = property as { multiple?: boolean };\n if (fileProp.multiple) {\n return `${FILE_INTERFACE_NAME}[]`;\n }\n return `${FILE_INTERFACE_NAME} | null`;\n }\n\n // Handle associations\n if (property.type === 'Association') {\n const assocProp = property as {\n relation?: string;\n target?: string;\n targets?: readonly string[];\n };\n\n const targetName = assocProp.target ?? 'unknown';\n\n switch (assocProp.relation) {\n // Standard relations\n case 'OneToOne':\n case 'ManyToOne':\n return targetName;\n case 'OneToMany':\n case 'ManyToMany':\n return `${targetName}[]`;\n\n // Polymorphic relations\n case 'MorphTo':\n // Union type of all possible targets\n if (assocProp.targets && assocProp.targets.length > 0) {\n return assocProp.targets.join(' | ');\n }\n return 'unknown';\n case 'MorphOne':\n return targetName;\n case 'MorphMany':\n case 'MorphToMany':\n case 'MorphedByMany':\n return `${targetName}[]`;\n\n default:\n return 'unknown';\n }\n }\n\n // Handle enum types\n if (property.type === 'Enum') {\n const enumProp = property as { enum?: string | readonly string[] };\n if (typeof enumProp.enum === 'string') {\n // Reference to a named enum\n return enumProp.enum;\n }\n if (Array.isArray(enumProp.enum)) {\n // Inline enum - create union type\n return enumProp.enum.map(v => `'${v}'`).join(' | ');\n }\n }\n\n // Handle Select with options\n if (property.type === 'Select') {\n const selectProp = property as { options?: readonly string[] };\n if (selectProp.options && selectProp.options.length > 0) {\n return selectProp.options.map(v => `'${v}'`).join(' | ');\n }\n }\n\n // Standard type mapping\n return TYPE_MAP[property.type] ?? 'unknown';\n}\n\n/**\n * Converts a property to TypeScript property definition.\n * For MorphTo, returns multiple properties (_type, _id, and relation).\n * For compound custom types, expands to multiple properties.\n */\nexport function propertyToTSProperties(\n propertyName: string,\n property: PropertyDefinition,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSProperty[] {\n const baseProp = property as { nullable?: boolean; displayName?: LocalizedString; fields?: Record<string, { nullable?: boolean }> };\n const isReadonly = options.readonly ?? true;\n // Resolve displayName using locale config\n const displayName = resolveDisplayName(baseProp.displayName, options);\n\n // Handle custom compound types from plugins (e.g., JapaneseName, JapaneseAddress)\n if (options.customTypes) {\n const customType = options.customTypes.get(property.type);\n if (customType?.compound && customType.expand) {\n const expandedProps: TSProperty[] = [];\n for (const field of customType.expand) {\n const fieldName = `${propertyName}_${toSnakeCase(field.suffix)}`;\n const fieldOverride = baseProp.fields?.[field.suffix];\n const isNullable = fieldOverride?.nullable ?? baseProp.nullable ?? false;\n const tsType = field.typescript?.type ?? 'string';\n\n expandedProps.push({\n name: fieldName,\n type: tsType,\n optional: isNullable,\n readonly: isReadonly,\n comment: `${displayName ?? propertyName} (${field.suffix})`,\n });\n }\n\n // Add accessor properties (computed properties like full_name)\n if (customType.accessors) {\n for (const accessor of customType.accessors) {\n const accessorName = `${propertyName}_${toSnakeCase(accessor.name)}`;\n expandedProps.push({\n name: accessorName,\n type: 'string | null',\n optional: true,\n readonly: isReadonly,\n comment: `${displayName ?? propertyName} (computed)`,\n });\n }\n }\n\n return expandedProps;\n }\n // Handle simple custom types (non-compound)\n if (customType && !customType.compound) {\n const tsType = customType.typescript?.type ?? 'string';\n return [{\n name: toPropertyName(propertyName),\n type: tsType,\n optional: baseProp.nullable ?? false,\n readonly: isReadonly,\n comment: displayName,\n }];\n }\n }\n\n // Handle MorphTo specially - it creates _type and _id columns\n if (property.type === 'Association') {\n const assocProp = property as {\n relation?: string;\n targets?: readonly string[];\n };\n\n if (assocProp.relation === 'MorphTo' && assocProp.targets && assocProp.targets.length > 0) {\n const propBaseName = toPropertyName(propertyName);\n const targetUnion = assocProp.targets.map(t => `'${t}'`).join(' | ');\n const relationUnion = assocProp.targets.join(' | ');\n\n return [\n {\n name: `${propBaseName}Type`,\n type: targetUnion,\n optional: true, // Polymorphic columns are nullable\n readonly: isReadonly,\n comment: `Polymorphic type for ${propertyName}`,\n },\n {\n name: `${propBaseName}Id`,\n type: 'number',\n optional: true,\n readonly: isReadonly,\n comment: `Polymorphic ID for ${propertyName}`,\n },\n {\n name: propBaseName,\n type: `${relationUnion} | null`,\n optional: true,\n readonly: isReadonly,\n comment: displayName ?? `Polymorphic relation to ${assocProp.targets.join(', ')}`,\n },\n ];\n }\n }\n\n // Default: single property\n const type = getPropertyType(property, allSchemas);\n\n return [{\n name: toPropertyName(propertyName),\n type,\n optional: baseProp.nullable ?? false,\n readonly: isReadonly,\n comment: displayName,\n }];\n}\n\n/**\n * Converts a property to TypeScript property definition (legacy - returns single property).\n */\nexport function propertyToTSProperty(\n propertyName: string,\n property: PropertyDefinition,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSProperty {\n return propertyToTSProperties(propertyName, property, allSchemas, options)[0]!;\n}\n\n/**\n * Extracts referenced interface names from a TypeScript type string.\n * Returns only interface names (not primitives like string, number, boolean, unknown).\n */\nfunction extractTypeReferences(type: string, allSchemaNames: Set<string>): string[] {\n const primitives = new Set(['string', 'number', 'boolean', 'unknown', 'null', 'undefined', 'void', 'never', 'any']);\n const refs: string[] = [];\n\n // Remove array notation and split by | for union types\n const cleanType = type.replace(/\\[\\]/g, '').replace(/\\s*\\|\\s*null/g, '');\n const parts = cleanType.split(/\\s*\\|\\s*/);\n\n for (const part of parts) {\n // Remove quotes (for string literal types like 'Post')\n const trimmed = part.trim().replace(/^['\"]|['\"]$/g, '');\n if (!primitives.has(trimmed) && allSchemaNames.has(trimmed)) {\n refs.push(trimmed);\n }\n }\n\n return refs;\n}\n\n/**\n * Generates TypeScript interface from schema.\n */\nexport function schemaToInterface(\n schema: LoadedSchema,\n allSchemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSInterface {\n const properties: TSProperty[] = [];\n const allSchemaNames = new Set(Object.keys(allSchemas).filter(name => allSchemas[name]!.kind !== 'enum'));\n\n // ID property (only if id is not disabled)\n if (schema.options?.id !== false) {\n const pkType = (schema.options?.idType ?? 'BigInt') as keyof typeof PK_TYPE_MAP;\n properties.push({\n name: 'id',\n type: PK_TYPE_MAP[pkType] ?? 'number',\n optional: false,\n readonly: options.readonly ?? true,\n comment: 'Primary key',\n });\n }\n\n // Schema properties\n if (schema.properties) {\n for (const [propName, property] of Object.entries(schema.properties)) {\n // Use propertyToTSProperties which handles MorphTo returning multiple properties\n properties.push(...propertyToTSProperties(propName, property, allSchemas, options));\n }\n }\n\n // Timestamps (snake_case to match database columns)\n if (schema.options?.timestamps !== false) {\n properties.push(\n {\n name: 'created_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updated_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Last update timestamp',\n }\n );\n }\n\n // Soft delete (snake_case to match database columns)\n if (schema.options?.softDelete) {\n properties.push({\n name: 'deleted_at',\n type: 'DateTimeString',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\n });\n }\n\n // Collect dependencies from property types\n const dependencySet = new Set<string>();\n for (const prop of properties) {\n for (const ref of extractTypeReferences(prop.type, allSchemaNames)) {\n if (ref !== schema.name) { // Don't include self-references\n dependencySet.add(ref);\n }\n }\n }\n\n // Resolve schema displayName using locale config\n const schemaDisplayName = resolveDisplayName(schema.displayName, options);\n\n return {\n name: toInterfaceName(schema.name),\n properties,\n comment: schemaDisplayName ?? schema.name,\n dependencies: dependencySet.size > 0 ? Array.from(dependencySet).sort() : undefined,\n };\n}\n\n/**\n * Formats a TypeScript property.\n */\nexport function formatProperty(property: TSProperty): string {\n const readonly = property.readonly ? 'readonly ' : '';\n const optional = property.optional ? '?' : '';\n const comment = property.comment ? ` /** ${property.comment} */\\n` : '';\n return `${comment} ${readonly}${property.name}${optional}: ${property.type};`;\n}\n\n/**\n * Formats a TypeScript interface.\n */\nexport function formatInterface(iface: TSInterface): string {\n const comment = iface.comment ? `/**\\n * ${iface.comment}\\n */\\n` : '';\n const extendsClause = iface.extends && iface.extends.length > 0\n ? ` extends ${iface.extends.join(', ')}`\n : '';\n const properties = iface.properties.map(formatProperty).join('\\n');\n\n return `${comment}export interface ${iface.name}${extendsClause} {\\n${properties}\\n}`;\n}\n\n/**\n * Generates interfaces for all schemas.\n * Note: File interface is now generated from File.yaml schema (use ensureFileSchema() to auto-create it).\n */\nexport function generateInterfaces(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TSInterface[] {\n const interfaces: TSInterface[] = [];\n\n for (const schema of Object.values(schemas)) {\n // Skip enum schemas\n if (schema.kind === 'enum') {\n continue;\n }\n\n // Skip hidden schemas (e.g., cache, jobs, sessions)\n if (schema.options?.hidden === true) {\n continue;\n }\n\n interfaces.push(schemaToInterface(schema, schemas, options));\n }\n\n return interfaces;\n}\n","/**\n * @famgia/omnify-typescript - TypeScript Enum Generator\n *\n * Generates TypeScript enums with helper methods from schema enum definitions.\n */\n\nimport type { LoadedSchema, SchemaCollection, LocalizedString } from '@famgia/omnify-types';\nimport { resolveLocalizedString } from '@famgia/omnify-types';\nimport type { TSEnum, TSEnumValue, TSTypeAlias, TypeScriptOptions } from './types.js';\n\n/**\n * Resolves a localized string using the given options.\n */\nfunction resolveDisplayName(\n value: LocalizedString | undefined,\n options: TypeScriptOptions = {}\n): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n return resolveLocalizedString(value, {\n locale: options.locale,\n config: options.localeConfig,\n });\n}\n\n/**\n * Inline enum value from schema (can be string or object with value/label/extra).\n */\ninterface InlineEnumValue {\n readonly value: string;\n /** Display label - supports multi-language (string or locale map) */\n readonly label?: LocalizedString;\n readonly extra?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Converts enum value to valid TypeScript enum member name.\n */\nexport function toEnumMemberName(value: string): string {\n // Convert to PascalCase and remove invalid characters\n return value\n .split(/[-_\\s]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '');\n}\n\n/**\n * Converts schema name to TypeScript enum name.\n */\nexport function toEnumName(schemaName: string): string {\n return schemaName;\n}\n\n/**\n * Parses enum value from schema (can be string or object).\n * If multiLocale is true, keeps all locales. Otherwise resolves to single locale.\n */\nfunction parseEnumValue(\n value: string | InlineEnumValue,\n options: TypeScriptOptions = {}\n): TSEnumValue {\n if (typeof value === 'string') {\n return {\n name: toEnumMemberName(value),\n value,\n // No label or extra - will fallback to value\n };\n }\n\n // Handle label - either multi-locale or resolved single locale\n let label: string | Record<string, string> | undefined;\n if (value.label !== undefined) {\n if (options.multiLocale && typeof value.label === 'object') {\n // Keep all locales as object\n label = value.label as Record<string, string>;\n } else {\n // Resolve to single locale\n label = resolveDisplayName(value.label, options);\n }\n }\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label,\n extra: value.extra,\n };\n}\n\n/**\n * Generates TypeScript enum from schema enum.\n */\nexport function schemaToEnum(schema: LoadedSchema, options: TypeScriptOptions = {}): TSEnum | null {\n if (schema.kind !== 'enum' || !schema.values) {\n return null;\n }\n\n const values: TSEnumValue[] = schema.values.map(value =>\n parseEnumValue(value as string | InlineEnumValue, options)\n );\n const displayName = resolveDisplayName(schema.displayName, options);\n\n return {\n name: toEnumName(schema.name),\n values,\n comment: displayName ?? schema.name,\n };\n}\n\n/**\n * Generates enums for all enum schemas.\n */\nexport function generateEnums(schemas: SchemaCollection, options: TypeScriptOptions = {}): TSEnum[] {\n const enums: TSEnum[] = [];\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') {\n const enumDef = schemaToEnum(schema, options);\n if (enumDef) {\n enums.push(enumDef);\n }\n }\n }\n\n return enums;\n}\n\n/**\n * Check if label is multi-locale (object) or single string.\n */\nfunction isMultiLocaleLabel(label: string | Record<string, string> | undefined): label is Record<string, string> {\n return label !== undefined && typeof label === 'object';\n}\n\n/**\n * Formats a TypeScript enum with helper methods.\n */\nexport function formatEnum(enumDef: TSEnum): string {\n const { name, values, comment } = enumDef;\n const parts: string[] = [];\n\n // JSDoc comment\n if (comment) {\n parts.push(`/**\\n * ${comment}\\n */\\n`);\n }\n\n // Enum definition\n const enumValues = values\n .map(v => ` ${v.name} = '${v.value}',`)\n .join('\\n');\n parts.push(`export enum ${name} {\\n${enumValues}\\n}\\n\\n`);\n\n // Values array\n parts.push(`/** All ${name} values */\\n`);\n parts.push(`export const ${name}Values = Object.values(${name});\\n\\n`);\n\n // Type guard\n parts.push(`/** Type guard for ${name} */\\n`);\n parts.push(`export function is${name}(value: unknown): value is ${name} {\\n`);\n parts.push(` return ${name}Values.includes(value as ${name});\\n`);\n parts.push(`}\\n\\n`);\n\n // Check if we have multi-locale labels or single-locale labels\n const hasLabels = values.some(v => v.label !== undefined);\n const hasMultiLocale = values.some(v => isMultiLocaleLabel(v.label));\n\n if (hasLabels) {\n if (hasMultiLocale) {\n // Multi-locale labels: Record<Enum, Record<string, string>>\n const labelEntries = values\n .filter(v => v.label !== undefined)\n .map(v => {\n if (isMultiLocaleLabel(v.label)) {\n const locales = Object.entries(v.label)\n .map(([locale, text]) => `${locale}: '${text}'`)\n .join(', ');\n return ` [${name}.${v.name}]: { ${locales} },`;\n }\n return ` [${name}.${v.name}]: { default: '${v.label}' },`;\n })\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Labels: Partial<Record<${name}, Record<string, string>>> = {\\n${labelEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get label for ${name} value with locale support */\\n`);\n parts.push(`export function get${name}Label(value: ${name}, locale?: string): string {\\n`);\n parts.push(` const labels = ${lowerFirst(name)}Labels[value];\\n`);\n parts.push(` if (!labels) return value;\\n`);\n parts.push(` if (locale && labels[locale]) return labels[locale];\\n`);\n parts.push(` return Object.values(labels)[0] ?? value;\\n`);\n parts.push(`}\\n\\n`);\n } else {\n // Single-locale labels: Record<Enum, string>\n const labelEntries = values\n .filter(v => v.label !== undefined)\n .map(v => ` [${name}.${v.name}]: '${v.label}',`)\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Labels: Partial<Record<${name}, string>> = {\\n${labelEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get label for ${name} value (fallback to value if no label) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n parts.push(`}\\n\\n`);\n }\n } else {\n parts.push(`/** Get label for ${name} value (returns value as-is) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return value;\\n`);\n parts.push(`}\\n\\n`);\n }\n\n // Extra - only generate if at least one value has extra\n const hasExtra = values.some(v => v.extra !== undefined);\n if (hasExtra) {\n const extraEntries = values\n .filter(v => v.extra !== undefined)\n .map(v => ` [${name}.${v.name}]: ${JSON.stringify(v.extra)},`)\n .join('\\n');\n parts.push(`const ${lowerFirst(name)}Extra: Partial<Record<${name}, Record<string, unknown>>> = {\\n${extraEntries}\\n};\\n\\n`);\n\n parts.push(`/** Get extra metadata for ${name} value (undefined if not defined) */\\n`);\n parts.push(`export function get${name}Extra(value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return ${lowerFirst(name)}Extra[value];\\n`);\n parts.push(`}`);\n } else {\n parts.push(`/** Get extra metadata for ${name} value (undefined if not defined) */\\n`);\n parts.push(`export function get${name}Extra(_value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return undefined;\\n`);\n parts.push(`}`);\n }\n\n return parts.join('');\n}\n\n/**\n * Convert first character to lowercase.\n */\nfunction lowerFirst(str: string): string {\n return str.charAt(0).toLowerCase() + str.slice(1);\n}\n\n/**\n * Generates a union type alias as an alternative to enum.\n */\nexport function enumToUnionType(enumDef: TSEnum): TSTypeAlias {\n const type = enumDef.values\n .map(v => `'${v.value}'`)\n .join(' | ');\n\n return {\n name: enumDef.name,\n type,\n comment: enumDef.comment,\n };\n}\n\n/**\n * Formats a TypeScript type alias with helper methods.\n */\nexport function formatTypeAlias(alias: TSTypeAlias): string {\n const { name, type, comment } = alias;\n const parts: string[] = [];\n\n // JSDoc comment\n if (comment) {\n parts.push(`/**\\n * ${comment}\\n */\\n`);\n }\n\n // Type alias\n parts.push(`export type ${name} = ${type};\\n\\n`);\n\n // Values array\n const values = type.split(' | ').map(v => v.trim());\n parts.push(`/** All ${name} values */\\n`);\n parts.push(`export const ${name}Values: ${name}[] = [${values.join(', ')}];\\n\\n`);\n\n // Type guard\n parts.push(`/** Type guard for ${name} */\\n`);\n parts.push(`export function is${name}(value: unknown): value is ${name} {\\n`);\n parts.push(` return ${name}Values.includes(value as ${name});\\n`);\n parts.push(`}\\n\\n`);\n\n // Label getter (fallback to value for type aliases - no labels)\n parts.push(`/** Get label for ${name} value (returns value as-is) */\\n`);\n parts.push(`export function get${name}Label(value: ${name}): string {\\n`);\n parts.push(` return value;\\n`);\n parts.push(`}\\n\\n`);\n\n // Extra getter (always undefined for type aliases)\n parts.push(`/** Get extra metadata for ${name} value (always undefined for type aliases) */\\n`);\n parts.push(`export function get${name}Extra(_value: ${name}): Record<string, unknown> | undefined {\\n`);\n parts.push(` return undefined;\\n`);\n parts.push(`}`);\n\n return parts.join('');\n}\n\n/**\n * Extracts inline enums from properties for type generation.\n */\nexport function extractInlineEnums(schemas: SchemaCollection, options: TypeScriptOptions = {}): TSTypeAlias[] {\n const typeAliases: TSTypeAlias[] = [];\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum' || !schema.properties) {\n continue;\n }\n\n for (const [propName, property] of Object.entries(schema.properties)) {\n if (property.type === 'Enum') {\n const enumProp = property as { enum?: readonly (string | InlineEnumValue)[]; displayName?: LocalizedString };\n\n // Only handle inline array enums (not references to named enums)\n if (Array.isArray(enumProp.enum) && enumProp.enum.length > 0) {\n const typeName = `${schema.name}${propName.charAt(0).toUpperCase() + propName.slice(1)}`;\n const values = enumProp.enum.map(v =>\n typeof v === 'string' ? v : v.value\n );\n const displayName = resolveDisplayName(enumProp.displayName, options);\n typeAliases.push({\n name: typeName,\n type: values.map(v => `'${v}'`).join(' | '),\n comment: displayName ?? `${schema.name} ${propName} enum`,\n });\n }\n }\n\n if (property.type === 'Select') {\n const selectProp = property as { options?: readonly string[]; displayName?: LocalizedString };\n\n if (selectProp.options && selectProp.options.length > 0) {\n const typeName = `${schema.name}${propName.charAt(0).toUpperCase() + propName.slice(1)}`;\n const displayName = resolveDisplayName(selectProp.displayName, options);\n typeAliases.push({\n name: typeName,\n type: selectProp.options.map(v => `'${v}'`).join(' | '),\n comment: displayName ?? `${schema.name} ${propName} options`,\n });\n }\n }\n }\n }\n\n return typeAliases;\n}\n","/**\n * Built-in validation message templates for common languages.\n * Templates use ${displayName}, ${min}, ${max}, ${pattern} placeholders.\n */\n\nexport interface ValidationTemplates {\n readonly required: Record<string, string>;\n readonly minLength: Record<string, string>;\n readonly maxLength: Record<string, string>;\n readonly min: Record<string, string>;\n readonly max: Record<string, string>;\n readonly email: Record<string, string>;\n readonly url: Record<string, string>;\n readonly pattern: Record<string, string>;\n readonly enum: Record<string, string>;\n}\n\n/**\n * Default validation message templates.\n * Supports: ja (Japanese), en (English), vi (Vietnamese), ko (Korean), zh (Chinese)\n */\nexport const DEFAULT_VALIDATION_TEMPLATES: ValidationTemplates = {\n required: {\n ja: '${displayName}は必須です',\n en: '${displayName} is required',\n vi: '${displayName} là bắt buộc',\n ko: '${displayName}은(는) 필수입니다',\n zh: '${displayName}为必填项',\n },\n minLength: {\n ja: '${displayName}は${min}文字以上で入力してください',\n en: '${displayName} must be at least ${min} characters',\n vi: '${displayName} phải có ít nhất ${min} ký tự',\n ko: '${displayName}은(는) ${min}자 이상이어야 합니다',\n zh: '${displayName}至少需要${min}个字符',\n },\n maxLength: {\n ja: '${displayName}は${max}文字以内で入力してください',\n en: '${displayName} must be at most ${max} characters',\n vi: '${displayName} tối đa ${max} ký tự',\n ko: '${displayName}은(는) ${max}자 이하여야 합니다',\n zh: '${displayName}不能超过${max}个字符',\n },\n min: {\n ja: '${displayName}は${min}以上の値を入力してください',\n en: '${displayName} must be at least ${min}',\n vi: '${displayName} phải lớn hơn hoặc bằng ${min}',\n ko: '${displayName}은(는) ${min} 이상이어야 합니다',\n zh: '${displayName}不能小于${min}',\n },\n max: {\n ja: '${displayName}は${max}以下の値を入力してください',\n en: '${displayName} must be at most ${max}',\n vi: '${displayName} phải nhỏ hơn hoặc bằng ${max}',\n ko: '${displayName}은(는) ${max} 이하여야 합니다',\n zh: '${displayName}不能大于${max}',\n },\n email: {\n ja: '${displayName}の形式が正しくありません',\n en: '${displayName} is not a valid email address',\n vi: '${displayName} không phải là địa chỉ email hợp lệ',\n ko: '${displayName} 형식이 올바르지 않습니다',\n zh: '${displayName}不是有效的邮箱地址',\n },\n url: {\n ja: '${displayName}は有効なURLではありません',\n en: '${displayName} is not a valid URL',\n vi: '${displayName} không phải là URL hợp lệ',\n ko: '${displayName}은(는) 유효한 URL이 아닙니다',\n zh: '${displayName}不是有效的URL',\n },\n pattern: {\n ja: '${displayName}の形式が正しくありません',\n en: '${displayName} format is invalid',\n vi: '${displayName} không đúng định dạng',\n ko: '${displayName} 형식이 올바르지 않습니다',\n zh: '${displayName}格式不正确',\n },\n enum: {\n ja: '${displayName}の値が無効です',\n en: '${displayName} has an invalid value',\n vi: '${displayName} có giá trị không hợp lệ',\n ko: '${displayName} 값이 유효하지 않습니다',\n zh: '${displayName}的值无效',\n },\n};\n\n/**\n * Merge user templates with default templates.\n */\nexport function mergeValidationTemplates(\n userTemplates?: Partial<ValidationTemplates>\n): ValidationTemplates {\n if (!userTemplates) {\n return DEFAULT_VALIDATION_TEMPLATES;\n }\n\n // Create mutable copies of each template category\n const merged: Record<keyof ValidationTemplates, Record<string, string>> = {\n required: { ...DEFAULT_VALIDATION_TEMPLATES.required },\n minLength: { ...DEFAULT_VALIDATION_TEMPLATES.minLength },\n maxLength: { ...DEFAULT_VALIDATION_TEMPLATES.maxLength },\n min: { ...DEFAULT_VALIDATION_TEMPLATES.min },\n max: { ...DEFAULT_VALIDATION_TEMPLATES.max },\n email: { ...DEFAULT_VALIDATION_TEMPLATES.email },\n url: { ...DEFAULT_VALIDATION_TEMPLATES.url },\n pattern: { ...DEFAULT_VALIDATION_TEMPLATES.pattern },\n enum: { ...DEFAULT_VALIDATION_TEMPLATES.enum },\n };\n\n // Merge user templates\n for (const [key, value] of Object.entries(userTemplates)) {\n if (value && key in merged) {\n merged[key as keyof ValidationTemplates] = {\n ...merged[key as keyof ValidationTemplates],\n ...value,\n };\n }\n }\n\n return merged as ValidationTemplates;\n}\n\n/**\n * Format a validation message with placeholders.\n */\nexport function formatValidationMessage(\n template: string,\n vars: Record<string, string | number>\n): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replace(new RegExp(`\\\\$\\\\{${key}\\\\}`, 'g'), String(value));\n }\n return result;\n}\n\n/**\n * Get validation messages for all configured locales.\n * Fallback order: locale -> fallbackLocale -> 'en'\n */\nexport function getValidationMessages(\n templates: ValidationTemplates,\n ruleType: keyof ValidationTemplates,\n locales: string[],\n vars: Record<string, string | number>,\n fallbackLocale?: string\n): Record<string, string> {\n const ruleTemplates = templates[ruleType];\n const messages: Record<string, string> = {};\n\n for (const locale of locales) {\n // Try: locale -> fallbackLocale -> 'en'\n const template = ruleTemplates[locale]\n ?? (fallbackLocale ? ruleTemplates[fallbackLocale] : undefined)\n ?? ruleTemplates['en']\n ?? '';\n messages[locale] = formatValidationMessage(template, vars);\n }\n\n return messages;\n}\n","/**\n * Generates Ant Design compatible validation rules from schemas.\n */\n\nimport type { LoadedSchema, SchemaCollection, PropertyDefinition, LocalizedString, LocaleConfig } from '@famgia/omnify-types';\nimport type { TypeScriptFile, TypeScriptOptions, LocaleMap } from './types.js';\nimport {\n DEFAULT_VALIDATION_TEMPLATES,\n mergeValidationTemplates,\n getValidationMessages,\n type ValidationTemplates,\n} from './validation-templates.js';\n\n/**\n * Ant Design rule structure with multi-locale message.\n */\ninterface AntdRule {\n required?: boolean;\n type?: 'string' | 'number' | 'email' | 'url' | 'integer';\n min?: number;\n max?: number;\n len?: number;\n pattern?: string;\n message: LocaleMap;\n}\n\n/**\n * Property rules for a model.\n */\ninterface PropertyRules {\n displayName: LocaleMap;\n rules: AntdRule[];\n}\n\n/**\n * Model rules structure.\n */\ninterface ModelRules {\n displayName: LocaleMap;\n properties: Record<string, PropertyRules>;\n}\n\n/**\n * Get localized display name as object with all locales.\n */\nfunction getMultiLocaleDisplayName(\n value: LocalizedString | undefined,\n locales: string[],\n fallbackLocale: string,\n defaultValue: string\n): LocaleMap {\n if (!value) {\n // Return default value for all locales\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = defaultValue;\n }\n return result;\n }\n\n if (typeof value === 'string') {\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = value;\n }\n return result;\n }\n\n // It's a locale map\n const result: Record<string, string> = {};\n for (const locale of locales) {\n result[locale] = value[locale] ?? value[fallbackLocale] ?? value['en'] ?? defaultValue;\n }\n return result;\n}\n\n/**\n * Generate validation rules for a property.\n */\nfunction generatePropertyRules(\n propName: string,\n property: PropertyDefinition,\n displayName: LocaleMap,\n locales: string[],\n fallbackLocale: string,\n templates: ValidationTemplates\n): AntdRule[] {\n const rules: AntdRule[] = [];\n const propDef = property as {\n nullable?: boolean;\n length?: number;\n minLength?: number;\n maxLength?: number;\n min?: number;\n max?: number;\n pattern?: string;\n };\n\n // Required rule (if not nullable)\n if (!propDef.nullable) {\n rules.push({\n required: true,\n message: getValidationMessages(templates, 'required', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Type-specific rules\n if (property.type === 'Email') {\n rules.push({\n type: 'email',\n message: getValidationMessages(templates, 'email', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Length rules for strings\n if (property.type === 'String' || property.type === 'Text' || property.type === 'LongText') {\n if (propDef.minLength) {\n rules.push({\n min: propDef.minLength,\n message: getValidationMessages(templates, 'minLength', locales, { displayName: '${displayName}', min: propDef.minLength }, fallbackLocale),\n });\n }\n if (propDef.maxLength || propDef.length) {\n const max = propDef.maxLength ?? propDef.length!;\n rules.push({\n max,\n message: getValidationMessages(templates, 'maxLength', locales, { displayName: '${displayName}', max }, fallbackLocale),\n });\n }\n }\n\n // Numeric range rules\n if (property.type === 'Int' || property.type === 'BigInt' || property.type === 'Float') {\n if (propDef.min !== undefined) {\n rules.push({\n type: property.type === 'Float' ? 'number' : 'integer',\n min: propDef.min,\n message: getValidationMessages(templates, 'min', locales, { displayName: '${displayName}', min: propDef.min }, fallbackLocale),\n });\n }\n if (propDef.max !== undefined) {\n rules.push({\n type: property.type === 'Float' ? 'number' : 'integer',\n max: propDef.max,\n message: getValidationMessages(templates, 'max', locales, { displayName: '${displayName}', max: propDef.max }, fallbackLocale),\n });\n }\n }\n\n // Pattern rule\n if (propDef.pattern) {\n rules.push({\n pattern: propDef.pattern,\n message: getValidationMessages(templates, 'pattern', locales, { displayName: '${displayName}' }, fallbackLocale),\n });\n }\n\n // Replace ${displayName} placeholder with actual display name per locale\n for (const rule of rules) {\n const newMessage: Record<string, string> = {};\n for (const locale of locales) {\n const msg = rule.message[locale];\n if (msg) {\n newMessage[locale] = msg.replace(/\\$\\{displayName\\}/g, displayName[locale] ?? propName);\n }\n }\n (rule as { message: Record<string, string> }).message = newMessage;\n }\n\n return rules;\n}\n\n/**\n * Generate rules for a schema.\n */\nexport function generateModelRules(\n schema: LoadedSchema,\n locales: string[],\n fallbackLocale: string,\n templates: ValidationTemplates\n): ModelRules {\n const modelDisplayName = getMultiLocaleDisplayName(\n schema.displayName,\n locales,\n fallbackLocale,\n schema.name\n );\n\n const properties: Record<string, PropertyRules> = {};\n\n if (schema.properties) {\n for (const [propName, property] of Object.entries(schema.properties)) {\n const propDef = property as { displayName?: LocalizedString };\n const displayName = getMultiLocaleDisplayName(\n propDef.displayName,\n locales,\n fallbackLocale,\n propName\n );\n\n properties[propName] = {\n displayName,\n rules: generatePropertyRules(propName, property, displayName, locales, fallbackLocale, templates),\n };\n }\n }\n\n return {\n displayName: modelDisplayName,\n properties,\n };\n}\n\n/**\n * Format rules as TypeScript code.\n */\nfunction formatRulesFile(\n schemaName: string,\n rules: ModelRules\n): string {\n const parts: string[] = [];\n\n parts.push(`/**\n * Auto-generated validation rules and metadata for ${schemaName}.\n * DO NOT EDIT - This file is automatically generated and will be overwritten.\n */\n\nimport type { LocaleMap, ValidationRule } from '../common.js';\n\n`);\n\n // Model display name\n parts.push(`/** Display name for ${schemaName} */\\n`);\n parts.push(`export const ${schemaName}DisplayName: LocaleMap = ${JSON.stringify(rules.displayName, null, 2)};\\n\\n`);\n\n // Property metadata and rules\n parts.push(`/** Property display names for ${schemaName} */\\n`);\n parts.push(`export const ${schemaName}PropertyDisplayNames: Record<string, LocaleMap> = {\\n`);\n for (const [propName, propRules] of Object.entries(rules.properties)) {\n parts.push(` ${propName}: ${JSON.stringify(propRules.displayName)},\\n`);\n }\n parts.push(`};\\n\\n`);\n\n // Validation rules\n parts.push(`/** Validation rules for ${schemaName} (Ant Design compatible) */\\n`);\n parts.push(`export const ${schemaName}Rules: Record<string, ValidationRule[]> = {\\n`);\n for (const [propName, propRules] of Object.entries(rules.properties)) {\n if (propRules.rules.length > 0) {\n parts.push(` ${propName}: [\\n`);\n for (const rule of propRules.rules) {\n const ruleObj: Record<string, unknown> = {};\n if (rule.required) ruleObj.required = true;\n if (rule.type) ruleObj.type = `'${rule.type}'`;\n if (rule.min !== undefined) ruleObj.min = rule.min;\n if (rule.max !== undefined) ruleObj.max = rule.max;\n if (rule.pattern) ruleObj.pattern = `/${rule.pattern}/`;\n ruleObj.message = rule.message;\n\n // Format as JS object\n const ruleStr = Object.entries(ruleObj)\n .map(([k, v]) => {\n if (k === 'type') return `${k}: ${v}`;\n if (k === 'pattern') return `${k}: ${v}`;\n return `${k}: ${JSON.stringify(v)}`;\n })\n .join(', ');\n parts.push(` { ${ruleStr} },\\n`);\n }\n parts.push(` ],\\n`);\n }\n }\n parts.push(`};\\n\\n`);\n\n // Helper function to get rules with locale-specific messages\n parts.push(`/** Get validation rules with messages for a specific locale */\\n`);\n parts.push(`export function get${schemaName}Rules(locale: string): Record<string, Array<{ required?: boolean; type?: string; min?: number; max?: number; pattern?: RegExp; message: string }>> {\n const result: Record<string, Array<{ required?: boolean; type?: string; min?: number; max?: number; pattern?: RegExp; message: string }>> = {};\n for (const [prop, rules] of Object.entries(${schemaName}Rules)) {\n result[prop] = rules.map(rule => ({\n ...rule,\n message: rule.message[locale] ?? rule.message['en'] ?? '',\n }));\n }\n return result;\n}\\n\\n`);\n\n // Helper function to get display name\n parts.push(`/** Get display name for a specific locale */\\n`);\n parts.push(`export function get${schemaName}DisplayName(locale: string): string {\n return ${schemaName}DisplayName[locale] ?? ${schemaName}DisplayName['en'] ?? '${schemaName}';\n}\\n\\n`);\n\n parts.push(`/** Get property display name for a specific locale */\\n`);\n parts.push(`export function get${schemaName}PropertyDisplayName(property: string, locale: string): string {\n const names = ${schemaName}PropertyDisplayNames[property];\n return names?.[locale] ?? names?.['en'] ?? property;\n}\\n`);\n\n return parts.join('');\n}\n\n/**\n * Generate rules files for all schemas.\n */\nexport function generateRulesFiles(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TypeScriptFile[] {\n const files: TypeScriptFile[] = [];\n const localeConfig = options.localeConfig;\n const locales = [...(localeConfig?.locales ?? ['en'])]; // Convert readonly to mutable\n const fallbackLocale = localeConfig?.fallbackLocale ?? 'en';\n\n // Merge user templates with defaults\n const templates = mergeValidationTemplates(options.validationTemplates as Partial<ValidationTemplates> | undefined);\n\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n\n const rules = generateModelRules(schema, locales, fallbackLocale, templates);\n const content = formatRulesFile(schema.name, rules);\n\n files.push({\n filePath: `rules/${schema.name}.rules.ts`,\n content,\n types: [`${schema.name}Rules`, `${schema.name}DisplayName`],\n overwrite: true,\n });\n }\n\n return files;\n}\n","/**\n * @famgia/omnify-typescript - TypeScript Generator\n *\n * Generates TypeScript models with base/model pattern:\n * - models/base/[SchemaName].ts - Auto-generated base interfaces, DO NOT EDIT\n * - models/enum/[EnumName].ts - Auto-generated enums/type aliases, DO NOT EDIT\n * - models/[SchemaName].ts - Extends base, user can customize\n * - models/index.ts - Re-exports all\n */\n\nimport type { SchemaCollection } from '@famgia/omnify-types';\nimport type { TypeScriptFile, TypeScriptOptions, TSEnum, TSTypeAlias } from './types.js';\nimport { generateInterfaces, formatInterface } from './interface-generator.js';\nimport { generateEnums, formatEnum, formatTypeAlias, extractInlineEnums } from './enum-generator.js';\nimport { generateRulesFiles } from './rules-generator.js';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: false, // Changed: interfaces should be mutable for forms/mutations\n strictNullChecks: true,\n};\n\n/**\n * Generates the base file header comment (DO NOT EDIT).\n */\nfunction generateBaseHeader(): string {\n return `/**\n * Auto-generated TypeScript types from Omnify schemas.\n * DO NOT EDIT - This file is automatically generated and will be overwritten.\n */\n\n`;\n}\n\n/**\n * Generates the model file header comment (user can edit).\n */\nfunction generateModelHeader(schemaName: string): string {\n return `/**\n * ${schemaName} Model\n *\n * This file extends the auto-generated base interface.\n * You can add custom methods, computed properties, or override types here.\n * This file will NOT be overwritten by the generator.\n */\n\n`;\n}\n\n/**\n * Generates utility types for a schema.\n * - Create: For POST requests (excludes id, timestamps)\n * - Update: For PUT/PATCH requests (all fields optional)\n */\nfunction generateUtilityTypes(schemaName: string, schema: { options?: { id?: boolean; timestamps?: boolean; softDelete?: boolean } }): string {\n const parts: string[] = [];\n const excludeFields: string[] = [];\n\n // Exclude id if auto-generated\n if (schema.options?.id !== false) {\n excludeFields.push(\"'id'\");\n }\n\n // Exclude timestamps if enabled\n if (schema.options?.timestamps !== false) {\n excludeFields.push(\"'created_at'\", \"'updated_at'\");\n }\n\n // Exclude soft delete if enabled\n if (schema.options?.softDelete) {\n excludeFields.push(\"'deleted_at'\");\n }\n\n const omitType = excludeFields.length > 0\n ? `Omit<${schemaName}, ${excludeFields.join(' | ')}>`\n : schemaName;\n\n // Create type - for POST requests\n parts.push(`\\n/** For creating new ${schemaName} (POST requests) */`);\n parts.push(`\\nexport type ${schemaName}Create = ${omitType};\\n`);\n\n // Update type - for PUT/PATCH requests (all optional)\n parts.push(`\\n/** For updating ${schemaName} (PUT/PATCH requests) */`);\n parts.push(`\\nexport type ${schemaName}Update = Partial<${schemaName}Create>;\\n`);\n\n return parts.join('');\n}\n\n/**\n * Checks if interface uses DateTimeString or DateString types.\n */\nfunction needsDateTimeImports(iface: { properties: readonly { type: string }[] }): { dateTime: boolean; date: boolean } {\n let dateTime = false;\n let date = false;\n for (const prop of iface.properties) {\n if (prop.type === 'DateTimeString' || prop.type.includes('DateTimeString')) {\n dateTime = true;\n }\n if (prop.type === 'DateString' || prop.type.includes('DateString')) {\n date = true;\n }\n }\n return { dateTime, date };\n}\n\n/**\n * Generates a single base interface file.\n */\nfunction generateBaseInterfaceFile(\n schemaName: string,\n schemas: SchemaCollection,\n options: TypeScriptOptions\n): TypeScriptFile {\n const interfaces = generateInterfaces(schemas, options);\n const iface = interfaces.find(i => i.name === schemaName);\n const schema = schemas[schemaName];\n\n if (!iface || !schema) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n\n // Check if we need to import DateTimeString or DateString\n const dateImports = needsDateTimeImports(iface);\n const commonImports: string[] = [];\n if (dateImports.dateTime) commonImports.push('DateTimeString');\n if (dateImports.date) commonImports.push('DateString');\n if (commonImports.length > 0) {\n parts.push(`import type { ${commonImports.join(', ')} } from '../common.js';\\n`);\n }\n\n // Add imports for dependencies\n if (iface.dependencies && iface.dependencies.length > 0) {\n for (const dep of iface.dependencies) {\n parts.push(`import type { ${dep} } from './${dep}.js';\\n`);\n }\n parts.push('\\n');\n } else if (commonImports.length > 0) {\n parts.push('\\n');\n }\n\n // Main interface\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n // Utility types (Create, Update)\n parts.push(generateUtilityTypes(schemaName, schema));\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName, `${schemaName}Create`, `${schemaName}Update`],\n overwrite: true,\n };\n}\n\n/**\n * Generates a single enum file.\n */\nfunction generateEnumFile(enumDef: TSEnum): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatEnum(enumDef));\n parts.push('\\n');\n\n return {\n filePath: `enum/${enumDef.name}.ts`,\n content: parts.join(''),\n types: [enumDef.name],\n overwrite: true,\n };\n}\n\n/**\n * Generates a single type alias file.\n */\nfunction generateTypeAliasFile(alias: TSTypeAlias): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatTypeAlias(alias));\n parts.push('\\n');\n\n return {\n filePath: `enum/${alias.name}.ts`,\n content: parts.join(''),\n types: [alias.name],\n overwrite: true,\n };\n}\n\n/**\n * Generates model file content that extends base.\n */\nfunction generateModelFile(schemaName: string): TypeScriptFile {\n const parts: string[] = [generateModelHeader(schemaName)];\n\n // Import base interface\n parts.push(`import type { ${schemaName} as ${schemaName}Base } from './base/${schemaName}.js';\\n\\n`);\n\n // Export interface that extends base\n parts.push(`/**\\n * ${schemaName} model interface.\\n * Add custom properties or methods here.\\n */\\n`);\n parts.push(`export interface ${schemaName} extends ${schemaName}Base {\\n`);\n parts.push(` // Add custom properties here\\n`);\n parts.push(`}\\n\\n`);\n\n // Re-export base for convenience\n parts.push(`// Re-export base type for internal use\\n`);\n parts.push(`export type { ${schemaName}Base };\\n`);\n\n return {\n filePath: `${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\n overwrite: false, // Never overwrite user models\n };\n}\n\n/**\n * Generates common.ts with shared types.\n */\nfunction generateCommonFile(options: TypeScriptOptions): TypeScriptFile {\n const locales = options.localeConfig?.locales ?? ['ja', 'en'];\n const localeUnion = locales.map(l => `'${l}'`).join(' | ');\n\n const content = `${generateBaseHeader()}\n/**\n * Locale map for multi-language support.\n */\nexport interface LocaleMap {\n [locale: string]: string;\n}\n\n/**\n * Supported locales in this project.\n */\nexport type Locale = ${localeUnion};\n\n/**\n * Ant Design compatible validation rule.\n */\nexport interface ValidationRule {\n required?: boolean;\n type?: 'string' | 'number' | 'email' | 'url' | 'integer' | 'array' | 'object';\n min?: number;\n max?: number;\n len?: number;\n pattern?: RegExp;\n message: string;\n}\n\n/**\n * ISO 8601 date-time string.\n */\nexport type DateTimeString = string;\n\n/**\n * ISO 8601 date string (YYYY-MM-DD).\n */\nexport type DateString = string;\n`;\n\n return {\n filePath: 'common.ts',\n content,\n types: ['LocaleMap', 'Locale', 'ValidationRule', 'DateTimeString', 'DateString'],\n overwrite: true,\n };\n}\n\n/**\n * Generates index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[],\n options: TypeScriptOptions\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\n\n // Export common types\n parts.push(`// Common Types\\n`);\n parts.push(`export type { LocaleMap, Locale, ValidationRule, DateTimeString, DateString } from './common.js';\\n\\n`);\n\n // Export enums (enum + Values + isX + getXLabel + getXExtra)\n if (enums.length > 0 || typeAliases.length > 0) {\n parts.push(`// Enums\\n`);\n for (const enumDef of enums) {\n parts.push(`export {\\n`);\n parts.push(` ${enumDef.name},\\n`);\n parts.push(` ${enumDef.name}Values,\\n`);\n parts.push(` is${enumDef.name},\\n`);\n parts.push(` get${enumDef.name}Label,\\n`);\n parts.push(` get${enumDef.name}Extra,\\n`);\n parts.push(`} from './enum/${enumDef.name}.js';\\n`);\n }\n for (const alias of typeAliases) {\n parts.push(`export {\\n`);\n parts.push(` type ${alias.name},\\n`);\n parts.push(` ${alias.name}Values,\\n`);\n parts.push(` is${alias.name},\\n`);\n parts.push(` get${alias.name}Label,\\n`);\n parts.push(` get${alias.name}Extra,\\n`);\n parts.push(`} from './enum/${alias.name}.js';\\n`);\n }\n parts.push('\\n');\n }\n\n // Export all models with utility types\n parts.push(`// Models (with Create/Update utility types)\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\n`);\n parts.push(`export type { ${schema.name}Create, ${schema.name}Update } from './base/${schema.name}.js';\\n`);\n }\n\n // Export rules functions if enabled\n if (options.generateRules) {\n parts.push(`\\n// Validation Rules\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n parts.push(`export {\\n`);\n parts.push(` get${schema.name}Rules,\\n`);\n parts.push(` get${schema.name}DisplayName,\\n`);\n parts.push(` get${schema.name}PropertyDisplayName,\\n`);\n parts.push(`} from './rules/${schema.name}.rules.js';\\n`);\n }\n }\n\n return {\n filePath: 'index.ts',\n content: parts.join(''),\n types: [],\n overwrite: true,\n };\n}\n\n/**\n * Generates TypeScript files with base/model pattern.\n *\n * Output structure:\n * - models/base/[SchemaName].ts - Auto-generated base interfaces (always overwritten)\n * - models/enum/[EnumName].ts - Auto-generated enums/type aliases (always overwritten)\n * - models/[SchemaName].ts - User-editable models that extend base (created once, never overwritten)\n * - models/index.ts - Re-exports (always overwritten)\n */\nexport function generateTypeScript(\n schemas: SchemaCollection,\n options: TypeScriptOptions = {}\n): TypeScriptFile[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const files: TypeScriptFile[] = [];\n\n // Generate enum files\n const enums = generateEnums(schemas, opts);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas, opts);\n for (const alias of typeAliases) {\n files.push(generateTypeAliasFile(alias));\n }\n\n // Generate base interface files\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n files.push(generateBaseInterfaceFile(schema.name, schemas, opts));\n }\n\n // Generate model files (only created if not exists)\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n if (schema.options?.hidden === true) continue;\n files.push(generateModelFile(schema.name));\n }\n\n // Generate validation rules files (if enabled)\n if (opts.generateRules) {\n const rulesFiles = generateRulesFiles(schemas, opts);\n files.push(...rulesFiles);\n }\n\n // Generate common.ts\n files.push(generateCommonFile(opts));\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases, opts));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["resolveLocalizedString","resolveDisplayName","result"]}
|
package/dist/index.cjs
CHANGED
|
@@ -938,6 +938,7 @@ function generateRulesFiles(schemas, options = {}) {
|
|
|
938
938
|
const templates = mergeValidationTemplates(options.validationTemplates);
|
|
939
939
|
for (const schema of Object.values(schemas)) {
|
|
940
940
|
if (schema.kind === "enum") continue;
|
|
941
|
+
if (schema.options?.hidden === true) continue;
|
|
941
942
|
const rules = generateModelRules(schema, locales, fallbackLocale, templates);
|
|
942
943
|
const content = formatRulesFile(schema.name, rules);
|
|
943
944
|
files.push({
|