@famgia/omnify-typescript 0.0.23 → 0.0.25
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-QDNF7LWB.js → chunk-4NNFIIZ4.js} +5 -4
- package/dist/chunk-4NNFIIZ4.js.map +1 -0
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/plugin.cjs +4 -3
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-QDNF7LWB.js.map +0 -1
|
@@ -13,6 +13,7 @@ var TYPE_MAP = {
|
|
|
13
13
|
LongText: "string",
|
|
14
14
|
Date: "string",
|
|
15
15
|
Time: "string",
|
|
16
|
+
DateTime: "string",
|
|
16
17
|
Timestamp: "string",
|
|
17
18
|
Json: "unknown",
|
|
18
19
|
Email: "string",
|
|
@@ -193,14 +194,14 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
193
194
|
if (schema.options?.timestamps !== false) {
|
|
194
195
|
properties.push(
|
|
195
196
|
{
|
|
196
|
-
name: "
|
|
197
|
+
name: "created_at",
|
|
197
198
|
type: "string",
|
|
198
199
|
optional: true,
|
|
199
200
|
readonly: options.readonly ?? true,
|
|
200
201
|
comment: "Creation timestamp"
|
|
201
202
|
},
|
|
202
203
|
{
|
|
203
|
-
name: "
|
|
204
|
+
name: "updated_at",
|
|
204
205
|
type: "string",
|
|
205
206
|
optional: true,
|
|
206
207
|
readonly: options.readonly ?? true,
|
|
@@ -210,7 +211,7 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
210
211
|
}
|
|
211
212
|
if (schema.options?.softDelete) {
|
|
212
213
|
properties.push({
|
|
213
|
-
name: "
|
|
214
|
+
name: "deleted_at",
|
|
214
215
|
type: "string",
|
|
215
216
|
optional: true,
|
|
216
217
|
readonly: options.readonly ?? true,
|
|
@@ -671,4 +672,4 @@ export {
|
|
|
671
672
|
extractInlineEnums,
|
|
672
673
|
generateTypeScript
|
|
673
674
|
};
|
|
674
|
-
//# sourceMappingURL=chunk-
|
|
675
|
+
//# sourceMappingURL=chunk-4NNFIIZ4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/interface-generator.ts","../src/enum-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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n DateTime: 'string',\n Timestamp: 'string',\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 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 * 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\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updated_at',\n type: 'string',\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":";AAOA,SAAS,8BAA8B;AAMvC,SAAS,YAAY,KAAqB;AACxC,SAAO,IACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,MAAM,EAAE,EAChB,YAAY;AACjB;AAKA,IAAM,WAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACV;AAMO,IAAM,sBAAsB;AAKnC,IAAM,cAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACV;AAMA,SAAS,mBACP,OACA,UAA6B,CAAC,GACV;AACpB,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO,uBAAuB,OAAO;AAAA,IACnC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAMO,SAAS,eAAe,MAAsB;AACnD,SAAO;AACT;AAMO,SAAS,gBAAgB,YAA4B;AAC1D,SAAO;AACT;AAKO,SAAS,gBACd,UACA,aACQ;AAGR,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,WAAW;AACjB,QAAI,SAAS,UAAU;AACrB,aAAO,GAAG,mBAAmB;AAAA,IAC/B;AACA,WAAO,GAAG,mBAAmB;AAAA,EAC/B;AAGA,MAAI,SAAS,SAAS,eAAe;AACnC,UAAM,YAAY;AAMlB,UAAM,aAAa,UAAU,UAAU;AAEvC,YAAQ,UAAU,UAAU;AAAA;AAAA,MAE1B,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAG,UAAU;AAAA;AAAA,MAGtB,KAAK;AAEH,YAAI,UAAU,WAAW,UAAU,QAAQ,SAAS,GAAG;AACrD,iBAAO,UAAU,QAAQ,KAAK,KAAK;AAAA,QACrC;AACA,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAG,UAAU;AAAA,MAEtB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,SAAS,UAAU;AAErC,aAAO,SAAS;AAAA,IAClB;AACA,QAAI,MAAM,QAAQ,SAAS,IAAI,GAAG;AAEhC,aAAO,SAAS,KAAK,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,IACpD;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,UAAU;AAC9B,UAAM,aAAa;AACnB,QAAI,WAAW,WAAW,WAAW,QAAQ,SAAS,GAAG;AACvD,aAAO,WAAW,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,IACzD;AAAA,EACF;AAGA,SAAO,SAAS,SAAS,IAAI,KAAK;AACpC;AAOO,SAAS,uBACd,cACA,UACA,YACA,UAA6B,CAAC,GAChB;AACd,QAAM,WAAW;AACjB,QAAM,aAAa,QAAQ,YAAY;AAEvC,QAAM,cAAc,mBAAmB,SAAS,aAAa,OAAO;AAGpE,MAAI,QAAQ,aAAa;AACvB,UAAM,aAAa,QAAQ,YAAY,IAAI,SAAS,IAAI;AACxD,QAAI,YAAY,YAAY,WAAW,QAAQ;AAC7C,YAAM,gBAA8B,CAAC;AACrC,iBAAW,SAAS,WAAW,QAAQ;AACrC,cAAM,YAAY,GAAG,YAAY,IAAI,YAAY,MAAM,MAAM,CAAC;AAC9D,cAAM,gBAAgB,SAAS,SAAS,MAAM,MAAM;AACpD,cAAM,aAAa,eAAe,YAAY,SAAS,YAAY;AACnE,cAAM,SAAS,MAAM,YAAY,QAAQ;AAEzC,sBAAc,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS,GAAG,eAAe,YAAY,KAAK,MAAM,MAAM;AAAA,QAC1D,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,CAAC,WAAW,UAAU;AACtC,YAAM,SAAS,WAAW,YAAY,QAAQ;AAC9C,aAAO,CAAC;AAAA,QACN,MAAM,eAAe,YAAY;AAAA,QACjC,MAAM;AAAA,QACN,UAAU,SAAS,YAAY;AAAA,QAC/B,UAAU;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,SAAS,SAAS,eAAe;AACnC,UAAM,YAAY;AAKlB,QAAI,UAAU,aAAa,aAAa,UAAU,WAAW,UAAU,QAAQ,SAAS,GAAG;AACzF,YAAM,eAAe,eAAe,YAAY;AAChD,YAAM,cAAc,UAAU,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AACnE,YAAM,gBAAgB,UAAU,QAAQ,KAAK,KAAK;AAElD,aAAO;AAAA,QACL;AAAA,UACE,MAAM,GAAG,YAAY;AAAA,UACrB,MAAM;AAAA,UACN,UAAU;AAAA;AAAA,UACV,UAAU;AAAA,UACV,SAAS,wBAAwB,YAAY;AAAA,QAC/C;AAAA,QACA;AAAA,UACE,MAAM,GAAG,YAAY;AAAA,UACrB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS,sBAAsB,YAAY;AAAA,QAC7C;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM,GAAG,aAAa;AAAA,UACtB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAS,eAAe,2BAA2B,UAAU,QAAQ,KAAK,IAAI,CAAC;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,gBAAgB,UAAU,UAAU;AAEjD,SAAO,CAAC;AAAA,IACN,MAAM,eAAe,YAAY;AAAA,IACjC;AAAA,IACA,UAAU,SAAS,YAAY;AAAA,IAC/B,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC;AACH;AAKO,SAAS,qBACd,cACA,UACA,YACA,UAA6B,CAAC,GAClB;AACZ,SAAO,uBAAuB,cAAc,UAAU,YAAY,OAAO,EAAE,CAAC;AAC9E;AAKO,SAAS,kBACd,QACA,YACA,UAA6B,CAAC,GACjB;AACb,QAAM,aAA2B,CAAC;AAGlC,MAAI,OAAO,SAAS,OAAO,OAAO;AAChC,UAAM,SAAU,OAAO,SAAS,UAAU;AAC1C,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM,YAAY,MAAM,KAAK;AAAA,MAC7B,UAAU;AAAA,MACV,UAAU,QAAQ,YAAY;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,OAAO,YAAY;AACrB,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAEpE,iBAAW,KAAK,GAAG,uBAAuB,UAAU,UAAU,YAAY,OAAO,CAAC;AAAA,IACpF;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,eAAe,OAAO;AACxC,eAAW;AAAA,MACT;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,QACV,UAAU,QAAQ,YAAY;AAAA,QAC9B,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA,QACV,UAAU,QAAQ,YAAY;AAAA,QAC9B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,YAAY;AAC9B,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU,QAAQ,YAAY;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,QAAM,oBAAoB,mBAAmB,OAAO,aAAa,OAAO;AAExE,SAAO;AAAA,IACL,MAAM,gBAAgB,OAAO,IAAI;AAAA,IACjC;AAAA,IACA,SAAS,qBAAqB,OAAO;AAAA,EACvC;AACF;AAKO,SAAS,eAAe,UAA8B;AAC3D,QAAM,WAAW,SAAS,WAAW,cAAc;AACnD,QAAM,WAAW,SAAS,WAAW,MAAM;AAC3C,QAAM,UAAU,SAAS,UAAU,SAAS,SAAS,OAAO;AAAA,IAAU;AACtE,SAAO,GAAG,OAAO,KAAK,QAAQ,GAAG,SAAS,IAAI,GAAG,QAAQ,KAAK,SAAS,IAAI;AAC7E;AAKO,SAAS,gBAAgB,OAA4B;AAC1D,QAAM,UAAU,MAAM,UAAU;AAAA,KAAW,MAAM,OAAO;AAAA;AAAA,IAAY;AACpE,QAAM,gBAAgB,MAAM,WAAW,MAAM,QAAQ,SAAS,IAC1D,YAAY,MAAM,QAAQ,KAAK,IAAI,CAAC,KACpC;AACJ,QAAM,aAAa,MAAM,WAAW,IAAI,cAAc,EAAE,KAAK,IAAI;AAEjE,SAAO,GAAG,OAAO,oBAAoB,MAAM,IAAI,GAAG,aAAa;AAAA,EAAO,UAAU;AAAA;AAClF;AAMO,SAAS,mBACd,SACA,UAA6B,CAAC,GACf;AACf,QAAM,aAA4B,CAAC;AAEnC,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAE3C,QAAI,OAAO,SAAS,QAAQ;AAC1B;AAAA,IACF;AAEA,eAAW,KAAK,kBAAkB,QAAQ,SAAS,OAAO,CAAC;AAAA,EAC7D;AAEA,SAAO;AACT;;;ACvYA,SAAS,0BAAAA,+BAA8B;AAMvC,SAASC,oBACP,OACA,UAA6B,CAAC,GACV;AACpB,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAOD,wBAAuB,OAAO;AAAA,IACnC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAeO,SAAS,iBAAiB,OAAuB;AAEtD,SAAO,MACJ,MAAM,SAAS,EACf,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE,EACP,QAAQ,iBAAiB,EAAE;AAChC;AAKO,SAAS,WAAW,YAA4B;AACrD,SAAO;AACT;AAMA,SAAS,eACP,OACA,UAA6B,CAAC,GACjB;AACb,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,MAAM,iBAAiB,KAAK;AAAA,MAC5B;AAAA;AAAA,IAEF;AAAA,EACF;AAGA,QAAM,gBAAgBC,oBAAmB,MAAM,OAAO,OAAO;AAE7D,SAAO;AAAA,IACL,MAAM,iBAAiB,MAAM,KAAK;AAAA,IAClC,OAAO,MAAM;AAAA,IACb,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,EACf;AACF;AAKO,SAAS,aAAa,QAAsB,UAA6B,CAAC,GAAkB;AACjG,MAAI,OAAO,SAAS,UAAU,CAAC,OAAO,QAAQ;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,SAAwB,OAAO,OAAO;AAAA,IAAI,WAC9C,eAAe,OAAmC,OAAO;AAAA,EAC3D;AACA,QAAM,cAAcA,oBAAmB,OAAO,aAAa,OAAO;AAElE,SAAO;AAAA,IACL,MAAM,WAAW,OAAO,IAAI;AAAA,IAC5B;AAAA,IACA,SAAS,eAAe,OAAO;AAAA,EACjC;AACF;AAKO,SAAS,cAAc,SAA2B,UAA6B,CAAC,GAAa;AAClG,QAAM,QAAkB,CAAC;AAEzB,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,UAAU,aAAa,QAAQ,OAAO;AAC5C,UAAI,SAAS;AACX,cAAM,KAAK,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,WAAW,SAAyB;AAClD,QAAM,EAAE,MAAM,QAAQ,QAAQ,IAAI;AAClC,QAAM,QAAkB,CAAC;AAGzB,MAAI,SAAS;AACX,UAAM,KAAK;AAAA,KAAW,OAAO;AAAA;AAAA,CAAS;AAAA,EACxC;AAGA,QAAM,aAAa,OAChB,IAAI,OAAK,KAAK,EAAE,IAAI,OAAO,EAAE,KAAK,IAAI,EACtC,KAAK,IAAI;AACZ,QAAM,KAAK,eAAe,IAAI;AAAA,EAAO,UAAU;AAAA;AAAA;AAAA,CAAS;AAGxD,QAAM,KAAK,WAAW,IAAI;AAAA,CAAc;AACxC,QAAM,KAAK,gBAAgB,IAAI,0BAA0B,IAAI;AAAA;AAAA,CAAQ;AAGrE,QAAM,KAAK,sBAAsB,IAAI;AAAA,CAAO;AAC5C,QAAM,KAAK,qBAAqB,IAAI,8BAA8B,IAAI;AAAA,CAAM;AAC5E,QAAM,KAAK,YAAY,IAAI,4BAA4B,IAAI;AAAA,CAAM;AACjE,QAAM,KAAK;AAAA;AAAA,CAAO;AAGlB,QAAM,YAAY,OAAO,KAAK,OAAK,EAAE,UAAU,MAAS;AACxD,MAAI,WAAW;AACb,UAAM,eAAe,OAClB,OAAO,OAAK,EAAE,UAAU,MAAS,EACjC,IAAI,OAAK,MAAM,IAAI,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,IAAI,EAC/C,KAAK,IAAI;AACZ,UAAM,KAAK,SAAS,WAAW,IAAI,CAAC,0BAA0B,IAAI;AAAA,EAAmB,YAAY;AAAA;AAAA;AAAA,CAAU;AAAA,EAC7G;AAEA,QAAM,KAAK,qBAAqB,IAAI;AAAA,CAA6C;AACjF,QAAM,KAAK,sBAAsB,IAAI,gBAAgB,IAAI;AAAA,CAAe;AACxE,MAAI,WAAW;AACb,UAAM,KAAK,YAAY,WAAW,IAAI,CAAC;AAAA,CAA2B;AAAA,EACpE,OAAO;AACL,UAAM,KAAK;AAAA,CAAmB;AAAA,EAChC;AACA,QAAM,KAAK;AAAA;AAAA,CAAO;AAGlB,QAAM,WAAW,OAAO,KAAK,OAAK,EAAE,UAAU,MAAS;AACvD,MAAI,UAAU;AACZ,UAAM,eAAe,OAClB,OAAO,OAAK,EAAE,UAAU,MAAS,EACjC,IAAI,OAAK,MAAM,IAAI,IAAI,EAAE,IAAI,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC,GAAG,EAC7D,KAAK,IAAI;AACZ,UAAM,KAAK,SAAS,WAAW,IAAI,CAAC,yBAAyB,IAAI;AAAA,EAAoC,YAAY;AAAA;AAAA;AAAA,CAAU;AAE3H,UAAM,KAAK,8BAA8B,IAAI;AAAA,CAAwC;AACrF,UAAM,KAAK,sBAAsB,IAAI,gBAAgB,IAAI;AAAA,CAA4C;AACrG,UAAM,KAAK,YAAY,WAAW,IAAI,CAAC;AAAA,CAAiB;AACxD,UAAM,KAAK,GAAG;AAAA,EAChB,OAAO;AACL,UAAM,KAAK,8BAA8B,IAAI;AAAA,CAAwC;AACrF,UAAM,KAAK,sBAAsB,IAAI,iBAAiB,IAAI;AAAA,CAA4C;AACtG,UAAM,KAAK;AAAA,CAAuB;AAClC,UAAM,KAAK,GAAG;AAAA,EAChB;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;AAKA,SAAS,WAAW,KAAqB;AACvC,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;AAKO,SAAS,gBAAgB,SAA8B;AAC5D,QAAM,OAAO,QAAQ,OAClB,IAAI,OAAK,IAAI,EAAE,KAAK,GAAG,EACvB,KAAK,KAAK;AAEb,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB;AACF;AAKO,SAAS,gBAAgB,OAA4B;AAC1D,QAAM,EAAE,MAAM,MAAM,QAAQ,IAAI;AAChC,QAAM,QAAkB,CAAC;AAGzB,MAAI,SAAS;AACX,UAAM,KAAK;AAAA,KAAW,OAAO;AAAA;AAAA,CAAS;AAAA,EACxC;AAGA,QAAM,KAAK,eAAe,IAAI,MAAM,IAAI;AAAA;AAAA,CAAO;AAG/C,QAAM,SAAS,KAAK,MAAM,KAAK,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAClD,QAAM,KAAK,WAAW,IAAI;AAAA,CAAc;AACxC,QAAM,KAAK,gBAAgB,IAAI,WAAW,IAAI,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,CAAQ;AAGhF,QAAM,KAAK,sBAAsB,IAAI;AAAA,CAAO;AAC5C,QAAM,KAAK,qBAAqB,IAAI,8BAA8B,IAAI;AAAA,CAAM;AAC5E,QAAM,KAAK,YAAY,IAAI,4BAA4B,IAAI;AAAA,CAAM;AACjE,QAAM,KAAK;AAAA;AAAA,CAAO;AAGlB,QAAM,KAAK,qBAAqB,IAAI;AAAA,CAAmC;AACvE,QAAM,KAAK,sBAAsB,IAAI,gBAAgB,IAAI;AAAA,CAAe;AACxE,QAAM,KAAK;AAAA,CAAmB;AAC9B,QAAM,KAAK;AAAA;AAAA,CAAO;AAGlB,QAAM,KAAK,8BAA8B,IAAI;AAAA,CAAiD;AAC9F,QAAM,KAAK,sBAAsB,IAAI,iBAAiB,IAAI;AAAA,CAA4C;AACtG,QAAM,KAAK;AAAA,CAAuB;AAClC,QAAM,KAAK,GAAG;AAEd,SAAO,MAAM,KAAK,EAAE;AACtB;AAKO,SAAS,mBAAmB,SAA2B,UAA6B,CAAC,GAAkB;AAC5G,QAAM,cAA6B,CAAC;AAEpC,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,OAAO,SAAS,UAAU,CAAC,OAAO,YAAY;AAChD;AAAA,IACF;AAEA,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACpE,UAAI,SAAS,SAAS,QAAQ;AAC5B,cAAM,WAAW;AAGjB,YAAI,MAAM,QAAQ,SAAS,IAAI,KAAK,SAAS,KAAK,SAAS,GAAG;AAC5D,gBAAM,WAAW,GAAG,OAAO,IAAI,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC;AACtF,gBAAM,SAAS,SAAS,KAAK;AAAA,YAAI,OAC/B,OAAO,MAAM,WAAW,IAAI,EAAE;AAAA,UAChC;AACA,gBAAM,cAAcA,oBAAmB,SAAS,aAAa,OAAO;AACpE,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,MAAM,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,YAC1C,SAAS,eAAe,GAAG,OAAO,IAAI,IAAI,QAAQ;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,UAAU;AAC9B,cAAM,aAAa;AAEnB,YAAI,WAAW,WAAW,WAAW,QAAQ,SAAS,GAAG;AACvD,gBAAM,WAAW,GAAG,OAAO,IAAI,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC,CAAC;AACtF,gBAAM,cAAcA,oBAAmB,WAAW,aAAa,OAAO;AACtE,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,MAAM,WAAW,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,YACtD,SAAS,eAAe,GAAG,OAAO,IAAI,IAAI,QAAQ;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC1RA,IAAM,kBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,kBAAkB;AACpB;AAKA,SAAS,qBAA6B;AACpC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMT;AAKA,SAAS,oBAAoB,YAA4B;AACvD,SAAO;AAAA,KACJ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQf;AAKA,SAAS,0BACP,YACA,SACA,SACgB;AAChB,QAAM,aAAa,mBAAmB,SAAS,OAAO;AACtD,QAAM,QAAQ,WAAW,KAAK,OAAK,EAAE,SAAS,UAAU;AAExD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,mCAAmC,UAAU,EAAE;AAAA,EACjE;AAEA,QAAM,QAAkB,CAAC,mBAAmB,CAAC;AAC7C,QAAM,KAAK,gBAAgB,KAAK,CAAC;AACjC,QAAM,KAAK,IAAI;AAEf,SAAO;AAAA,IACL,UAAU,QAAQ,UAAU;AAAA,IAC5B,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB,OAAO,CAAC,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AACF;AAKA,SAAS,iBAAiB,SAAiC;AACzD,QAAM,QAAkB,CAAC,mBAAmB,CAAC;AAC7C,QAAM,KAAK,WAAW,OAAO,CAAC;AAC9B,QAAM,KAAK,IAAI;AAEf,SAAO;AAAA,IACL,UAAU,QAAQ,QAAQ,IAAI;AAAA,IAC9B,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB,OAAO,CAAC,QAAQ,IAAI;AAAA,IACpB,WAAW;AAAA,EACb;AACF;AAKA,SAAS,sBAAsB,OAAoC;AACjE,QAAM,QAAkB,CAAC,mBAAmB,CAAC;AAC7C,QAAM,KAAK,gBAAgB,KAAK,CAAC;AACjC,QAAM,KAAK,IAAI;AAEf,SAAO;AAAA,IACL,UAAU,QAAQ,MAAM,IAAI;AAAA,IAC5B,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB,OAAO,CAAC,MAAM,IAAI;AAAA,IAClB,WAAW;AAAA,EACb;AACF;AAKA,SAAS,kBAAkB,YAAoC;AAC7D,QAAM,QAAkB,CAAC,oBAAoB,UAAU,CAAC;AAGxD,QAAM,KAAK,iBAAiB,UAAU,OAAO,UAAU,uBAAuB,UAAU;AAAA;AAAA,CAAW;AAGnG,QAAM,KAAK;AAAA,KAAW,UAAU;AAAA;AAAA;AAAA,CAAqE;AACrG,QAAM,KAAK,oBAAoB,UAAU,YAAY,UAAU;AAAA,CAAU;AACzE,QAAM,KAAK;AAAA,CAAmC;AAC9C,QAAM,KAAK;AAAA;AAAA,CAAO;AAGlB,QAAM,KAAK;AAAA,CAA2C;AACtD,QAAM,KAAK,iBAAiB,UAAU;AAAA,CAAW;AAEjD,SAAO;AAAA,IACL,UAAU,GAAG,UAAU;AAAA,IACvB,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB,OAAO,CAAC,UAAU;AAAA,IAClB,WAAW;AAAA;AAAA,EACb;AACF;AAKA,SAAS,kBACP,SACA,OACA,aACgB;AAChB,QAAM,QAAkB,CAAC,mBAAmB,CAAC;AAG7C,MAAI,MAAM,SAAS,KAAK,YAAY,SAAS,GAAG;AAC9C,UAAM,KAAK;AAAA,CAAY;AACvB,eAAW,WAAW,OAAO;AAC3B,YAAM,KAAK;AAAA,CAAY;AACvB,YAAM,KAAK,KAAK,QAAQ,IAAI;AAAA,CAAK;AACjC,YAAM,KAAK,KAAK,QAAQ,IAAI;AAAA,CAAW;AACvC,YAAM,KAAK,OAAO,QAAQ,IAAI;AAAA,CAAK;AACnC,YAAM,KAAK,QAAQ,QAAQ,IAAI;AAAA,CAAU;AACzC,YAAM,KAAK,QAAQ,QAAQ,IAAI;AAAA,CAAU;AACzC,YAAM,KAAK,kBAAkB,QAAQ,IAAI;AAAA,CAAS;AAAA,IACpD;AACA,eAAW,SAAS,aAAa;AAC/B,YAAM,KAAK;AAAA,CAAY;AACvB,YAAM,KAAK,UAAU,MAAM,IAAI;AAAA,CAAK;AACpC,YAAM,KAAK,KAAK,MAAM,IAAI;AAAA,CAAW;AACrC,YAAM,KAAK,OAAO,MAAM,IAAI;AAAA,CAAK;AACjC,YAAM,KAAK,QAAQ,MAAM,IAAI;AAAA,CAAU;AACvC,YAAM,KAAK,QAAQ,MAAM,IAAI;AAAA,CAAU;AACvC,YAAM,KAAK,kBAAkB,MAAM,IAAI;AAAA,CAAS;AAAA,IAClD;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,QAAM,KAAK;AAAA,CAAa;AACxB,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,OAAO,SAAS,OAAQ;AAC5B,UAAM,KAAK,iBAAiB,OAAO,IAAI,cAAc,OAAO,IAAI;AAAA,CAAS;AAAA,EAC3E;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB,OAAO,CAAC;AAAA,IACR,WAAW;AAAA,EACb;AACF;AAWO,SAAS,mBACd,SACA,UAA6B,CAAC,GACZ;AAClB,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,QAA0B,CAAC;AAGjC,QAAM,QAAQ,cAAc,OAAO;AACnC,aAAW,WAAW,OAAO;AAC3B,UAAM,KAAK,iBAAiB,OAAO,CAAC;AAAA,EACtC;AAGA,QAAM,cAAc,mBAAmB,OAAO;AAC9C,aAAW,SAAS,aAAa;AAC/B,UAAM,KAAK,sBAAsB,KAAK,CAAC;AAAA,EACzC;AAGA,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,OAAO,SAAS,OAAQ;AAC5B,UAAM,KAAK,0BAA0B,OAAO,MAAM,SAAS,IAAI,CAAC;AAAA,EAClE;AAGA,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,QAAI,OAAO,SAAS,OAAQ;AAC5B,UAAM,KAAK,kBAAkB,OAAO,IAAI,CAAC;AAAA,EAC3C;AAGA,QAAM,KAAK,kBAAkB,SAAS,OAAO,WAAW,CAAC;AAEzD,SAAO;AACT;","names":["resolveLocalizedString","resolveDisplayName"]}
|
package/dist/index.cjs
CHANGED
|
@@ -56,6 +56,7 @@ var TYPE_MAP = {
|
|
|
56
56
|
LongText: "string",
|
|
57
57
|
Date: "string",
|
|
58
58
|
Time: "string",
|
|
59
|
+
DateTime: "string",
|
|
59
60
|
Timestamp: "string",
|
|
60
61
|
Json: "unknown",
|
|
61
62
|
Email: "string",
|
|
@@ -236,14 +237,14 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
236
237
|
if (schema.options?.timestamps !== false) {
|
|
237
238
|
properties.push(
|
|
238
239
|
{
|
|
239
|
-
name: "
|
|
240
|
+
name: "created_at",
|
|
240
241
|
type: "string",
|
|
241
242
|
optional: true,
|
|
242
243
|
readonly: options.readonly ?? true,
|
|
243
244
|
comment: "Creation timestamp"
|
|
244
245
|
},
|
|
245
246
|
{
|
|
246
|
-
name: "
|
|
247
|
+
name: "updated_at",
|
|
247
248
|
type: "string",
|
|
248
249
|
optional: true,
|
|
249
250
|
readonly: options.readonly ?? true,
|
|
@@ -253,7 +254,7 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
253
254
|
}
|
|
254
255
|
if (schema.options?.softDelete) {
|
|
255
256
|
properties.push({
|
|
256
|
-
name: "
|
|
257
|
+
name: "deleted_at",
|
|
257
258
|
type: "string",
|
|
258
259
|
optional: true,
|
|
259
260
|
readonly: options.readonly ?? true,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/interface-generator.ts","../src/enum-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-typescript\n *\n * TypeScript type definitions generator for Omnify schemas.\n */\n\nexport type {\n TypeScriptFile,\n TypeScriptOptions,\n TSProperty,\n TSInterface,\n TSEnum,\n TSEnumValue,\n TSTypeAlias,\n} from './types.js';\n\nexport {\n toPropertyName,\n toInterfaceName,\n getPropertyType,\n propertyToTSProperty,\n schemaToInterface,\n formatProperty,\n formatInterface,\n generateInterfaces,\n} from './interface-generator.js';\n\nexport {\n toEnumMemberName,\n toEnumName,\n schemaToEnum,\n generateEnums,\n formatEnum,\n enumToUnionType,\n formatTypeAlias,\n extractInlineEnums,\n} from './enum-generator.js';\n\nexport {\n generateTypeScript,\n generateTypeScriptFiles,\n} from './generator.js';\n","/**\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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n Timestamp: 'string',\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 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 * 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\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\n if (schema.options?.timestamps !== false) {\n properties.push(\n {\n name: 'createdAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updatedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Last update timestamp',\n }\n );\n }\n\n // Soft delete\n if (schema.options?.softDelete) {\n properties.push({\n name: 'deletedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["import_omnify_types","resolveDisplayName"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/interface-generator.ts","../src/enum-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-typescript\n *\n * TypeScript type definitions generator for Omnify schemas.\n */\n\nexport type {\n TypeScriptFile,\n TypeScriptOptions,\n TSProperty,\n TSInterface,\n TSEnum,\n TSEnumValue,\n TSTypeAlias,\n} from './types.js';\n\nexport {\n toPropertyName,\n toInterfaceName,\n getPropertyType,\n propertyToTSProperty,\n schemaToInterface,\n formatProperty,\n formatInterface,\n generateInterfaces,\n} from './interface-generator.js';\n\nexport {\n toEnumMemberName,\n toEnumName,\n schemaToEnum,\n generateEnums,\n formatEnum,\n enumToUnionType,\n formatTypeAlias,\n extractInlineEnums,\n} from './enum-generator.js';\n\nexport {\n generateTypeScript,\n generateTypeScriptFiles,\n} from './generator.js';\n","/**\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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n DateTime: 'string',\n Timestamp: 'string',\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 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 * 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\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updated_at',\n type: 'string',\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["import_omnify_types","resolveDisplayName"]}
|
package/dist/index.js
CHANGED
package/dist/plugin.cjs
CHANGED
|
@@ -40,6 +40,7 @@ var TYPE_MAP = {
|
|
|
40
40
|
LongText: "string",
|
|
41
41
|
Date: "string",
|
|
42
42
|
Time: "string",
|
|
43
|
+
DateTime: "string",
|
|
43
44
|
Timestamp: "string",
|
|
44
45
|
Json: "unknown",
|
|
45
46
|
Email: "string",
|
|
@@ -217,14 +218,14 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
217
218
|
if (schema.options?.timestamps !== false) {
|
|
218
219
|
properties.push(
|
|
219
220
|
{
|
|
220
|
-
name: "
|
|
221
|
+
name: "created_at",
|
|
221
222
|
type: "string",
|
|
222
223
|
optional: true,
|
|
223
224
|
readonly: options.readonly ?? true,
|
|
224
225
|
comment: "Creation timestamp"
|
|
225
226
|
},
|
|
226
227
|
{
|
|
227
|
-
name: "
|
|
228
|
+
name: "updated_at",
|
|
228
229
|
type: "string",
|
|
229
230
|
optional: true,
|
|
230
231
|
readonly: options.readonly ?? true,
|
|
@@ -234,7 +235,7 @@ function schemaToInterface(schema, allSchemas, options = {}) {
|
|
|
234
235
|
}
|
|
235
236
|
if (schema.options?.softDelete) {
|
|
236
237
|
properties.push({
|
|
237
|
-
name: "
|
|
238
|
+
name: "deleted_at",
|
|
238
239
|
type: "string",
|
|
239
240
|
optional: true,
|
|
240
241
|
readonly: options.readonly ?? true,
|
package/dist/plugin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/interface-generator.ts","../src/enum-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-typescript - Plugin\n *\n * Plugin for generating TypeScript type definitions from Omnify schemas.\n *\n * Output structure:\n * - types/models/base/[SchemaName].ts - Auto-generated base interfaces, always overwritten\n * - types/models/enum/[EnumName].ts - Auto-generated enums/type aliases, always overwritten\n * - types/models/[SchemaName].ts - Extends base, user can customize, never overwritten\n * - types/models/index.ts - Re-exports, always overwritten\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@famgia/omnify';\n * import typescript from '@famgia/omnify-typescript/plugin';\n *\n * export default defineConfig({\n * plugins: [\n * typescript({\n * modelsPath: 'types/models', // default\n * }),\n * ],\n * });\n * ```\n */\n\nimport type { OmnifyPlugin, GeneratorOutput, GeneratorContext, PluginConfigSchema } from '@famgia/omnify-types';\nimport { generateTypeScript } from './generator.js';\n\n/**\n * Configuration schema for TypeScript plugin UI settings\n */\nconst TYPESCRIPT_CONFIG_SCHEMA: PluginConfigSchema = {\n fields: [\n {\n key: 'modelsPath',\n type: 'path',\n label: 'Models Output Path',\n description: 'Directory for generated TypeScript model files',\n default: 'types/models',\n group: 'output',\n },\n ],\n};\n\n/**\n * Options for the TypeScript plugin.\n */\nexport interface TypeScriptPluginOptions {\n /**\n * Path for TypeScript model files.\n * @default 'types/models'\n */\n modelsPath?: string;\n}\n\n/**\n * Resolved options with defaults applied.\n */\ninterface ResolvedOptions {\n modelsPath: string;\n}\n\n/**\n * Resolves options with defaults.\n */\nfunction resolveOptions(options?: TypeScriptPluginOptions): ResolvedOptions {\n return {\n modelsPath: options?.modelsPath ?? 'types/models',\n };\n}\n\n/**\n * Creates the TypeScript plugin with the specified options.\n *\n * @param options - Plugin configuration options\n * @returns OmnifyPlugin configured for TypeScript generation\n */\nexport default function typescriptPlugin(options?: TypeScriptPluginOptions): OmnifyPlugin {\n const resolved = resolveOptions(options);\n\n return {\n name: '@famgia/omnify-typescript',\n version: '0.0.1',\n configSchema: TYPESCRIPT_CONFIG_SCHEMA,\n\n generators: [\n {\n name: 'typescript-models',\n description: 'Generate TypeScript model definitions',\n\n generate: async (ctx: GeneratorContext): Promise<GeneratorOutput[]> => {\n const files = generateTypeScript(ctx.schemas);\n\n return files.map((file) => ({\n path: `${resolved.modelsPath}/${file.filePath}`,\n content: file.content,\n type: 'type' as const,\n overwrite: file.overwrite,\n metadata: {\n types: file.types,\n },\n }));\n },\n },\n ],\n };\n}\n\n// Named export for flexibility\nexport { typescriptPlugin };\n","/**\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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n Timestamp: 'string',\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 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 * 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\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\n if (schema.options?.timestamps !== false) {\n properties.push(\n {\n name: 'createdAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updatedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Last update timestamp',\n }\n );\n }\n\n // Soft delete\n if (schema.options?.softDelete) {\n properties.push({\n name: 'deletedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["import_omnify_types","resolveDisplayName","resolveDisplayName"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/interface-generator.ts","../src/enum-generator.ts","../src/generator.ts"],"sourcesContent":["/**\n * @famgia/omnify-typescript - Plugin\n *\n * Plugin for generating TypeScript type definitions from Omnify schemas.\n *\n * Output structure:\n * - types/models/base/[SchemaName].ts - Auto-generated base interfaces, always overwritten\n * - types/models/enum/[EnumName].ts - Auto-generated enums/type aliases, always overwritten\n * - types/models/[SchemaName].ts - Extends base, user can customize, never overwritten\n * - types/models/index.ts - Re-exports, always overwritten\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@famgia/omnify';\n * import typescript from '@famgia/omnify-typescript/plugin';\n *\n * export default defineConfig({\n * plugins: [\n * typescript({\n * modelsPath: 'types/models', // default\n * }),\n * ],\n * });\n * ```\n */\n\nimport type { OmnifyPlugin, GeneratorOutput, GeneratorContext, PluginConfigSchema } from '@famgia/omnify-types';\nimport { generateTypeScript } from './generator.js';\n\n/**\n * Configuration schema for TypeScript plugin UI settings\n */\nconst TYPESCRIPT_CONFIG_SCHEMA: PluginConfigSchema = {\n fields: [\n {\n key: 'modelsPath',\n type: 'path',\n label: 'Models Output Path',\n description: 'Directory for generated TypeScript model files',\n default: 'types/models',\n group: 'output',\n },\n ],\n};\n\n/**\n * Options for the TypeScript plugin.\n */\nexport interface TypeScriptPluginOptions {\n /**\n * Path for TypeScript model files.\n * @default 'types/models'\n */\n modelsPath?: string;\n}\n\n/**\n * Resolved options with defaults applied.\n */\ninterface ResolvedOptions {\n modelsPath: string;\n}\n\n/**\n * Resolves options with defaults.\n */\nfunction resolveOptions(options?: TypeScriptPluginOptions): ResolvedOptions {\n return {\n modelsPath: options?.modelsPath ?? 'types/models',\n };\n}\n\n/**\n * Creates the TypeScript plugin with the specified options.\n *\n * @param options - Plugin configuration options\n * @returns OmnifyPlugin configured for TypeScript generation\n */\nexport default function typescriptPlugin(options?: TypeScriptPluginOptions): OmnifyPlugin {\n const resolved = resolveOptions(options);\n\n return {\n name: '@famgia/omnify-typescript',\n version: '0.0.1',\n configSchema: TYPESCRIPT_CONFIG_SCHEMA,\n\n generators: [\n {\n name: 'typescript-models',\n description: 'Generate TypeScript model definitions',\n\n generate: async (ctx: GeneratorContext): Promise<GeneratorOutput[]> => {\n const files = generateTypeScript(ctx.schemas);\n\n return files.map((file) => ({\n path: `${resolved.modelsPath}/${file.filePath}`,\n content: file.content,\n type: 'type' as const,\n overwrite: file.overwrite,\n metadata: {\n types: file.types,\n },\n }));\n },\n },\n ],\n };\n}\n\n// Named export for flexibility\nexport { typescriptPlugin };\n","/**\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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n DateTime: 'string',\n Timestamp: 'string',\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 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 * 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\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updated_at',\n type: 'string',\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: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["import_omnify_types","resolveDisplayName","resolveDisplayName"]}
|
package/dist/plugin.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@famgia/omnify-typescript",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.25",
|
|
4
4
|
"description": "TypeScript type definitions generator for Omnify schemas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"directory": "packages/typescript-generator"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@famgia/omnify-types": "0.0.
|
|
50
|
+
"@famgia/omnify-types": "0.0.34"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"tsup": "^8.5.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interface-generator.ts","../src/enum-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 Int: 'number',\n BigInt: 'number',\n Float: 'number',\n Boolean: 'boolean',\n Text: 'string',\n LongText: 'string',\n Date: 'string',\n Time: 'string',\n Timestamp: 'string',\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 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 * 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\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\n if (schema.options?.timestamps !== false) {\n properties.push(\n {\n name: 'createdAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Creation timestamp',\n },\n {\n name: 'updatedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Last update timestamp',\n }\n );\n }\n\n // Soft delete\n if (schema.options?.softDelete) {\n properties.push({\n name: 'deletedAt',\n type: 'string',\n optional: true,\n readonly: options.readonly ?? true,\n comment: 'Soft delete timestamp',\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 };\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 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 * Resolves LocalizedString labels to string using provided options.\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 // Resolve LocalizedString label to string\n const resolvedLabel = resolveDisplayName(value.label, options);\n\n return {\n name: toEnumMemberName(value.value),\n value: value.value,\n label: resolvedLabel,\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 * 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 // Labels - only generate if at least one value has a label\n const hasLabels = values.some(v => v.label !== undefined);\n if (hasLabels) {\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\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 if (hasLabels) {\n parts.push(` return ${lowerFirst(name)}Labels[value] ?? value;\\n`);\n } else {\n parts.push(` return value;\\n`);\n }\n parts.push(`}\\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 * @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';\n\n/**\n * Default options for TypeScript generation.\n */\nconst DEFAULT_OPTIONS: TypeScriptOptions = {\n readonly: true,\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 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\n if (!iface) {\n throw new Error(`Interface not found for schema: ${schemaName}`);\n }\n\n const parts: string[] = [generateBaseHeader()];\n parts.push(formatInterface(iface));\n parts.push('\\n');\n\n return {\n filePath: `base/${schemaName}.ts`,\n content: parts.join(''),\n types: [schemaName],\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 index file for re-exports.\n */\nfunction generateIndexFile(\n schemas: SchemaCollection,\n enums: TSEnum[],\n typeAliases: TSTypeAlias[]\n): TypeScriptFile {\n const parts: string[] = [generateBaseHeader()];\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\n parts.push(`// Models\\n`);\n for (const schema of Object.values(schemas)) {\n if (schema.kind === 'enum') continue;\n parts.push(`export type { ${schema.name} } from './${schema.name}.js';\\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);\n for (const enumDef of enums) {\n files.push(generateEnumFile(enumDef));\n }\n\n // Generate type alias files\n const typeAliases = extractInlineEnums(schemas);\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 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 files.push(generateModelFile(schema.name));\n }\n\n // Generate index file\n files.push(generateIndexFile(schemas, enums, typeAliases));\n\n return files;\n}\n\n// Legacy exports for compatibility\nexport { generateTypeScript as generateTypeScriptFiles };\n"],"mappings":"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","names":["resolveLocalizedString","resolveDisplayName"]}
|