@strapi2front/generators 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +116 -2
- package/dist/index.js +1803 -288
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/formatter.ts","../src/utils/file.ts","../src/utils/naming.ts","../src/shared/type-mapper.ts","../src/output/typescript/types.ts","../src/output/jsdoc/types.ts","../src/types/generator.ts","../src/output/jsdoc/services.ts","../src/services/generator.ts","../src/frameworks/astro/actions.ts","../src/actions/generator.ts","../src/client/generator.ts","../src/locales/generator.ts","../src/by-feature/generator.ts","../src/frameworks/nextjs/actions.ts","../src/frameworks/nuxt/server-routes.ts","../src/frameworks/index.ts"],"names":["path","generateUtilityTypes","generateCollectionType","generateSingleType","generateComponentType","generateCollectionService","generateSingleService","generateClient","generateLocalesFile","generateCollectionActions","generateAttributes"],"mappings":"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","file":"index.js","sourcesContent":["import * as prettier from 'prettier';\n\n/**\n * Format TypeScript code using Prettier\n */\nexport async function formatCode(code: string): Promise<string> {\n try {\n return await prettier.format(code, {\n parser: 'typescript',\n semi: true,\n singleQuote: true,\n trailingComma: 'es5',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n });\n } catch {\n // If formatting fails, return original code\n return code;\n }\n}\n\n/**\n * Format JSON code using Prettier\n */\nexport async function formatJson(code: string): Promise<string> {\n try {\n return await prettier.format(code, {\n parser: 'json',\n tabWidth: 2,\n });\n } catch {\n return code;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // Ignore if directory already exists\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw error;\n }\n }\n}\n\n/**\n * Write content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Read a file's content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Check if a file exists\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Delete a file if it exists\n */\nexport async function deleteFile(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n\n/**\n * List files in a directory matching a pattern\n */\nexport async function listFiles(dirPath: string, extension?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => path.join(dirPath, entry.name));\n\n if (extension) {\n files = files.filter((file) => file.endsWith(extension));\n }\n\n return files;\n } catch {\n return [];\n }\n}\n","/**\n * Convert string to PascalCase\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert string to camelCase\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Convert string to kebab-case\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Pluralize a word (simple version)\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n if (word.endsWith('y') && !['a', 'e', 'i', 'o', 'u'].includes(word.charAt(word.length - 2))) {\n return word.slice(0, -1) + 'ies';\n }\n return word + 's';\n}\n","/**\n * Type mapping utilities\n * Shared logic for converting Strapi attributes to TypeScript/JSDoc types\n */\n\nimport type { Attribute, ComponentType } from '@strapi2front/core';\nimport { toPascalCase } from '../utils/naming.js';\n\n/**\n * Mapped type information\n */\nexport interface MappedType {\n /** The type string (e.g., \"string\", \"number\", \"Article\") */\n type: string;\n /** Whether this type needs an import */\n needsImport: boolean;\n /** Import details if needed */\n import?: {\n name: string;\n from: string;\n isRelation?: boolean;\n isComponent?: boolean;\n };\n}\n\n/**\n * Convert Strapi attribute to type string\n */\nexport function mapAttributeToType(attr: Attribute, _components: ComponentType[]): MappedType {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return { type: 'string', needsImport: false };\n\n case 'blocks':\n return {\n type: 'BlocksContent',\n needsImport: true,\n import: { name: 'BlocksContent', from: 'utils' }\n };\n\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return { type: 'number', needsImport: false };\n\n case 'boolean':\n return { type: 'boolean', needsImport: false };\n\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return { type: 'string', needsImport: false };\n\n case 'json':\n return { type: 'unknown', needsImport: false };\n\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return {\n type: attr.enum.map((v) => `'${v}'`).join(' | '),\n needsImport: false\n };\n }\n return { type: 'string', needsImport: false };\n\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return {\n type: 'StrapiMedia[]',\n needsImport: true,\n import: { name: 'StrapiMedia', from: 'utils' }\n };\n }\n return {\n type: 'StrapiMedia | null',\n needsImport: true,\n import: { name: 'StrapiMedia', from: 'utils' }\n };\n\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || 'unknown';\n const typeName = toPascalCase(targetName);\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n return {\n type: isMany ? `${typeName}[]` : `${typeName} | null`,\n needsImport: true,\n import: { name: typeName, from: targetName, isRelation: true }\n };\n }\n return { type: 'unknown', needsImport: false };\n\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n if ('repeatable' in attr && attr.repeatable) {\n return {\n type: `${typeName}[]`,\n needsImport: true,\n import: { name: typeName, from: componentName, isComponent: true }\n };\n }\n return {\n type: `${typeName} | null`,\n needsImport: true,\n import: { name: typeName, from: componentName, isComponent: true }\n };\n }\n return { type: 'unknown', needsImport: false };\n\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map((c) => {\n const name = c.split('.').pop() || 'unknown';\n return toPascalCase(name);\n });\n return {\n type: `(${types.join(' | ')})[]`,\n needsImport: true,\n // Dynamic zones need multiple imports, handled separately\n };\n }\n return { type: 'unknown[]', needsImport: false };\n\n default:\n return { type: 'unknown', needsImport: false };\n }\n}\n\n/**\n * Get JSDoc type annotation for an attribute\n */\nexport function getJSDocType(mappedType: MappedType): string {\n return mappedType.type;\n}\n\n/**\n * Get attribute comment/description\n */\nexport function getAttributeComment(attr: Attribute): string | null {\n const parts: string[] = [];\n\n if (attr.required) {\n parts.push('Required');\n }\n\n if ('minLength' in attr && attr.minLength !== undefined) {\n parts.push(`Min length: ${attr.minLength}`);\n }\n\n if ('maxLength' in attr && attr.maxLength !== undefined) {\n parts.push(`Max length: ${attr.maxLength}`);\n }\n\n if ('min' in attr && attr.min !== undefined) {\n parts.push(`Min: ${attr.min}`);\n }\n\n if ('max' in attr && attr.max !== undefined) {\n parts.push(`Max: ${attr.max}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n}\n\n/**\n * Extract all dependencies (relations and components) from attributes\n */\nexport function extractDependencies(\n attributes: Record<string, Attribute>,\n selfName: string\n): { relations: Set<string>; components: Set<string> } {\n const relations = new Set<string>();\n const components = new Set<string>();\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'relation' && 'target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || '';\n const typeName = toPascalCase(targetName);\n // Don't import self\n if (typeName !== selfName && targetName) {\n relations.add(targetName);\n }\n }\n\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || '';\n if (componentName) {\n components.add(componentName);\n }\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const comp of attr.components) {\n const componentName = comp.split('.').pop() || '';\n if (componentName) {\n components.add(componentName);\n }\n }\n }\n }\n\n return { relations, components };\n}\n","/**\n * TypeScript type generator\n * Generates .ts files with interfaces\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType, ComponentType, Attribute } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { formatCode } from '../../utils/formatter.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toKebabCase } from '../../utils/naming.js';\nimport { mapAttributeToType, getAttributeComment, extractDependencies } from '../../shared/type-mapper.js';\n\nexport interface TypeScriptTypesOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate TypeScript types from parsed schema\n */\nexport async function generateTypeScriptTypes(\n schema: ParsedSchema,\n options: TypeScriptTypesOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'components'));\n\n // Generate utility types\n const utilsPath = path.join(outputDir, 'utils.ts');\n const strapiVersion = options.strapiVersion ?? 'v5';\n await writeFile(utilsPath, await formatCode(generateUtilityTypes(options.blocksRendererInstalled ?? false, strapiVersion)));\n generatedFiles.push(utilsPath);\n\n // Generate collection types\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.ts`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateCollectionType(collection, schema.components);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.ts`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateSingleType(single, schema.components);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate component types\n for (const component of schema.components) {\n const fileName = `${toKebabCase(component.name)}.ts`;\n const filePath = path.join(outputDir, 'components', fileName);\n const content = generateComponentType(component);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate utility types\n */\nfunction generateUtilityTypes(blocksRendererInstalled: boolean, strapiVersion: StrapiVersion): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n */\nexport type RichTextContent = string;`\n : blocksRendererInstalled\n ? `/**\n * Blocks content type (Strapi v5 rich text)\n * Re-exported from @strapi/blocks-react-renderer\n */\nexport type { BlocksContent } from '@strapi/blocks-react-renderer';`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n */\nexport type BlocksContent = unknown[];`;\n\n const baseEntity = isV4\n ? `/**\n * Base entity fields (Strapi v4)\n */\nexport interface StrapiBaseEntity {\n id: number;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`\n : `/**\n * Base entity fields (Strapi v5)\n */\nexport interface StrapiBaseEntity {\n id: number;\n documentId: string;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`;\n\n const mediaType = isV4\n ? `/**\n * Strapi media object (v4)\n */\nexport interface StrapiMedia {\n id: number;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`\n : `/**\n * Strapi media object (v5)\n */\nexport interface StrapiMedia {\n id: number;\n documentId: string;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`;\n\n const rawResponseTypes = isV4\n ? `\n/**\n * Strapi v4 raw API response (with nested attributes)\n */\nexport interface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\nexport interface StrapiV4RawResponse<T> {\n data: StrapiV4RawItem<T>;\n meta: Record<string, unknown>;\n}\n\nexport interface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n/**\n * Flatten Strapi v4 response item\n */\nexport function flattenV4Response<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Flatten Strapi v4 list response\n */\nexport function flattenV4ListResponse<T>(items: StrapiV4RawItem<T>[]): T[] {\n return items.map(item => flattenV4Response<T>(item));\n}`\n : '';\n\n return `/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\n/**\n * Strapi pagination\n */\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n/**\n * Strapi response wrapper\n */\nexport interface StrapiResponse<T> {\n data: T;\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\n/**\n * Strapi list response\n */\nexport interface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n${baseEntity}\n${rawResponseTypes}\n${blocksContentType}\n`;\n}\n\n/**\n * Generate import statements for dependencies\n */\nfunction generateDependencyImports(\n relations: Set<string>,\n components: Set<string>\n): string {\n const imports: string[] = [];\n\n // Import relations (other collections/singles)\n for (const relation of relations) {\n const typeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n imports.push(`import type { ${typeName} } from './${fileName}';`);\n }\n\n // Import components\n for (const component of components) {\n const typeName = toPascalCase(component);\n const fileName = toKebabCase(component);\n imports.push(`import type { ${typeName} } from '../components/${fileName}';`);\n }\n\n return imports.join('\\n');\n}\n\n/**\n * Generate type for a collection\n */\nfunction generateCollectionType(collection: CollectionType, components: ComponentType[]): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateAttributes(collection.attributes, components);\n const { relations, components: componentDeps } = extractDependencies(collection.attributes, typeName);\n const dependencyImports = generateDependencyImports(relations, componentDeps);\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = ['StrapiBaseEntity'];\n const attributesStr = JSON.stringify(collection.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\nimport type { ${utilsImports.join(', ')} } from '../utils';\n${dependencyImports ? dependencyImports + '\\n' : ''}\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n\nexport interface ${typeName}Filters {\n id?: number | { $eq?: number; $ne?: number; $in?: number[]; $notIn?: number[] };\n documentId?: string | { $eq?: string; $ne?: string };\n createdAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n updatedAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n publishedAt?: string | null | { $eq?: string; $ne?: string; $null?: boolean };\n $and?: ${typeName}Filters[];\n $or?: ${typeName}Filters[];\n $not?: ${typeName}Filters;\n}\n\nexport interface ${typeName}Sort {\n field: keyof ${typeName};\n order: 'asc' | 'desc';\n}\n`;\n}\n\n/**\n * Generate type for a single type\n */\nfunction generateSingleType(single: SingleType, components: ComponentType[]): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateAttributes(single.attributes, components);\n const { relations, components: componentDeps } = extractDependencies(single.attributes, typeName);\n const dependencyImports = generateDependencyImports(relations, componentDeps);\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = ['StrapiBaseEntity'];\n const attributesStr = JSON.stringify(single.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\nimport type { ${utilsImports.join(', ')} } from '../utils';\n${dependencyImports ? dependencyImports + '\\n' : ''}\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n`;\n}\n\n/**\n * Generate type for a component\n */\nfunction generateComponentType(component: ComponentType): string {\n const typeName = toPascalCase(component.name);\n const attributes = generateAttributes(component.attributes, []);\n const { relations, components: componentDeps } = extractDependencies(component.attributes, typeName);\n\n // For components, relations import from collections and other components import from same folder\n const imports: string[] = [];\n\n for (const relation of relations) {\n const relTypeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n imports.push(`import type { ${relTypeName} } from '../collections/${fileName}';`);\n }\n\n for (const comp of componentDeps) {\n const compTypeName = toPascalCase(comp);\n const fileName = toKebabCase(comp);\n // Don't import self\n if (compTypeName !== typeName) {\n imports.push(`import type { ${compTypeName} } from './${fileName}';`);\n }\n }\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = [];\n const attributesStr = JSON.stringify(component.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n const utilsImportLine = utilsImports.length > 0\n ? `import type { ${utilsImports.join(', ')} } from '../utils';\\n`\n : '';\n const dependencyImports = imports.length > 0 ? imports.join('\\n') + '\\n' : '';\n\n return `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n${utilsImportLine}${dependencyImports}\nexport interface ${typeName} {\n id: number;\n${attributes}\n}\n`;\n}\n\n/**\n * Generate TypeScript properties from Strapi attributes\n */\nfunction generateAttributes(\n attributes: Record<string, Attribute>,\n components: ComponentType[]\n): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const mappedType = mapAttributeToType(attr, components);\n const optional = attr.required ? '' : '?';\n const comment = getAttributeComment(attr);\n\n if (comment) {\n lines.push(` /** ${comment} */`);\n }\n lines.push(` ${name}${optional}: ${mappedType.type};`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * JSDoc type generator\n * Generates .js files with JSDoc annotations for type safety without TypeScript\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType, ComponentType, Attribute } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toKebabCase } from '../../utils/naming.js';\nimport { mapAttributeToType, getAttributeComment, extractDependencies } from '../../shared/type-mapper.js';\n\nexport interface JSDocTypesOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate JSDoc types from parsed schema\n */\nexport async function generateJSDocTypes(\n schema: ParsedSchema,\n options: JSDocTypesOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'components'));\n\n // Generate utility types\n const utilsPath = path.join(outputDir, 'utils.js');\n const strapiVersion = options.strapiVersion ?? 'v5';\n await writeFile(utilsPath, generateUtilityTypes(strapiVersion));\n generatedFiles.push(utilsPath);\n\n // Generate collection types\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.js`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateCollectionType(collection, schema.components, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.js`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateSingleType(single, schema.components, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate component types\n for (const component of schema.components) {\n const fileName = `${toKebabCase(component.name)}.js`;\n const filePath = path.join(outputDir, 'components', fileName);\n const content = generateComponentType(component, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate utility types with JSDoc\n */\nfunction generateUtilityTypes(strapiVersion: StrapiVersion): string {\n const isV4 = strapiVersion === \"v4\";\n\n const baseEntityFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`;\n\n const mediaFields = isV4\n ? ` * @property {number} id`\n : ` * @property {number} id\n * @property {string} documentId`;\n\n return `/**\n * Strapi utility types (JSDoc)\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n *\n * These types provide IntelliSense support in JavaScript projects.\n */\n\n/**\n * Strapi media format\n * @typedef {Object} StrapiMediaFormat\n * @property {string} name\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} width\n * @property {number} height\n * @property {number} size\n * @property {string} url\n */\n\n/**\n * Strapi media object\n * @typedef {Object} StrapiMedia\n${mediaFields}\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {{thumbnail?: StrapiMediaFormat, small?: StrapiMediaFormat, medium?: StrapiMediaFormat, large?: StrapiMediaFormat}|null} formats\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */\n\n/**\n * Strapi pagination\n * @typedef {Object} StrapiPagination\n * @property {number} page\n * @property {number} pageSize\n * @property {number} pageCount\n * @property {number} total\n */\n\n/**\n * Strapi response wrapper\n * @template T\n * @typedef {Object} StrapiResponse\n * @property {T} data\n * @property {{pagination?: StrapiPagination}} meta\n */\n\n/**\n * Strapi list response\n * @template T\n * @typedef {Object} StrapiListResponse\n * @property {T[]} data\n * @property {{pagination: StrapiPagination}} meta\n */\n\n/**\n * Base entity fields\n * @typedef {Object} StrapiBaseEntity\n${baseEntityFields}\n */\n\n/**\n * Blocks content type (rich text)\n * @typedef {unknown[]} BlocksContent\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a collection\n */\nfunction generateCollectionType(\n collection: CollectionType,\n components: ComponentType[],\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n const { relations, components: componentDeps } = extractDependencies(collection.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'collection');\n\n // Generate properties\n const properties = generateJSDocProperties(collection.attributes, components);\n\n // Base fields\n const baseFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`;\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${collection.displayName}\n * @typedef {Object} ${typeName}\n${baseFields}\n${properties}\n */\n\n/**\n * ${typeName} filters for querying\n * @typedef {Object} ${typeName}Filters\n * @property {number|{$eq?: number, $ne?: number, $in?: number[], $notIn?: number[]}} [id]\n * @property {string|{$eq?: string, $ne?: string}} [documentId]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [createdAt]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [updatedAt]\n * @property {string|null|{$eq?: string, $ne?: string, $null?: boolean}} [publishedAt]\n * @property {${typeName}Filters[]} [$and]\n * @property {${typeName}Filters[]} [$or]\n * @property {${typeName}Filters} [$not]\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a single type\n */\nfunction generateSingleType(\n single: SingleType,\n components: ComponentType[],\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(single.singularName);\n const isV4 = strapiVersion === \"v4\";\n const { relations, components: componentDeps } = extractDependencies(single.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'collection');\n\n // Generate properties\n const properties = generateJSDocProperties(single.attributes, components);\n\n // Base fields\n const baseFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt`;\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${single.displayName}\n * @typedef {Object} ${typeName}\n${baseFields}\n${properties}\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a component\n */\nfunction generateComponentType(component: ComponentType, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(component.name);\n const { relations, components: componentDeps } = extractDependencies(component.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'component');\n\n // Generate properties\n const properties = generateJSDocProperties(component.attributes, []);\n\n return `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${component.displayName}\n * @typedef {Object} ${typeName}\n * @property {number} id\n${properties}\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc imports\n */\nfunction generateJSDocImports(\n relations: Set<string>,\n components: Set<string>,\n context: 'collection' | 'component'\n): string {\n const imports: string[] = [];\n\n // Import from utils\n imports.push(`/** @typedef {import('../utils').StrapiMedia} StrapiMedia */`);\n imports.push(`/** @typedef {import('../utils').BlocksContent} BlocksContent */`);\n\n // Import relations\n for (const relation of relations) {\n const typeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n if (context === 'component') {\n imports.push(`/** @typedef {import('../collections/${fileName}').${typeName}} ${typeName} */`);\n } else {\n imports.push(`/** @typedef {import('./${fileName}').${typeName}} ${typeName} */`);\n }\n }\n\n // Import components\n for (const component of components) {\n const typeName = toPascalCase(component);\n const fileName = toKebabCase(component);\n if (context === 'component') {\n imports.push(`/** @typedef {import('./${fileName}').${typeName}} ${typeName} */`);\n } else {\n imports.push(`/** @typedef {import('../components/${fileName}').${typeName}} ${typeName} */`);\n }\n }\n\n return imports.join('\\n');\n}\n\n/**\n * Generate JSDoc properties from Strapi attributes\n */\nfunction generateJSDocProperties(\n attributes: Record<string, Attribute>,\n components: ComponentType[]\n): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const mappedType = mapAttributeToType(attr, components);\n const jsDocType = convertToJSDocType(mappedType.type);\n const comment = getAttributeComment(attr);\n const commentPart = comment ? ` - ${comment}` : '';\n\n // In JSDoc, [name] indicates optional. Required fields don't use brackets.\n if (attr.required) {\n lines.push(` * @property {${jsDocType}} ${name}${commentPart}`);\n } else {\n lines.push(` * @property {${jsDocType}} [${name}]${commentPart}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Convert TypeScript type to JSDoc type\n */\nfunction convertToJSDocType(tsType: string): string {\n // Handle union types with null\n if (tsType.includes(' | null')) {\n const baseType = tsType.replace(' | null', '');\n return `${baseType}|null`;\n }\n\n // Handle arrays\n if (tsType.endsWith('[]')) {\n const baseType = tsType.slice(0, -2);\n // Handle union arrays like (A | B)[]\n if (baseType.startsWith('(') && baseType.endsWith(')')) {\n return `Array<${baseType.slice(1, -1).replace(/ \\| /g, '|')}>`;\n }\n return `${baseType}[]`;\n }\n\n // Handle string literal unions (enums)\n if (tsType.includes(\"'\") && tsType.includes(' | ')) {\n return 'string';\n }\n\n return tsType;\n}\n","/**\n * Type generator\n * Supports TypeScript (.ts) and JSDoc (.js) output formats\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { OutputFormat, StrapiVersion } from '../shared/types.js';\nimport { generateTypeScriptTypes } from '../output/typescript/types.js';\nimport { generateJSDocTypes } from '../output/jsdoc/types.js';\n\nexport interface TypeGeneratorOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: OutputFormat;\n}\n\n/**\n * Generate types from parsed schema\n * Supports both TypeScript and JSDoc output formats\n */\nexport async function generateTypes(\n schema: ParsedSchema,\n options: TypeGeneratorOptions\n): Promise<string[]> {\n const outputFormat = options.outputFormat ?? 'typescript';\n\n if (outputFormat === 'jsdoc') {\n return generateJSDocTypes(schema, {\n outputDir: options.outputDir,\n blocksRendererInstalled: options.blocksRendererInstalled,\n strapiVersion: options.strapiVersion,\n });\n }\n\n // Default: TypeScript\n return generateTypeScriptTypes(schema, {\n outputDir: options.outputDir,\n blocksRendererInstalled: options.blocksRendererInstalled,\n strapiVersion: options.strapiVersion,\n });\n}\n","/**\n * JSDoc service generator\n * Generates .js files with JSDoc annotations for services\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../../utils/naming.js';\n\nexport interface JSDocServicesOptions {\n outputDir: string;\n typesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate JSDoc service files from parsed schema\n */\nexport async function generateJSDocServices(\n schema: ParsedSchema,\n options: JSDocServicesOptions\n): Promise<string[]> {\n const { outputDir, typesImportPath, strapiVersion = \"v5\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate services for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.service.js`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionService(collection, typesImportPath, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate services for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.service.js`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleService(single, typesImportPath, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate service for a collection type\n */\nfunction generateCollectionService(\n collection: CollectionType,\n typesImportPath: string,\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const fileName = toKebabCase(collection.singularName);\n const endpoint = collection.pluralName;\n const isV4 = strapiVersion === \"v4\";\n\n const idParam = isV4 ? 'id' : 'documentId';\n const idType = isV4 ? 'number' : 'string';\n\n // Feature flags\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n\n // Build locale and status options\n const localeOption = localized ? '\\n * @property {string} [locale] - Locale code' : '';\n const statusOption = draftAndPublish ? \"\\n * @property {'draft'|'published'} [status] - Publication status\" : '';\n\n const findBySlugMethod = hasSlug ? `\n/**\n * Find one ${collection.singularName} by slug\n * @param {string} slug - The slug to search for\n * @param {FindOneOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\nasync findBySlug(slug, options = {}) {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } },\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return data[0] || null;\n},\n` : '';\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { collection } from '../client.js';\n\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}} ${typeName} */\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}Filters} ${typeName}Filters */\n/** @typedef {import('${typesImportPath}/utils').StrapiPagination} StrapiPagination */\n${localized ? `/** @typedef {import('../locales').Locale} Locale */` : ''}\n\n/**\n * @typedef {Object} FindManyOptions\n * @property {${typeName}Filters} [filters] - Filter conditions\n * @property {{page?: number, pageSize?: number, start?: number, limit?: number}} [pagination] - Pagination options\n * @property {string|string[]} [sort] - Sort order\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/**\n * @typedef {Object} FindOneOptions\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/** @type {ReturnType<typeof collection<${typeName}>>} */\nconst ${toCamelCase(collection.singularName)}Collection = collection('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Find multiple ${collection.pluralName}\n * @param {FindManyOptions} [options={}] - Query options\n * @returns {Promise<{data: ${typeName}[], pagination: StrapiPagination}>}\n */\n async findMany(options = {}) {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * Find all ${collection.pluralName} (handles pagination automatically)\n * @param {Omit<FindManyOptions, 'pagination'>} [options={}] - Query options\n * @returns {Promise<${typeName}[]>}\n */\n async findAll(options = {}) {\n /** @type {${typeName}[]} */\n const allItems = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * Find one ${collection.singularName} by ${idParam}\n * @param {${idType}} ${idParam} - The ${idParam} to find\n * @param {FindOneOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\n async findOne(${idParam}, options = {}) {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idParam}, {\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${findBySlugMethod}\n /**\n * Create a new ${collection.singularName}\n * @param {Partial<${typeName}>} data - The data to create\n * @returns {Promise<${typeName}>}\n */\n async create(data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n /**\n * Update a ${collection.singularName}\n * @param {${idType}} ${idParam} - The ${idParam} to update\n * @param {Partial<${typeName}>} data - The data to update\n * @returns {Promise<${typeName}>}\n */\n async update(${idParam}, data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idParam}, { data });\n return response.data;\n },\n\n /**\n * Delete a ${collection.singularName}\n * @param {${idType}} ${idParam} - The ${idParam} to delete\n * @returns {Promise<void>}\n */\n async delete(${idParam}) {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idParam});\n },\n\n /**\n * Count ${collection.pluralName}\n * @param {${typeName}Filters} [filters] - Filter conditions\n * @returns {Promise<number>}\n */\n async count(filters) {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n`;\n}\n\n/**\n * Generate service for a single type\n */\nfunction generateSingleService(\n single: SingleType,\n typesImportPath: string,\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const fileName = toKebabCase(single.singularName);\n const endpoint = single.singularName;\n\n // Feature flags\n const { localized, draftAndPublish } = single;\n\n // Build locale and status options\n const localeOption = localized ? '\\n * @property {string} [locale] - Locale code' : '';\n const statusOption = draftAndPublish ? \"\\n * @property {'draft'|'published'} [status] - Publication status\" : '';\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { single } from '../client.js';\n\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}} ${typeName} */\n${localized ? `/** @typedef {import('../locales').Locale} Locale */` : ''}\n\n/**\n * @typedef {Object} FindOptions\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/** @type {ReturnType<typeof single<${typeName}>>} */\nconst ${toCamelCase(single.singularName)}Single = single('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Get ${single.displayName}\n * @param {FindOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\n async find(options = {}) {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * Update ${single.displayName}\n * @param {Partial<${typeName}>} data - The data to update\n * @returns {Promise<${typeName}>}\n */\n async update(data) {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n /**\n * Delete ${single.displayName}\n * @returns {Promise<void>}\n */\n async delete() {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n`;\n}\n","/**\n * Service generator\n * Supports TypeScript (.ts) and JSDoc (.js) output formats\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { OutputFormat, StrapiVersion } from '../shared/types.js';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../utils/naming.js';\nimport { generateJSDocServices } from '../output/jsdoc/services.js';\n\nexport interface ServiceGeneratorOptions {\n outputDir: string;\n typesImportPath: string;\n strapiVersion?: StrapiVersion;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: OutputFormat;\n}\n\n/**\n * Generate service files from parsed schema\n */\nexport async function generateServices(\n schema: ParsedSchema,\n options: ServiceGeneratorOptions\n): Promise<string[]> {\n const outputFormat = options.outputFormat ?? 'typescript';\n\n if (outputFormat === 'jsdoc') {\n return generateJSDocServices(schema, {\n outputDir: options.outputDir,\n typesImportPath: options.typesImportPath,\n strapiVersion: options.strapiVersion,\n });\n }\n\n // Default: TypeScript\n return generateTypeScriptServices(schema, options);\n}\n\n/**\n * Generate TypeScript service files\n */\nasync function generateTypeScriptServices(\n schema: ParsedSchema,\n options: ServiceGeneratorOptions\n): Promise<string[]> {\n const { outputDir, typesImportPath, strapiVersion = \"v5\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate services for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.service.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionService(collection, typesImportPath, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate services for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.service.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleService(single, typesImportPath, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate service for a collection type\n */\nfunction generateCollectionService(collection: CollectionType, typesImportPath: string, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const fileName = toKebabCase(collection.singularName);\n const endpoint = collection.pluralName;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id: number' : 'documentId: string';\n const idName = isV4 ? 'id' : 'documentId';\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt' | 'publishedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt' | 'publishedAt'\";\n\n // Feature flags\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n\n // Build imports\n const imports: string[] = [\n `import { collection } from '../client';`,\n `import type { ${typeName}, ${typeName}Filters } from '${typesImportPath}/collections/${fileName}';`,\n `import type { StrapiPagination } from '${typesImportPath}/utils';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../locales';`);\n }\n\n // Build FindManyOptions interface\n const findManyOptionsFields: string[] = [\n ` filters?: ${typeName}Filters;`,\n ` pagination?: {`,\n ` /** Page number (1-indexed) - use with pageSize */`,\n ` page?: number;`,\n ` /** Number of items per page (default: 25) - use with page */`,\n ` pageSize?: number;`,\n ` /** Offset to start from (0-indexed) - use with limit */`,\n ` start?: number;`,\n ` /** Maximum number of items to return - use with start */`,\n ` limit?: number;`,\n ` };`,\n ` sort?: string | string[];`,\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findManyOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findManyOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build FindOneOptions interface\n const findOneOptionsFields: string[] = [\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findOneOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findOneOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build find params\n const findParams: string[] = [\n ` filters: options.filters,`,\n ` pagination: options.pagination,`,\n ` sort: options.sort,`,\n ` populate: options.populate,`,\n ];\n if (localized) {\n findParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findParams.push(` status: options.status,`);\n }\n\n // Build findOne params\n const findOneParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findOneParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findOneParams.push(` status: options.status,`);\n }\n\n // Build findBySlug params\n const findBySlugParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findBySlugParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findBySlugParams.push(` status: options.status,`);\n }\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindManyOptions {\n${findManyOptionsFields.join('\\n')}\n}\n\nexport interface FindOneOptions {\n${findOneOptionsFields.join('\\n')}\n}\n\n// Create typed collection helper\nconst ${toCamelCase(collection.singularName)}Collection = collection<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Find multiple ${collection.pluralName}\n */\n async findMany(options: FindManyOptions = {}): Promise<{ data: ${typeName}[]; pagination: StrapiPagination }> {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n${findParams.join('\\n')}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * Find all ${collection.pluralName} (handles pagination automatically)\n */\n async findAll(options: Omit<FindManyOptions, 'pagination'> = {}): Promise<${typeName}[]> {\n const allItems: ${typeName}[] = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * Find one ${collection.singularName} by ${idName}\n */\n async findOne(${idParam}, options: FindOneOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idName}, {\n${findOneParams.join('\\n')}\n });\n\n return response.data;\n } catch (error) {\n // Return null if not found\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n /**\n * Find one ${collection.singularName} by slug\n */\n async findBySlug(slug: string, options: FindOneOptions = {}): Promise<${typeName} | null> {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } } as ${typeName}Filters,\n pagination: { pageSize: 1 },\n${findBySlugParams.join('\\n')}\n });\n\n return data[0] || null;\n },\n` : ''}\n /**\n * Create a new ${collection.singularName}\n */\n async create(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n /**\n * Update a ${collection.singularName}\n */\n async update(${idParam}, data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idName}, { data });\n return response.data;\n },\n\n /**\n * Delete a ${collection.singularName}\n */\n async delete(${idParam}): Promise<void> {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idName});\n },\n\n /**\n * Count ${collection.pluralName}\n */\n async count(filters?: ${typeName}Filters): Promise<number> {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n`;\n}\n\n/**\n * Generate service for a single type\n */\nfunction generateSingleService(single: SingleType, typesImportPath: string, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const fileName = toKebabCase(single.singularName);\n const endpoint = single.singularName;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 doesn't have documentId\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Feature flags\n const { localized, draftAndPublish } = single;\n\n // Build imports\n const imports: string[] = [\n `import { single } from '../client';`,\n `import type { ${typeName} } from '${typesImportPath}/collections/${fileName}';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../locales';`);\n }\n\n // Build FindOptions interface\n const findOptionsFields: string[] = [\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build find params\n const findParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findParams.push(` status: options.status,`);\n }\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindOptions {\n${findOptionsFields.join('\\n')}\n}\n\n// Create typed single helper\nconst ${toCamelCase(single.singularName)}Single = single<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Get ${single.displayName}\n */\n async find(options: FindOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n${findParams.join('\\n')}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * Update ${single.displayName}\n */\n async update(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n /**\n * Delete ${single.displayName}\n */\n async delete(): Promise<void> {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n`;\n}\n","/**\n * Astro Actions generator\n * Generates type-safe Astro Actions for Strapi content types\n *\n * Requirements:\n * - Astro v4.0+ (Actions are only available in v4+)\n * - TypeScript enabled\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { formatCode } from '../../utils/formatter.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toCamelCase, toKebabCase } from '../../utils/naming.js';\n\nexport interface AstroActionsOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Check if Astro Actions are supported\n * Requires Astro v4.0 or higher\n */\nexport function isAstroActionsSupported(astroVersion: string | null): boolean {\n if (!astroVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = astroVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 4;\n}\n\n/**\n * Generate Astro Actions from parsed schema\n */\nexport async function generateAstroActions(\n schema: ParsedSchema,\n options: AstroActionsOptions\n): Promise<string[]> {\n const { outputDir, servicesImportPath, strapiVersion = \"v5\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate actions for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionActions(collection, servicesImportPath, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate actions for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleActions(single, servicesImportPath);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate actions for a collection type\n */\nfunction generateCollectionActions(\n collection: CollectionType,\n servicesImportPath: string,\n strapiVersion: StrapiVersion\n): string {\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const actionsName = toCamelCase(collection.singularName);\n const fileName = toKebabCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idInputSchema = isV4 ? 'z.number().int().positive()' : 'z.string().min(1)';\n const idParamName = isV4 ? 'id' : 'documentId';\n const idComment = isV4 ? 'id' : 'documentId';\n\n // Detect if collection has a slug field\n const hasSlug = 'slug' in collection.attributes;\n\n return `/**\n * ${collection.displayName} Actions\n * ${collection.description || ''}\n * Generated by strapi2front\n * Framework: Astro\n * Strapi version: ${strapiVersion}\n */\n\nimport { defineAction, ActionError } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from '${servicesImportPath}/${fileName}.service';\n\n/**\n * Pagination input schema\n */\nconst paginationSchema = z.object({\n page: z.number().int().positive().optional().default(1),\n pageSize: z.number().int().positive().max(100).optional().default(25),\n}).optional();\n\n/**\n * ${collection.displayName} actions\n */\nexport const ${actionsName} = {\n /**\n * Get all ${collection.pluralName} with pagination\n */\n getAll: defineAction({\n input: z.object({\n pagination: paginationSchema,\n sort: z.union([z.string(), z.array(z.string())]).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const result = await ${serviceName}.findMany({\n pagination: input?.pagination,\n sort: input?.sort,\n });\n\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.pluralName}',\n });\n }\n },\n }),\n\n /**\n * Get a single ${collection.singularName} by ${idComment}\n */\n getOne: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }),\n handler: async ({ ${idParamName}, populate }) => {\n try {\n const result = await ${serviceName}.findOne(${idParamName}, { populate });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${collection.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.singularName}',\n });\n }\n },\n }),\n${hasSlug ? `\n /**\n * Get a single ${collection.singularName} by slug\n */\n getBySlug: defineAction({\n input: z.object({\n slug: z.string().min(1),\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }),\n handler: async ({ slug, populate }) => {\n try {\n const result = await ${serviceName}.findBySlug(slug, { populate });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${collection.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.singularName}',\n });\n }\n },\n }),\n` : ''}\n /**\n * Create a new ${collection.singularName}\n */\n create: defineAction({\n input: z.object({\n data: z.record(z.unknown()),\n }),\n handler: async ({ data }) => {\n try {\n const result = await ${serviceName}.create(data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to create ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Update a ${collection.singularName}\n */\n update: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n data: z.record(z.unknown()),\n }),\n handler: async ({ ${idParamName}, data }) => {\n try {\n const result = await ${serviceName}.update(${idParamName}, data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to update ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Delete a ${collection.singularName}\n */\n delete: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async ({ ${idParamName} }) => {\n try {\n await ${serviceName}.delete(${idParamName});\n return { success: true };\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to delete ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Count ${collection.pluralName}\n */\n count: defineAction({\n input: z.object({\n filters: z.record(z.unknown()).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const count = await ${serviceName}.count(input?.filters as any);\n return { count };\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to count ${collection.pluralName}',\n });\n }\n },\n }),\n};\n`;\n}\n\n/**\n * Generate actions for a single type\n */\nfunction generateSingleActions(\n single: SingleType,\n servicesImportPath: string\n): string {\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const actionsName = toCamelCase(single.singularName);\n const fileName = toKebabCase(single.singularName);\n\n return `/**\n * ${single.displayName} Actions (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Framework: Astro\n */\n\nimport { defineAction, ActionError } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from '${servicesImportPath}/${fileName}.service';\n\n/**\n * ${single.displayName} actions\n */\nexport const ${actionsName} = {\n /**\n * Get ${single.displayName}\n */\n get: defineAction({\n input: z.object({\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const result = await ${serviceName}.find({\n populate: input?.populate,\n });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${single.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${single.singularName}',\n });\n }\n },\n }),\n\n /**\n * Update ${single.displayName}\n */\n update: defineAction({\n input: z.object({\n data: z.record(z.unknown()),\n }),\n handler: async ({ data }) => {\n try {\n const result = await ${serviceName}.update(data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to update ${single.singularName}',\n });\n }\n },\n }),\n};\n`;\n}\n","/**\n * Actions generator\n * Re-exports from frameworks/astro for backwards compatibility\n *\n * For framework-specific generators, import directly from:\n * - '@strapi2front/generators/frameworks/astro'\n * - '@strapi2front/generators/frameworks/nextjs' (coming soon)\n * - '@strapi2front/generators/frameworks/nuxt' (coming soon)\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../shared/types.js';\nimport { generateAstroActions } from '../frameworks/astro/actions.js';\n\nexport interface ActionsGeneratorOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Astro Actions from parsed schema\n * @deprecated Use generateAstroActions from '@strapi2front/generators/frameworks/astro' instead\n */\nexport async function generateActions(\n schema: ParsedSchema,\n options: ActionsGeneratorOptions\n): Promise<string[]> {\n return generateAstroActions(schema, {\n outputDir: options.outputDir,\n servicesImportPath: options.servicesImportPath,\n strapiVersion: options.strapiVersion,\n });\n}\n","import path from 'node:path';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\n\nexport interface ClientGeneratorOptions {\n outputDir: string;\n strapiVersion?: \"v4\" | \"v5\";\n apiPrefix?: string;\n}\n\n/**\n * Generate the Strapi client file\n */\nexport async function generateClient(\n options: ClientGeneratorOptions\n): Promise<string[]> {\n const { outputDir, strapiVersion = \"v5\", apiPrefix = \"/api\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n const filePath = path.join(outputDir, 'client.ts');\n const content = generateClientFile(strapiVersion, apiPrefix);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n\n return generatedFiles;\n}\n\n/**\n * Generate the client file content\n */\nfunction generateClientFile(strapiVersion: \"v4\" | \"v5\", apiPrefix: string): string {\n const isV4 = strapiVersion === \"v4\";\n\n if (isV4) {\n return generateV4ClientFile(apiPrefix);\n }\n return generateV5ClientFile(apiPrefix);\n}\n\n/**\n * Generate client for Strapi v5 (flat response structure)\n */\nfunction generateV5ClientFile(apiPrefix: string): string {\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n return `/**\n * Strapi Client (v5)\n * Generated by strapi2front\n */\n\nimport Strapi from 'strapi-sdk-js';\n\n// Initialize the Strapi client\nconst strapiUrl = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = import.meta.env.STRAPI_API_PREFIX || process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nexport const strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n// Pagination type\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Response types\ninterface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\ninterface StrapiSingleResponse<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\n// Helper to get typed collection\nexport function collection<T>(pluralName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await strapi.find(pluralName, params) as unknown as StrapiListResponse<T>;\n return {\n data: Array.isArray(response.data) ? response.data : [],\n meta: {\n pagination: response.meta?.pagination || defaultPagination,\n },\n };\n },\n async findOne(documentId: string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.findOne(pluralName, documentId, params) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async create(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.create(pluralName, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async update(documentId: string, data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(pluralName, documentId, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async delete(documentId: string): Promise<void> {\n await strapi.delete(pluralName, documentId);\n },\n };\n}\n\n// Helper to get typed single type\nexport function single<T>(singularName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.find(singularName, params) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async update(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(singularName, 1 as unknown as string, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async delete(): Promise<void> {\n await strapi.delete(singularName, 1 as unknown as string);\n },\n };\n}\n`;\n}\n\n/**\n * Generate client for Strapi v4 (nested attributes structure)\n */\nfunction generateV4ClientFile(apiPrefix: string): string {\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n return `/**\n * Strapi Client (v4)\n * Generated by strapi2front\n */\n\nimport Strapi from 'strapi-sdk-js';\n\n// Initialize the Strapi client\nconst strapiUrl = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = import.meta.env.STRAPI_API_PREFIX || process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nexport const strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n// Pagination type\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Strapi v4 raw response types (with nested attributes)\ninterface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\ninterface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\ninterface StrapiV4RawSingleResponse<T> {\n data: StrapiV4RawItem<T>;\n meta?: Record<string, unknown>;\n}\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n */\nfunction flattenItem<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n */\nfunction flattenRelations<T>(data: T): T {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n return data.map(item => flattenRelations(item)) as unknown as T;\n }\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n // Check if this is a Strapi v4 relation response { data: { id, attributes } }\n if (value && typeof value === 'object' && 'data' in value) {\n const relationData = (value as { data: unknown }).data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n // To-many relation\n result[key] = relationData.map((item: StrapiV4RawItem<unknown>) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && 'id' in relationData && 'attributes' in relationData) {\n // To-one relation\n result[key] = flattenRelations(flattenItem(relationData as StrapiV4RawItem<unknown>));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n return result as T;\n }\n return data;\n}\n\n// Helper to get typed collection\nexport function collection<T>(pluralName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await strapi.find(pluralName, params) as unknown as StrapiV4RawListResponse<T>;\n const flattenedData = Array.isArray(response.data)\n ? response.data.map(item => flattenRelations(flattenItem<T>(item)))\n : [];\n return {\n data: flattenedData,\n meta: {\n pagination: response.meta?.pagination || defaultPagination,\n },\n };\n },\n async findOne(id: number | string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.findOne(pluralName, String(id), params) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async create(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.create(pluralName, data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(id: number | string, data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(pluralName, String(id), data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(id: number | string): Promise<void> {\n await strapi.delete(pluralName, String(id));\n },\n };\n}\n\n// Helper to get typed single type\nexport function single<T>(singularName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.find(singularName, params) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(singularName, 1 as unknown as string, data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(): Promise<void> {\n await strapi.delete(singularName, 1 as unknown as string);\n },\n };\n}\n`;\n}\n","import path from 'node:path';\nimport type { StrapiLocale } from '@strapi2front/core';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\n\nexport interface LocalesGeneratorOptions {\n outputDir: string;\n}\n\n/**\n * Generate locales file from Strapi i18n configuration\n */\nexport async function generateLocales(\n locales: StrapiLocale[],\n options: LocalesGeneratorOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n const filePath = path.join(outputDir, 'locales.ts');\n const content = generateLocalesFile(locales);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n\n return generatedFiles;\n}\n\n/**\n * Generate the locales file content\n */\nfunction generateLocalesFile(locales: StrapiLocale[]): string {\n if (locales.length === 0) {\n return `/**\n * Strapi Locales\n * Generated by strapi2front\n *\n * Note: No locales found. i18n might not be enabled in Strapi.\n */\n\nexport const locales = [] as const;\n\nexport type Locale = string;\n\nexport const defaultLocale: Locale = 'en';\n\nexport const localeNames: Record<string, string> = {};\n`;\n }\n\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n const localeCodes = locales.map(l => `'${l.code}'`).join(' | ');\n const localeArray = locales.map(l => `'${l.code}'`).join(', ');\n const localeNames = locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n');\n\n return `/**\n * Strapi Locales\n * Generated by strapi2front\n */\n\n/**\n * Available locale codes\n */\nexport const locales = [${localeArray}] as const;\n\n/**\n * Locale type - union of all available locales\n */\nexport type Locale = ${localeCodes};\n\n/**\n * Default locale\n */\nexport const defaultLocale: Locale = '${defaultLocale}';\n\n/**\n * Locale display names\n */\nexport const localeNames: Record<Locale, string> = {\n${localeNames}\n};\n\n/**\n * Check if a string is a valid locale\n */\nexport function isValidLocale(code: string): code is Locale {\n return locales.includes(code as Locale);\n}\n\n/**\n * Get locale name by code\n */\nexport function getLocaleName(code: Locale): string {\n return localeNames[code] || code;\n}\n`;\n}\n","import path from 'node:path';\nimport type {\n ParsedSchema,\n CollectionType,\n SingleType,\n ComponentType,\n Attribute,\n StrapiLocale,\n} from '@strapi2front/core';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../utils/naming.js';\n\nexport interface ByFeatureGeneratorOptions {\n outputDir: string;\n features: {\n types: boolean;\n services: boolean;\n actions: boolean;\n };\n blocksRendererInstalled?: boolean;\n strapiVersion?: \"v4\" | \"v5\";\n apiPrefix?: string;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: \"typescript\" | \"jsdoc\";\n /**\n * Module type for JSDoc output: 'esm' for ES Modules, 'commonjs' for CommonJS\n * @default 'commonjs'\n */\n moduleType?: \"esm\" | \"commonjs\";\n}\n\n/**\n * Generate all files using 'by-feature' structure\n *\n * Output structure:\n * strapi/\n * collections/\n * article/\n * types.ts\n * service.ts\n * actions.ts\n * singles/\n * homepage/\n * types.ts\n * service.ts\n * components/\n * seo.ts\n * shared/\n * utils.ts\n * client.ts\n * locales.ts\n */\nexport async function generateByFeature(\n schema: ParsedSchema,\n locales: StrapiLocale[],\n options: ByFeatureGeneratorOptions\n): Promise<string[]> {\n const {\n outputDir,\n features,\n blocksRendererInstalled = false,\n strapiVersion = \"v5\",\n apiPrefix = \"/api\",\n outputFormat = \"typescript\",\n moduleType = \"commonjs\"\n } = options;\n const generatedFiles: string[] = [];\n\n // Determine export/import style for JSDoc\n const useESM = outputFormat === \"jsdoc\" && moduleType === \"esm\";\n\n // File extension based on output format\n const ext = outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'singles'));\n await ensureDir(path.join(outputDir, 'components'));\n await ensureDir(path.join(outputDir, 'shared'));\n\n // Generate shared files\n const sharedDir = path.join(outputDir, 'shared');\n\n // Utils\n const utilsPath = path.join(sharedDir, `utils.${ext}`);\n const utilsContent = outputFormat === \"jsdoc\"\n ? generateUtilityTypesJSDoc(blocksRendererInstalled, strapiVersion, useESM)\n : generateUtilityTypes(blocksRendererInstalled, strapiVersion);\n await writeFile(utilsPath, await formatCode(utilsContent));\n generatedFiles.push(utilsPath);\n\n // Client\n const clientPath = path.join(sharedDir, `client.${ext}`);\n const clientContent = outputFormat === \"jsdoc\"\n ? generateClientJSDoc(strapiVersion, apiPrefix, useESM)\n : generateClient(strapiVersion, apiPrefix);\n await writeFile(clientPath, await formatCode(clientContent));\n generatedFiles.push(clientPath);\n\n // Locales\n const localesPath = path.join(sharedDir, `locales.${ext}`);\n const localesContent = outputFormat === \"jsdoc\"\n ? generateLocalesFileJSDoc(locales, useESM)\n : generateLocalesFile(locales);\n await writeFile(localesPath, await formatCode(localesContent));\n generatedFiles.push(localesPath);\n\n // Generate collection files\n for (const collection of schema.collections) {\n const featureDir = path.join(outputDir, 'collections', toKebabCase(collection.singularName));\n await ensureDir(featureDir);\n\n if (features.types) {\n const typesPath = path.join(featureDir, `types.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateCollectionTypesJSDoc(collection, schema, useESM)\n : generateCollectionTypes(collection, schema);\n await writeFile(typesPath, await formatCode(content));\n generatedFiles.push(typesPath);\n }\n\n if (features.services) {\n const servicePath = path.join(featureDir, `service.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateCollectionServiceJSDoc(collection, strapiVersion, useESM)\n : generateCollectionService(collection, strapiVersion);\n await writeFile(servicePath, await formatCode(content));\n generatedFiles.push(servicePath);\n }\n\n if (features.actions) {\n const actionsPath = path.join(featureDir, `actions.${ext}`);\n await writeFile(actionsPath, await formatCode(generateCollectionActions(collection, strapiVersion)));\n generatedFiles.push(actionsPath);\n }\n }\n\n // Generate single type files\n for (const single of schema.singles) {\n const featureDir = path.join(outputDir, 'singles', toKebabCase(single.singularName));\n await ensureDir(featureDir);\n\n if (features.types) {\n const typesPath = path.join(featureDir, `types.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateSingleTypesJSDoc(single, schema, useESM)\n : generateSingleTypes(single, schema);\n await writeFile(typesPath, await formatCode(content));\n generatedFiles.push(typesPath);\n }\n\n if (features.services) {\n const servicePath = path.join(featureDir, `service.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateSingleServiceJSDoc(single, strapiVersion, useESM)\n : generateSingleService(single, strapiVersion);\n await writeFile(servicePath, await formatCode(content));\n generatedFiles.push(servicePath);\n }\n }\n\n // Generate component files\n for (const component of schema.components) {\n const componentPath = path.join(outputDir, 'components', `${toKebabCase(component.name)}.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateComponentTypesJSDoc(component, schema, useESM)\n : generateComponentTypes(component, schema);\n await writeFile(componentPath, await formatCode(content));\n generatedFiles.push(componentPath);\n }\n\n return generatedFiles;\n}\n\n// ============================================\n// Shared Files Generation\n// ============================================\n\nfunction generateUtilityTypes(blocksRendererInstalled: boolean, strapiVersion: \"v4\" | \"v5\"): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n */\nexport type RichTextContent = string;`\n : blocksRendererInstalled\n ? `/**\n * Blocks content type (Strapi v5 rich text)\n * Re-exported from @strapi/blocks-react-renderer\n */\nexport type { BlocksContent } from '@strapi/blocks-react-renderer';`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n */\nexport type BlocksContent = unknown[];`;\n\n const baseEntity = isV4\n ? `export interface StrapiBaseEntity {\n id: number;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`\n : `export interface StrapiBaseEntity {\n id: number;\n documentId: string;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`;\n\n const mediaType = isV4\n ? `export interface StrapiMedia {\n id: number;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`\n : `export interface StrapiMedia {\n id: number;\n documentId: string;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`;\n\n const v4RawResponseTypes = isV4 ? `\n\n/**\n * Strapi v4 raw API response (with nested attributes)\n */\nexport interface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\nexport interface StrapiV4RawResponse<T> {\n data: StrapiV4RawItem<T>;\n meta: Record<string, unknown>;\n}\n\nexport interface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n/**\n * Flatten Strapi v4 response item\n */\nexport function flattenV4Response<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Flatten Strapi v4 list response\n */\nexport function flattenV4ListResponse<T>(items: StrapiV4RawItem<T>[]): T[] {\n return items.map(item => flattenV4Response<T>(item));\n}` : '';\n\n return `/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface StrapiResponse<T> {\n data: T;\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\nexport interface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n${baseEntity}\n${v4RawResponseTypes}\n${blocksContentType}\n`;\n}\n\nfunction generateClient(strapiVersion: \"v4\" | \"v5\", apiPrefix: string = \"/api\"): string {\n const isV4 = strapiVersion === \"v4\";\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n if (isV4) {\n return `/**\n * Strapi Client (v4)\n * Generated by strapi2front\n */\n\nimport Strapi from 'strapi-sdk-js';\nimport type { StrapiPagination } from './utils';\n\n// Initialize the Strapi client\nconst strapiUrl = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = import.meta.env.STRAPI_API_PREFIX || process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nexport const strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Strapi v4 raw response types (with nested attributes)\ninterface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\ninterface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\ninterface StrapiV4RawSingleResponse<T> {\n data: StrapiV4RawItem<T>;\n meta?: Record<string, unknown>;\n}\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n */\nfunction flattenItem<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n */\nfunction flattenRelations<T>(data: T): T {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n return data.map(item => flattenRelations(item)) as unknown as T;\n }\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n // Check if this is a Strapi v4 relation response { data: { id, attributes } }\n if (value && typeof value === 'object' && 'data' in value) {\n const relationData = (value as { data: unknown }).data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n // To-many relation\n result[key] = relationData.map((item: StrapiV4RawItem<unknown>) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && 'id' in relationData && 'attributes' in relationData) {\n // To-one relation\n result[key] = flattenRelations(flattenItem(relationData as StrapiV4RawItem<unknown>));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n return result as T;\n }\n return data;\n}\n\n// Helper to get typed collection\nexport function collection<T>(pluralName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await strapi.find(pluralName, params) as unknown as StrapiV4RawListResponse<T>;\n const flattenedData = Array.isArray(response.data)\n ? response.data.map(item => flattenRelations(flattenItem<T>(item)))\n : [];\n return {\n data: flattenedData,\n meta: {\n pagination: response.meta?.pagination || defaultPagination,\n },\n };\n },\n async findOne(id: number | string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.findOne(pluralName, String(id), params) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async create(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.create(pluralName, data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(id: number | string, data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(pluralName, String(id), data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(id: number | string): Promise<void> {\n await strapi.delete(pluralName, String(id));\n },\n };\n}\n\n// Helper to get typed single type\nexport function single<T>(singularName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.find(singularName, params) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(singularName, 1 as unknown as string, data.data as Record<string, unknown>) as unknown as StrapiV4RawSingleResponse<T>;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(): Promise<void> {\n await strapi.delete(singularName, 1 as unknown as string);\n },\n };\n}\n`;\n }\n\n return `/**\n * Strapi Client (v5)\n * Generated by strapi2front\n */\n\nimport Strapi from 'strapi-sdk-js';\nimport type { StrapiPagination } from './utils';\n\n// Initialize the Strapi client\nconst strapiUrl = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = import.meta.env.STRAPI_API_PREFIX || process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nexport const strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Response types from strapi-sdk-js\ninterface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\ninterface StrapiSingleResponse<T> {\n data: T;\n meta?: Record<string, unknown>;\n}\n\n// Helper to get typed collection\nexport function collection<T>(pluralName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await strapi.find(pluralName, params) as unknown as StrapiListResponse<T>;\n return {\n data: Array.isArray(response.data) ? response.data : [],\n meta: {\n pagination: response.meta?.pagination || defaultPagination,\n },\n };\n },\n async findOne(documentId: string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.findOne(pluralName, documentId, params) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async create(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.create(pluralName, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async update(documentId: string, data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(pluralName, documentId, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async delete(documentId: string): Promise<void> {\n await strapi.delete(pluralName, documentId);\n },\n };\n}\n\n// Helper to get typed single type\nexport function single<T>(singularName: string) {\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await strapi.find(singularName, params) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async update(data: { data: Partial<T> }): Promise<{ data: T }> {\n const response = await strapi.update(singularName, 1 as unknown as string, data.data as Record<string, unknown>) as unknown as StrapiSingleResponse<T>;\n return { data: response.data };\n },\n async delete(): Promise<void> {\n await strapi.delete(singularName, 1 as unknown as string);\n },\n };\n}\n`;\n}\n\nfunction generateLocalesFile(locales: StrapiLocale[]): string {\n if (locales.length === 0) {\n return `/**\n * Strapi locales\n * Generated by strapi2front\n * Note: i18n is not enabled in Strapi\n */\n\nexport const locales = [] as const;\nexport type Locale = string;\nexport const defaultLocale: Locale = 'en';\nexport const localeNames: Record<string, string> = {};\n\nexport function isValidLocale(_code: string): _code is Locale {\n return true;\n}\n\nexport function getLocaleName(code: string): string {\n return code;\n}\n`;\n }\n\n const localeCodes = locales.map(l => l.code);\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n\n return `/**\n * Strapi locales\n * Generated by strapi2front\n */\n\nexport const locales = [${localeCodes.map(c => `'${c}'`).join(', ')}] as const;\n\nexport type Locale = typeof locales[number];\n\nexport const defaultLocale: Locale = '${defaultLocale}';\n\nexport const localeNames: Record<Locale, string> = {\n${locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n')}\n};\n\nexport function isValidLocale(code: string): code is Locale {\n return locales.includes(code as Locale);\n}\n\nexport function getLocaleName(code: Locale): string {\n return localeNames[code] || code;\n}\n`;\n}\n\n// ============================================\n// Collection Types Generation\n// ============================================\n\nfunction generateCollectionTypes(collection: CollectionType, schema: ParsedSchema): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateAttributes(collection.attributes);\n const imports = generateTypeImports(collection.attributes, schema, 'collection');\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n\nexport interface ${typeName}Filters {\n id?: number | { $eq?: number; $ne?: number; $in?: number[]; $notIn?: number[] };\n documentId?: string | { $eq?: string; $ne?: string };\n createdAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n updatedAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n publishedAt?: string | null | { $eq?: string; $ne?: string; $null?: boolean };\n $and?: ${typeName}Filters[];\n $or?: ${typeName}Filters[];\n $not?: ${typeName}Filters;\n}\n`;\n}\n\nfunction generateSingleTypes(single: SingleType, schema: ParsedSchema): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateAttributes(single.attributes);\n const imports = generateTypeImports(single.attributes, schema, 'single');\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n`;\n}\n\nfunction generateComponentTypes(component: ComponentType, schema: ParsedSchema): string {\n const typeName = toPascalCase(component.name);\n const attributes = generateAttributes(component.attributes);\n const imports = generateTypeImports(component.attributes, schema, 'component');\n\n return `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} {\n id: number;\n${attributes}\n}\n`;\n}\n\nfunction generateTypeImports(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema,\n context: 'collection' | 'single' | 'component'\n): string {\n const utilsImports: string[] = [];\n const relationImports: Map<string, string> = new Map();\n const componentImports: Map<string, string> = new Map();\n\n // Check what utils we need\n const attributesStr = JSON.stringify(attributes);\n if (context !== 'component') {\n utilsImports.push('StrapiBaseEntity');\n }\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n // Extract relations and components\n // Components are in strapi/components/, collections/singles are in strapi/collections/xxx/ or strapi/singles/xxx/\n // From component: ../collections/xxx/types (one level up)\n // From collection/single: ../../collections/xxx/types (two levels up, since they're in a subfolder)\n const relativePrefix = context === 'component' ? '..' : '../..';\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'relation' && 'target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || '';\n if (targetName) {\n const typeName = toPascalCase(targetName);\n const fileName = toKebabCase(targetName);\n // Check if it's a collection or single\n const isCollection = schema.collections.some(c => c.singularName === targetName);\n const isSingle = schema.singles.some(s => s.singularName === targetName);\n if (isCollection) {\n relationImports.set(typeName, `${relativePrefix}/collections/${fileName}/types`);\n } else if (isSingle) {\n relationImports.set(typeName, `${relativePrefix}/singles/${fileName}/types`);\n }\n }\n }\n\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || '';\n if (componentName) {\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n if (context === 'component') {\n componentImports.set(typeName, `./${fileName}`);\n } else {\n componentImports.set(typeName, `../../components/${fileName}`);\n }\n }\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const comp of attr.components) {\n const componentName = comp.split('.').pop() || '';\n if (componentName) {\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n if (context === 'component') {\n componentImports.set(typeName, `./${fileName}`);\n } else {\n componentImports.set(typeName, `../../components/${fileName}`);\n }\n }\n }\n }\n }\n\n const lines: string[] = [];\n\n // Utils import\n if (utilsImports.length > 0) {\n const utilsPath = context === 'component' ? '../shared/utils' : '../../shared/utils';\n lines.push(`import type { ${utilsImports.join(', ')} } from '${utilsPath}';`);\n }\n\n // Relation imports\n for (const [typeName, importPath] of relationImports) {\n lines.push(`import type { ${typeName} } from '${importPath}';`);\n }\n\n // Component imports\n for (const [typeName, importPath] of componentImports) {\n lines.push(`import type { ${typeName} } from '${importPath}';`);\n }\n\n return lines.join('\\n');\n}\n\nfunction generateAttributes(attributes: Record<string, Attribute>): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const tsType = attributeToTsType(attr);\n const optional = attr.required ? '' : '?';\n lines.push(` ${name}${optional}: ${tsType};`);\n }\n\n return lines.join('\\n');\n}\n\nfunction attributeToTsType(attr: Attribute): string {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return 'string';\n case 'blocks':\n return 'BlocksContent';\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return 'string';\n case 'json':\n return 'unknown';\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return attr.enum.map(v => `'${v}'`).join(' | ');\n }\n return 'string';\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return 'StrapiMedia[]';\n }\n return 'StrapiMedia | null';\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = toPascalCase(attr.target.split('.').pop() || 'unknown');\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n return isMany ? `${targetName}[]` : `${targetName} | null`;\n }\n return 'unknown';\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = toPascalCase(attr.component.split('.').pop() || 'unknown');\n if ('repeatable' in attr && attr.repeatable) {\n return `${componentName}[]`;\n }\n return `${componentName} | null`;\n }\n return 'unknown';\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map(c => toPascalCase(c.split('.').pop() || 'unknown'));\n return `(${types.join(' | ')})[]`;\n }\n return 'unknown[]';\n default:\n return 'unknown';\n }\n}\n\n// ============================================\n// Collection Service Generation\n// ============================================\n\nfunction generateCollectionService(collection: CollectionType, strapiVersion: \"v4\" | \"v5\"): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const endpoint = collection.pluralName;\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id: number' : 'documentId: string';\n const idName = isV4 ? 'id' : 'documentId';\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt' | 'publishedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt' | 'publishedAt'\";\n const omitFieldsUpdate = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Build imports\n const imports = [\n `import { collection } from '../../shared/client';`,\n `import type { ${typeName}, ${typeName}Filters } from './types';`,\n `import type { StrapiPagination } from '../../shared/utils';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../../shared/locales';`);\n }\n\n // Build options interfaces\n const paginationFields = `\n /** Page number (1-indexed) - use with pageSize */\n page?: number;\n /** Number of items per page (default: 25) - use with page */\n pageSize?: number;\n /** Offset to start from (0-indexed) - use with limit */\n start?: number;\n /** Maximum number of items to return - use with start */\n limit?: number;`;\n\n let findManyOptionsFields = ` filters?: ${typeName}Filters;\n pagination?: {${paginationFields}\n };\n sort?: string | string[];\n populate?: string | string[] | Record<string, unknown>;`;\n\n let findOneOptionsFields = ` populate?: string | string[] | Record<string, unknown>;`;\n\n if (localized) {\n findManyOptionsFields += `\\n locale?: Locale;`;\n findOneOptionsFields += `\\n locale?: Locale;`;\n }\n if (draftAndPublish) {\n findManyOptionsFields += `\\n status?: 'draft' | 'published';`;\n findOneOptionsFields += `\\n status?: 'draft' | 'published';`;\n }\n\n // Build find params\n let findParams = ` filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,`;\n let findOneParams = ` populate: options.populate,`;\n\n if (localized) {\n findParams += `\\n locale: options.locale,`;\n findOneParams += `\\n locale: options.locale,`;\n }\n if (draftAndPublish) {\n findParams += `\\n status: options.status,`;\n findOneParams += `\\n status: options.status,`;\n }\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindManyOptions {\n${findManyOptionsFields}\n}\n\nexport interface FindOneOptions {\n${findOneOptionsFields}\n}\n\n// Create typed collection helper\nconst ${toCamelCase(collection.singularName)}Collection = collection<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n async findMany(options: FindManyOptions = {}): Promise<{ data: ${typeName}[]; pagination: StrapiPagination }> {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n${findParams}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n async findAll(options: Omit<FindManyOptions, 'pagination'> = {}): Promise<${typeName}[]> {\n const allItems: ${typeName}[] = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n async findOne(${idParam}, options: FindOneOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idName}, {\n${findOneParams}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n async findBySlug(slug: string, options: FindOneOptions = {}): Promise<${typeName} | null> {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } } as ${typeName}Filters,\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return data[0] || null;\n },\n` : ''}\n async create(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n async update(${idParam}, data: Partial<Omit<${typeName}, ${omitFieldsUpdate}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idName}, { data });\n return response.data;\n },\n\n async delete(${idParam}): Promise<void> {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idName});\n },\n\n async count(filters?: ${typeName}Filters): Promise<number> {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n`;\n}\n\n// ============================================\n// Single Service Generation\n// ============================================\n\nfunction generateSingleService(single: SingleType, strapiVersion: \"v4\" | \"v5\"): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const endpoint = single.singularName;\n const { localized, draftAndPublish } = single;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 doesn't have documentId\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Build imports\n const imports = [\n `import { single } from '../../shared/client';`,\n `import type { ${typeName} } from './types';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../../shared/locales';`);\n }\n\n // Build options interface\n let findOptionsFields = ` populate?: string | string[] | Record<string, unknown>;`;\n if (localized) {\n findOptionsFields += `\\n locale?: Locale;`;\n }\n if (draftAndPublish) {\n findOptionsFields += `\\n status?: 'draft' | 'published';`;\n }\n\n // Build find params\n let findParams = ` populate: options.populate,`;\n if (localized) {\n findParams += `\\n locale: options.locale,`;\n }\n if (draftAndPublish) {\n findParams += `\\n status: options.status,`;\n }\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindOptions {\n${findOptionsFields}\n}\n\n// Create typed single helper\nconst ${toCamelCase(single.singularName)}Single = single<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n async find(options: FindOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n${findParams}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n async update(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n async delete(): Promise<void> {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n`;\n}\n\n// ============================================\n// Collection Actions Generation\n// ============================================\n\nfunction generateCollectionActions(collection: CollectionType, strapiVersion: \"v4\" | \"v5\"): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const actionPrefix = toCamelCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idInputSchema = isV4 ? 'z.number().int().positive()' : 'z.string()';\n const idParamName = isV4 ? 'id' : 'documentId';\n\n return `/**\n * ${collection.displayName} Astro Actions\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { defineAction } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from './service';\nimport type { ${typeName} } from './types';\n\nexport const ${actionPrefix}Actions = {\n getMany: defineAction({\n input: z.object({\n page: z.number().optional(),\n pageSize: z.number().optional(),\n sort: z.string().optional(),\n }).optional(),\n handler: async (input) => {\n const { data, pagination } = await ${serviceName}.findMany({\n pagination: input ? { page: input.page, pageSize: input.pageSize } : undefined,\n sort: input?.sort,\n });\n return { data, pagination };\n },\n }),\n\n getOne: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async (input) => {\n const data = await ${serviceName}.findOne(input.${idParamName});\n return { data };\n },\n }),\n\n create: defineAction({\n input: z.object({\n data: z.record(z.unknown()),\n }),\n handler: async (input) => {\n const data = await ${serviceName}.create(input.data as Partial<${typeName}>);\n return { data };\n },\n }),\n\n update: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n data: z.record(z.unknown()),\n }),\n handler: async (input) => {\n const data = await ${serviceName}.update(input.${idParamName}, input.data as Partial<${typeName}>);\n return { data };\n },\n }),\n\n delete: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async (input) => {\n await ${serviceName}.delete(input.${idParamName});\n return { success: true };\n },\n }),\n};\n`;\n}\n\n// ============================================\n// JSDoc Generators\n// ============================================\n\nfunction generateUtilityTypesJSDoc(blocksRendererInstalled: boolean, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n * @typedef {string} RichTextContent\n */`\n : blocksRendererInstalled\n ? `// BlocksContent - import from '@strapi/blocks-react-renderer' for full type support`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n * @typedef {Array<Object>} BlocksContent\n */`;\n\n const baseEntity = isV4\n ? `/**\n * @typedef {Object} StrapiBaseEntity\n * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt\n */`\n : `/**\n * @typedef {Object} StrapiBaseEntity\n * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt\n */`;\n\n const mediaType = isV4\n ? `/**\n * @typedef {Object} StrapiMedia\n * @property {number} id\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {Object|null} formats\n * @property {StrapiMediaFormat} [formats.thumbnail]\n * @property {StrapiMediaFormat} [formats.small]\n * @property {StrapiMediaFormat} [formats.medium]\n * @property {StrapiMediaFormat} [formats.large]\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */`\n : `/**\n * @typedef {Object} StrapiMedia\n * @property {number} id\n * @property {string} documentId\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {Object|null} formats\n * @property {StrapiMediaFormat} [formats.thumbnail]\n * @property {StrapiMediaFormat} [formats.small]\n * @property {StrapiMediaFormat} [formats.medium]\n * @property {StrapiMediaFormat} [formats.large]\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */`;\n\n const v4RawResponseTypes = isV4 ? `\n\n/**\n * Strapi v4 raw API response item (with nested attributes)\n * @template T\n * @typedef {Object} StrapiV4RawItem\n * @property {number} id\n * @property {Omit<T, 'id'>} attributes\n */\n\n/**\n * Strapi v4 raw API response\n * @template T\n * @typedef {Object} StrapiV4RawResponse\n * @property {StrapiV4RawItem<T>} data\n * @property {Object} meta\n */\n\n/**\n * Strapi v4 raw list response\n * @template T\n * @typedef {Object} StrapiV4RawListResponse\n * @property {StrapiV4RawItem<T>[]} data\n * @property {Object} meta\n * @property {StrapiPagination} meta.pagination\n */\n\n/**\n * Flatten Strapi v4 response item\n * @template T\n * @param {StrapiV4RawItem<T>} item\n * @returns {T}\n */\nfunction flattenV4Response(item) {\n /** @type {any} */\n const merged = { id: item.id, ...item.attributes };\n return merged;\n}\n\n/**\n * Flatten Strapi v4 list response\n * @template T\n * @param {StrapiV4RawItem<T>[]} items\n * @returns {T[]}\n */\nfunction flattenV4ListResponse(items) {\n return items.map(item => flattenV4Response(item));\n}\n\n${useESM ? 'export { flattenV4Response, flattenV4ListResponse };' : 'module.exports = { flattenV4Response, flattenV4ListResponse };'}` : '';\n\n return `// @ts-check\n/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\n/**\n * @typedef {Object} StrapiMediaFormat\n * @property {string} name\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} width\n * @property {number} height\n * @property {number} size\n * @property {string} url\n */\n\n/**\n * @typedef {Object} StrapiPagination\n * @property {number} page\n * @property {number} pageSize\n * @property {number} pageCount\n * @property {number} total\n */\n\n/**\n * @template T\n * @typedef {Object} StrapiResponse\n * @property {T} data\n * @property {Object} meta\n * @property {StrapiPagination} [meta.pagination]\n */\n\n/**\n * @template T\n * @typedef {Object} StrapiListResponse\n * @property {T[]} data\n * @property {Object} meta\n * @property {StrapiPagination} meta.pagination\n */\n\n${baseEntity}\n${v4RawResponseTypes}\n${blocksContentType}\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateClientJSDoc(strapiVersion: \"v4\" | \"v5\", apiPrefix: string = \"/api\", useESM: boolean = false): string {\n const isV4 = strapiVersion === \"v4\";\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n const importStatement = useESM\n ? `import Strapi from 'strapi-sdk-js';`\n : `const Strapi = require('strapi-sdk-js').default;`;\n\n if (isV4) {\n return `// @ts-check\n/**\n * Strapi Client (v4)\n * Generated by strapi2front\n */\n\n${importStatement}\n\n// Initialize the Strapi client\nconst strapiUrl = process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nconst strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n/** @type {import('./utils').StrapiPagination} */\nconst defaultPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n * @template T\n * @param {{ id: number, attributes: Omit<T, 'id'> }} item\n * @returns {T}\n */\nfunction flattenItem(item) {\n /** @type {any} */\n const merged = { id: item.id, ...item.attributes };\n return merged;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n * @template T\n * @param {T} data\n * @returns {T}\n */\nfunction flattenRelations(data) {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n /** @type {any} */\n const mapped = data.map(item => flattenRelations(item));\n return mapped;\n }\n if (typeof data === 'object') {\n /** @type {Record<string, unknown>} */\n const result = {};\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'data' in value) {\n /** @type {any} */\n const wrapper = value;\n const relationData = wrapper.data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n result[key] = relationData.map((item) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && relationData !== null && 'id' in relationData && 'attributes' in relationData) {\n result[key] = flattenRelations(flattenItem(relationData));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n /** @type {any} */\n const typed = result;\n return typed;\n }\n return data;\n}\n\n/**\n * Helper to get typed collection\n * @template T\n * @param {string} pluralName\n */\nfunction collection(pluralName) {\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T[], meta: { pagination: import('./utils').StrapiPagination } }>}\n */\n async find(params) {\n const response = await strapi.find(pluralName, params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T[]} */\n const data = Array.isArray(rawData)\n ? rawData.map(item => flattenRelations(flattenItem(item)))\n : [];\n /** @type {any} */\n const rawMeta = response.meta;\n /** @type {any} */\n const rawPag = rawMeta?.pagination;\n /** @type {import('./utils').StrapiPagination} */\n const pagination = {\n page: rawPag?.page ?? defaultPagination.page,\n pageSize: rawPag?.pageSize ?? defaultPagination.pageSize,\n pageCount: rawPag?.pageCount ?? defaultPagination.pageCount,\n total: rawPag?.total ?? defaultPagination.total,\n };\n return { data, meta: { pagination } };\n },\n /**\n * @param {number|string} id\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async findOne(id, params) {\n const response = await strapi.findOne(pluralName, String(id), params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = flattenRelations(flattenItem(rawData));\n return { data };\n },\n /**\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async create(data) {\n const response = await strapi.create(pluralName, data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @param {number|string} id\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async update(id, data) {\n const response = await strapi.update(pluralName, String(id), data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @param {number|string} id\n * @returns {Promise<void>}\n */\n async delete(id) {\n await strapi.delete(pluralName, String(id));\n },\n };\n}\n\n/**\n * Helper to get typed single type\n * @template T\n * @param {string} singularName\n */\nfunction single(singularName) {\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async find(params) {\n const response = await strapi.find(singularName, params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = flattenRelations(flattenItem(rawData));\n return { data };\n },\n /**\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async update(data) {\n const response = await strapi.update(singularName, String(1), data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await strapi.delete(singularName, String(1));\n },\n };\n}\n\n${useESM ? 'export { strapi, collection, single };' : 'module.exports = { strapi, collection, single };'}\n`;\n }\n\n return `// @ts-check\n/**\n * Strapi Client (v5)\n * Generated by strapi2front\n */\n\n${importStatement}\n\n// Initialize the Strapi client\nconst strapiUrl = process.env.STRAPI_URL || 'http://localhost:1337';\nconst strapiToken = process.env.STRAPI_TOKEN;\nconst strapiApiPrefix = process.env.STRAPI_API_PREFIX || '${normalizedPrefix}';\n\nconst strapi = new Strapi({\n url: strapiUrl,\n prefix: strapiApiPrefix,\n axiosOptions: {\n headers: strapiToken ? {\n Authorization: \\`Bearer \\${strapiToken}\\`,\n } : {},\n },\n});\n\n/** @type {import('./utils').StrapiPagination} */\nconst defaultPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n/**\n * Helper to get typed collection\n * @template T\n * @param {string} pluralName\n */\nfunction collection(pluralName) {\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T[], meta: { pagination: import('./utils').StrapiPagination } }>}\n */\n async find(params) {\n const response = await strapi.find(pluralName, params);\n /** @type {any} */\n const rawMeta = response.meta;\n /** @type {any} */\n const rawPag = rawMeta?.pagination;\n /** @type {import('./utils').StrapiPagination} */\n const pagination = {\n page: rawPag?.page ?? defaultPagination.page,\n pageSize: rawPag?.pageSize ?? defaultPagination.pageSize,\n pageCount: rawPag?.pageCount ?? defaultPagination.pageCount,\n total: rawPag?.total ?? defaultPagination.total,\n };\n /** @type {any} */\n const rawData = response.data;\n /** @type {T[]} */\n const data = Array.isArray(rawData) ? rawData : [];\n return { data, meta: { pagination } };\n },\n /**\n * @param {string} documentId\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async findOne(documentId, params) {\n const response = await strapi.findOne(pluralName, documentId, params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = rawData;\n return { data };\n },\n /**\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async create(data) {\n const response = await strapi.create(pluralName, data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @param {string} documentId\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async update(documentId, data) {\n const response = await strapi.update(pluralName, documentId, data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @param {string} documentId\n * @returns {Promise<void>}\n */\n async delete(documentId) {\n await strapi.delete(pluralName, documentId);\n },\n };\n}\n\n/**\n * Helper to get typed single type\n * @template T\n * @param {string} singularName\n */\nfunction single(singularName) {\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async find(params) {\n const response = await strapi.find(singularName, params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = rawData;\n return { data };\n },\n /**\n * @param {{ data: Partial<T> }} data\n * @returns {Promise<{ data: T }>}\n */\n async update(data) {\n const response = await strapi.update(singularName, String(1), data.data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await strapi.delete(singularName, String(1));\n },\n };\n}\n\n${useESM ? 'export { strapi, collection, single };' : 'module.exports = { strapi, collection, single };'}\n`;\n}\n\nfunction generateLocalesFileJSDoc(locales: StrapiLocale[], useESM: boolean = false): string {\n if (locales.length === 0) {\n return `// @ts-check\n/**\n * Strapi locales\n * Generated by strapi2front\n * Note: i18n is not enabled in Strapi\n */\n\n/** @type {readonly string[]} */\nconst locales = [];\n\n/** @typedef {string} Locale */\n\n/** @type {string} */\nconst defaultLocale = 'en';\n\n/** @type {Record<string, string>} */\nconst localeNames = {};\n\n/**\n * @param {string} _code\n * @returns {boolean}\n */\nfunction isValidLocale(_code) {\n return true;\n}\n\n/**\n * @param {string} code\n * @returns {string}\n */\nfunction getLocaleName(code) {\n return code;\n}\n\n${useESM ? 'export { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };' : 'module.exports = { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };'}\n`;\n }\n\n const localeCodes = locales.map(l => l.code);\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n\n return `// @ts-check\n/**\n * Strapi locales\n * Generated by strapi2front\n */\n\n/** @type {readonly [${localeCodes.map(c => `'${c}'`).join(', ')}]} */\nconst locales = [${localeCodes.map(c => `'${c}'`).join(', ')}];\n\n/** @typedef {${localeCodes.map(c => `'${c}'`).join(' | ')}} Locale */\n\n/** @type {Locale} */\nconst defaultLocale = '${defaultLocale}';\n\n/** @type {Record<Locale, string>} */\nconst localeNames = {\n${locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n')}\n};\n\n/**\n * @param {string} code\n * @returns {boolean}\n */\nfunction isValidLocale(code) {\n /** @type {readonly string[]} */\n const localeList = locales;\n return localeList.includes(code);\n}\n\n/**\n * @param {Locale} code\n * @returns {string}\n */\nfunction getLocaleName(code) {\n return localeNames[code] || code;\n}\n\n${useESM ? 'export { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };' : 'module.exports = { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };'}\n`;\n}\n\n// ============================================\n// JSDoc Collection Types Generation\n// ============================================\n\nfunction generateCollectionTypesJSDoc(collection: CollectionType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateJSDocAttributes(collection.attributes, schema, 'collection');\n\n return `// @ts-check\n/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {import('../../shared/utils').StrapiBaseEntity & ${typeName}Attributes} ${typeName}\n */\n\n/**\n * @typedef {Object} ${typeName}Attributes\n${attributes}\n */\n\n/**\n * @typedef {Object} ${typeName}Filters\n * @property {number|{$eq?: number, $ne?: number, $in?: number[], $notIn?: number[]}} [id]\n * @property {string|{$eq?: string, $ne?: string}} [documentId]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [createdAt]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [updatedAt]\n * @property {string|null|{$eq?: string, $ne?: string, $null?: boolean}} [publishedAt]\n * @property {${typeName}Filters[]} [$and]\n * @property {${typeName}Filters[]} [$or]\n * @property {${typeName}Filters} [$not]\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateSingleTypesJSDoc(single: SingleType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateJSDocAttributes(single.attributes, schema, 'single');\n\n return `// @ts-check\n/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {import('../../shared/utils').StrapiBaseEntity & ${typeName}Attributes} ${typeName}\n */\n\n/**\n * @typedef {Object} ${typeName}Attributes\n${attributes}\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateComponentTypesJSDoc(component: ComponentType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(component.name);\n const attributes = generateJSDocAttributes(component.attributes, schema, 'component');\n\n return `// @ts-check\n/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {Object} ${typeName}\n * @property {number} id\n${attributes}\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateJSDocAttributes(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema,\n context: 'collection' | 'single' | 'component'\n): string {\n const lines: string[] = [];\n const relativePrefix = context === 'component' ? '..' : '../..';\n\n for (const [name, attr] of Object.entries(attributes)) {\n const jsType = attributeToJSDocType(attr, schema, relativePrefix);\n const optional = attr.required ? '' : '[';\n const optionalEnd = attr.required ? '' : ']';\n lines.push(` * @property {${jsType}} ${optional}${name}${optionalEnd}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction attributeToJSDocType(\n attr: Attribute,\n schema: ParsedSchema,\n relativePrefix: string\n): string {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return 'string';\n case 'blocks':\n return 'Array<Object>';\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return 'string';\n case 'json':\n return 'Object';\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return attr.enum.map(v => `'${v}'`).join('|');\n }\n return 'string';\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return `import(\"${relativePrefix}/shared/utils\").StrapiMedia[]`;\n }\n return `import(\"${relativePrefix}/shared/utils\").StrapiMedia|null`;\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || 'unknown';\n const typeName = toPascalCase(targetName);\n const fileName = toKebabCase(targetName);\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n\n // Determine if target is a collection or single\n const isCollection = schema.collections.some(c => c.singularName === targetName);\n const isSingle = schema.singles.some(s => s.singularName === targetName);\n\n let importPath: string;\n if (isCollection) {\n importPath = `${relativePrefix}/collections/${fileName}/types`;\n } else if (isSingle) {\n importPath = `${relativePrefix}/singles/${fileName}/types`;\n } else {\n // Fallback - assume collection\n importPath = `${relativePrefix}/collections/${fileName}/types`;\n }\n\n const importType = `import(\"${importPath}\").${typeName}`;\n return isMany ? `${importType}[]` : `${importType}|null`;\n }\n return 'Object';\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n const importPath = `${relativePrefix}/components/${fileName}`;\n const importType = `import(\"${importPath}\").${typeName}`;\n\n if ('repeatable' in attr && attr.repeatable) {\n return `${importType}[]`;\n }\n return `${importType}|null`;\n }\n return 'Object';\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map(comp => {\n const componentName = comp.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n const importPath = `${relativePrefix}/components/${fileName}`;\n return `import(\"${importPath}\").${typeName}`;\n });\n return `(${types.join('|')})[]`;\n }\n return 'Object[]';\n default:\n return 'Object';\n }\n}\n\n// ============================================\n// JSDoc Collection Service Generation\n// ============================================\n\nfunction generateCollectionServiceJSDoc(collection: CollectionType, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const endpoint = collection.pluralName;\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id' : 'documentId';\n const idType = isV4 ? 'number' : 'string';\n\n const importStatement = useESM\n ? `import { collection } from '../../shared/client.js';`\n : `const { collection } = require('../../shared/client');`;\n\n return `// @ts-check\n/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${importStatement}\n\n/**\n * @typedef {Object} FindManyOptions\n * @property {import('./types').${typeName}Filters} [filters]\n * @property {Object} [pagination]\n * @property {number} [pagination.page]\n * @property {number} [pagination.pageSize]\n * @property {number} [pagination.start]\n * @property {number} [pagination.limit]\n * @property {string|string[]} [sort]\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/**\n * @typedef {Object} FindOneOptions\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/** @type {ReturnType<typeof collection<import('./types').${typeName}>>} */\nconst ${toCamelCase(collection.singularName)}Collection = collection('${endpoint}');\n\nconst ${serviceName} = {\n /**\n * @param {FindManyOptions} [options]\n * @returns {Promise<{ data: import('./types').${typeName}[], pagination: import('../../shared/utils').StrapiPagination }>}\n */\n async findMany(options = {}) {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * @param {Omit<FindManyOptions, 'pagination'>} [options]\n * @returns {Promise<import('./types').${typeName}[]>}\n */\n async findAll(options = {}) {\n /** @type {import('./types').${typeName}[]} */\n const allItems = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @param {FindOneOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async findOne(${idParam}, options = {}) {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idParam}, {\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n /**\n * @param {string} slug\n * @param {FindOneOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async findBySlug(slug, options = {}) {\n const { data } = await this.findMany({\n filters: /** @type {import('./types').${typeName}Filters} */ ({ slug: { $eq: slug } }),\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return data[0] || null;\n },\n` : ''}\n /**\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async create(data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async update(${idParam}, data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idParam}, { data });\n return response.data;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @returns {Promise<void>}\n */\n async delete(${idParam}) {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idParam});\n },\n\n /**\n * @param {import('./types').${typeName}Filters} [filters]\n * @returns {Promise<number>}\n */\n async count(filters) {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n\n${useESM ? `export { ${serviceName} };` : `module.exports = { ${serviceName} };`}\n`;\n}\n\n// ============================================\n// JSDoc Single Service Generation\n// ============================================\n\nfunction generateSingleServiceJSDoc(single: SingleType, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const endpoint = single.singularName;\n const { localized, draftAndPublish } = single;\n\n const importStatement = useESM\n ? `import { single } from '../../shared/client.js';`\n : `const { single } = require('../../shared/client');`;\n\n return `// @ts-check\n/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${importStatement}\n\n/**\n * @typedef {Object} FindOptions\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/** @type {ReturnType<typeof single<import('./types').${typeName}>>} */\nconst ${toCamelCase(single.singularName)}Single = single('${endpoint}');\n\nconst ${serviceName} = {\n /**\n * @param {FindOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async find(options = {}) {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async update(data) {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n\n${useESM ? `export { ${serviceName} };` : `module.exports = { ${serviceName} };`}\n`;\n}\n","/**\n * Next.js Server Actions generator\n * Generates type-safe Server Actions for Strapi content types\n *\n * Requirements:\n * - Next.js 14+ (Server Actions)\n * - TypeScript enabled\n *\n * Status: COMING SOON\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\n\nexport interface NextJsActionsOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Next.js Server Actions from parsed schema\n *\n * @throws Error - Not yet implemented\n */\nexport async function generateNextJsActions(\n _schema: ParsedSchema,\n _options: NextJsActionsOptions\n): Promise<string[]> {\n throw new Error(\n 'Next.js Server Actions generator is not yet implemented. ' +\n 'Coming soon! For now, you can use the generated services directly.'\n );\n}\n\n/**\n * Check if Next.js Server Actions are supported\n * Requires Next.js 14+ with App Router\n */\nexport function isNextJsActionsSupported(nextVersion: string | null): boolean {\n if (!nextVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = nextVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 14;\n}\n","/**\n * Nuxt Server Routes generator\n * Generates type-safe server routes for Strapi content types\n *\n * Requirements:\n * - Nuxt 3+\n * - TypeScript enabled\n *\n * Status: COMING SOON\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\n\nexport interface NuxtServerRoutesOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Nuxt Server Routes from parsed schema\n *\n * @throws Error - Not yet implemented\n */\nexport async function generateNuxtServerRoutes(\n _schema: ParsedSchema,\n _options: NuxtServerRoutesOptions\n): Promise<string[]> {\n throw new Error(\n 'Nuxt Server Routes generator is not yet implemented. ' +\n 'Coming soon! For now, you can use the generated services directly.'\n );\n}\n\n/**\n * Check if Nuxt Server Routes are supported\n * Requires Nuxt 3+\n */\nexport function isNuxtServerRoutesSupported(nuxtVersion: string | null): boolean {\n if (!nuxtVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = nuxtVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 3;\n}\n","/**\n * Framework-specific generators\n *\n * Each framework has its own approach to server-side data fetching:\n * - Astro: Actions (v4+)\n * - Next.js: Server Actions (v14+) - Coming Soon\n * - Nuxt: Server Routes (v3+) - Coming Soon\n */\n\n// Astro\nexport { generateAstroActions, isAstroActionsSupported } from './astro/actions.js';\nexport type { AstroActionsOptions } from './astro/actions.js';\n\n// Next.js (Coming Soon)\nexport { generateNextJsActions, isNextJsActionsSupported } from './nextjs/actions.js';\nexport type { NextJsActionsOptions } from './nextjs/actions.js';\n\n// Nuxt (Coming Soon)\nexport { generateNuxtServerRoutes, isNuxtServerRoutesSupported } from './nuxt/server-routes.js';\nexport type { NuxtServerRoutesOptions } from './nuxt/server-routes.js';\n\n/**\n * Supported frameworks for action generation\n */\nexport type SupportedFramework = 'astro' | 'nextjs' | 'nuxt';\n\n/**\n * Framework support status\n */\nexport const frameworkSupport: Record<SupportedFramework, { status: 'stable' | 'coming-soon'; minVersion: string }> = {\n astro: { status: 'stable', minVersion: '4.0.0' },\n nextjs: { status: 'coming-soon', minVersion: '14.0.0' },\n nuxt: { status: 'coming-soon', minVersion: '3.0.0' },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/formatter.ts","../src/utils/file.ts","../src/utils/naming.ts","../src/shared/type-mapper.ts","../src/output/typescript/types.ts","../src/output/jsdoc/types.ts","../src/types/generator.ts","../src/output/jsdoc/services.ts","../src/services/generator.ts","../src/shared/blocks-schema.ts","../src/shared/zod-mapper.ts","../src/frameworks/astro/actions.ts","../src/actions/generator.ts","../src/client/generator.ts","../src/locales/generator.ts","../src/by-feature/generator.ts","../src/frameworks/nextjs/actions.ts","../src/frameworks/nuxt/server-routes.ts","../src/frameworks/index.ts","../src/output/zod/schemas.ts"],"names":["path","generateUtilityTypes","generateCollectionType","generateSingleType","generateComponentType","generateCollectionService","generateSingleService","generateClient","generateLocalesFile","generateCollectionActions","generateAttributes","generateCollectionSchemas","generateSingleSchemas","exports"],"mappings":";;;;;AAKA,eAAsB,WAAW,IAAA,EAA+B;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAe,gBAAO,IAAA,EAAM;AAAA,MACjC,MAAA,EAAQ,YAAA;AAAA,MACR,IAAA,EAAM,IAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,IAAA,EAA+B;AAC9D,EAAA,IAAI;AACF,IAAA,OAAO,MAAe,gBAAO,IAAA,EAAM;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AC5BA,eAAsB,UAAU,OAAA,EAAgC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,GAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AAEd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,eAAsB,SAAA,CAAU,UAAkB,OAAA,EAAgC;AAChF,EAAA,MAAM,GAAA,GAAMA,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACjC,EAAA,MAAM,UAAU,GAAG,CAAA;AACnB,EAAA,MAAM,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC/C;AAKA,eAAsB,SAAS,QAAA,EAAmC;AAChE,EAAA,OAAO,MAAM,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC5C;AAKA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,QAAA,EAAiC;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AAAA,EAC1B,SAAS,KAAA,EAAO;AACd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAKA,eAAsB,SAAA,CAAU,SAAiB,SAAA,EAAuC;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AACjE,IAAA,IAAI,QAAQ,OAAA,CACT,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,MAAA,EAAQ,CAAA,CAChC,GAAA,CAAI,CAAC,KAAA,KAAUA,KAAA,CAAK,KAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AAEhD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACzEO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CACJ,MAAM,SAAS,CAAA,CACf,IAAI,CAAC,IAAA,KAAS,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAK,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa,CAAA,CACxE,IAAA,CAAK,EAAE,CAAA;AACZ;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACxD;AAKO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,OAAO,GAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CACtB,WAAA,EAAY;AACjB;AAKO,SAAS,UAAU,IAAA,EAAsB;AAC9C,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1F,IAAA,OAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AACA,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,KAAK,CAAC,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA,CAAE,SAAS,IAAA,CAAK,MAAA,CAAO,KAAK,MAAA,GAAS,CAAC,CAAC,CAAA,EAAG;AAC3F,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA,GAAO,GAAA;AAChB;;;ACXO,SAAS,kBAAA,CAAmB,MAAiB,WAAA,EAA0C;AAC5F,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM;AAAA,IAE9C,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,eAAA;AAAA,QACN,WAAA,EAAa,IAAA;AAAA,QACb,MAAA,EAAQ,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAM,OAAA;AAAQ,OACjD;AAAA,IAEF,KAAK,SAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM;AAAA,IAE9C,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM;AAAA,IAE/C,KAAK,MAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM;AAAA,IAE9C,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM;AAAA,IAE/C,KAAK,aAAA;AACH,MAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,IAAA,EAAM;AAC/B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,UAC/C,WAAA,EAAa;AAAA,SACf;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,KAAA,EAAM;AAAA,IAE9C,KAAK,OAAA;AACH,MAAA,IAAI,UAAA,IAAc,IAAA,IAAQ,IAAA,CAAK,QAAA,EAAU;AACvC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,eAAA;AAAA,UACN,WAAA,EAAa,IAAA;AAAA,UACb,MAAA,EAAQ,EAAE,IAAA,EAAM,aAAA,EAAe,MAAM,OAAA;AAAQ,SAC/C;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,WAAA,EAAa,IAAA;AAAA,QACb,MAAA,EAAQ,EAAE,IAAA,EAAM,aAAA,EAAe,MAAM,OAAA;AAAQ,OAC/C;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,EAAQ;AACnC,QAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AACnD,QAAA,MAAM,QAAA,GAAW,aAAa,UAAU,CAAA;AACxC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,KAAa,WAAA,IAAe,KAAK,QAAA,KAAa,YAAA;AAClE,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,GAAS,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAA,GAAO,GAAG,QAAQ,CAAA,OAAA,CAAA;AAAA,UAC5C,WAAA,EAAa,IAAA;AAAA,UACb,QAAQ,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,UAAA,EAAY,YAAY,IAAA;AAAK,SAC/D;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM;AAAA,IAE/C,KAAK,WAAA;AACH,MAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AACzC,QAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AACzD,QAAA,MAAM,QAAA,GAAW,aAAa,aAAa,CAAA;AAC3C,QAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,EAAY;AAC3C,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAA,CAAA;AAAA,YACjB,WAAA,EAAa,IAAA;AAAA,YACb,QAAQ,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,aAAA,EAAe,aAAa,IAAA;AAAK,WACnE;AAAA,QACF;AACA,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,GAAG,QAAQ,CAAA,OAAA,CAAA;AAAA,UACjB,WAAA,EAAa,IAAA;AAAA,UACb,QAAQ,EAAE,IAAA,EAAM,UAAU,IAAA,EAAM,aAAA,EAAe,aAAa,IAAA;AAAK,SACnE;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM;AAAA,IAE/C,KAAK,aAAA;AACH,MAAA,IAAI,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,EAAY;AAC3C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AACvC,UAAA,MAAM,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AACnC,UAAA,OAAO,aAAa,IAAI,CAAA;AAAA,QAC1B,CAAC,CAAA;AACD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,GAAA,CAAA;AAAA,UAC3B,WAAA,EAAa;AAAA;AAAA,SAEf;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,WAAA,EAAa,KAAA,EAAM;AAAA,IAEjD;AACE,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAM;AAAA;AAEnD;AAYO,SAAS,oBAAoB,IAAA,EAAgC;AAClE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,WAAA,IAAe,IAAA,IAAQ,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW;AACvD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAA,EAAW;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,MAAA,EAAW;AAC3C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC/C;AAKO,SAAS,mBAAA,CACd,YACA,QAAA,EACqD;AACrD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,EAAG;AAC5C,IAAA,IAAI,KAAK,IAAA,KAAS,UAAA,IAAc,QAAA,IAAY,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC/D,MAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AACnD,MAAA,MAAM,QAAA,GAAW,aAAa,UAAU,CAAA;AAExC,MAAA,IAAI,QAAA,KAAa,YAAY,UAAA,EAAY;AACvC,QAAA,SAAA,CAAU,IAAI,UAAU,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,IAAA,KAAS,WAAA,IAAe,WAAA,IAAe,IAAA,IAAQ,KAAK,SAAA,EAAW;AACtE,MAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AACzD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,UAAA,CAAW,IAAI,aAAa,CAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,IAAA,KAAS,aAAA,IAAiB,YAAA,IAAgB,IAAA,IAAQ,KAAK,UAAA,EAAY;AAC1E,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,UAAA,EAAY;AAClC,QAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAC/C,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,UAAA,CAAW,IAAI,aAAa,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,WAAW,UAAA,EAAW;AACjC;;;AC7LA,eAAsB,uBAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AACtB,EAAA,MAAM,iBAA2B,EAAC;AAGlC,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAA;AACnD,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAC,CAAA;AAGlD,EAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,IAAA;AAC/C,EAAA,MAAM,SAAA,CAAU,SAAA,EAAW,MAAM,UAAA,CAAW,oBAAA,CAAqB,QAAQ,uBAAA,IAA2B,KAAA,EAAO,aAAa,CAAC,CAAC,CAAA;AAC1H,EAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAG7B,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA,GAAA,CAAA;AACxD,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,QAAQ,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,UAAA,EAAY,MAAA,CAAO,UAAU,CAAA;AACpE,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,GAAA,CAAA;AACpD,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,QAAQ,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,MAAA,CAAO,UAAU,CAAA;AAC5D,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,SAAA,CAAU,IAAI,CAAC,CAAA,GAAA,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,cAAc,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,sBAAsB,SAAS,CAAA;AAC/C,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,oBAAA,CAAqB,yBAAkC,aAAA,EAAsC;AACpG,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,MAAM,oBAAoB,IAAA,GACtB,CAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,CAAA,GAKA,uBAAA,GACA,CAAA;AAAA;AAAA;AAAA;AAAA,mEAAA,CAAA,GAKA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAUJ,EAAA,MAAM,aAAa,IAAA,GACf,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GASA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAWJ,EAAA,MAAM,YAAY,IAAA,GACd,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GA0BA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA4BJ,EAAA,MAAM,mBAAmB,IAAA,GACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GAkCA,EAAA;AAEJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGY,aAAa;AAAA;;AAAA,EAGhC,SAAS;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EA2CT,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,CAAA;AAEnB;AAKA,SAAS,yBAAA,CACP,WACA,UAAA,EACQ;AACR,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,QAAA,GAAW,aAAa,QAAQ,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAClE;AAGA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,YAAY,SAAS,CAAA;AACtC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,QAAQ,CAAA,uBAAA,EAA0B,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAKA,SAAS,sBAAA,CAAuB,YAA4B,UAAA,EAAqC;AAC/F,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,UAAA,CAAW,UAAsB,CAAA;AACvE,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,UAAA,CAAW,YAAY,QAAQ,CAAA;AACpG,EAAA,MAAM,iBAAA,GAAoB,yBAAA,CAA0B,SAAA,EAAW,aAAa,CAAA;AAG5E,EAAA,MAAM,YAAA,GAAyB,CAAC,kBAAkB,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,UAAU,CAAA;AAC1D,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC5C,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC7C,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,WAAW,WAAW;AAAA,GAAA,EACtB,UAAA,CAAW,eAAe,EAAE;AAAA;AAAA;;AAAA,cAAA,EAIjB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACrC,iBAAA,GAAoB,iBAAA,GAAoB,IAAA,GAAO,EAAE;AAAA,iBAAA,EAChC,QAAQ,CAAA;AAAA,EACzB,UAAU;AAAA;;AAAA,iBAAA,EAGO,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAMhB,QAAQ,CAAA;AAAA,QAAA,EACT,QAAQ,CAAA;AAAA,SAAA,EACP,QAAQ,CAAA;AAAA;;AAAA,iBAAA,EAGA,QAAQ,CAAA;AAAA,eAAA,EACV,QAAQ,CAAA;AAAA;AAAA;AAAA,CAAA;AAIzB;AAKA,SAAS,kBAAA,CAAmB,QAAoB,UAAA,EAAqC;AACnF,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,YAAY,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,UAAsB,CAAA;AACnE,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,MAAA,CAAO,YAAY,QAAQ,CAAA;AAChG,EAAA,MAAM,iBAAA,GAAoB,yBAAA,CAA0B,SAAA,EAAW,aAAa,CAAA;AAG5E,EAAA,MAAM,YAAA,GAAyB,CAAC,kBAAkB,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AACtD,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC5C,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC7C,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,OAAO,WAAW;AAAA,GAAA,EAClB,MAAA,CAAO,eAAe,EAAE;AAAA;AAAA;;AAAA,cAAA,EAIb,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACrC,iBAAA,GAAoB,iBAAA,GAAoB,IAAA,GAAO,EAAE;AAAA,iBAAA,EAChC,QAAQ,CAAA;AAAA,EACzB,UAAU;AAAA;AAAA,CAAA;AAGZ;AAKA,SAAS,sBAAsB,SAAA,EAAkC;AAC/D,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,SAAA,CAAU,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAA,CAAU,UAAc,CAAA;AAC9D,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,SAAA,CAAU,YAAY,QAAQ,CAAA;AAGnG,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,WAAA,GAAc,aAAa,QAAQ,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,WAAW,CAAA,wBAAA,EAA2B,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAClF;AAEA,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,YAAA,GAAe,aAAa,IAAI,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AAEjC,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAY,CAAA,WAAA,EAAc,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,UAAU,CAAA;AACzD,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC5C,IAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC7C,IAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,eAAA,GAAkB,aAAa,MAAA,GAAS,CAAA,GAC1C,iBAAiB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,CAAA,GACxC,EAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAA,GAAS,CAAA,GAAI,QAAQ,IAAA,CAAK,IAAI,IAAI,IAAA,GAAO,EAAA;AAE3E,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,UAAU,WAAW,CAAA;AAAA,aAAA,EACX,UAAU,QAAQ;AAAA,GAAA,EAC5B,SAAA,CAAU,eAAe,EAAE;AAAA;AAAA;;AAAA,EAI9B,eAAe,GAAG,iBAAiB;AAAA,iBAAA,EAClB,QAAQ,CAAA;AAAA;AAAA,EAEzB,UAAU;AAAA;AAAA,CAAA;AAGZ;AAKA,SAAS,kBAAA,CACP,YACA,UAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,IAAgB,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,GAAW,EAAA,GAAK,GAAA;AACtC,IAAA,MAAM,OAAA,GAAU,oBAAoB,IAAI,CAAA;AAExC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,IAClC;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AC7aA,eAAsB,kBAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AACtB,EAAA,MAAM,iBAA2B,EAAC;AAGlC,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAA;AACnD,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAC,CAAA;AAGlD,EAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,IAAA;AAC/C,EAAA,MAAM,SAAA,CAAU,SAAA,EAAWC,qBAAAA,CAAqB,aAAa,CAAC,CAAA;AAC9D,EAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAG7B,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA,GAAA,CAAA;AACxD,IAAA,MAAM,QAAA,GAAWD,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,QAAQ,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAUE,uBAAAA,CAAuB,UAAA,EAAY,MAAA,CAAO,YAAY,aAAa,CAAA;AACnF,IAAA,MAAM,SAAA,CAAU,UAAU,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,GAAA,CAAA;AACpD,IAAA,MAAM,QAAA,GAAWF,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,eAAe,QAAQ,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAUG,mBAAAA,CAAmB,MAAA,EAAQ,MAAA,CAAO,YAAY,aAAa,CAAA;AAC3E,IAAA,MAAM,SAAA,CAAU,UAAU,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,SAAA,CAAU,IAAI,CAAC,CAAA,GAAA,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAWH,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,cAAc,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAUI,sBAAAA,CAAsB,SAAA,EAAW,aAAa,CAAA;AAC9D,IAAA,MAAM,SAAA,CAAU,UAAU,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAKA,SAASH,sBAAqB,aAAA,EAAsC;AAClE,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,MAAM,mBAAmB,IAAA,GACrB,CAAA;AAAA;AAAA;AAAA,sCAAA,CAAA,GAIA,CAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAMJ,EAAA,MAAM,WAAA,GAAc,OAChB,CAAA,wBAAA,CAAA,GACA,CAAA;AAAA,gCAAA,CAAA;AAGJ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGY,aAAa;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,EAqBhC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,EA8CX,gBAAgB;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAWlB;AAKA,SAASC,uBAAAA,CACP,UAAA,EACA,UAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AACrD,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAC/B,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,UAAA,CAAW,YAAY,QAAQ,CAAA;AAGpG,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,SAAA,EAAW,aAAA,EAAe,YAAY,CAAA;AAG3E,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,UAAA,CAAW,UAAsB,CAAA;AAG5E,EAAA,MAAM,aAAa,IAAA,GACf,CAAA;AAAA;AAAA;AAAA,sCAAA,CAAA,GAIA,CAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAMJ,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,WAAW,WAAW;AAAA,GAAA,EACtB,UAAA,CAAW,eAAe,EAAE;AAAA;AAAA,mBAAA,EAEZ,aAAa;AAAA;;AAAA,EAGhC,OAAO;;AAAA;AAAA,GAAA,EAGJ,WAAW,WAAW;AAAA,qBAAA,EACJ,QAAQ;AAAA,EAC7B,UAAU;AAAA,EACV,UAAU;AAAA;;AAAA;AAAA,GAAA,EAIP,QAAQ,CAAA;AAAA,qBAAA,EACU,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAMf,QAAQ,CAAA;AAAA,cAAA,EACR,QAAQ,CAAA;AAAA,cAAA,EACR,QAAQ,CAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAMxB;AAKA,SAASC,mBAAAA,CACP,MAAA,EACA,UAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,YAAY,CAAA;AACjD,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAC/B,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,MAAA,CAAO,YAAY,QAAQ,CAAA;AAGhG,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,SAAA,EAAW,aAAA,EAAe,YAAY,CAAA;AAG3E,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,MAAA,CAAO,UAAsB,CAAA;AAGxE,EAAA,MAAM,aAAa,IAAA,GACf,CAAA;AAAA;AAAA,+BAAA,CAAA,GAGA,CAAA;AAAA;AAAA;AAAA,+BAAA,CAAA;AAKJ,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,OAAO,WAAW;AAAA,GAAA,EAClB,MAAA,CAAO,eAAe,EAAE;AAAA;AAAA,mBAAA,EAER,aAAa;AAAA;;AAAA,EAGhC,OAAO;;AAAA;AAAA,GAAA,EAGJ,OAAO,WAAW;AAAA,qBAAA,EACA,QAAQ;AAAA,EAC7B,UAAU;AAAA,EACV,UAAU;AAAA;;AAAA;AAAA;AAAA,CAAA;AAMZ;AAKA,SAASC,sBAAAA,CAAsB,WAA0B,aAAA,EAAsC;AAC7F,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,SAAA,CAAU,IAAI,CAAA;AAC5C,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,aAAA,KAAkB,mBAAA,CAAoB,SAAA,CAAU,YAAY,QAAQ,CAAA;AAGnG,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,SAAA,EAAW,aAAA,EAAe,WAAW,CAAA;AAG1E,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,SAAA,CAAU,UAAc,CAAA;AAEnE,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,UAAU,WAAW,CAAA;AAAA,aAAA,EACX,UAAU,QAAQ;AAAA,GAAA,EAC5B,SAAA,CAAU,eAAe,EAAE;AAAA;AAAA,mBAAA,EAEX,aAAa;AAAA;;AAAA,EAGhC,OAAO;;AAAA;AAAA,GAAA,EAGJ,UAAU,WAAW;AAAA,qBAAA,EACH,QAAQ;AAAA;AAAA,EAE7B,UAAU;AAAA;;AAAA;AAAA;AAAA,CAAA;AAMZ;AAKA,SAAS,oBAAA,CACP,SAAA,EACA,UAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,OAAA,CAAQ,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAC3E,EAAA,OAAA,CAAQ,KAAK,CAAA,gEAAA,CAAkE,CAAA;AAG/E,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,QAAA,GAAW,aAAa,QAAQ,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AACrC,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,OAAA,CAAQ,KAAK,CAAA,qCAAA,EAAwC,QAAQ,MAAM,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IAC/F,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,CAAA,wBAAA,EAA2B,QAAQ,MAAM,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IAClF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,QAAA,GAAW,aAAa,SAAS,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,YAAY,SAAS,CAAA;AACtC,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,OAAA,CAAQ,KAAK,CAAA,wBAAA,EAA2B,QAAQ,MAAM,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IAClF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,CAAA,oCAAA,EAAuC,QAAQ,MAAM,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IAC9F;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAKA,SAAS,uBAAA,CACP,YACA,UAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,IAAgB,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,UAAA,CAAW,IAAI,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,oBAAoB,IAAI,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,OAAA,GAAU,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,GAAK,EAAA;AAGhD,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,SAAS,KAAK,IAAI,CAAA,EAAG,WAAW,CAAA,CAAE,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,SAAS,MAAM,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,mBAAmB,MAAA,EAAwB;AAElD,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAC7C,IAAA,OAAO,GAAG,QAAQ,CAAA,KAAA,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEnC,IAAA,IAAI,SAAS,UAAA,CAAW,GAAG,KAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,MAAA,OAAO,CAAA,MAAA,EAAS,SAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,GAAG,QAAQ,CAAA,EAAA,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,OAAO,QAAA,CAAS,GAAG,KAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAClD,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;;;ACnYA,eAAsB,aAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,YAAA;AAE7C,EAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,IAAA,OAAO,mBAAmB,MAAA,EAAQ;AAAA,MAChC,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,yBAAyB,OAAA,CAAQ,uBAAA;AAAA,MACjC,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,wBAAwB,MAAA,EAAQ;AAAA,IACrC,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,yBAAyB,OAAA,CAAQ,uBAAA;AAAA,IACjC,eAAe,OAAA,CAAQ;AAAA,GACxB,CAAA;AACH;ACzBA,eAAsB,qBAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAiB,aAAA,GAAgB,MAAK,GAAI,OAAA;AAC7D,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAU,SAAS,CAAA;AAGzB,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA,WAAA,CAAA;AACxD,IAAA,MAAM,QAAA,GAAWJ,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,UAAA,EAAY,eAAA,EAAiB,aAAa,CAAA;AACpF,IAAA,MAAM,SAAA,CAAU,UAAU,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,WAAA,CAAA;AACpD,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAA;AAC5E,IAAA,MAAM,SAAA,CAAU,UAAU,OAAO,CAAA;AACjC,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,yBAAA,CACP,UAAA,EACA,eAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,GAAI,SAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA;AACpD,EAAA,MAAM,WAAW,UAAA,CAAW,UAAA;AAC5B,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,GAAO,YAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,OAAO,QAAA,GAAW,QAAA;AAGjC,EAAA,MAAM,OAAA,GAAU,UAAU,UAAA,CAAW,UAAA;AACrC,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAgB,GAAI,UAAA;AAGvC,EAAA,MAAM,YAAA,GAAe,YAAY,gDAAA,GAAmD,EAAA;AACpF,EAAA,MAAM,YAAA,GAAe,kBAAkB,oEAAA,GAAuE,EAAA;AAE9G,EAAA,MAAM,mBAAmB,OAAA,GAAU;AAAA;AAAA,YAAA,EAEvB,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA,qBAAA,EAGd,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAME,YAAY,+BAAA,GAAkC,EAAE,CAAA,EAAG,eAAA,GAAkB,kCAAkC,EAAE;AAAA;;AAAA;AAAA;AAAA,CAAA,GAKtI,EAAA;AAEF,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,WAAW,WAAW,CAAA;AAAA,GAAA,EACtB,UAAA,CAAW,eAAe,EAAE;AAAA;AAAA,mBAAA,EAEZ,aAAa;AAAA;;AAAA;;AAAA,sBAAA,EAKV,eAAe,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,EAAM,QAAQ,KAAK,QAAQ,CAAA;AAAA,sBAAA,EAClE,eAAe,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,EAAM,QAAQ,YAAY,QAAQ,CAAA;AAAA,sBAAA,EACzE,eAAe,CAAA;AAAA,EACrC,SAAA,GAAY,yDAAyD,EAAE;;AAAA;AAAA;AAAA,cAAA,EAIzD,QAAQ,CAAA;AAAA;AAAA;AAAA,wEAAA,EAGkD,YAAY,GAAG,YAAY;AAAA;;AAAA;AAAA;AAAA,wEAAA,EAK3B,YAAY,GAAG,YAAY;AAAA;;AAAA,wCAAA,EAG3D,QAAQ,CAAA;AAAA,MAAA,EAC1C,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,4BAA4B,QAAQ,CAAA;;AAAA,aAAA,EAEjE,WAAW,CAAA;AAAA;AAAA,mBAAA,EAEL,WAAW,UAAU;AAAA;AAAA,8BAAA,EAEV,QAAQ,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGX,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,iCAAA,EAI9B,YAAY,iCAAA,GAAoC,EAAE,CAAA,EAAG,eAAA,GAAkB,oCAAoC,EAAE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAUhI,WAAW,UAAU,CAAA;AAAA;AAAA,uBAAA,EAEZ,QAAQ,CAAA;AAAA;AAAA;AAAA,eAAA,EAGhB,QAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,cAAA,EAoBT,UAAA,CAAW,YAAY,CAAA,IAAA,EAAO,OAAO;AAAA,aAAA,EACtC,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA;AAAA;AAAA,uBAAA,EAEzB,QAAQ,CAAA;AAAA;AAAA,gBAAA,EAEf,OAAO,CAAA;AAAA;AAAA,6BAAA,EAEM,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,sBAAsB,OAAO,CAAA;AAAA,mCAAA,EAC3D,YAAY,mCAAA,GAAsC,EAAE,CAAA,EAAG,eAAA,GAAkB,sCAAsC,EAAE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWpJ,gBAAgB;AAAA;AAAA,kBAAA,EAEE,WAAW,YAAY;AAAA,qBAAA,EACpB,QAAQ,CAAA;AAAA,uBAAA,EACN,QAAQ,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGJ,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAKjD,WAAW,YAAY;AAAA,aAAA,EACxB,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA;AAAA,qBAAA,EAC3B,QAAQ,CAAA;AAAA,uBAAA,EACN,QAAQ,CAAA;AAAA;AAAA,eAAA,EAEhB,OAAO,CAAA;AAAA,2BAAA,EACK,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,qBAAqB,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAK7E,WAAW,YAAY;AAAA,aAAA,EACxB,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,EAAU,OAAO,CAAA;AAAA;AAAA;AAAA,eAAA,EAGjC,OAAO,CAAA;AAAA,UAAA,EACZ,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,qBAAqB,OAAO,CAAA;AAAA;;AAAA;AAAA,WAAA,EAI/D,WAAW,UAAU;AAAA,aAAA,EACnB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAavB;AAKA,SAAS,qBAAA,CACP,MAAA,EACA,eAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,YAAY,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA,GAAI,SAAA;AACvD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AAChD,EAAA,MAAM,WAAW,MAAA,CAAO,YAAA;AAGxB,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAgB,GAAI,MAAA;AAGvC,EAAA,MAAM,YAAA,GAAe,YAAY,gDAAA,GAAmD,EAAA;AACpF,EAAA,MAAM,YAAA,GAAe,kBAAkB,oEAAA,GAAuE,EAAA;AAE9G,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,OAAO,WAAW,CAAA;AAAA,GAAA,EAClB,MAAA,CAAO,eAAe,EAAE;AAAA;AAAA,mBAAA,EAER,aAAa;AAAA;;AAAA;;AAAA,sBAAA,EAKV,eAAe,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,EAAM,QAAQ,KAAK,QAAQ,CAAA;AAAA,EACxF,SAAA,GAAY,yDAAyD,EAAE;;AAAA;AAAA;AAAA,wEAAA,EAIC,YAAY,GAAG,YAAY;AAAA;;AAAA,oCAAA,EAG/D,QAAQ,CAAA;AAAA,MAAA,EACtC,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,oBAAoB,QAAQ,CAAA;;AAAA,aAAA,EAErD,WAAW,CAAA;AAAA;AAAA,SAAA,EAEf,OAAO,WAAW;AAAA;AAAA,uBAAA,EAEJ,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAIF,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,mCAAA,EAC1B,YAAY,mCAAA,GAAsC,EAAE,CAAA,EAAG,eAAA,GAAkB,sCAAsC,EAAE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EAaxI,OAAO,WAAW;AAAA,qBAAA,EACT,QAAQ,CAAA;AAAA,uBAAA,EACN,QAAQ,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGJ,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EAK/C,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA,UAAA,EAIpB,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA;AAI5C;;;ACjSA,eAAsB,gBAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,YAAA;AAE7C,EAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,IAAA,OAAO,sBAAsB,MAAA,EAAQ;AAAA,MACnC,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,MACzB,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,0BAAA,CAA2B,QAAQ,OAAO,CAAA;AACnD;AAKA,eAAe,0BAAA,CACb,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAiB,aAAA,GAAgB,MAAK,GAAI,OAAA;AAC7D,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAU,SAAS,CAAA;AAGzB,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA,WAAA,CAAA;AACxD,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAUK,0BAAAA,CAA0B,UAAA,EAAY,eAAA,EAAiB,aAAa,CAAA;AACpF,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,WAAA,CAAA;AACpD,IAAA,MAAM,QAAA,GAAWL,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAUM,sBAAAA,CAAsB,MAAA,EAAQ,eAAA,EAAiB,aAAa,CAAA;AAC5E,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAKA,SAASD,0BAAAA,CAA0B,UAAA,EAA4B,eAAA,EAAyB,aAAA,EAAsC;AAC5H,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,YAAY,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,GAAI,SAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA;AACpD,EAAA,MAAM,WAAW,UAAA,CAAW,UAAA;AAC5B,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAG/B,EAAA,MAAM,OAAA,GAAU,OAAO,YAAA,GAAe,oBAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,GAAO,YAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,OACf,kDAAA,GACA,iEAAA;AAGJ,EAAA,MAAM,OAAA,GAAU,UAAU,UAAA,CAAW,UAAA;AACrC,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAgB,GAAI,UAAA;AAGvC,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,uCAAA,CAAA;AAAA,IACA,iBAAiB,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,gBAAA,EAAmB,eAAe,gBAAgB,QAAQ,CAAA,EAAA,CAAA;AAAA,IAChG,0CAA0C,eAAe,CAAA,QAAA;AAAA,GAC3D;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,qBAAA,GAAkC;AAAA,IACtC,eAAe,QAAQ,CAAA,QAAA,CAAA;AAAA,IACvB,CAAA,gBAAA,CAAA;AAAA,IACA,CAAA,sDAAA,CAAA;AAAA,IACA,CAAA,kBAAA,CAAA;AAAA,IACA,CAAA,iEAAA,CAAA;AAAA,IACA,CAAA,sBAAA,CAAA;AAAA,IACA,CAAA,4DAAA,CAAA;AAAA,IACA,CAAA,mBAAA,CAAA;AAAA,IACA,CAAA,6DAAA,CAAA;AAAA,IACA,CAAA,mBAAA,CAAA;AAAA,IACA,CAAA,IAAA,CAAA;AAAA,IACA,CAAA,2BAAA,CAAA;AAAA,IACA,CAAA,yDAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,qBAAA,CAAsB,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,qBAAA,CAAsB,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,oBAAA,GAAiC;AAAA,IACrC,CAAA,yDAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,oBAAA,CAAqB,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,oBAAA,CAAqB,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,UAAA,GAAuB;AAAA,IAC3B,CAAA,+BAAA,CAAA;AAAA,IACA,CAAA,qCAAA,CAAA;AAAA,IACA,CAAA,yBAAA,CAAA;AAAA,IACA,CAAA,iCAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,aAAA,GAA0B;AAAA,IAC9B,CAAA,mCAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,aAAA,CAAc,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,aAAA,CAAc,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACtD;AAGA,EAAA,MAAM,gBAAA,GAA6B;AAAA,IACjC,CAAA,iCAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,gBAAA,CAAiB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,gBAAA,CAAiB,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,WAAW,WAAW,CAAA;AAAA,GAAA,EACtB,UAAA,CAAW,eAAe,EAAE;AAAA;AAAA,mBAAA,EAEZ,aAAa;AAAA;;AAAA,EAGhC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAGlB,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA,EAIhC,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA,MAAA,EAIzB,YAAY,UAAA,CAAW,YAAY,CAAC,CAAA,wBAAA,EAA2B,QAAQ,MAAM,QAAQ,CAAA;;AAAA,aAAA,EAE9E,WAAW,CAAA;AAAA;AAAA,mBAAA,EAEL,WAAW,UAAU;AAAA;AAAA,iEAAA,EAEyB,QAAQ,CAAA;AAAA,2BAAA,EAC9C,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA,EAC/D,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAUP,WAAW,UAAU,CAAA;AAAA;AAAA,4EAAA,EAEyC,QAAQ,CAAA;AAAA,oBAAA,EAChE,QAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,cAAA,EAmBd,UAAA,CAAW,YAAY,CAAA,IAAA,EAAO,MAAM;AAAA;AAAA,gBAAA,EAElC,OAAO,4CAA4C,QAAQ,CAAA;AAAA;AAAA,6BAAA,EAE9C,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,sBAAsB,MAAM,CAAA;AAAA,EAC7F,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYxB,OAAA,GAAU;AAAA;AAAA,cAAA,EAEI,WAAW,YAAY,CAAA;AAAA;AAAA,wEAAA,EAEmC,QAAQ,CAAA;AAAA;AAAA,0CAAA,EAEtC,QAAQ,CAAA;AAAA;AAAA,EAElD,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA,CAAA,GAKzB,EAAE;AAAA;AAAA,kBAAA,EAEc,WAAW,YAAY;AAAA;AAAA,kCAAA,EAEP,QAAQ,CAAA,EAAA,EAAK,UAAU,CAAA,aAAA,EAAgB,QAAQ,CAAA;AAAA,2BAAA,EACtD,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAKjD,WAAW,YAAY;AAAA;AAAA,eAAA,EAEtB,OAAO,CAAA,qBAAA,EAAwB,QAAQ,CAAA,EAAA,EAAK,UAAU,gBAAgB,QAAQ,CAAA;AAAA,2BAAA,EAClE,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,qBAAqB,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAK5E,WAAW,YAAY;AAAA;AAAA,eAAA,EAEtB,OAAO,CAAA;AAAA,UAAA,EACZ,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,qBAAqB,MAAM,CAAA;AAAA;;AAAA;AAAA,WAAA,EAI9D,WAAW,UAAU;AAAA;AAAA,wBAAA,EAER,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAUlC;AAKA,SAASC,sBAAAA,CAAsB,MAAA,EAAoB,eAAA,EAAyB,aAAA,EAAsC;AAChH,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,MAAA,CAAO,YAAY,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA,GAAI,SAAA;AACvD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AAChD,EAAA,MAAM,WAAW,MAAA,CAAO,YAAA;AACxB,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAG/B,EAAA,MAAM,UAAA,GAAa,OACf,kCAAA,GACA,iDAAA;AAGJ,EAAA,MAAM,EAAE,SAAA,EAAW,eAAA,EAAgB,GAAI,MAAA;AAGvC,EAAA,MAAM,OAAA,GAAoB;AAAA,IACxB,CAAA,mCAAA,CAAA;AAAA,IACA,CAAA,cAAA,EAAiB,QAAQ,CAAA,SAAA,EAAY,eAAe,gBAAgB,QAAQ,CAAA,EAAA;AAAA,GAC9E;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAA,CAAQ,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,iBAAA,GAA8B;AAAA,IAClC,CAAA,yDAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,iBAAA,CAAkB,KAAK,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,iBAAA,CAAkB,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,UAAA,GAAuB;AAAA,IAC3B,CAAA,mCAAA;AAAA,GACF;AACA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,UAAA,CAAW,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,UAAA,CAAW,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,OAAO,WAAW,CAAA;AAAA,GAAA,EAClB,MAAA,CAAO,eAAe,EAAE;AAAA;AAAA,mBAAA,EAER,aAAa;AAAA;;AAAA,EAGhC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAGlB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA,MAAA,EAItB,YAAY,MAAA,CAAO,YAAY,CAAC,CAAA,gBAAA,EAAmB,QAAQ,MAAM,QAAQ,CAAA;;AAAA,aAAA,EAElE,WAAW,CAAA;AAAA;AAAA,SAAA,EAEf,OAAO,WAAW;AAAA;AAAA,iDAAA,EAEsB,QAAQ,CAAA;AAAA;AAAA,6BAAA,EAE5B,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,EAC7D,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EAaT,OAAO,WAAW;AAAA;AAAA,kCAAA,EAEI,QAAQ,CAAA,EAAA,EAAK,UAAU,CAAA,aAAA,EAAgB,QAAQ,CAAA;AAAA,2BAAA,EACtD,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EAK/C,OAAO,WAAW;AAAA;AAAA;AAAA,UAAA,EAGpB,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA;AAAA;AAAA,CAAA;AAI5C;;;ACzQO,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAUT;;;AC1FA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,IAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKM,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,OAAO,aAAA,CAAc,IAAI,SAAS,CAAA;AACpC;AAKO,SAAS,uBAAA,CACd,IAAA,EACA,OAAA,GAA4B,EAAC,EACT;AACpB,EAAA,MAAM,EAAE,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AAG7B,EAAA,IAAI,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AAG1C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,YAAY,kBAAA,EAAmB;AAAA,EAClE;AAKA,EAAA,IAAI,QAAA,IAAY,CAAC,IAAA,CAAK,QAAA,EAAU;AAC9B,IAAA,MAAA,GAAS,GAAG,MAAM,CAAA,WAAA,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,YAAY,MAAA,IAAa,IAAA,CAAK,YAAY,IAAA,EAAM;AACpE,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,KAAK,IAAI,CAAA;AAC/D,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,YAAY,CAAA,CAAA,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAC/B;AAKA,SAAS,eAAA,CAAgB,MAAiB,OAAA,EAA0C;AAClF,EAAA,QAAQ,KAAK,IAAA;AAAM;AAAA,IAEjB,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,kBAAkB,IAAuB,CAAA;AAAA,IAElD,KAAK,OAAA;AACH,MAAA,OAAO,iBAAiB,IAAuB,CAAA;AAAA,IAEjD,KAAK,UAAA;AACH,MAAA,OAAO,oBAAoB,IAAuB,CAAA;AAAA;AAAA;AAAA,IAIpD,KAAK,QAAA;AACH,MAAA,OAAO,sBAAA,EAAuB;AAAA;AAAA,IAGhC,KAAK,SAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,OAAO,mBAAmB,IAAuB,CAAA;AAAA,IAEnD,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,iBAAiB,IAAuB,CAAA;AAAA;AAAA,IAGjD,KAAK,SAAA;AACH,MAAA,OAAO,aAAA;AAAA;AAAA,IAGT,KAAK,MAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IAET,KAAK,MAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IAET,KAAK,UAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,OAAO,uCAAA;AAAA;AAAA,IAGT,KAAK,MAAA;AACH,MAAA,OAAO,uBAAA;AAAA;AAAA,IAGT,KAAK,aAAA;AACH,MAAA,OAAO,gBAAgB,IAA4B,CAAA;AAAA;AAAA,IAGrD,KAAK,OAAA;AACH,MAAA,OAAO,iBAAiB,IAAsB,CAAA;AAAA;AAAA,IAGhD,KAAK,UAAA;AACH,MAAA,OAAO,mBAAA,CAAoB,MAA2B,OAAO,CAAA;AAAA;AAAA,IAG/D,KAAK,WAAA;AACH,MAAA,OAAO,oBAAA,CAAqB,MAA4B,OAAO,CAAA;AAAA;AAAA,IAGjE,KAAK,aAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,MAA8B,OAAO,CAAA;AAAA,IAErE;AACE,MAAA,OAAO,aAAA;AAAA;AAEb;AAKA,SAAS,kBAAkB,IAAA,EAA+B;AACxD,EAAA,MAAM,KAAA,GAAkB,CAAC,YAAY,CAAA;AAErC,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,KAAK,KAAA,EAAO;AAEd,IAAA,MAAM,YAAA,GAAe,KAAK,KAAA,CAAM,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC1E,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,YAAY,CAAA,GAAA,CAAK,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAKA,SAAS,iBAAiB,IAAA,EAA+B;AACvD,EAAA,IAAI,MAAA,GAAS,oBAAA;AAEb,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,MAAA,IAAU,CAAA,KAAA,EAAQ,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,MAAA,IAAU,CAAA,KAAA,EAAQ,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,oBAAoB,IAAA,EAA+B;AAC1D,EAAA,IAAI,MAAA,GAAS,YAAA;AAGb,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AACpC,EAAA,MAAA,IAAU,QAAQ,SAAS,CAAA,CAAA,CAAA;AAE3B,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,MAAA,IAAU,CAAA,KAAA,EAAQ,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAmB,IAAA,EAA+B;AACzD,EAAA,MAAM,KAAA,GAAkB,CAAC,kBAAkB,CAAA;AAE3C,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAKA,SAAS,iBAAiB,IAAA,EAA+B;AACvD,EAAA,MAAM,KAAA,GAAkB,CAAC,YAAY,CAAA;AAErC,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAW;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAKA,SAAS,gBAAgB,IAAA,EAAoC;AAC3D,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACxC,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,EAAA,OAAO,WAAW,UAAU,CAAA,EAAA,CAAA;AAC9B;AAqBA,SAAS,iBAAiB,IAAA,EAA8B;AACtD,EAAA,IAAI,KAAK,QAAA,EAAU;AAGjB,IAAA,OAAO,kDAAA;AAAA,EACT;AAEA,EAAA,OAAO,wCAAA;AACT;AAkEA,SAAS,mBAAA,CAAoB,IAAA,EAAyB,OAAA,GAA4B,EAAC,EAAW;AAC5F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,KAAa,WAAA,IAAe,KAAK,QAAA,KAAa,YAAA;AAClE,EAAA,MAAM,IAAA,GAAO,QAAQ,aAAA,KAAkB,IAAA;AACvC,EAAA,MAAM,WAAA,GAAc,QAAQ,oBAAA,IAAwB,IAAA;AAIpD,EAAA,MAAM,QAAA,GAAW,OAAO,YAAA,GAAe,6BAAA;AAEvC,EAAA,IAAI,WAAA,EAAa;AAEf,IAAA,MAAM,cAAA,GAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,CAAA;AAQvB,IAAA,MAAM,kBAAA,GAAqB,CAAA;AAAA,gBAAA,EACb,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAMV,cAAc,CAAA;AAAA,IAAA,CAAA;AAK1B,IAAA,MAAM,cAAA,GAAiB,CAAA,SAAA,EAAY,QAAQ,CAAA,EAAA,EAAK,kBAAkB,CAAA,EAAA,CAAA;AAGlE,IAAA,MAAM,oBAAA,GAAuB,CAAA;AAAA,IAAA,EAC3B,QAAQ,CAAA;AAAA;AAAA,kBAAA,EAEM,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQxB,IAAA,OAAO,CAAA;AAAA;AAAA,UAAA,EAEC,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,EAIG,cAAc,CAAA;AAAA;AAAA,wBAAA,EAEX,oBAAoB,CAAA;AAAA;AAAA,iBAAA,EAE3B,cAAc,CAAA;AAAA;AAAA,aAAA,CAAA;AAAA,EAG/B;AAGA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,WAAW,QAAQ,CAAA,aAAA,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,GAAG,QAAQ,CAAA,WAAA,CAAA;AACpB;AAQA,SAAS,oBAAA,CAAqB,IAAA,EAA0B,OAAA,GAA4B,EAAC,EAAW;AAC9F,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,oBAAA,EAAsB,GAAA,CAAI,KAAK,SAAS,CAAA;AAEnE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAO,WAAW,UAAU,CAAA,CAAA,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,GAAG,UAAU,CAAA,WAAA,CAAA;AAAA,EACtB;AAGA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,OAAO,gCAAA;AAAA,EACT;AACA,EAAA,OAAO,kCAAA;AACT;AASA,SAAS,sBAAA,CAAuB,IAAA,EAA4B,OAAA,GAA4B,EAAC,EAAW;AAClG,EAAA,IAAI,QAAQ,oBAAA,IAAwB,IAAA,CAAK,cAAc,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AACjF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAClB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,oBAAA,CAAsB,GAAA,CAAI,GAAG,CAAA;AACxD,MAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,MAAA,OAAO,CAAA,EAAG,UAAU,CAAA,kCAAA,EAAqC,GAAG,CAAA,KAAA,CAAA;AAAA,IAC9D,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAEjB,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAO,CAAA;AAAA;AAAA,IAAA,EAA0D,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA;AAAA,CAAA,CAAA;AAAA,IAC1F;AAAA,EACF;AAGA,EAAA,OAAO,gCAAA;AACT;AAKA,SAAS,kBAAA,CAAmB,OAAgB,IAAA,EAA6B;AACvE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,UAAU,QAAA,GAAW,CAAA,CAAA,EAAI,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,IAEzE,KAAK,SAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,IAErD,KAAK,SAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AAAA,IAEtD,KAAK,aAAA;AACH,MAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,IAEpD;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAKO,SAAS,uBAAA,CACd,UAAA,EACA,OAAA,GAA4B,EAAC,EAC+C;AAC5E,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,gBAAyD,EAAC;AAEhE,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAErD,IAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,iBAAiB,CAAA;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,IAAA,EAAM,OAAO,CAAA;AAEpD,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,aAAA,CAAc,KAAK,EAAE,IAAA,EAAM,QAAQ,MAAA,CAAO,UAAA,IAAc,WAAW,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA,EAAe,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,EAAA,CAAA;AAE/C,EAAA,OAAO,EAAE,QAAQ,aAAA,EAAc;AACjC;;;AChiBO,SAAS,wBAAwB,YAAA,EAAsC;AAC5E,EAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAG1B,EAAA,MAAM,QAAQ,YAAA,CAAa,OAAA,CAAQ,UAAU,EAAE,CAAA,CAAE,MAAM,QAAQ,CAAA;AAC/D,EAAA,MAAM,eAAe,KAAA,GAAQ,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAEtD,EAAA,OAAO,YAAA,KAAiB,QAAQ,YAAA,IAAgB,CAAA;AAClD;AAKA,eAAsB,oBAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,SAAA,EAAW,kBAAA,EAAoB,gBAAgB,IAAA,EAAM,eAAA,GAAkB,MAAK,GAAI,OAAA;AACxF,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAU,SAAS,CAAA;AAGzB,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA,GAAA,CAAA;AACxD,IAAA,MAAM,QAAA,GAAWN,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,UAAA,EAAY,kBAAA,EAAoB,eAAe,eAAe,CAAA;AACxG,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA,GAAA,CAAA;AACpD,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,MAAA,EAAQ,kBAAA,EAAoB,eAAe,CAAA;AACjF,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,IAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,yBAAA,CACP,UAAA,EACA,kBAAA,EACA,aAAA,EACA,kBAA2B,KAAA,EACnB;AACR,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,GAAI,SAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA;AACpD,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAG/B,EAAA,MAAM,aAAA,GAAgB,OAAO,6BAAA,GAAgC,mBAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,OAAO,IAAA,GAAO,YAAA;AAClC,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,GAAO,YAAA;AAGhC,EAAA,MAAM,OAAA,GAAU,UAAU,UAAA,CAAW,UAAA;AAGrC,EAAA,IAAI,gBAAA,GAAmB,uBAAA;AACvB,EAAA,IAAI,gBAAA,GAAmB,uBAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,EAAA;AAExB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,eAAe,uBAAA,CAAwB,UAAA,CAAW,YAAY,EAAE,QAAA,EAAU,OAAO,CAAA;AACvF,IAAA,MAAM,eAAe,uBAAA,CAAwB,UAAA,CAAW,YAAY,EAAE,QAAA,EAAU,MAAM,CAAA;AAEtF,IAAA,iBAAA,GAAoB;AAAA;AAAA,qBAAA,EAED,WAAW,WAAW;AAAA;AAAA,qBAAA,EAEtB,aAAa,MAAM,CAAA;;AAAA;AAAA,qBAAA,EAGnB,WAAW,WAAW;AAAA;AAAA,qBAAA,EAEtB,aAAa,MAAM,CAAA;AAAA,CAAA;AAEtC,IAAA,gBAAA,GAAmB,cAAA;AACnB,IAAA,gBAAA,GAAmB,cAAA;AAAA,EACrB;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,WAAW,WAAW,CAAA;AAAA,GAAA,EACtB,UAAA,CAAW,eAAe,EAAE;AAAA;AAAA;AAAA,mBAAA,EAGZ,aAAa;AAAA;;AAAA;AAAA;AAAA,SAAA,EAKvB,WAAW,CAAA,SAAA,EAAY,kBAAkB,CAAA,CAAA,EAAI,QAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9D,iBAAiB;;AAAA;AAAA,GAAA,EAGd,WAAW,WAAW,CAAA;AAAA;AAAA,aAAA,EAEZ,WAAW,CAAA;AAAA;AAAA,aAAA,EAEX,WAAW,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EASL,WAAW,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EASqC,WAAW,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,kBAAA,EAOhF,UAAA,CAAW,YAAY,CAAA,IAAA,EAAO,SAAS;AAAA;AAAA;AAAA;AAAA,MAAA,EAInD,WAAW,KAAK,aAAa,CAAA;AAAA;AAAA;AAAA,sBAAA,EAGb,WAAW,CAAA;AAAA;AAAA,6BAAA,EAEJ,WAAW,YAAY,WAAW,CAAA;;AAAA;AAAA;AAAA;AAAA,sBAAA,EAKzC,WAAW,WAAW,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EASiC,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpG,OAAA,GAAU;AAAA;AAAA,kBAAA,EAEQ,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EASZ,WAAW,CAAA;;AAAA;AAAA;AAAA;AAAA,sBAAA,EAKlB,WAAW,WAAW,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EASiC,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,GAKlG,EAAE;AAAA;AAAA,kBAAA,EAEc,WAAW,YAAY;AAAA;AAAA;AAAA;AAAA,YAAA,EAI7B,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAIC,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAKsC,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAOvF,WAAW,YAAY;AAAA;AAAA;AAAA;AAAA,MAAA,EAI/B,WAAW,KAAK,aAAa,CAAA;AAAA,YAAA,EACvB,gBAAgB,CAAA;AAAA;AAAA,sBAAA,EAEN,WAAW,CAAA;AAAA;AAAA,6BAAA,EAEJ,WAAW,WAAW,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAKgB,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,cAAA,EAOvF,WAAW,YAAY;AAAA;AAAA;AAAA;AAAA,MAAA,EAI/B,WAAW,KAAK,aAAa,CAAA;AAAA;AAAA,sBAAA,EAEb,WAAW,CAAA;AAAA;AAAA,cAAA,EAEnB,WAAW,WAAW,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAK+B,WAAW,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,WAAA,EAO1F,WAAW,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAQJ,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EAKsC,WAAW,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOpG;AAKA,SAAS,qBAAA,CACP,MAAA,EACA,kBAAA,EACA,eAAA,GAA2B,KAAA,EACnB;AACR,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA,GAAI,SAAA;AACvD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,CAAO,YAAY,CAAA;AAGhD,EAAA,IAAI,gBAAA,GAAmB,uBAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,EAAA;AAExB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,eAAe,uBAAA,CAAwB,MAAA,CAAO,YAAY,EAAE,QAAA,EAAU,MAAM,CAAA;AAElF,IAAA,iBAAA,GAAoB;AAAA;AAAA,qBAAA,EAED,OAAO,WAAW;AAAA;AAAA,qBAAA,EAElB,aAAa,MAAM,CAAA;AAAA,CAAA;AAEtC,IAAA,gBAAA,GAAmB,cAAA;AAAA,EACrB;AAEA,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,OAAO,WAAW,CAAA;AAAA,GAAA,EAClB,MAAA,CAAO,eAAe,EAAE;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,SAAA,EAOlB,WAAW,CAAA,SAAA,EAAY,kBAAkB,CAAA,CAAA,EAAI,QAAQ,CAAA;AAAA,EAC9D,iBAAiB;AAAA;AAAA,GAAA,EAEd,OAAO,WAAW,CAAA;AAAA;AAAA,aAAA,EAER,WAAW,CAAA;AAAA;AAAA,SAAA,EAEf,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAQE,WAAW,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,sBAAA,EAOlB,OAAO,WAAW,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAAA,EASqC,OAAO,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,YAAA,EAOpF,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA,YAAA,EAIlB,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAIC,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8EAAA,EAKsC,OAAO,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOnG;;;AC/XA,eAAsB,eAAA,CACpB,QACA,OAAA,EACmB;AACnB,EAAA,OAAO,qBAAqB,MAAA,EAAQ;AAAA,IAClC,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,IAC5B,eAAe,OAAA,CAAQ;AAAA,GACxB,CAAA;AACH;ACpBA,eAAsB,eACpB,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,SAAA,EAAW,aAAA,GAAgB,IAAA,EAAM,SAAA,GAAY,QAAO,GAAI,OAAA;AAChE,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,aAAA,EAAe,SAAS,CAAA;AAC3D,EAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,EAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAE5B,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,kBAAA,CAAmB,eAA4B,SAAA,EAA2B;AACjF,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,qBAAqB,SAAS,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,qBAAqB,SAAS,CAAA;AACvC;AAKA,SAAS,qBAAqB,SAAA,EAA2B;AAEvD,EAAA,MAAM,mBAAmB,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,GAAI,YAAY,GAAA,GAAM,SAAA;AAEvE,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,qGAAA,EAW8F,gBAAgB,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoJvH;AAKA,SAAS,qBAAqB,SAAA,EAA2B;AAEvD,EAAA,MAAM,mBAAmB,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,GAAI,YAAY,GAAA,GAAM,SAAA;AAEvE,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,qGAAA,EAW8F,gBAAgB,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAqMvH;AC5ZA,eAAsB,eAAA,CACpB,SACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,WAAU,GAAI,OAAA;AACtB,EAAA,MAAM,iBAA2B,EAAC;AAElC,EAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,oBAAoB,OAAO,CAAA;AAC3C,EAAA,MAAM,SAAA,CAAU,QAAA,EAAU,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACnD,EAAA,cAAA,CAAe,KAAK,QAAQ,CAAA;AAE5B,EAAA,OAAO,cAAA;AACT;AAKA,SAAS,oBAAoB,OAAA,EAAiC;AAC5D,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAAA,EAeT;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG,IAAA,IAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,IAAQ,IAAA;AAClF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,KAAK,CAAA;AAE7E,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,wBAAA,EAQiB,WAAW,CAAA;;AAAA;AAAA;AAAA;AAAA,qBAAA,EAKd,WAAW,CAAA;;AAAA;AAAA;AAAA;AAAA,sCAAA,EAKM,aAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnD,WAAW;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBb;ACfA,eAAsB,iBAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAgB,EAAC;AAAA,IACjB,uBAAA,GAA0B,KAAA;AAAA,IAC1B,aAAA,GAAgB,IAAA;AAAA,IAChB,SAAA,GAAY,MAAA;AAAA,IACZ,YAAA,GAAe,YAAA;AAAA,IACf,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,iBAA2B,EAAC;AAGlC,EAAA,MAAM,iBAAA,GAAoB,cAAc,iBAAA,IAAqB,KAAA;AAG7D,EAAA,MAAM,MAAA,GAAS,YAAA,KAAiB,OAAA,IAAW,UAAA,KAAe,KAAA;AAG1D,EAAA,MAAM,GAAA,GAAM,YAAA,KAAiB,OAAA,GAAU,IAAA,GAAO,IAAA;AAI9C,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,OAAA,IAAY,YAAA,KAAiB,YAAA;AAG9D,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,aAAa,CAAC,CAAA;AACnD,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,SAAS,CAAC,CAAA;AAC/C,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAC,CAAA;AAClD,EAAA,MAAM,SAAA,CAAUA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAC,CAAA;AAG9C,EAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAG/C,EAAA,MAAM,YAAYA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,YAAA,KAAiB,OAAA,GAClC,yBAAA,CAA0B,uBAAA,EAAyB,eAAe,MAAM,CAAA,GACxEC,qBAAAA,CAAqB,uBAAA,EAAyB,aAAa,CAAA;AAC/D,EAAA,MAAM,SAAA,CAAU,SAAA,EAAW,MAAM,UAAA,CAAW,YAAY,CAAC,CAAA;AACzD,EAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAG7B,EAAA,MAAM,aAAaD,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AACvD,EAAA,MAAM,aAAA,GAAgB,YAAA,KAAiB,OAAA,GACnC,mBAAA,CAAoB,aAAA,EAAe,WAAW,MAAM,CAAA,GACpDO,eAAAA,CAAe,aAAA,EAAe,SAAS,CAAA;AAC3C,EAAA,MAAM,SAAA,CAAU,UAAA,EAAY,MAAM,UAAA,CAAW,aAAa,CAAC,CAAA;AAC3D,EAAA,cAAA,CAAe,KAAK,UAAU,CAAA;AAG9B,EAAA,MAAM,cAAcP,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AACzD,EAAA,MAAM,cAAA,GAAiB,iBAAiB,OAAA,GACpC,wBAAA,CAAyB,SAAS,MAAM,CAAA,GACxCQ,qBAAoB,OAAO,CAAA;AAC/B,EAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAC7D,EAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAG/B,EAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,IAAA,MAAM,mBAAmBR,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AACpE,IAAA,MAAM,sBAAsB,YAAA,KAAiB,OAAA,GACzC,yBAAA,CAA0B,MAAM,IAChC,sBAAA,EAAuB;AAC3B,IAAA,MAAM,SAAA,CAAU,gBAAA,EAAkB,MAAM,UAAA,CAAW,mBAAmB,CAAC,CAAA;AACvE,IAAA,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAGpC,IAAA,IAAI,QAAA,CAAS,OAAA,IAAW,YAAA,KAAiB,YAAA,EAAc;AACrD,MAAA,MAAM,gBAAA,GAAmBA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,kBAAkB,CAAA;AAChE,MAAA,MAAM,sBAAsB,sBAAA,EAAuB;AACnD,MAAA,MAAM,SAAA,CAAU,gBAAA,EAAkB,MAAM,UAAA,CAAW,mBAAmB,CAAC,CAAA;AACvE,MAAA,cAAA,CAAe,KAAK,gBAAgB,CAAA;AAAA,IACtC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,UAAA,IAAc,OAAO,WAAA,EAAa;AAC3C,IAAA,MAAM,UAAA,GAAaA,MAAK,IAAA,CAAK,SAAA,EAAW,eAAe,WAAA,CAAY,UAAA,CAAW,YAAY,CAAC,CAAA;AAC3F,IAAA,MAAM,UAAU,UAAU,CAAA;AAE1B,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,YAAYA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,GAC7B,4BAAA,CAA6B,UAAA,EAAY,QAAQ,MAAM,CAAA,GACvD,uBAAA,CAAwB,UAAA,EAAY,MAAM,CAAA;AAC9C,MAAA,MAAM,SAAA,CAAU,SAAA,EAAW,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACpD,MAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,UAAA,EAAY,MAAA,EAAQ,eAAe,iBAAiB,CAAA;AACrG,MAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAC7D,MAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,GAC7B,8BAAA,CAA+B,UAAA,EAAY,eAAe,MAAM,CAAA,GAChEK,0BAAAA,CAA0B,UAAA,EAAY,aAAa,CAAA;AACvD,MAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACtD,MAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,cAAcL,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAiBS,2BAA0B,UAAA,EAAY;AAAA,QAC3D,aAAA;AAAA,QACA,kBAAA,EAAoB,eAAA;AAAA,QACpB,iBAAiB,UAAA,CAAW;AAAA,OAC7B,CAAA;AACD,MAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAC7D,MAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,MAAM,UAAA,GAAaT,MAAK,IAAA,CAAK,SAAA,EAAW,WAAW,WAAA,CAAY,MAAA,CAAO,YAAY,CAAC,CAAA;AACnF,IAAA,MAAM,UAAU,UAAU,CAAA;AAE1B,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,YAAYA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,GAC7B,wBAAA,CAAyB,MAAA,EAAQ,QAAQ,MAAM,CAAA,GAC/C,mBAAA,CAAoB,MAAA,EAAQ,MAAM,CAAA;AACtC,MAAA,MAAM,SAAA,CAAU,SAAA,EAAW,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACpD,MAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAA,EAAQ,MAAA,EAAQ,eAAe,iBAAiB,CAAA;AAC7F,MAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,cAAc,CAAC,CAAA;AAC7D,MAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,cAAcA,KAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,GAC7B,0BAAA,CAA2B,MAAA,EAAQ,eAAe,MAAM,CAAA,GACxDM,sBAAAA,CAAsB,MAAA,EAAQ,aAAa,CAAA;AAC/C,MAAA,MAAM,SAAA,CAAU,WAAA,EAAa,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACtD,MAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,IAAA,MAAM,aAAA,GAAgBN,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAA,EAAc,CAAA,EAAG,WAAA,CAAY,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAChG,IAAA,MAAM,OAAA,GAAU,YAAA,KAAiB,OAAA,GAC7B,2BAAA,CAA4B,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA,GACrD,sBAAA,CAAuB,SAAA,EAAW,MAAA,EAAQ,eAAA,EAAiB,eAAe,iBAAiB,CAAA;AAC/F,IAAA,MAAM,SAAA,CAAU,aAAA,EAAe,MAAM,UAAA,CAAW,OAAO,CAAC,CAAA;AACxD,IAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,cAAA;AACT;AAMA,SAASC,qBAAAA,CAAqB,yBAAkC,aAAA,EAAoC;AAClG,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,MAAM,oBAAoB,IAAA,GACtB,CAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,CAAA,GAKA,uBAAA,GACE,CAAA;AAAA;AAAA;AAAA;AAAA,mEAAA,CAAA,GAKA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAUN,EAAA,MAAM,aAAa,IAAA,GACf,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GAMA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAQJ,EAAA,MAAM,YAAY,IAAA,GACd,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GAuBA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAyBJ,EAAA,MAAM,qBAAqB,IAAA,GAAO;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA,GAkC/B,EAAA;AAEH,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGY,aAAa;AAAA;;AAAA,EAGhC,SAAS;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EA4CT,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,CAAA;AAEnB;AAEA,SAASM,eAAAA,CAAe,aAAA,EAA4B,SAAA,GAAoB,MAAA,EAAgB;AACtF,EAAA,MAAM,OAAO,aAAA,KAAkB,IAAA;AAE/B,EAAA,MAAM,mBAAmB,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,GAAI,YAAY,GAAA,GAAM,SAAA;AAIvE,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,mBAAA,EAcU,gBAAgB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAsNnC;AAEA,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,mBAAA,EAcY,gBAAgB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["import * as prettier from 'prettier';\n\n/**\n * Format TypeScript code using Prettier\n */\nexport async function formatCode(code: string): Promise<string> {\n try {\n return await prettier.format(code, {\n parser: 'typescript',\n semi: true,\n singleQuote: true,\n trailingComma: 'es5',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n });\n } catch {\n // If formatting fails, return original code\n return code;\n }\n}\n\n/**\n * Format JSON code using Prettier\n */\nexport async function formatJson(code: string): Promise<string> {\n try {\n return await prettier.format(code, {\n parser: 'json',\n tabWidth: 2,\n });\n } catch {\n return code;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\n/**\n * Ensure a directory exists, creating it if necessary\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // Ignore if directory already exists\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw error;\n }\n }\n}\n\n/**\n * Write content to a file, creating parent directories if needed\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Read a file's content\n */\nexport async function readFile(filePath: string): Promise<string> {\n return await fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Check if a file exists\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Delete a file if it exists\n */\nexport async function deleteFile(filePath: string): Promise<void> {\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n\n/**\n * List files in a directory matching a pattern\n */\nexport async function listFiles(dirPath: string, extension?: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => path.join(dirPath, entry.name));\n\n if (extension) {\n files = files.filter((file) => file.endsWith(extension));\n }\n\n return files;\n } catch {\n return [];\n }\n}\n","/**\n * Convert string to PascalCase\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert string to camelCase\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Convert string to kebab-case\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Pluralize a word (simple version)\n */\nexport function pluralize(word: string): string {\n if (word.endsWith('s') || word.endsWith('x') || word.endsWith('ch') || word.endsWith('sh')) {\n return word + 'es';\n }\n if (word.endsWith('y') && !['a', 'e', 'i', 'o', 'u'].includes(word.charAt(word.length - 2))) {\n return word.slice(0, -1) + 'ies';\n }\n return word + 's';\n}\n","/**\n * Type mapping utilities\n * Shared logic for converting Strapi attributes to TypeScript/JSDoc types\n */\n\nimport type { Attribute, ComponentType } from '@strapi2front/core';\nimport { toPascalCase } from '../utils/naming.js';\n\n/**\n * Mapped type information\n */\nexport interface MappedType {\n /** The type string (e.g., \"string\", \"number\", \"Article\") */\n type: string;\n /** Whether this type needs an import */\n needsImport: boolean;\n /** Import details if needed */\n import?: {\n name: string;\n from: string;\n isRelation?: boolean;\n isComponent?: boolean;\n };\n}\n\n/**\n * Convert Strapi attribute to type string\n */\nexport function mapAttributeToType(attr: Attribute, _components: ComponentType[]): MappedType {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return { type: 'string', needsImport: false };\n\n case 'blocks':\n return {\n type: 'BlocksContent',\n needsImport: true,\n import: { name: 'BlocksContent', from: 'utils' }\n };\n\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return { type: 'number', needsImport: false };\n\n case 'boolean':\n return { type: 'boolean', needsImport: false };\n\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return { type: 'string', needsImport: false };\n\n case 'json':\n return { type: 'unknown', needsImport: false };\n\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return {\n type: attr.enum.map((v) => `'${v}'`).join(' | '),\n needsImport: false\n };\n }\n return { type: 'string', needsImport: false };\n\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return {\n type: 'StrapiMedia[]',\n needsImport: true,\n import: { name: 'StrapiMedia', from: 'utils' }\n };\n }\n return {\n type: 'StrapiMedia | null',\n needsImport: true,\n import: { name: 'StrapiMedia', from: 'utils' }\n };\n\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || 'unknown';\n const typeName = toPascalCase(targetName);\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n return {\n type: isMany ? `${typeName}[]` : `${typeName} | null`,\n needsImport: true,\n import: { name: typeName, from: targetName, isRelation: true }\n };\n }\n return { type: 'unknown', needsImport: false };\n\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n if ('repeatable' in attr && attr.repeatable) {\n return {\n type: `${typeName}[]`,\n needsImport: true,\n import: { name: typeName, from: componentName, isComponent: true }\n };\n }\n return {\n type: `${typeName} | null`,\n needsImport: true,\n import: { name: typeName, from: componentName, isComponent: true }\n };\n }\n return { type: 'unknown', needsImport: false };\n\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map((c) => {\n const name = c.split('.').pop() || 'unknown';\n return toPascalCase(name);\n });\n return {\n type: `(${types.join(' | ')})[]`,\n needsImport: true,\n // Dynamic zones need multiple imports, handled separately\n };\n }\n return { type: 'unknown[]', needsImport: false };\n\n default:\n return { type: 'unknown', needsImport: false };\n }\n}\n\n/**\n * Get JSDoc type annotation for an attribute\n */\nexport function getJSDocType(mappedType: MappedType): string {\n return mappedType.type;\n}\n\n/**\n * Get attribute comment/description\n */\nexport function getAttributeComment(attr: Attribute): string | null {\n const parts: string[] = [];\n\n if (attr.required) {\n parts.push('Required');\n }\n\n if ('minLength' in attr && attr.minLength !== undefined) {\n parts.push(`Min length: ${attr.minLength}`);\n }\n\n if ('maxLength' in attr && attr.maxLength !== undefined) {\n parts.push(`Max length: ${attr.maxLength}`);\n }\n\n if ('min' in attr && attr.min !== undefined) {\n parts.push(`Min: ${attr.min}`);\n }\n\n if ('max' in attr && attr.max !== undefined) {\n parts.push(`Max: ${attr.max}`);\n }\n\n return parts.length > 0 ? parts.join(', ') : null;\n}\n\n/**\n * Extract all dependencies (relations and components) from attributes\n */\nexport function extractDependencies(\n attributes: Record<string, Attribute>,\n selfName: string\n): { relations: Set<string>; components: Set<string> } {\n const relations = new Set<string>();\n const components = new Set<string>();\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'relation' && 'target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || '';\n const typeName = toPascalCase(targetName);\n // Don't import self\n if (typeName !== selfName && targetName) {\n relations.add(targetName);\n }\n }\n\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || '';\n if (componentName) {\n components.add(componentName);\n }\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const comp of attr.components) {\n const componentName = comp.split('.').pop() || '';\n if (componentName) {\n components.add(componentName);\n }\n }\n }\n }\n\n return { relations, components };\n}\n","/**\n * TypeScript type generator\n * Generates .ts files with interfaces\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType, ComponentType, Attribute } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { formatCode } from '../../utils/formatter.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toKebabCase } from '../../utils/naming.js';\nimport { mapAttributeToType, getAttributeComment, extractDependencies } from '../../shared/type-mapper.js';\n\nexport interface TypeScriptTypesOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate TypeScript types from parsed schema\n */\nexport async function generateTypeScriptTypes(\n schema: ParsedSchema,\n options: TypeScriptTypesOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'components'));\n\n // Generate utility types\n const utilsPath = path.join(outputDir, 'utils.ts');\n const strapiVersion = options.strapiVersion ?? 'v5';\n await writeFile(utilsPath, await formatCode(generateUtilityTypes(options.blocksRendererInstalled ?? false, strapiVersion)));\n generatedFiles.push(utilsPath);\n\n // Generate collection types\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.ts`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateCollectionType(collection, schema.components);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.ts`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateSingleType(single, schema.components);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate component types\n for (const component of schema.components) {\n const fileName = `${toKebabCase(component.name)}.ts`;\n const filePath = path.join(outputDir, 'components', fileName);\n const content = generateComponentType(component);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate utility types\n */\nfunction generateUtilityTypes(blocksRendererInstalled: boolean, strapiVersion: StrapiVersion): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n */\nexport type RichTextContent = string;`\n : blocksRendererInstalled\n ? `/**\n * Blocks content type (Strapi v5 rich text)\n * Re-exported from @strapi/blocks-react-renderer\n */\nexport type { BlocksContent } from '@strapi/blocks-react-renderer';`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n */\nexport type BlocksContent = unknown[];`;\n\n const baseEntity = isV4\n ? `/**\n * Base entity fields (Strapi v4)\n */\nexport interface StrapiBaseEntity {\n id: number;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`\n : `/**\n * Base entity fields (Strapi v5)\n */\nexport interface StrapiBaseEntity {\n id: number;\n documentId: string;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`;\n\n const mediaType = isV4\n ? `/**\n * Strapi media object (v4)\n */\nexport interface StrapiMedia {\n id: number;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`\n : `/**\n * Strapi media object (v5)\n */\nexport interface StrapiMedia {\n id: number;\n documentId: string;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`;\n\n const rawResponseTypes = isV4\n ? `\n/**\n * Strapi v4 raw API response (with nested attributes)\n */\nexport interface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\nexport interface StrapiV4RawResponse<T> {\n data: StrapiV4RawItem<T>;\n meta: Record<string, unknown>;\n}\n\nexport interface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n/**\n * Flatten Strapi v4 response item\n */\nexport function flattenV4Response<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Flatten Strapi v4 list response\n */\nexport function flattenV4ListResponse<T>(items: StrapiV4RawItem<T>[]): T[] {\n return items.map(item => flattenV4Response<T>(item));\n}`\n : '';\n\n return `/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\n/**\n * Strapi pagination\n */\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n/**\n * Strapi response wrapper\n */\nexport interface StrapiResponse<T> {\n data: T;\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\n/**\n * Strapi list response\n */\nexport interface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n${baseEntity}\n${rawResponseTypes}\n${blocksContentType}\n`;\n}\n\n/**\n * Generate import statements for dependencies\n */\nfunction generateDependencyImports(\n relations: Set<string>,\n components: Set<string>\n): string {\n const imports: string[] = [];\n\n // Import relations (other collections/singles)\n for (const relation of relations) {\n const typeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n imports.push(`import type { ${typeName} } from './${fileName}';`);\n }\n\n // Import components\n for (const component of components) {\n const typeName = toPascalCase(component);\n const fileName = toKebabCase(component);\n imports.push(`import type { ${typeName} } from '../components/${fileName}';`);\n }\n\n return imports.join('\\n');\n}\n\n/**\n * Generate type for a collection\n */\nfunction generateCollectionType(collection: CollectionType, components: ComponentType[]): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateAttributes(collection.attributes, components);\n const { relations, components: componentDeps } = extractDependencies(collection.attributes, typeName);\n const dependencyImports = generateDependencyImports(relations, componentDeps);\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = ['StrapiBaseEntity'];\n const attributesStr = JSON.stringify(collection.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\nimport type { ${utilsImports.join(', ')} } from '../utils';\n${dependencyImports ? dependencyImports + '\\n' : ''}\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n\nexport interface ${typeName}Filters {\n id?: number | { $eq?: number; $ne?: number; $in?: number[]; $notIn?: number[] };\n documentId?: string | { $eq?: string; $ne?: string };\n createdAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n updatedAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n publishedAt?: string | null | { $eq?: string; $ne?: string; $null?: boolean };\n $and?: ${typeName}Filters[];\n $or?: ${typeName}Filters[];\n $not?: ${typeName}Filters;\n}\n\nexport interface ${typeName}Sort {\n field: keyof ${typeName};\n order: 'asc' | 'desc';\n}\n`;\n}\n\n/**\n * Generate type for a single type\n */\nfunction generateSingleType(single: SingleType, components: ComponentType[]): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateAttributes(single.attributes, components);\n const { relations, components: componentDeps } = extractDependencies(single.attributes, typeName);\n const dependencyImports = generateDependencyImports(relations, componentDeps);\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = ['StrapiBaseEntity'];\n const attributesStr = JSON.stringify(single.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\nimport type { ${utilsImports.join(', ')} } from '../utils';\n${dependencyImports ? dependencyImports + '\\n' : ''}\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n`;\n}\n\n/**\n * Generate type for a component\n */\nfunction generateComponentType(component: ComponentType): string {\n const typeName = toPascalCase(component.name);\n const attributes = generateAttributes(component.attributes, []);\n const { relations, components: componentDeps } = extractDependencies(component.attributes, typeName);\n\n // For components, relations import from collections and other components import from same folder\n const imports: string[] = [];\n\n for (const relation of relations) {\n const relTypeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n imports.push(`import type { ${relTypeName} } from '../collections/${fileName}';`);\n }\n\n for (const comp of componentDeps) {\n const compTypeName = toPascalCase(comp);\n const fileName = toKebabCase(comp);\n // Don't import self\n if (compTypeName !== typeName) {\n imports.push(`import type { ${compTypeName} } from './${fileName}';`);\n }\n }\n\n // Build utils imports based on what's actually used\n const utilsImports: string[] = [];\n const attributesStr = JSON.stringify(component.attributes);\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n const utilsImportLine = utilsImports.length > 0\n ? `import type { ${utilsImports.join(', ')} } from '../utils';\\n`\n : '';\n const dependencyImports = imports.length > 0 ? imports.join('\\n') + '\\n' : '';\n\n return `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n${utilsImportLine}${dependencyImports}\nexport interface ${typeName} {\n id: number;\n${attributes}\n}\n`;\n}\n\n/**\n * Generate TypeScript properties from Strapi attributes\n */\nfunction generateAttributes(\n attributes: Record<string, Attribute>,\n components: ComponentType[]\n): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const mappedType = mapAttributeToType(attr, components);\n const optional = attr.required ? '' : '?';\n const comment = getAttributeComment(attr);\n\n if (comment) {\n lines.push(` /** ${comment} */`);\n }\n lines.push(` ${name}${optional}: ${mappedType.type};`);\n }\n\n return lines.join('\\n');\n}\n","/**\n * JSDoc type generator\n * Generates .js files with JSDoc annotations for type safety without TypeScript\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType, ComponentType, Attribute } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toKebabCase } from '../../utils/naming.js';\nimport { mapAttributeToType, getAttributeComment, extractDependencies } from '../../shared/type-mapper.js';\n\nexport interface JSDocTypesOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate JSDoc types from parsed schema\n */\nexport async function generateJSDocTypes(\n schema: ParsedSchema,\n options: JSDocTypesOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'components'));\n\n // Generate utility types\n const utilsPath = path.join(outputDir, 'utils.js');\n const strapiVersion = options.strapiVersion ?? 'v5';\n await writeFile(utilsPath, generateUtilityTypes(strapiVersion));\n generatedFiles.push(utilsPath);\n\n // Generate collection types\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.js`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateCollectionType(collection, schema.components, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.js`;\n const filePath = path.join(outputDir, 'collections', fileName);\n const content = generateSingleType(single, schema.components, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate component types\n for (const component of schema.components) {\n const fileName = `${toKebabCase(component.name)}.js`;\n const filePath = path.join(outputDir, 'components', fileName);\n const content = generateComponentType(component, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate utility types with JSDoc\n */\nfunction generateUtilityTypes(strapiVersion: StrapiVersion): string {\n const isV4 = strapiVersion === \"v4\";\n\n const baseEntityFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`;\n\n const mediaFields = isV4\n ? ` * @property {number} id`\n : ` * @property {number} id\n * @property {string} documentId`;\n\n return `/**\n * Strapi utility types (JSDoc)\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n *\n * These types provide IntelliSense support in JavaScript projects.\n */\n\n/**\n * Strapi media format\n * @typedef {Object} StrapiMediaFormat\n * @property {string} name\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} width\n * @property {number} height\n * @property {number} size\n * @property {string} url\n */\n\n/**\n * Strapi media object\n * @typedef {Object} StrapiMedia\n${mediaFields}\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {{thumbnail?: StrapiMediaFormat, small?: StrapiMediaFormat, medium?: StrapiMediaFormat, large?: StrapiMediaFormat}|null} formats\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */\n\n/**\n * Strapi pagination\n * @typedef {Object} StrapiPagination\n * @property {number} page\n * @property {number} pageSize\n * @property {number} pageCount\n * @property {number} total\n */\n\n/**\n * Strapi response wrapper\n * @template T\n * @typedef {Object} StrapiResponse\n * @property {T} data\n * @property {{pagination?: StrapiPagination}} meta\n */\n\n/**\n * Strapi list response\n * @template T\n * @typedef {Object} StrapiListResponse\n * @property {T[]} data\n * @property {{pagination: StrapiPagination}} meta\n */\n\n/**\n * Base entity fields\n * @typedef {Object} StrapiBaseEntity\n${baseEntityFields}\n */\n\n/**\n * Blocks content type (rich text)\n * @typedef {unknown[]} BlocksContent\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a collection\n */\nfunction generateCollectionType(\n collection: CollectionType,\n components: ComponentType[],\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n const { relations, components: componentDeps } = extractDependencies(collection.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'collection');\n\n // Generate properties\n const properties = generateJSDocProperties(collection.attributes, components);\n\n // Base fields\n const baseFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt`;\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${collection.displayName}\n * @typedef {Object} ${typeName}\n${baseFields}\n${properties}\n */\n\n/**\n * ${typeName} filters for querying\n * @typedef {Object} ${typeName}Filters\n * @property {number|{$eq?: number, $ne?: number, $in?: number[], $notIn?: number[]}} [id]\n * @property {string|{$eq?: string, $ne?: string}} [documentId]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [createdAt]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [updatedAt]\n * @property {string|null|{$eq?: string, $ne?: string, $null?: boolean}} [publishedAt]\n * @property {${typeName}Filters[]} [$and]\n * @property {${typeName}Filters[]} [$or]\n * @property {${typeName}Filters} [$not]\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a single type\n */\nfunction generateSingleType(\n single: SingleType,\n components: ComponentType[],\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(single.singularName);\n const isV4 = strapiVersion === \"v4\";\n const { relations, components: componentDeps } = extractDependencies(single.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'collection');\n\n // Generate properties\n const properties = generateJSDocProperties(single.attributes, components);\n\n // Base fields\n const baseFields = isV4\n ? ` * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt`\n : ` * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt`;\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${single.displayName}\n * @typedef {Object} ${typeName}\n${baseFields}\n${properties}\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc type for a component\n */\nfunction generateComponentType(component: ComponentType, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(component.name);\n const { relations, components: componentDeps } = extractDependencies(component.attributes, typeName);\n\n // Generate imports\n const imports = generateJSDocImports(relations, componentDeps, 'component');\n\n // Generate properties\n const properties = generateJSDocProperties(component.attributes, []);\n\n return `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports}\n\n/**\n * ${component.displayName}\n * @typedef {Object} ${typeName}\n * @property {number} id\n${properties}\n */\n\n// Export empty object to make this a module\nexport {};\n`;\n}\n\n/**\n * Generate JSDoc imports\n */\nfunction generateJSDocImports(\n relations: Set<string>,\n components: Set<string>,\n context: 'collection' | 'component'\n): string {\n const imports: string[] = [];\n\n // Import from utils\n imports.push(`/** @typedef {import('../utils').StrapiMedia} StrapiMedia */`);\n imports.push(`/** @typedef {import('../utils').BlocksContent} BlocksContent */`);\n\n // Import relations\n for (const relation of relations) {\n const typeName = toPascalCase(relation);\n const fileName = toKebabCase(relation);\n if (context === 'component') {\n imports.push(`/** @typedef {import('../collections/${fileName}').${typeName}} ${typeName} */`);\n } else {\n imports.push(`/** @typedef {import('./${fileName}').${typeName}} ${typeName} */`);\n }\n }\n\n // Import components\n for (const component of components) {\n const typeName = toPascalCase(component);\n const fileName = toKebabCase(component);\n if (context === 'component') {\n imports.push(`/** @typedef {import('./${fileName}').${typeName}} ${typeName} */`);\n } else {\n imports.push(`/** @typedef {import('../components/${fileName}').${typeName}} ${typeName} */`);\n }\n }\n\n return imports.join('\\n');\n}\n\n/**\n * Generate JSDoc properties from Strapi attributes\n */\nfunction generateJSDocProperties(\n attributes: Record<string, Attribute>,\n components: ComponentType[]\n): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const mappedType = mapAttributeToType(attr, components);\n const jsDocType = convertToJSDocType(mappedType.type);\n const comment = getAttributeComment(attr);\n const commentPart = comment ? ` - ${comment}` : '';\n\n // In JSDoc, [name] indicates optional. Required fields don't use brackets.\n if (attr.required) {\n lines.push(` * @property {${jsDocType}} ${name}${commentPart}`);\n } else {\n lines.push(` * @property {${jsDocType}} [${name}]${commentPart}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Convert TypeScript type to JSDoc type\n */\nfunction convertToJSDocType(tsType: string): string {\n // Handle union types with null\n if (tsType.includes(' | null')) {\n const baseType = tsType.replace(' | null', '');\n return `${baseType}|null`;\n }\n\n // Handle arrays\n if (tsType.endsWith('[]')) {\n const baseType = tsType.slice(0, -2);\n // Handle union arrays like (A | B)[]\n if (baseType.startsWith('(') && baseType.endsWith(')')) {\n return `Array<${baseType.slice(1, -1).replace(/ \\| /g, '|')}>`;\n }\n return `${baseType}[]`;\n }\n\n // Handle string literal unions (enums)\n if (tsType.includes(\"'\") && tsType.includes(' | ')) {\n return 'string';\n }\n\n return tsType;\n}\n","/**\n * Type generator\n * Supports TypeScript (.ts) and JSDoc (.js) output formats\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { OutputFormat, StrapiVersion } from '../shared/types.js';\nimport { generateTypeScriptTypes } from '../output/typescript/types.js';\nimport { generateJSDocTypes } from '../output/jsdoc/types.js';\n\nexport interface TypeGeneratorOptions {\n outputDir: string;\n blocksRendererInstalled?: boolean;\n strapiVersion?: StrapiVersion;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: OutputFormat;\n}\n\n/**\n * Generate types from parsed schema\n * Supports both TypeScript and JSDoc output formats\n */\nexport async function generateTypes(\n schema: ParsedSchema,\n options: TypeGeneratorOptions\n): Promise<string[]> {\n const outputFormat = options.outputFormat ?? 'typescript';\n\n if (outputFormat === 'jsdoc') {\n return generateJSDocTypes(schema, {\n outputDir: options.outputDir,\n blocksRendererInstalled: options.blocksRendererInstalled,\n strapiVersion: options.strapiVersion,\n });\n }\n\n // Default: TypeScript\n return generateTypeScriptTypes(schema, {\n outputDir: options.outputDir,\n blocksRendererInstalled: options.blocksRendererInstalled,\n strapiVersion: options.strapiVersion,\n });\n}\n","/**\n * JSDoc service generator\n * Generates .js files with JSDoc annotations for services\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../../utils/naming.js';\n\nexport interface JSDocServicesOptions {\n outputDir: string;\n typesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate JSDoc service files from parsed schema\n */\nexport async function generateJSDocServices(\n schema: ParsedSchema,\n options: JSDocServicesOptions\n): Promise<string[]> {\n const { outputDir, typesImportPath, strapiVersion = \"v5\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate services for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.service.js`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionService(collection, typesImportPath, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n // Generate services for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.service.js`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleService(single, typesImportPath, strapiVersion);\n await writeFile(filePath, content);\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate service for a collection type\n */\nfunction generateCollectionService(\n collection: CollectionType,\n typesImportPath: string,\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const fileName = toKebabCase(collection.singularName);\n const endpoint = collection.pluralName;\n const isV4 = strapiVersion === \"v4\";\n\n const idParam = isV4 ? 'id' : 'documentId';\n const idType = isV4 ? 'number' : 'string';\n\n // Feature flags\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n\n // Build locale and status options\n const localeOption = localized ? '\\n * @property {string} [locale] - Locale code' : '';\n const statusOption = draftAndPublish ? \"\\n * @property {'draft'|'published'} [status] - Publication status\" : '';\n\n const findBySlugMethod = hasSlug ? `\n/**\n * Find one ${collection.singularName} by slug\n * @param {string} slug - The slug to search for\n * @param {FindOneOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\nasync findBySlug(slug, options = {}) {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } },\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return data[0] || null;\n},\n` : '';\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { collection } from '../client.js';\n\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}} ${typeName} */\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}Filters} ${typeName}Filters */\n/** @typedef {import('${typesImportPath}/utils').StrapiPagination} StrapiPagination */\n${localized ? `/** @typedef {import('../locales').Locale} Locale */` : ''}\n\n/**\n * @typedef {Object} FindManyOptions\n * @property {${typeName}Filters} [filters] - Filter conditions\n * @property {{page?: number, pageSize?: number, start?: number, limit?: number}} [pagination] - Pagination options\n * @property {string|string[]} [sort] - Sort order\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/**\n * @typedef {Object} FindOneOptions\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/** @type {ReturnType<typeof collection<${typeName}>>} */\nconst ${toCamelCase(collection.singularName)}Collection = collection('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Find multiple ${collection.pluralName}\n * @param {FindManyOptions} [options={}] - Query options\n * @returns {Promise<{data: ${typeName}[], pagination: StrapiPagination}>}\n */\n async findMany(options = {}) {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * Find all ${collection.pluralName} (handles pagination automatically)\n * @param {Omit<FindManyOptions, 'pagination'>} [options={}] - Query options\n * @returns {Promise<${typeName}[]>}\n */\n async findAll(options = {}) {\n /** @type {${typeName}[]} */\n const allItems = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * Find one ${collection.singularName} by ${idParam}\n * @param {${idType}} ${idParam} - The ${idParam} to find\n * @param {FindOneOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\n async findOne(${idParam}, options = {}) {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idParam}, {\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${findBySlugMethod}\n /**\n * Create a new ${collection.singularName}\n * @param {Partial<${typeName}>} data - The data to create\n * @returns {Promise<${typeName}>}\n */\n async create(data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n /**\n * Update a ${collection.singularName}\n * @param {${idType}} ${idParam} - The ${idParam} to update\n * @param {Partial<${typeName}>} data - The data to update\n * @returns {Promise<${typeName}>}\n */\n async update(${idParam}, data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idParam}, { data });\n return response.data;\n },\n\n /**\n * Delete a ${collection.singularName}\n * @param {${idType}} ${idParam} - The ${idParam} to delete\n * @returns {Promise<void>}\n */\n async delete(${idParam}) {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idParam});\n },\n\n /**\n * Count ${collection.pluralName}\n * @param {${typeName}Filters} [filters] - Filter conditions\n * @returns {Promise<number>}\n */\n async count(filters) {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n`;\n}\n\n/**\n * Generate service for a single type\n */\nfunction generateSingleService(\n single: SingleType,\n typesImportPath: string,\n strapiVersion: StrapiVersion\n): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const fileName = toKebabCase(single.singularName);\n const endpoint = single.singularName;\n\n // Feature flags\n const { localized, draftAndPublish } = single;\n\n // Build locale and status options\n const localeOption = localized ? '\\n * @property {string} [locale] - Locale code' : '';\n const statusOption = draftAndPublish ? \"\\n * @property {'draft'|'published'} [status] - Publication status\" : '';\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { single } from '../client.js';\n\n/** @typedef {import('${typesImportPath}/collections/${fileName}').${typeName}} ${typeName} */\n${localized ? `/** @typedef {import('../locales').Locale} Locale */` : ''}\n\n/**\n * @typedef {Object} FindOptions\n * @property {string|string[]|Object} [populate] - Relations to populate${localeOption}${statusOption}\n */\n\n/** @type {ReturnType<typeof single<${typeName}>>} */\nconst ${toCamelCase(single.singularName)}Single = single('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Get ${single.displayName}\n * @param {FindOptions} [options={}] - Query options\n * @returns {Promise<${typeName}|null>}\n */\n async find(options = {}) {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * Update ${single.displayName}\n * @param {Partial<${typeName}>} data - The data to update\n * @returns {Promise<${typeName}>}\n */\n async update(data) {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n /**\n * Delete ${single.displayName}\n * @returns {Promise<void>}\n */\n async delete() {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n`;\n}\n","/**\n * Service generator\n * Supports TypeScript (.ts) and JSDoc (.js) output formats\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { OutputFormat, StrapiVersion } from '../shared/types.js';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../utils/naming.js';\nimport { generateJSDocServices } from '../output/jsdoc/services.js';\n\nexport interface ServiceGeneratorOptions {\n outputDir: string;\n typesImportPath: string;\n strapiVersion?: StrapiVersion;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: OutputFormat;\n}\n\n/**\n * Generate service files from parsed schema\n */\nexport async function generateServices(\n schema: ParsedSchema,\n options: ServiceGeneratorOptions\n): Promise<string[]> {\n const outputFormat = options.outputFormat ?? 'typescript';\n\n if (outputFormat === 'jsdoc') {\n return generateJSDocServices(schema, {\n outputDir: options.outputDir,\n typesImportPath: options.typesImportPath,\n strapiVersion: options.strapiVersion,\n });\n }\n\n // Default: TypeScript\n return generateTypeScriptServices(schema, options);\n}\n\n/**\n * Generate TypeScript service files\n */\nasync function generateTypeScriptServices(\n schema: ParsedSchema,\n options: ServiceGeneratorOptions\n): Promise<string[]> {\n const { outputDir, typesImportPath, strapiVersion = \"v5\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate services for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.service.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionService(collection, typesImportPath, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate services for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.service.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleService(single, typesImportPath, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate service for a collection type\n */\nfunction generateCollectionService(collection: CollectionType, typesImportPath: string, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const fileName = toKebabCase(collection.singularName);\n const endpoint = collection.pluralName;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id: number' : 'documentId: string';\n const idName = isV4 ? 'id' : 'documentId';\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt' | 'publishedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt' | 'publishedAt'\";\n\n // Feature flags\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n\n // Build imports\n const imports: string[] = [\n `import { collection } from '../client';`,\n `import type { ${typeName}, ${typeName}Filters } from '${typesImportPath}/collections/${fileName}';`,\n `import type { StrapiPagination } from '${typesImportPath}/utils';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../locales';`);\n }\n\n // Build FindManyOptions interface\n const findManyOptionsFields: string[] = [\n ` filters?: ${typeName}Filters;`,\n ` pagination?: {`,\n ` /** Page number (1-indexed) - use with pageSize */`,\n ` page?: number;`,\n ` /** Number of items per page (default: 25) - use with page */`,\n ` pageSize?: number;`,\n ` /** Offset to start from (0-indexed) - use with limit */`,\n ` start?: number;`,\n ` /** Maximum number of items to return - use with start */`,\n ` limit?: number;`,\n ` };`,\n ` sort?: string | string[];`,\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findManyOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findManyOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build FindOneOptions interface\n const findOneOptionsFields: string[] = [\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findOneOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findOneOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build find params\n const findParams: string[] = [\n ` filters: options.filters,`,\n ` pagination: options.pagination,`,\n ` sort: options.sort,`,\n ` populate: options.populate,`,\n ];\n if (localized) {\n findParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findParams.push(` status: options.status,`);\n }\n\n // Build findOne params\n const findOneParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findOneParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findOneParams.push(` status: options.status,`);\n }\n\n // Build findBySlug params\n const findBySlugParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findBySlugParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findBySlugParams.push(` status: options.status,`);\n }\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindManyOptions {\n${findManyOptionsFields.join('\\n')}\n}\n\nexport interface FindOneOptions {\n${findOneOptionsFields.join('\\n')}\n}\n\n// Create typed collection helper\nconst ${toCamelCase(collection.singularName)}Collection = collection<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Find multiple ${collection.pluralName}\n */\n async findMany(options: FindManyOptions = {}): Promise<{ data: ${typeName}[]; pagination: StrapiPagination }> {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n${findParams.join('\\n')}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * Find all ${collection.pluralName} (handles pagination automatically)\n */\n async findAll(options: Omit<FindManyOptions, 'pagination'> = {}): Promise<${typeName}[]> {\n const allItems: ${typeName}[] = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * Find one ${collection.singularName} by ${idName}\n */\n async findOne(${idParam}, options: FindOneOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idName}, {\n${findOneParams.join('\\n')}\n });\n\n return response.data;\n } catch (error) {\n // Return null if not found\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n /**\n * Find one ${collection.singularName} by slug\n */\n async findBySlug(slug: string, options: FindOneOptions = {}): Promise<${typeName} | null> {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } } as ${typeName}Filters,\n pagination: { pageSize: 1 },\n${findBySlugParams.join('\\n')}\n });\n\n return data[0] || null;\n },\n` : ''}\n /**\n * Create a new ${collection.singularName}\n */\n async create(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.create({ data });\n return response.data;\n },\n\n /**\n * Update a ${collection.singularName}\n */\n async update(${idParam}, data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idName}, { data });\n return response.data;\n },\n\n /**\n * Delete a ${collection.singularName}\n */\n async delete(${idParam}): Promise<void> {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idName});\n },\n\n /**\n * Count ${collection.pluralName}\n */\n async count(filters?: ${typeName}Filters): Promise<number> {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n`;\n}\n\n/**\n * Generate service for a single type\n */\nfunction generateSingleService(single: SingleType, typesImportPath: string, strapiVersion: StrapiVersion): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const fileName = toKebabCase(single.singularName);\n const endpoint = single.singularName;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 doesn't have documentId\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Feature flags\n const { localized, draftAndPublish } = single;\n\n // Build imports\n const imports: string[] = [\n `import { single } from '../client';`,\n `import type { ${typeName} } from '${typesImportPath}/collections/${fileName}';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../locales';`);\n }\n\n // Build FindOptions interface\n const findOptionsFields: string[] = [\n ` populate?: string | string[] | Record<string, unknown>;`,\n ];\n if (localized) {\n findOptionsFields.push(` locale?: Locale;`);\n }\n if (draftAndPublish) {\n findOptionsFields.push(` status?: 'draft' | 'published';`);\n }\n\n // Build find params\n const findParams: string[] = [\n ` populate: options.populate,`,\n ];\n if (localized) {\n findParams.push(` locale: options.locale,`);\n }\n if (draftAndPublish) {\n findParams.push(` status: options.status,`);\n }\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindOptions {\n${findOptionsFields.join('\\n')}\n}\n\n// Create typed single helper\nconst ${toCamelCase(single.singularName)}Single = single<${typeName}>('${endpoint}');\n\nexport const ${serviceName} = {\n /**\n * Get ${single.displayName}\n */\n async find(options: FindOptions = {}): Promise<${typeName} | null> {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n${findParams.join('\\n')}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * Update ${single.displayName}\n */\n async update(data: Partial<Omit<${typeName}, ${omitFields}>>): Promise<${typeName}> {\n const response = await ${toCamelCase(single.singularName)}Single.update({ data });\n return response.data;\n },\n\n /**\n * Delete ${single.displayName}\n */\n async delete(): Promise<void> {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n`;\n}\n","/**\n * Zod Schema for Strapi Blocks (Rich Text Editor v5)\n *\n * This schema validates the JSON structure of Strapi's Blocks field type.\n * The Blocks editor produces a structured JSON format that can be validated\n * and rendered using @strapi/blocks-react-renderer or similar libraries.\n *\n * @see https://github.com/strapi/blocks-react-renderer\n * @see https://docs.strapi.io/cms/features/content-type-builder\n */\n\n/**\n * Generate the Zod schema string for Strapi Blocks content.\n *\n * The schema defines all possible block types:\n * - paragraph: Basic text block\n * - heading: Headings h1-h6\n * - list: Ordered and unordered lists\n * - quote: Block quotes\n * - code: Code blocks\n * - image: Image blocks with media reference\n *\n * Text nodes can have modifiers: bold, italic, underline, strikethrough, code\n */\nexport function generateBlocksSchemaString(): string {\n return `\n// Text node with optional formatting modifiers\nconst textNodeSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n bold: z.boolean().optional(),\n italic: z.boolean().optional(),\n underline: z.boolean().optional(),\n strikethrough: z.boolean().optional(),\n code: z.boolean().optional(),\n});\n\n// Link node (inline element)\nconst linkNodeSchema = z.object({\n type: z.literal('link'),\n url: z.string().url(),\n children: z.array(textNodeSchema),\n});\n\n// Inline content can be text or links\nconst inlineNodeSchema = z.union([textNodeSchema, linkNodeSchema]);\n\n// List item node\nconst listItemNodeSchema = z.object({\n type: z.literal('list-item'),\n children: z.array(inlineNodeSchema),\n});\n\n// Paragraph block\nconst paragraphBlockSchema = z.object({\n type: z.literal('paragraph'),\n children: z.array(inlineNodeSchema),\n});\n\n// Heading block (levels 1-6)\nconst headingBlockSchema = z.object({\n type: z.literal('heading'),\n level: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6)]),\n children: z.array(inlineNodeSchema),\n});\n\n// List block (ordered or unordered)\nconst listBlockSchema = z.object({\n type: z.literal('list'),\n format: z.enum(['ordered', 'unordered']),\n children: z.array(listItemNodeSchema),\n});\n\n// Quote block\nconst quoteBlockSchema = z.object({\n type: z.literal('quote'),\n children: z.array(inlineNodeSchema),\n});\n\n// Code block\nconst codeBlockSchema = z.object({\n type: z.literal('code'),\n children: z.array(textNodeSchema),\n});\n\n// Image block\nconst imageBlockSchema = z.object({\n type: z.literal('image'),\n image: z.object({\n name: z.string(),\n alternativeText: z.string().nullable().optional(),\n url: z.string(),\n caption: z.string().nullable().optional(),\n width: z.number().positive(),\n height: z.number().positive(),\n formats: z.record(z.unknown()).nullable().optional(),\n hash: z.string(),\n ext: z.string(),\n mime: z.string(),\n size: z.number().positive(),\n previewUrl: z.string().nullable().optional(),\n provider: z.string(),\n }),\n children: z.array(z.object({ type: z.literal('text'), text: z.string() })),\n});\n\n// All possible block types\nconst blockSchema = z.discriminatedUnion('type', [\n paragraphBlockSchema,\n headingBlockSchema,\n listBlockSchema,\n quoteBlockSchema,\n codeBlockSchema,\n imageBlockSchema,\n]);\n\n// BlocksContent is an array of blocks\nconst blocksContentSchema = z.array(blockSchema);\n`.trim();\n}\n\n/**\n * Get the inline Zod schema for blocks field (simpler version)\n * Use this when you don't want to define all the helper schemas\n */\nexport function getBlocksZodSchema(): string {\n return 'z.array(z.object({ type: z.string(), children: z.array(z.unknown()).optional() }).passthrough())';\n}\n\n/**\n * Get the full Zod schema variable name for blocks\n * This assumes the schema has been defined using generateBlocksSchemaString()\n */\nexport function getBlocksSchemaReference(): string {\n return 'blocksContentSchema';\n}\n\n/**\n * Compact inline version of blocks schema\n * More strict than passthrough but still inline-able\n */\nexport function getCompactBlocksSchema(): string {\n return `z.array(\n z.discriminatedUnion('type', [\n z.object({ type: z.literal('paragraph'), children: z.array(z.object({ type: z.literal('text'), text: z.string() }).passthrough()) }),\n z.object({ type: z.literal('heading'), level: z.number().int().min(1).max(6), children: z.array(z.object({ type: z.literal('text'), text: z.string() }).passthrough()) }),\n z.object({ type: z.literal('list'), format: z.enum(['ordered', 'unordered']), children: z.array(z.object({ type: z.literal('list-item'), children: z.array(z.unknown()) })) }),\n z.object({ type: z.literal('quote'), children: z.array(z.object({ type: z.literal('text'), text: z.string() }).passthrough()) }),\n z.object({ type: z.literal('code'), children: z.array(z.object({ type: z.literal('text'), text: z.string() })) }),\n z.object({ type: z.literal('image'), image: z.object({ url: z.string(), width: z.number(), height: z.number() }).passthrough(), children: z.array(z.unknown()) }),\n ])\n)`;\n}\n","/**\n * Zod Schema mapping utilities\n * Converts Strapi attributes to Zod schema strings\n *\n * Note: This mapper generates Zod schema code as strings\n * that will be written to generated files.\n */\n\nimport type {\n Attribute,\n StringAttribute,\n NumberAttribute,\n EnumerationAttribute,\n MediaAttribute,\n RelationAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n} from '@strapi2front/core';\nimport { getCompactBlocksSchema } from './blocks-schema.js';\n\n/**\n * Options for schema generation\n */\nexport interface ZodMapperOptions {\n /** Whether this is for an update schema (all fields optional) */\n isUpdate?: boolean;\n /** Whether to include relation fields */\n includeRelations?: boolean;\n /** Whether to include media fields */\n includeMedia?: boolean;\n /** Whether to include component fields */\n includeComponents?: boolean;\n /** Strapi version - affects ID types (v4: number, v5: string documentId) */\n strapiVersion?: 'v4' | 'v5';\n /**\n * Use advanced relation format with connect/disconnect/set\n * @default false - uses simple ID arrays\n */\n useAdvancedRelations?: boolean;\n /**\n * Map of component UIDs to their schema variable names\n * e.g. { 'curse.resource': 'resourceSchema' }\n * When provided, component fields reference imported schemas instead of z.record(z.unknown())\n */\n componentSchemaNames?: Map<string, string>;\n}\n\n/**\n * Result of mapping an attribute to Zod\n */\nexport interface ZodMappedAttribute {\n /** The Zod schema string (e.g., \"z.string().min(1)\") */\n schema: string;\n /** Whether this field should be skipped in generation */\n skip: boolean;\n /** Reason for skipping (if skip is true) */\n skipReason?: string;\n}\n\n/**\n * System fields that should be excluded from create/update schemas\n */\nconst SYSTEM_FIELDS = new Set([\n 'id',\n 'documentId',\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'createdBy',\n 'updatedBy',\n 'localizations',\n 'locale',\n]);\n\n/**\n * Check if a field is a system field\n */\nexport function isSystemField(fieldName: string): boolean {\n return SYSTEM_FIELDS.has(fieldName);\n}\n\n/**\n * Map a Strapi attribute to a Zod schema string\n */\nexport function mapAttributeToZodSchema(\n attr: Attribute,\n options: ZodMapperOptions = {}\n): ZodMappedAttribute {\n const { isUpdate = false } = options;\n\n // Build the base schema\n let schema = buildBaseSchema(attr, options);\n\n // If schema is empty, it means we should skip this field\n if (!schema) {\n return { schema: '', skip: true, skipReason: 'Unsupported type' };\n }\n\n // Apply required/optional modifiers\n // For update schemas, all fields are optional\n // For create schemas, only non-required fields are optional\n if (isUpdate || !attr.required) {\n schema = `${schema}.optional()`;\n }\n\n // Apply default if present and not an update schema\n if (!isUpdate && attr.default !== undefined && attr.default !== null) {\n const defaultValue = formatDefaultValue(attr.default, attr.type);\n if (defaultValue !== null) {\n schema = `${schema}.default(${defaultValue})`;\n }\n }\n\n return { schema, skip: false };\n}\n\n/**\n * Build the base Zod schema for an attribute (without optional/default modifiers)\n */\nfunction buildBaseSchema(attr: Attribute, options: ZodMapperOptions): string | null {\n switch (attr.type) {\n // String types\n case 'string':\n case 'text':\n case 'richtext':\n case 'uid':\n return buildStringSchema(attr as StringAttribute);\n\n case 'email':\n return buildEmailSchema(attr as StringAttribute);\n\n case 'password':\n return buildPasswordSchema(attr as StringAttribute);\n\n // Blocks (Strapi v5 rich text)\n // Uses structured schema with all block types: paragraph, heading, list, quote, code, image\n case 'blocks':\n return getCompactBlocksSchema();\n\n // Number types\n case 'integer':\n case 'biginteger':\n return buildIntegerSchema(attr as NumberAttribute);\n\n case 'float':\n case 'decimal':\n return buildFloatSchema(attr as NumberAttribute);\n\n // Boolean\n case 'boolean':\n return 'z.boolean()';\n\n // Date types\n case 'date':\n return 'z.string().date()';\n\n case 'time':\n return 'z.string().time()';\n\n case 'datetime':\n case 'timestamp':\n return 'z.string().datetime({ offset: true })';\n\n // JSON\n case 'json':\n return 'z.record(z.unknown())';\n\n // Enumeration\n case 'enumeration':\n return buildEnumSchema(attr as EnumerationAttribute);\n\n // Media - accepts file IDs (numbers) from upload API\n case 'media':\n return buildMediaSchema(attr as MediaAttribute);\n\n // Relation - accepts documentIds (v5) or ids (v4)\n case 'relation':\n return buildRelationSchema(attr as RelationAttribute, options);\n\n // Component\n case 'component':\n return buildComponentSchema(attr as ComponentAttribute, options);\n\n // Dynamic zone\n case 'dynamiczone':\n return buildDynamicZoneSchema(attr as DynamicZoneAttribute, options);\n\n default:\n return 'z.unknown()';\n }\n}\n\n/**\n * Build Zod schema for string attributes\n */\nfunction buildStringSchema(attr: StringAttribute): string {\n const parts: string[] = ['z.string()'];\n\n if (attr.minLength !== undefined) {\n parts.push(`.min(${attr.minLength})`);\n }\n\n if (attr.maxLength !== undefined) {\n parts.push(`.max(${attr.maxLength})`);\n }\n\n if (attr.regex) {\n // Escape the regex for string literal\n const escapedRegex = attr.regex.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n parts.push(`.regex(new RegExp('${escapedRegex}'))`);\n }\n\n return parts.join('');\n}\n\n/**\n * Build Zod schema for email attributes\n */\nfunction buildEmailSchema(attr: StringAttribute): string {\n let schema = 'z.string().email()';\n\n if (attr.minLength !== undefined) {\n schema += `.min(${attr.minLength})`;\n }\n\n if (attr.maxLength !== undefined) {\n schema += `.max(${attr.maxLength})`;\n }\n\n return schema;\n}\n\n/**\n * Build Zod schema for password attributes\n */\nfunction buildPasswordSchema(attr: StringAttribute): string {\n let schema = 'z.string()';\n\n // Passwords typically have a minimum length\n const minLength = attr.minLength ?? 6;\n schema += `.min(${minLength})`;\n\n if (attr.maxLength !== undefined) {\n schema += `.max(${attr.maxLength})`;\n }\n\n return schema;\n}\n\n/**\n * Build Zod schema for integer attributes\n */\nfunction buildIntegerSchema(attr: NumberAttribute): string {\n const parts: string[] = ['z.number().int()'];\n\n if (attr.min !== undefined) {\n parts.push(`.min(${attr.min})`);\n }\n\n if (attr.max !== undefined) {\n parts.push(`.max(${attr.max})`);\n }\n\n return parts.join('');\n}\n\n/**\n * Build Zod schema for float/decimal attributes\n */\nfunction buildFloatSchema(attr: NumberAttribute): string {\n const parts: string[] = ['z.number()'];\n\n if (attr.min !== undefined) {\n parts.push(`.min(${attr.min})`);\n }\n\n if (attr.max !== undefined) {\n parts.push(`.max(${attr.max})`);\n }\n\n return parts.join('');\n}\n\n/**\n * Build Zod schema for enumeration attributes\n */\nfunction buildEnumSchema(attr: EnumerationAttribute): string {\n if (!attr.enum || attr.enum.length === 0) {\n return 'z.string()';\n }\n\n const enumValues = attr.enum.map((v) => `'${v}'`).join(', ');\n return `z.enum([${enumValues}])`;\n}\n\n/**\n * Build Zod schema for media attributes\n *\n * For create/update operations, media fields accept:\n * - Single: number (media ID) or null to remove\n * - Multiple: array of numbers (media IDs)\n *\n * Note: Files must be uploaded first via the upload API (/api/upload),\n * then the returned file IDs are used here to link to the entry.\n *\n * @example\n * // Single media\n * { cover: 42 } // Link file with ID 42\n * { cover: null } // Remove the linked file\n *\n * // Multiple media\n * { gallery: [1, 2, 3] } // Link files with IDs 1, 2, 3\n * { gallery: [] } // Remove all linked files\n */\nfunction buildMediaSchema(attr: MediaAttribute): string {\n if (attr.multiple) {\n // Multiple media: array of file IDs (numbers)\n // Empty array is valid to remove all files\n return 'z.array(z.number().int().positive()).default([])';\n }\n // Single media: file ID (number) or null to remove\n return 'z.number().int().positive().nullable()';\n}\n\n/**\n * Build Zod schema for relation attributes\n *\n * For create/update operations, relations accept:\n *\n * **Simple format (default):**\n * - oneToOne/manyToOne: documentId (string in v5, number in v4) or null\n * - oneToMany/manyToMany: array of documentIds\n *\n * **Advanced format (Strapi v5 with useAdvancedRelations):**\n * Supports connect, disconnect, and set operations with full options:\n * - connect: Add relations while preserving existing ones\n * - disconnect: Remove specific relations\n * - set: Replace ALL relations (cannot combine with connect/disconnect)\n *\n * Each relation item can specify:\n * - documentId: Required - the document to relate\n * - locale: Optional - for i18n content types\n * - status: Optional - 'draft' or 'published' for draft & publish\n * - position: Optional - ordering (before, after, start, end)\n *\n * @see https://docs.strapi.io/dev-docs/api/rest/relations\n *\n * @example\n * // Simple format (v5)\n * { author: \"abc123\" } // Link to document\n * { author: null } // Remove relation\n * { tags: [\"id1\", \"id2\"] } // Link multiple documents (shorthand)\n *\n * // Advanced format - connect with position\n * {\n * categories: {\n * connect: [\n * { documentId: \"id1\", position: { start: true } },\n * { documentId: \"id2\", position: { after: \"id1\" } }\n * ]\n * }\n * }\n *\n * // Advanced format - with locale and status (i18n + draft/publish)\n * {\n * categories: {\n * connect: [\n * { documentId: \"id1\", locale: \"en\", status: \"published\" },\n * { documentId: \"id1\", locale: \"fr\", status: \"draft\" }\n * ]\n * }\n * }\n *\n * // Advanced format - combine connect and disconnect\n * {\n * tags: {\n * connect: [{ documentId: \"newTag\" }],\n * disconnect: [{ documentId: \"oldTag\" }]\n * }\n * }\n *\n * // Advanced format - set (replaces all)\n * {\n * tags: {\n * set: [\"id1\", \"id2\"] // Shorthand\n * }\n * }\n */\nfunction buildRelationSchema(attr: RelationAttribute, options: ZodMapperOptions = {}): string {\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n const isV5 = options.strapiVersion !== 'v4';\n const useAdvanced = options.useAdvancedRelations && isV5;\n\n // ID type depends on Strapi version\n // v5 uses documentId (string), v4 uses id (number)\n const idSchema = isV5 ? 'z.string()' : 'z.number().int().positive()';\n\n if (useAdvanced) {\n // Position schema for ordering relations\n const positionSchema = `z.object({\n before: z.string().optional(),\n after: z.string().optional(),\n start: z.boolean().optional(),\n end: z.boolean().optional(),\n }).optional()`;\n\n // Full relation item schema with all options (longhand)\n const relationItemSchema = `z.object({\n documentId: ${idSchema},\n /** Locale for i18n content types */\n locale: z.string().optional(),\n /** Target draft or published version */\n status: z.enum(['draft', 'published']).optional(),\n /** Position for ordering */\n position: ${positionSchema},\n })`;\n\n // Shorthand: just documentId string/number\n // Longhand: full object with options\n const itemOrIdSchema = `z.union([${idSchema}, ${relationItemSchema}])`;\n\n // Disconnect only needs documentId (and optionally locale/status)\n const disconnectItemSchema = `z.union([\n ${idSchema},\n z.object({\n documentId: ${idSchema},\n locale: z.string().optional(),\n status: z.enum(['draft', 'published']).optional(),\n })\n ])`;\n\n // Advanced relation format\n // Note: set cannot be combined with connect/disconnect\n return `z.union([\n // Shorthand: array of documentIds (equivalent to set)\n z.array(${idSchema}),\n // Longhand: object with connect/disconnect/set\n z.object({\n /** Add relations while preserving existing ones */\n connect: z.array(${itemOrIdSchema}).optional(),\n /** Remove specific relations */\n disconnect: z.array(${disconnectItemSchema}).optional(),\n /** Replace ALL relations (cannot combine with connect/disconnect) */\n set: z.array(${itemOrIdSchema}).optional(),\n })\n]).optional()`;\n }\n\n // Simple format: just IDs\n if (isMany) {\n return `z.array(${idSchema}).default([])`;\n }\n\n return `${idSchema}.nullable()`;\n}\n\n/**\n * Build Zod schema for component attributes\n *\n * When componentSchemaNames is provided, references the imported component schema.\n * Otherwise falls back to a generic object schema.\n */\nfunction buildComponentSchema(attr: ComponentAttribute, options: ZodMapperOptions = {}): string {\n const schemaName = options.componentSchemaNames?.get(attr.component);\n\n if (schemaName) {\n if (attr.repeatable) {\n return `z.array(${schemaName})`;\n }\n return `${schemaName}.nullable()`;\n }\n\n // Fallback when no component schema map is provided\n if (attr.repeatable) {\n return 'z.array(z.record(z.unknown()))';\n }\n return 'z.record(z.unknown()).nullable()';\n}\n\n/**\n * Build Zod schema for dynamic zone attributes\n *\n * When componentSchemaNames is provided, generates a z.discriminatedUnion\n * on '__component' with each component schema extended with its literal.\n * Otherwise falls back to a generic array schema.\n */\nfunction buildDynamicZoneSchema(attr: DynamicZoneAttribute, options: ZodMapperOptions = {}): string {\n if (options.componentSchemaNames && attr.components && attr.components.length > 0) {\n const members = attr.components\n .map((uid) => {\n const schemaName = options.componentSchemaNames!.get(uid);\n if (!schemaName) return null;\n return `${schemaName}.extend({ __component: z.literal('${uid}') })`;\n })\n .filter(Boolean);\n\n if (members.length > 0) {\n return `z.array(\\n z.discriminatedUnion('__component', [\\n ${members.join(',\\n ')},\\n ])\\n)`;\n }\n }\n\n // Fallback when no component schema map is provided\n return 'z.array(z.record(z.unknown()))';\n}\n\n/**\n * Format a default value for Zod\n */\nfunction formatDefaultValue(value: unknown, type: string): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n switch (type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'uid':\n return typeof value === 'string' ? `'${value.replace(/'/g, \"\\\\'\")}'` : null;\n\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return typeof value === 'number' ? String(value) : null;\n\n case 'boolean':\n return typeof value === 'boolean' ? String(value) : null;\n\n case 'enumeration':\n return typeof value === 'string' ? `'${value}'` : null;\n\n default:\n return null;\n }\n}\n\n/**\n * Generate a complete Zod object schema from attributes\n */\nexport function generateZodObjectSchema(\n attributes: Record<string, Attribute>,\n options: ZodMapperOptions = {}\n): { schema: string; skippedFields: Array<{ name: string; reason: string }> } {\n const fields: string[] = [];\n const skippedFields: Array<{ name: string; reason: string }> = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n // Skip system fields\n if (isSystemField(name)) {\n continue;\n }\n\n // Skip private fields\n if (attr.private) {\n skippedFields.push({ name, reason: 'Private field' });\n continue;\n }\n\n const mapped = mapAttributeToZodSchema(attr, options);\n\n if (mapped.skip) {\n skippedFields.push({ name, reason: mapped.skipReason || 'Unknown' });\n continue;\n }\n\n fields.push(` ${name}: ${mapped.schema},`);\n }\n\n const schema = `z.object({\\n${fields.join('\\n')}\\n})`;\n\n return { schema, skippedFields };\n}\n","/**\n * Astro Actions generator\n * Generates type-safe Astro Actions for Strapi content types\n *\n * Requirements:\n * - Astro v4.0+ (Actions are only available in v4+)\n * - TypeScript enabled\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\nimport { formatCode } from '../../utils/formatter.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toCamelCase, toKebabCase } from '../../utils/naming.js';\nimport { generateZodObjectSchema } from '../../shared/zod-mapper.js';\n\nexport interface AstroActionsOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n /** Use typed Zod schemas instead of generic z.record(z.unknown()) */\n useTypedSchemas?: boolean;\n}\n\n/**\n * Check if Astro Actions are supported\n * Requires Astro v4.0 or higher\n */\nexport function isAstroActionsSupported(astroVersion: string | null): boolean {\n if (!astroVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = astroVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 4;\n}\n\n/**\n * Generate Astro Actions from parsed schema\n */\nexport async function generateAstroActions(\n schema: ParsedSchema,\n options: AstroActionsOptions\n): Promise<string[]> {\n const { outputDir, servicesImportPath, strapiVersion = \"v5\", useTypedSchemas = true } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n // Generate actions for collections\n for (const collection of schema.collections) {\n const fileName = `${toKebabCase(collection.singularName)}.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateCollectionActions(collection, servicesImportPath, strapiVersion, useTypedSchemas);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n // Generate actions for single types\n for (const single of schema.singles) {\n const fileName = `${toKebabCase(single.singularName)}.ts`;\n const filePath = path.join(outputDir, fileName);\n const content = generateSingleActions(single, servicesImportPath, useTypedSchemas);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate actions for a collection type\n */\nfunction generateCollectionActions(\n collection: CollectionType,\n servicesImportPath: string,\n strapiVersion: StrapiVersion,\n useTypedSchemas: boolean = false\n): string {\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const actionsName = toCamelCase(collection.singularName);\n const fileName = toKebabCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idInputSchema = isV4 ? 'z.number().int().positive()' : 'z.string().min(1)';\n const idParamName = isV4 ? 'id' : 'documentId';\n const idComment = isV4 ? 'id' : 'documentId';\n\n // Detect if collection has a slug field\n const hasSlug = 'slug' in collection.attributes;\n\n // Generate typed schemas if enabled\n let createDataSchema = 'z.record(z.unknown())';\n let updateDataSchema = 'z.record(z.unknown())';\n let schemaDefinitions = '';\n\n if (useTypedSchemas) {\n const createResult = generateZodObjectSchema(collection.attributes, { isUpdate: false });\n const updateResult = generateZodObjectSchema(collection.attributes, { isUpdate: true });\n\n schemaDefinitions = `\n/**\n * Create schema for ${collection.displayName}\n */\nconst createSchema = ${createResult.schema};\n\n/**\n * Update schema for ${collection.displayName}\n */\nconst updateSchema = ${updateResult.schema};\n`;\n createDataSchema = 'createSchema';\n updateDataSchema = 'updateSchema';\n }\n\n return `/**\n * ${collection.displayName} Actions\n * ${collection.description || ''}\n * Generated by strapi2front\n * Framework: Astro\n * Strapi version: ${strapiVersion}\n */\n\nimport { defineAction, ActionError } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from '${servicesImportPath}/${fileName}.service';\n\n/**\n * Pagination input schema\n */\nconst paginationSchema = z.object({\n page: z.number().int().positive().optional().default(1),\n pageSize: z.number().int().positive().max(100).optional().default(25),\n}).optional();\n${schemaDefinitions}\n\n/**\n * ${collection.displayName} actions\n */\nexport const ${actionsName} = {\n /**\n * Get all ${collection.pluralName} with pagination\n */\n getAll: defineAction({\n input: z.object({\n pagination: paginationSchema,\n sort: z.union([z.string(), z.array(z.string())]).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const result = await ${serviceName}.findMany({\n pagination: input?.pagination,\n sort: input?.sort,\n });\n\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.pluralName}',\n });\n }\n },\n }),\n\n /**\n * Get a single ${collection.singularName} by ${idComment}\n */\n getOne: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }),\n handler: async ({ ${idParamName}, populate }) => {\n try {\n const result = await ${serviceName}.findOne(${idParamName}, { populate });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${collection.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.singularName}',\n });\n }\n },\n }),\n${hasSlug ? `\n /**\n * Get a single ${collection.singularName} by slug\n */\n getBySlug: defineAction({\n input: z.object({\n slug: z.string().min(1),\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }),\n handler: async ({ slug, populate }) => {\n try {\n const result = await ${serviceName}.findBySlug(slug, { populate });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${collection.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${collection.singularName}',\n });\n }\n },\n }),\n` : ''}\n /**\n * Create a new ${collection.singularName}\n */\n create: defineAction({\n input: z.object({\n data: ${createDataSchema},\n }),\n handler: async ({ data }) => {\n try {\n const result = await ${serviceName}.create(data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to create ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Update a ${collection.singularName}\n */\n update: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n data: ${updateDataSchema},\n }),\n handler: async ({ ${idParamName}, data }) => {\n try {\n const result = await ${serviceName}.update(${idParamName}, data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to update ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Delete a ${collection.singularName}\n */\n delete: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async ({ ${idParamName} }) => {\n try {\n await ${serviceName}.delete(${idParamName});\n return { success: true };\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to delete ${collection.singularName}',\n });\n }\n },\n }),\n\n /**\n * Count ${collection.pluralName}\n */\n count: defineAction({\n input: z.object({\n filters: z.record(z.unknown()).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const count = await ${serviceName}.count(input?.filters as any);\n return { count };\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to count ${collection.pluralName}',\n });\n }\n },\n }),\n};\n`;\n}\n\n/**\n * Generate actions for a single type\n */\nfunction generateSingleActions(\n single: SingleType,\n servicesImportPath: string,\n useTypedSchemas: boolean = false\n): string {\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const actionsName = toCamelCase(single.singularName);\n const fileName = toKebabCase(single.singularName);\n\n // Generate typed schema if enabled\n let updateDataSchema = 'z.record(z.unknown())';\n let schemaDefinitions = '';\n\n if (useTypedSchemas) {\n const updateResult = generateZodObjectSchema(single.attributes, { isUpdate: true });\n\n schemaDefinitions = `\n/**\n * Update schema for ${single.displayName}\n */\nconst updateSchema = ${updateResult.schema};\n`;\n updateDataSchema = 'updateSchema';\n }\n\n return `/**\n * ${single.displayName} Actions (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Framework: Astro\n */\n\nimport { defineAction, ActionError } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from '${servicesImportPath}/${fileName}.service';\n${schemaDefinitions}\n/**\n * ${single.displayName} actions\n */\nexport const ${actionsName} = {\n /**\n * Get ${single.displayName}\n */\n get: defineAction({\n input: z.object({\n populate: z.union([z.string(), z.array(z.string())]).optional(),\n }).optional(),\n handler: async (input) => {\n try {\n const result = await ${serviceName}.find({\n populate: input?.populate,\n });\n\n if (!result) {\n throw new ActionError({\n code: 'NOT_FOUND',\n message: '${single.displayName} not found',\n });\n }\n\n return result;\n } catch (error) {\n if (error instanceof ActionError) throw error;\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch ${single.singularName}',\n });\n }\n },\n }),\n\n /**\n * Update ${single.displayName}\n */\n update: defineAction({\n input: z.object({\n data: ${updateDataSchema},\n }),\n handler: async ({ data }) => {\n try {\n const result = await ${serviceName}.update(data);\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Failed to update ${single.singularName}',\n });\n }\n },\n }),\n};\n`;\n}\n","/**\n * Actions generator\n * Re-exports from frameworks/astro for backwards compatibility\n *\n * For framework-specific generators, import directly from:\n * - '@strapi2front/generators/frameworks/astro'\n * - '@strapi2front/generators/frameworks/nextjs' (coming soon)\n * - '@strapi2front/generators/frameworks/nuxt' (coming soon)\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../shared/types.js';\nimport { generateAstroActions } from '../frameworks/astro/actions.js';\n\nexport interface ActionsGeneratorOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Astro Actions from parsed schema\n * @deprecated Use generateAstroActions from '@strapi2front/generators/frameworks/astro' instead\n */\nexport async function generateActions(\n schema: ParsedSchema,\n options: ActionsGeneratorOptions\n): Promise<string[]> {\n return generateAstroActions(schema, {\n outputDir: options.outputDir,\n servicesImportPath: options.servicesImportPath,\n strapiVersion: options.strapiVersion,\n });\n}\n","import path from 'node:path';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\n\nexport interface ClientGeneratorOptions {\n outputDir: string;\n strapiVersion?: \"v4\" | \"v5\";\n apiPrefix?: string;\n}\n\n/**\n * Generate the Strapi client file\n */\nexport async function generateClient(\n options: ClientGeneratorOptions\n): Promise<string[]> {\n const { outputDir, strapiVersion = \"v5\", apiPrefix = \"/api\" } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n const filePath = path.join(outputDir, 'client.ts');\n const content = generateClientFile(strapiVersion, apiPrefix);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n\n return generatedFiles;\n}\n\n/**\n * Generate the client file content\n */\nfunction generateClientFile(strapiVersion: \"v4\" | \"v5\", apiPrefix: string): string {\n const isV4 = strapiVersion === \"v4\";\n\n if (isV4) {\n return generateV4ClientFile(apiPrefix);\n }\n return generateV5ClientFile(apiPrefix);\n}\n\n/**\n * Generate client for Strapi v5 (flat response structure)\n */\nfunction generateV5ClientFile(apiPrefix: string): string {\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n return `/**\n * Strapi Client (v5)\n * Generated by strapi2front\n *\n * Using official @strapi/client\n * @see https://docs.strapi.io/cms/api/client\n */\n\nimport { strapi } from '@strapi/client';\n\n// Initialize the Strapi client\nconst baseURL = (import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337') + '${normalizedPrefix}';\nconst authToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\n\nexport const strapiClient = strapi({\n baseURL,\n auth: authToken,\n});\n\n// Pagination type\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n// Media types\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\nexport interface StrapiMedia {\n id: number;\n documentId: string;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * File metadata for uploads\n * @see https://docs.strapi.io/cms/api/client#upload\n */\nexport interface StrapiFileInfo {\n name?: string;\n alternativeText?: string;\n caption?: string;\n}\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Helper to get typed collection\nexport function collection<T>(pluralName: string) {\n const col = strapiClient.collection(pluralName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await col.find(params) as any;\n return {\n data: Array.isArray(response.data) ? response.data : [],\n meta: {\n pagination: response.meta?.pagination || defaultPagination,\n },\n };\n },\n async findOne(documentId: string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await col.findOne(documentId, params) as any;\n return { data: response.data };\n },\n async create(data: Partial<T>): Promise<{ data: T }> {\n const response = await col.create(data as any) as any;\n return { data: response.data };\n },\n async update(documentId: string, data: Partial<T>): Promise<{ data: T }> {\n const response = await col.update(documentId, data as any) as any;\n return { data: response.data };\n },\n async delete(documentId: string): Promise<void> {\n await col.delete(documentId);\n },\n };\n}\n\n// Helper to get typed single type\nexport function single<T>(singularName: string) {\n const singleType = strapiClient.single(singularName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await singleType.find(params) as any;\n return { data: response.data };\n },\n async update(data: Partial<T>): Promise<{ data: T }> {\n const response = await singleType.update(data as any) as any;\n return { data: response.data };\n },\n async delete(): Promise<void> {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nexport const files = {\n async upload(file: File | Blob, options?: { fileInfo?: StrapiFileInfo }): Promise<StrapiMedia> {\n const response = await strapiClient.files.upload(file, options) as any;\n return response;\n },\n async find(params?: Record<string, unknown>): Promise<StrapiMedia[]> {\n const response = await strapiClient.files.find(params) as any;\n return Array.isArray(response) ? response : [];\n },\n async findOne(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.findOne(fileId) as any;\n return response;\n },\n async update(fileId: number, fileInfo: StrapiFileInfo): Promise<StrapiMedia> {\n const response = await strapiClient.files.update(fileId, fileInfo) as any;\n return response;\n },\n async delete(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.delete(fileId) as any;\n return response;\n },\n};\n`;\n}\n\n/**\n * Generate client for Strapi v4 (nested attributes structure)\n */\nfunction generateV4ClientFile(apiPrefix: string): string {\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n return `/**\n * Strapi Client (v4)\n * Generated by strapi2front\n *\n * Note: @strapi/client officially supports Strapi v5+\n * This v4 client uses a compatibility layer for the nested attributes structure\n */\n\nimport { strapi as createStrapi } from '@strapi/client';\n\n// Initialize the Strapi client\nconst baseURL = (import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337') + '${normalizedPrefix}';\nconst authToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\n\nexport const strapiClient = createStrapi({\n baseURL,\n auth: authToken,\n});\n\n// Pagination type\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\n// Media types\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\nexport interface StrapiMedia {\n id: number;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * File metadata for uploads\n * @see https://docs.strapi.io/cms/api/client#upload\n */\nexport interface StrapiFileInfo {\n name?: string;\n alternativeText?: string;\n caption?: string;\n}\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Strapi v4 raw response types (with nested attributes)\ninterface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n */\nfunction flattenItem<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n */\nfunction flattenRelations<T>(data: T): T {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n return data.map(item => flattenRelations(item)) as unknown as T;\n }\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n // Check if this is a Strapi v4 relation response { data: { id, attributes } }\n if (value && typeof value === 'object' && 'data' in value) {\n const relationData = (value as { data: unknown }).data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n // To-many relation\n result[key] = relationData.map((item: StrapiV4RawItem<unknown>) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && 'id' in relationData && 'attributes' in relationData) {\n // To-one relation\n result[key] = flattenRelations(flattenItem(relationData as StrapiV4RawItem<unknown>));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n return result as T;\n }\n return data;\n}\n\n// Helper to get typed collection (v4 compatibility wrapper)\nexport function collection<T>(pluralName: string) {\n const col = strapiClient.collection(pluralName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await col.find(params) as any;\n const flattenedData = Array.isArray(response.data)\n ? response.data.map((item: StrapiV4RawItem<T>) => flattenRelations(flattenItem<T>(item)))\n : [];\n return {\n data: flattenedData,\n meta: { pagination: response.meta?.pagination || defaultPagination },\n };\n },\n async findOne(id: number | string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await col.findOne(String(id), params) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async create(data: Partial<T>): Promise<{ data: T }> {\n const response = await col.create(data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(id: number | string, data: Partial<T>): Promise<{ data: T }> {\n const response = await col.update(String(id), data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(id: number | string): Promise<void> {\n await col.delete(String(id));\n },\n };\n}\n\n// Helper to get typed single type (v4 compatibility wrapper)\nexport function single<T>(singularName: string) {\n const singleType = strapiClient.single(singularName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await singleType.find(params) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(data: Partial<T>): Promise<{ data: T }> {\n const response = await singleType.update(data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(): Promise<void> {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nexport const files = {\n async upload(file: File | Blob, options?: { fileInfo?: StrapiFileInfo }): Promise<StrapiMedia> {\n const response = await strapiClient.files.upload(file, options) as any;\n return response;\n },\n async find(params?: Record<string, unknown>): Promise<StrapiMedia[]> {\n const response = await strapiClient.files.find(params) as any;\n return Array.isArray(response) ? response : [];\n },\n async findOne(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.findOne(fileId) as any;\n return response;\n },\n async update(fileId: number, fileInfo: StrapiFileInfo): Promise<StrapiMedia> {\n const response = await strapiClient.files.update(fileId, fileInfo) as any;\n return response;\n },\n async delete(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.delete(fileId) as any;\n return response;\n },\n};\n`;\n}\n","import path from 'node:path';\nimport type { StrapiLocale } from '@strapi2front/core';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\n\nexport interface LocalesGeneratorOptions {\n outputDir: string;\n}\n\n/**\n * Generate locales file from Strapi i18n configuration\n */\nexport async function generateLocales(\n locales: StrapiLocale[],\n options: LocalesGeneratorOptions\n): Promise<string[]> {\n const { outputDir } = options;\n const generatedFiles: string[] = [];\n\n await ensureDir(outputDir);\n\n const filePath = path.join(outputDir, 'locales.ts');\n const content = generateLocalesFile(locales);\n await writeFile(filePath, await formatCode(content));\n generatedFiles.push(filePath);\n\n return generatedFiles;\n}\n\n/**\n * Generate the locales file content\n */\nfunction generateLocalesFile(locales: StrapiLocale[]): string {\n if (locales.length === 0) {\n return `/**\n * Strapi Locales\n * Generated by strapi2front\n *\n * Note: No locales found. i18n might not be enabled in Strapi.\n */\n\nexport const locales = [] as const;\n\nexport type Locale = string;\n\nexport const defaultLocale: Locale = 'en';\n\nexport const localeNames: Record<string, string> = {};\n`;\n }\n\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n const localeCodes = locales.map(l => `'${l.code}'`).join(' | ');\n const localeArray = locales.map(l => `'${l.code}'`).join(', ');\n const localeNames = locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n');\n\n return `/**\n * Strapi Locales\n * Generated by strapi2front\n */\n\n/**\n * Available locale codes\n */\nexport const locales = [${localeArray}] as const;\n\n/**\n * Locale type - union of all available locales\n */\nexport type Locale = ${localeCodes};\n\n/**\n * Default locale\n */\nexport const defaultLocale: Locale = '${defaultLocale}';\n\n/**\n * Locale display names\n */\nexport const localeNames: Record<Locale, string> = {\n${localeNames}\n};\n\n/**\n * Check if a string is a valid locale\n */\nexport function isValidLocale(code: string): code is Locale {\n return locales.includes(code as Locale);\n}\n\n/**\n * Get locale name by code\n */\nexport function getLocaleName(code: Locale): string {\n return localeNames[code] || code;\n}\n`;\n}\n","import path from 'node:path';\nimport type {\n ParsedSchema,\n CollectionType,\n SingleType,\n ComponentType,\n Attribute,\n StrapiLocale,\n} from '@strapi2front/core';\nimport { formatCode } from '../utils/formatter.js';\nimport { writeFile, ensureDir } from '../utils/file.js';\nimport { toPascalCase, toCamelCase, toKebabCase } from '../utils/naming.js';\nimport { generateZodObjectSchema, type ZodMapperOptions } from '../shared/zod-mapper.js';\n\nexport interface ByFeatureGeneratorOptions {\n outputDir: string;\n features: {\n types: boolean;\n services: boolean;\n actions: boolean;\n /**\n * Generate Zod schemas for validation\n * Useful for React Hook Form, TanStack Form, Formik, etc.\n * @default true for TypeScript, false for JSDoc\n */\n schemas?: boolean;\n /**\n * Generate upload helpers (upload-client + upload-action)\n * @default false\n */\n upload?: boolean;\n };\n /**\n * Schema generation options\n */\n schemaOptions?: {\n /**\n * Use advanced relation format with connect/disconnect/set operations\n * @default false\n */\n advancedRelations?: boolean;\n };\n blocksRendererInstalled?: boolean;\n strapiVersion?: \"v4\" | \"v5\";\n apiPrefix?: string;\n /**\n * Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n * @default 'typescript'\n */\n outputFormat?: \"typescript\" | \"jsdoc\";\n /**\n * Module type for JSDoc output: 'esm' for ES Modules, 'commonjs' for CommonJS\n * @default 'commonjs'\n */\n moduleType?: \"esm\" | \"commonjs\";\n}\n\n/**\n * Generate all files using 'by-feature' structure\n *\n * Output structure:\n * strapi/\n * collections/\n * article/\n * types.ts\n * schemas.ts\n * service.ts\n * actions.ts\n * singles/\n * homepage/\n * types.ts\n * schemas.ts\n * service.ts\n * components/\n * seo.ts\n * shared/\n * utils.ts\n * client.ts\n * upload-client.ts (when features.upload)\n * upload-action.ts (when features.upload + actions + TypeScript)\n * locales.ts\n */\nexport async function generateByFeature(\n schema: ParsedSchema,\n locales: StrapiLocale[],\n options: ByFeatureGeneratorOptions\n): Promise<string[]> {\n const {\n outputDir,\n features,\n schemaOptions = {},\n blocksRendererInstalled = false,\n strapiVersion = \"v5\",\n apiPrefix = \"/api\",\n outputFormat = \"typescript\",\n moduleType = \"commonjs\"\n } = options;\n const generatedFiles: string[] = [];\n\n // Schema options\n const advancedRelations = schemaOptions.advancedRelations ?? false;\n\n // Determine export/import style for JSDoc\n const useESM = outputFormat === \"jsdoc\" && moduleType === \"esm\";\n\n // File extension based on output format\n const ext = outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n\n // Determine if schemas should be generated\n // Default: true for TypeScript, false for JSDoc (Zod works best with TS)\n const generateSchemas = features.schemas ?? (outputFormat === \"typescript\");\n\n // Ensure directories exist\n await ensureDir(path.join(outputDir, 'collections'));\n await ensureDir(path.join(outputDir, 'singles'));\n await ensureDir(path.join(outputDir, 'components'));\n await ensureDir(path.join(outputDir, 'shared'));\n\n // Generate shared files\n const sharedDir = path.join(outputDir, 'shared');\n\n // Utils\n const utilsPath = path.join(sharedDir, `utils.${ext}`);\n const utilsContent = outputFormat === \"jsdoc\"\n ? generateUtilityTypesJSDoc(blocksRendererInstalled, strapiVersion, useESM)\n : generateUtilityTypes(blocksRendererInstalled, strapiVersion);\n await writeFile(utilsPath, await formatCode(utilsContent));\n generatedFiles.push(utilsPath);\n\n // Client\n const clientPath = path.join(sharedDir, `client.${ext}`);\n const clientContent = outputFormat === \"jsdoc\"\n ? generateClientJSDoc(strapiVersion, apiPrefix, useESM)\n : generateClient(strapiVersion, apiPrefix);\n await writeFile(clientPath, await formatCode(clientContent));\n generatedFiles.push(clientPath);\n\n // Locales\n const localesPath = path.join(sharedDir, `locales.${ext}`);\n const localesContent = outputFormat === \"jsdoc\"\n ? generateLocalesFileJSDoc(locales, useESM)\n : generateLocalesFile(locales);\n await writeFile(localesPath, await formatCode(localesContent));\n generatedFiles.push(localesPath);\n\n // Upload helpers\n if (features.upload) {\n // Upload client (always generated when upload is enabled)\n const uploadClientPath = path.join(sharedDir, `upload-client.${ext}`);\n const uploadClientContent = outputFormat === \"jsdoc\"\n ? generateUploadClientJSDoc(useESM)\n : generateUploadClientTS();\n await writeFile(uploadClientPath, await formatCode(uploadClientContent));\n generatedFiles.push(uploadClientPath);\n\n // Upload action (only if actions enabled + TypeScript)\n if (features.actions && outputFormat === \"typescript\") {\n const uploadActionPath = path.join(sharedDir, 'upload-action.ts');\n const uploadActionContent = generateUploadActionTS();\n await writeFile(uploadActionPath, await formatCode(uploadActionContent));\n generatedFiles.push(uploadActionPath);\n }\n }\n\n // Generate collection files\n for (const collection of schema.collections) {\n const featureDir = path.join(outputDir, 'collections', toKebabCase(collection.singularName));\n await ensureDir(featureDir);\n\n if (features.types) {\n const typesPath = path.join(featureDir, `types.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateCollectionTypesJSDoc(collection, schema, useESM)\n : generateCollectionTypes(collection, schema);\n await writeFile(typesPath, await formatCode(content));\n generatedFiles.push(typesPath);\n }\n\n // Generate schemas.ts for validation (React Hook Form, TanStack Form, etc.)\n if (generateSchemas) {\n const schemasPath = path.join(featureDir, `schemas.${ext}`);\n const schemasContent = generateCollectionSchemas(collection, schema, strapiVersion, advancedRelations);\n await writeFile(schemasPath, await formatCode(schemasContent));\n generatedFiles.push(schemasPath);\n }\n\n if (features.services) {\n const servicePath = path.join(featureDir, `service.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateCollectionServiceJSDoc(collection, strapiVersion, useESM)\n : generateCollectionService(collection, strapiVersion);\n await writeFile(servicePath, await formatCode(content));\n generatedFiles.push(servicePath);\n }\n\n if (features.actions) {\n const actionsPath = path.join(featureDir, `actions.${ext}`);\n const actionsContent = generateCollectionActions(collection, {\n strapiVersion,\n useExternalSchemas: generateSchemas,\n draftAndPublish: collection.draftAndPublish,\n });\n await writeFile(actionsPath, await formatCode(actionsContent));\n generatedFiles.push(actionsPath);\n }\n }\n\n // Generate single type files\n for (const single of schema.singles) {\n const featureDir = path.join(outputDir, 'singles', toKebabCase(single.singularName));\n await ensureDir(featureDir);\n\n if (features.types) {\n const typesPath = path.join(featureDir, `types.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateSingleTypesJSDoc(single, schema, useESM)\n : generateSingleTypes(single, schema);\n await writeFile(typesPath, await formatCode(content));\n generatedFiles.push(typesPath);\n }\n\n // Generate schemas.ts for single types too\n if (generateSchemas) {\n const schemasPath = path.join(featureDir, `schemas.${ext}`);\n const schemasContent = generateSingleSchemas(single, schema, strapiVersion, advancedRelations);\n await writeFile(schemasPath, await formatCode(schemasContent));\n generatedFiles.push(schemasPath);\n }\n\n if (features.services) {\n const servicePath = path.join(featureDir, `service.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateSingleServiceJSDoc(single, strapiVersion, useESM)\n : generateSingleService(single, strapiVersion);\n await writeFile(servicePath, await formatCode(content));\n generatedFiles.push(servicePath);\n }\n }\n\n // Generate component files\n for (const component of schema.components) {\n const componentPath = path.join(outputDir, 'components', `${toKebabCase(component.name)}.${ext}`);\n const content = outputFormat === \"jsdoc\"\n ? generateComponentTypesJSDoc(component, schema, useESM)\n : generateComponentTypes(component, schema, generateSchemas, strapiVersion, advancedRelations);\n await writeFile(componentPath, await formatCode(content));\n generatedFiles.push(componentPath);\n }\n\n return generatedFiles;\n}\n\n// ============================================\n// Shared Files Generation\n// ============================================\n\nfunction generateUtilityTypes(blocksRendererInstalled: boolean, strapiVersion: \"v4\" | \"v5\"): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n */\nexport type RichTextContent = string;`\n : blocksRendererInstalled\n ? `/**\n * Blocks content type (Strapi v5 rich text)\n * Re-exported from @strapi/blocks-react-renderer\n */\nexport type { BlocksContent } from '@strapi/blocks-react-renderer';`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n */\nexport type BlocksContent = unknown[];`;\n\n const baseEntity = isV4\n ? `export interface StrapiBaseEntity {\n id: number;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`\n : `export interface StrapiBaseEntity {\n id: number;\n documentId: string;\n createdAt: string;\n updatedAt: string;\n publishedAt: string | null;\n}`;\n\n const mediaType = isV4\n ? `export interface StrapiMedia {\n id: number;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`\n : `export interface StrapiMedia {\n id: number;\n documentId: string;\n name: string;\n alternativeText: string | null;\n caption: string | null;\n width: number;\n height: number;\n formats: {\n thumbnail?: StrapiMediaFormat;\n small?: StrapiMediaFormat;\n medium?: StrapiMediaFormat;\n large?: StrapiMediaFormat;\n } | null;\n hash: string;\n ext: string;\n mime: string;\n size: number;\n url: string;\n previewUrl: string | null;\n provider: string;\n createdAt: string;\n updatedAt: string;\n}`;\n\n const v4RawResponseTypes = isV4 ? `\n\n/**\n * Strapi v4 raw API response (with nested attributes)\n */\nexport interface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\nexport interface StrapiV4RawResponse<T> {\n data: StrapiV4RawItem<T>;\n meta: Record<string, unknown>;\n}\n\nexport interface StrapiV4RawListResponse<T> {\n data: StrapiV4RawItem<T>[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n/**\n * Flatten Strapi v4 response item\n */\nexport function flattenV4Response<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Flatten Strapi v4 list response\n */\nexport function flattenV4ListResponse<T>(items: StrapiV4RawItem<T>[]): T[] {\n return items.map(item => flattenV4Response<T>(item));\n}` : '';\n\n return `/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\nexport interface StrapiMediaFormat {\n name: string;\n hash: string;\n ext: string;\n mime: string;\n width: number;\n height: number;\n size: number;\n url: string;\n}\n\n/**\n * File metadata for uploads\n * @see https://docs.strapi.io/cms/api/client#upload\n */\nexport interface StrapiFileInfo {\n name?: string;\n alternativeText?: string;\n caption?: string;\n}\n\nexport interface StrapiPagination {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface StrapiResponse<T> {\n data: T;\n meta: {\n pagination?: StrapiPagination;\n };\n}\n\nexport interface StrapiListResponse<T> {\n data: T[];\n meta: {\n pagination: StrapiPagination;\n };\n}\n\n${baseEntity}\n${v4RawResponseTypes}\n${blocksContentType}\n`;\n}\n\nfunction generateClient(strapiVersion: \"v4\" | \"v5\", apiPrefix: string = \"/api\"): string {\n const isV4 = strapiVersion === \"v4\";\n // Normalize prefix for the generated code\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n // Note: @strapi/client is officially supported only for Strapi v5\n // For v4, we still need custom handling due to nested attributes structure\n if (isV4) {\n return `/**\n * Strapi Client (v4)\n * Generated by strapi2front\n *\n * Note: @strapi/client officially supports Strapi v5+\n * This v4 client uses a compatibility layer for the nested attributes structure\n */\n\nimport { strapi as createStrapi } from '@strapi/client';\nimport type { StrapiPagination, StrapiMedia, StrapiFileInfo } from './utils';\n\n// Default configuration from environment\nconst defaultBaseURL = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst defaultAuthToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst apiPrefix = '${normalizedPrefix}';\n\n/**\n * Client options for authentication and connection\n * @beta This API is in beta and may change\n */\nexport interface ClientOptions {\n /** JWT token or API token for authentication */\n authToken?: string;\n /** Base URL of the Strapi instance (without /api prefix) */\n baseURL?: string;\n}\n\n/**\n * Create a configured Strapi client instance\n *\n * @param options - Optional configuration (authToken, baseURL)\n * @returns Configured Strapi client\n *\n * @example\n * // Default client (uses STRAPI_URL and STRAPI_TOKEN from env)\n * const client = createStrapiClient();\n *\n * @example\n * // Client with user JWT token\n * const userClient = createStrapiClient({ authToken: session.jwt });\n *\n * @beta This API is in beta and may change\n */\nexport function createStrapiClient(options?: ClientOptions) {\n const baseURL = (options?.baseURL || defaultBaseURL) + apiPrefix;\n const auth = options?.authToken || defaultAuthToken;\n\n return createStrapi({ baseURL, auth });\n}\n\n// Default client instance (uses environment variables)\nexport const strapiClient = createStrapiClient();\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n// Strapi v4 raw response types (with nested attributes)\ninterface StrapiV4RawItem<T> {\n id: number;\n attributes: Omit<T, 'id'>;\n}\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n */\nfunction flattenItem<T>(item: StrapiV4RawItem<T>): T {\n return { id: item.id, ...item.attributes } as T;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n */\nfunction flattenRelations<T>(data: T): T {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n return data.map(item => flattenRelations(item)) as unknown as T;\n }\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data as Record<string, unknown>)) {\n if (value && typeof value === 'object' && 'data' in value) {\n const relationData = (value as { data: unknown }).data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n result[key] = relationData.map((item: StrapiV4RawItem<unknown>) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && 'id' in relationData && 'attributes' in relationData) {\n result[key] = flattenRelations(flattenItem(relationData as StrapiV4RawItem<unknown>));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n return result as T;\n }\n return data;\n}\n\n/**\n * Get or create a Strapi client based on options\n * @internal\n */\nfunction getClient(options?: ClientOptions) {\n if (options?.authToken || options?.baseURL) {\n return createStrapiClient(options);\n }\n return strapiClient;\n}\n\n/**\n * Helper to get typed collection (v4 compatibility wrapper)\n *\n * @param pluralName - The plural name of the collection (e.g., 'articles')\n * @param clientOptions - Optional client configuration\n */\nexport function collection<T>(pluralName: string, clientOptions?: ClientOptions) {\n const client = getClient(clientOptions);\n const col = client.collection(pluralName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await col.find(params) as any;\n const flattenedData = Array.isArray(response.data)\n ? response.data.map((item: StrapiV4RawItem<T>) => flattenRelations(flattenItem<T>(item)))\n : [];\n return {\n data: flattenedData,\n meta: { pagination: response.meta?.pagination || defaultPagination },\n };\n },\n async findOne(id: number | string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await col.findOne(String(id), params) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async create(data: Partial<T>): Promise<{ data: T }> {\n const response = await col.create(data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(id: number | string, data: Partial<T>): Promise<{ data: T }> {\n const response = await col.update(String(id), data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(id: number | string): Promise<void> {\n await col.delete(String(id));\n },\n };\n}\n\n/**\n * Helper to get typed single type (v4 compatibility wrapper)\n *\n * @param singularName - The singular name of the single type (e.g., 'homepage')\n * @param clientOptions - Optional client configuration\n */\nexport function single<T>(singularName: string, clientOptions?: ClientOptions) {\n const client = getClient(clientOptions);\n const singleType = client.single(singularName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await singleType.find(params) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async update(data: Partial<T>): Promise<{ data: T }> {\n const response = await singleType.update(data as any) as any;\n return { data: flattenRelations(flattenItem<T>(response.data)) };\n },\n async delete(): Promise<void> {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nexport const files = {\n /**\n * Upload a file to Strapi\n * @see https://docs.strapi.io/cms/api/client#upload\n */\n async upload(file: File | Blob, options?: { fileInfo?: StrapiFileInfo }): Promise<StrapiMedia> {\n const response = await strapiClient.files.upload(file, options) as any;\n return response;\n },\n\n /**\n * Find files with optional filtering and sorting\n */\n async find(params?: Record<string, unknown>): Promise<StrapiMedia[]> {\n const response = await strapiClient.files.find(params) as any;\n return Array.isArray(response) ? response : [];\n },\n\n /**\n * Get a single file by ID\n */\n async findOne(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.findOne(fileId) as any;\n return response;\n },\n\n /**\n * Update file metadata (name, alternativeText, caption)\n */\n async update(fileId: number, fileInfo: StrapiFileInfo): Promise<StrapiMedia> {\n const response = await strapiClient.files.update(fileId, fileInfo) as any;\n return response;\n },\n\n /**\n * Delete a file by ID\n */\n async delete(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.delete(fileId) as any;\n return response;\n },\n};\n`;\n }\n\n return `/**\n * Strapi Client (v5)\n * Generated by strapi2front\n *\n * Using official @strapi/client\n * @see https://docs.strapi.io/cms/api/client\n */\n\nimport { strapi } from '@strapi/client';\nimport type { StrapiPagination, StrapiMedia, StrapiFileInfo } from './utils';\n\n// Default configuration from environment\nconst defaultBaseURL = import.meta.env.STRAPI_URL || process.env.STRAPI_URL || 'http://localhost:1337';\nconst defaultAuthToken = import.meta.env.STRAPI_TOKEN || process.env.STRAPI_TOKEN;\nconst apiPrefix = '${normalizedPrefix}';\n\n/**\n * Client options for authentication and connection\n * @beta This API is in beta and may change\n */\nexport interface ClientOptions {\n /** JWT token or API token for authentication */\n authToken?: string;\n /** Base URL of the Strapi instance (without /api prefix) */\n baseURL?: string;\n}\n\n/**\n * Create a configured Strapi client instance\n *\n * @param options - Optional configuration (authToken, baseURL)\n * @returns Configured Strapi client\n *\n * @example\n * // Default client (uses STRAPI_URL and STRAPI_TOKEN from env)\n * const client = createStrapiClient();\n *\n * @example\n * // Client with user JWT token\n * const userClient = createStrapiClient({ authToken: session.jwt });\n *\n * @example\n * // Client with custom URL (multi-tenant)\n * const tenantClient = createStrapiClient({\n * baseURL: 'https://tenant.example.com',\n * authToken: tenantToken\n * });\n *\n * @beta This API is in beta and may change\n */\nexport function createStrapiClient(options?: ClientOptions) {\n const baseURL = (options?.baseURL || defaultBaseURL) + apiPrefix;\n const auth = options?.authToken || defaultAuthToken;\n\n return strapi({ baseURL, auth });\n}\n\n// Default client instance (uses environment variables)\nexport const strapiClient = createStrapiClient();\n\n// Default pagination for fallback\nconst defaultPagination: StrapiPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n/**\n * Get or create a Strapi client based on options\n * @internal\n */\nfunction getClient(options?: ClientOptions) {\n if (options?.authToken || options?.baseURL) {\n return createStrapiClient(options);\n }\n return strapiClient;\n}\n\n/**\n * Helper to get typed collection\n * Wraps @strapi/client collection methods with proper typing\n *\n * @param pluralName - The plural name of the collection (e.g., 'articles')\n * @param clientOptions - Optional client configuration\n */\nexport function collection<T>(pluralName: string, clientOptions?: ClientOptions) {\n const client = getClient(clientOptions);\n const col = client.collection(pluralName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T[]; meta: { pagination: StrapiPagination } }> {\n const response = await col.find(params) as any;\n return {\n data: Array.isArray(response.data) ? response.data : [],\n meta: { pagination: response.meta?.pagination || defaultPagination },\n };\n },\n async findOne(documentId: string, params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await col.findOne(documentId, params) as any;\n return { data: response.data };\n },\n async create(data: Partial<T>): Promise<{ data: T }> {\n const response = await col.create(data as any) as any;\n return { data: response.data };\n },\n async update(documentId: string, data: Partial<T>): Promise<{ data: T }> {\n const response = await col.update(documentId, data as any) as any;\n return { data: response.data };\n },\n async delete(documentId: string): Promise<void> {\n await col.delete(documentId);\n },\n };\n}\n\n/**\n * Helper to get typed single type\n * Wraps @strapi/client single methods with proper typing\n *\n * @param singularName - The singular name of the single type (e.g., 'homepage')\n * @param clientOptions - Optional client configuration\n */\nexport function single<T>(singularName: string, clientOptions?: ClientOptions) {\n const client = getClient(clientOptions);\n const singleType = client.single(singularName);\n return {\n async find(params?: Record<string, unknown>): Promise<{ data: T }> {\n const response = await singleType.find(params) as any;\n return { data: response.data };\n },\n async update(data: Partial<T>): Promise<{ data: T }> {\n const response = await singleType.update(data as any) as any;\n return { data: response.data };\n },\n async delete(): Promise<void> {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nexport const files = {\n /**\n * Upload a file to Strapi\n *\n * @example\n * // Browser: upload from file input\n * const file = fileInput.files[0];\n * const uploaded = await files.upload(file, {\n * fileInfo: { alternativeText: 'My image', caption: 'A caption' }\n * });\n *\n * @example\n * // Use the returned ID to link to an entry\n * await collection('articles').create({\n * title: 'My article',\n * cover: uploaded.id,\n * });\n *\n * @see https://docs.strapi.io/cms/api/client#upload\n */\n async upload(file: File | Blob, options?: { fileInfo?: StrapiFileInfo }): Promise<StrapiMedia> {\n const response = await strapiClient.files.upload(file, options) as any;\n return response;\n },\n\n /**\n * Find files with optional filtering and sorting\n *\n * @example\n * const images = await files.find({\n * filters: { mime: { $contains: 'image' } },\n * sort: ['name:asc'],\n * });\n */\n async find(params?: Record<string, unknown>): Promise<StrapiMedia[]> {\n const response = await strapiClient.files.find(params) as any;\n return Array.isArray(response) ? response : [];\n },\n\n /**\n * Get a single file by ID\n */\n async findOne(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.findOne(fileId) as any;\n return response;\n },\n\n /**\n * Update file metadata (name, alternativeText, caption)\n */\n async update(fileId: number, fileInfo: StrapiFileInfo): Promise<StrapiMedia> {\n const response = await strapiClient.files.update(fileId, fileInfo) as any;\n return response;\n },\n\n /**\n * Delete a file by ID\n */\n async delete(fileId: number): Promise<StrapiMedia> {\n const response = await strapiClient.files.delete(fileId) as any;\n return response;\n },\n};\n`;\n}\n\nfunction generateLocalesFile(locales: StrapiLocale[]): string {\n if (locales.length === 0) {\n return `/**\n * Strapi locales\n * Generated by strapi2front\n * Note: i18n is not enabled in Strapi\n */\n\nexport const locales = [] as const;\nexport type Locale = string;\nexport const defaultLocale: Locale = 'en';\nexport const localeNames: Record<string, string> = {};\n\nexport function isValidLocale(_code: string): _code is Locale {\n return true;\n}\n\nexport function getLocaleName(code: string): string {\n return code;\n}\n`;\n }\n\n const localeCodes = locales.map(l => l.code);\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n\n return `/**\n * Strapi locales\n * Generated by strapi2front\n */\n\nexport const locales = [${localeCodes.map(c => `'${c}'`).join(', ')}] as const;\n\nexport type Locale = typeof locales[number];\n\nexport const defaultLocale: Locale = '${defaultLocale}';\n\nexport const localeNames: Record<Locale, string> = {\n${locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n')}\n};\n\nexport function isValidLocale(code: string): code is Locale {\n return locales.includes(code as Locale);\n}\n\nexport function getLocaleName(code: Locale): string {\n return localeNames[code] || code;\n}\n`;\n}\n\n// ============================================\n// Collection Types Generation\n// ============================================\n\nfunction generateCollectionTypes(collection: CollectionType, schema: ParsedSchema): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateAttributes(collection.attributes);\n const imports = generateTypeImports(collection.attributes, schema, 'collection');\n\n return `/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n\nexport interface ${typeName}Filters {\n id?: number | { $eq?: number; $ne?: number; $in?: number[]; $notIn?: number[] };\n documentId?: string | { $eq?: string; $ne?: string };\n createdAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n updatedAt?: string | { $eq?: string; $gt?: string; $gte?: string; $lt?: string; $lte?: string };\n publishedAt?: string | null | { $eq?: string; $ne?: string; $null?: boolean };\n $and?: ${typeName}Filters[];\n $or?: ${typeName}Filters[];\n $not?: ${typeName}Filters;\n}\n`;\n}\n\nfunction generateSingleTypes(single: SingleType, schema: ParsedSchema): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateAttributes(single.attributes);\n const imports = generateTypeImports(single.attributes, schema, 'single');\n\n return `/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} extends StrapiBaseEntity {\n${attributes}\n}\n`;\n}\n\nfunction generateComponentTypes(\n component: ComponentType,\n schema: ParsedSchema,\n includeSchemas: boolean = false,\n strapiVersion: \"v4\" | \"v5\" = \"v5\",\n advancedRelations: boolean = false\n): string {\n const typeName = toPascalCase(component.name);\n const schemaName = toCamelCase(component.name);\n const attributes = generateAttributes(component.attributes);\n const imports = generateTypeImports(component.attributes, schema, 'component');\n\n let content = `/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n${imports}\n\nexport interface ${typeName} {\n id: number;\n${attributes}\n}\n`;\n\n // Add Zod schema if enabled\n if (includeSchemas) {\n const componentSchemaNames = buildComponentSchemaNames(component.attributes, schema);\n const schemaImports = generateSchemaImports(component.attributes, schema, 'component');\n const schemaOptions: ZodMapperOptions = {\n isUpdate: false,\n strapiVersion,\n useAdvancedRelations: advancedRelations,\n componentSchemaNames,\n };\n const schemaResult = generateZodObjectSchema(component.attributes, schemaOptions);\n\n content += `\nimport { z } from 'zod';\n${schemaImports}\n/**\n * Zod schema for ${component.displayName} component\n * Use this for validating component data in forms\n */\nexport const ${schemaName}Schema = ${schemaResult.schema};\n\n/**\n * Inferred type from schema\n */\nexport type ${typeName}Input = z.infer<typeof ${schemaName}Schema>;\n`;\n }\n\n return content;\n}\n\nfunction generateTypeImports(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema,\n context: 'collection' | 'single' | 'component'\n): string {\n const utilsImports: string[] = [];\n const relationImports: Map<string, string> = new Map();\n const componentImports: Map<string, string> = new Map();\n\n // Check what utils we need\n const attributesStr = JSON.stringify(attributes);\n if (context !== 'component') {\n utilsImports.push('StrapiBaseEntity');\n }\n if (attributesStr.includes('\"type\":\"media\"')) {\n utilsImports.push('StrapiMedia');\n }\n if (attributesStr.includes('\"type\":\"blocks\"')) {\n utilsImports.push('BlocksContent');\n }\n\n // Extract relations and components\n // Components are in strapi/components/, collections/singles are in strapi/collections/xxx/ or strapi/singles/xxx/\n // From component: ../collections/xxx/types (one level up)\n // From collection/single: ../../collections/xxx/types (two levels up, since they're in a subfolder)\n const relativePrefix = context === 'component' ? '..' : '../..';\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'relation' && 'target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || '';\n if (targetName) {\n const typeName = toPascalCase(targetName);\n const fileName = toKebabCase(targetName);\n // Check if it's a collection or single\n const isCollection = schema.collections.some(c => c.singularName === targetName);\n const isSingle = schema.singles.some(s => s.singularName === targetName);\n if (isCollection) {\n relationImports.set(typeName, `${relativePrefix}/collections/${fileName}/types`);\n } else if (isSingle) {\n relationImports.set(typeName, `${relativePrefix}/singles/${fileName}/types`);\n }\n }\n }\n\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || '';\n if (componentName) {\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n if (context === 'component') {\n componentImports.set(typeName, `./${fileName}`);\n } else {\n componentImports.set(typeName, `../../components/${fileName}`);\n }\n }\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const comp of attr.components) {\n const componentName = comp.split('.').pop() || '';\n if (componentName) {\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n if (context === 'component') {\n componentImports.set(typeName, `./${fileName}`);\n } else {\n componentImports.set(typeName, `../../components/${fileName}`);\n }\n }\n }\n }\n }\n\n const lines: string[] = [];\n\n // Utils import\n if (utilsImports.length > 0) {\n const utilsPath = context === 'component' ? '../shared/utils' : '../../shared/utils';\n lines.push(`import type { ${utilsImports.join(', ')} } from '${utilsPath}';`);\n }\n\n // Relation imports\n for (const [typeName, importPath] of relationImports) {\n lines.push(`import type { ${typeName} } from '${importPath}';`);\n }\n\n // Component imports\n for (const [typeName, importPath] of componentImports) {\n lines.push(`import type { ${typeName} } from '${importPath}';`);\n }\n\n return lines.join('\\n');\n}\n\nfunction generateAttributes(attributes: Record<string, Attribute>): string {\n const lines: string[] = [];\n\n for (const [name, attr] of Object.entries(attributes)) {\n const tsType = attributeToTsType(attr);\n const optional = attr.required ? '' : '?';\n lines.push(` ${name}${optional}: ${tsType};`);\n }\n\n return lines.join('\\n');\n}\n\nfunction attributeToTsType(attr: Attribute): string {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return 'string';\n case 'blocks':\n return 'BlocksContent';\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return 'string';\n case 'json':\n return 'unknown';\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return attr.enum.map(v => `'${v}'`).join(' | ');\n }\n return 'string';\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return 'StrapiMedia[]';\n }\n return 'StrapiMedia | null';\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = toPascalCase(attr.target.split('.').pop() || 'unknown');\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n return isMany ? `${targetName}[]` : `${targetName} | null`;\n }\n return 'unknown';\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = toPascalCase(attr.component.split('.').pop() || 'unknown');\n if ('repeatable' in attr && attr.repeatable) {\n return `${componentName}[]`;\n }\n return `${componentName} | null`;\n }\n return 'unknown';\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map(c => toPascalCase(c.split('.').pop() || 'unknown'));\n return `(${types.join(' | ')})[]`;\n }\n return 'unknown[]';\n default:\n return 'unknown';\n }\n}\n\n// ============================================\n// Collection Service Generation\n// ============================================\n\nfunction generateCollectionService(collection: CollectionType, strapiVersion: \"v4\" | \"v5\"): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const endpoint = collection.pluralName;\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id: number' : 'documentId: string';\n const idName = isV4 ? 'id' : 'documentId';\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt' | 'publishedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt' | 'publishedAt'\";\n const omitFieldsUpdate = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Build imports\n const imports = [\n `import { collection, type ClientOptions } from '../../shared/client';`,\n `import type { ${typeName}, ${typeName}Filters } from './types';`,\n `import type { StrapiPagination } from '../../shared/utils';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../../shared/locales';`);\n }\n\n // Build options interfaces\n const paginationFields = `\n /** Page number (1-indexed) - use with pageSize */\n page?: number;\n /** Number of items per page (default: 25) - use with page */\n pageSize?: number;\n /** Offset to start from (0-indexed) - use with limit */\n start?: number;\n /** Maximum number of items to return - use with start */\n limit?: number;`;\n\n let findManyOptionsFields = ` filters?: ${typeName}Filters;\n pagination?: {${paginationFields}\n };\n sort?: string | string[];\n populate?: string | string[] | Record<string, unknown>;`;\n\n let findOneOptionsFields = ` populate?: string | string[] | Record<string, unknown>;`;\n\n if (localized) {\n findManyOptionsFields += `\\n locale?: Locale;`;\n findOneOptionsFields += `\\n locale?: Locale;`;\n }\n if (draftAndPublish) {\n findManyOptionsFields += `\\n status?: 'draft' | 'published';`;\n findOneOptionsFields += `\\n status?: 'draft' | 'published';`;\n }\n\n // Build find params\n let findParams = ` filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,`;\n let findOneParams = ` populate: options.populate,`;\n\n if (localized) {\n findParams += `\\n locale: options.locale,`;\n findOneParams += `\\n locale: options.locale,`;\n }\n if (draftAndPublish) {\n findParams += `\\n status: options.status,`;\n findOneParams += `\\n status: options.status,`;\n }\n\n // Create options interface (only for draftAndPublish collections)\n const createOptionsInterface = draftAndPublish ? `\nexport interface CreateOptions {\n /** Publish immediately or create as draft. Default: 'draft' */\n status?: 'draft' | 'published';\n}\n` : '';\n\n // Update options interface (only for draftAndPublish collections)\n const updateOptionsInterface = draftAndPublish ? `\nexport interface UpdateOptions {\n /** Change publication status */\n status?: 'draft' | 'published';\n}\n` : '';\n\n return `/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindManyOptions {\n${findManyOptionsFields}\n}\n\nexport interface FindOneOptions {\n${findOneOptionsFields}\n}\n${createOptionsInterface}${updateOptionsInterface}\n/**\n * Get a typed collection helper, optionally with custom client options\n * @internal\n */\nfunction getCollection(clientOptions?: ClientOptions) {\n return collection<${typeName}>('${endpoint}', clientOptions);\n}\n\nexport const ${serviceName} = {\n /**\n * Find multiple ${collection.displayName} entries\n * @param options - Query options (filters, pagination, sort, populate)\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async findMany(options: FindManyOptions = {}, clientOptions?: ClientOptions): Promise<{ data: ${typeName}[]; pagination: StrapiPagination }> {\n const col = getCollection(clientOptions);\n const response = await col.find({\n${findParams}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * Find all ${collection.displayName} entries (handles pagination automatically)\n * @param options - Query options (filters, sort, populate)\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async findAll(options: Omit<FindManyOptions, 'pagination'> = {}, clientOptions?: ClientOptions): Promise<${typeName}[]> {\n const allItems: ${typeName}[] = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n }, clientOptions);\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * Find a single ${collection.displayName} by ID\n * @param ${idName} - The ${isV4 ? 'numeric ID' : 'document ID'}\n * @param options - Query options (populate)\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async findOne(${idParam}, options: FindOneOptions = {}, clientOptions?: ClientOptions): Promise<${typeName} | null> {\n try {\n const col = getCollection(clientOptions);\n const response = await col.findOne(${idName}, {\n${findOneParams}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n /**\n * Find a single ${collection.displayName} by slug\n * @param slug - The slug value\n * @param options - Query options (populate)\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async findBySlug(slug: string, options: FindOneOptions = {}, clientOptions?: ClientOptions): Promise<${typeName} | null> {\n const { data } = await this.findMany({\n filters: { slug: { $eq: slug } } as ${typeName}Filters,\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n }, clientOptions);\n\n return data[0] || null;\n },\n` : ''}\n /**\n * Create a new ${collection.displayName}\n * @param data - The data to create\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async create(data: Partial<Omit<${typeName}, ${omitFields}>>${draftAndPublish ? ', options: CreateOptions = {}' : ''}, clientOptions?: ClientOptions): Promise<${typeName}> {\n const col = getCollection(clientOptions);\n const response = await col.create(${draftAndPublish ? '{ ...data, status: options.status }' : 'data'});\n return response.data;\n },\n\n /**\n * Update an existing ${collection.displayName}\n * @param ${idName} - The ${isV4 ? 'numeric ID' : 'document ID'}\n * @param data - The data to update\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async update(${idParam}, data: Partial<Omit<${typeName}, ${omitFieldsUpdate}>>${draftAndPublish ? ', options: UpdateOptions = {}' : ''}, clientOptions?: ClientOptions): Promise<${typeName}> {\n const col = getCollection(clientOptions);\n const response = await col.update(${idName}, ${draftAndPublish ? '{ ...data, status: options.status }' : 'data'});\n return response.data;\n },\n\n /**\n * Delete a ${collection.displayName}\n * @param ${idName} - The ${isV4 ? 'numeric ID' : 'document ID'}\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async delete(${idParam}, clientOptions?: ClientOptions): Promise<void> {\n const col = getCollection(clientOptions);\n await col.delete(${idName});\n },\n\n /**\n * Count ${collection.displayName} entries\n * @param filters - Optional filters\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async count(filters?: ${typeName}Filters, clientOptions?: ClientOptions): Promise<number> {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n }, clientOptions);\n\n return pagination.total;\n },\n};\n`;\n}\n\n// ============================================\n// Single Service Generation\n// ============================================\n\nfunction generateSingleService(single: SingleType, strapiVersion: \"v4\" | \"v5\"): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const endpoint = single.singularName;\n const { localized, draftAndPublish } = single;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 doesn't have documentId\n const omitFields = isV4\n ? \"'id' | 'createdAt' | 'updatedAt'\"\n : \"'id' | 'documentId' | 'createdAt' | 'updatedAt'\";\n\n // Build imports\n const imports = [\n `import { single, type ClientOptions } from '../../shared/client';`,\n `import type { ${typeName} } from './types';`,\n ];\n if (localized) {\n imports.push(`import type { Locale } from '../../shared/locales';`);\n }\n\n // Build options interface\n let findOptionsFields = ` populate?: string | string[] | Record<string, unknown>;`;\n if (localized) {\n findOptionsFields += `\\n locale?: Locale;`;\n }\n if (draftAndPublish) {\n findOptionsFields += `\\n status?: 'draft' | 'published';`;\n }\n\n // Build find params\n let findParams = ` populate: options.populate,`;\n if (localized) {\n findParams += `\\n locale: options.locale,`;\n }\n if (draftAndPublish) {\n findParams += `\\n status: options.status,`;\n }\n\n return `/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${imports.join('\\n')}\n\nexport interface FindOptions {\n${findOptionsFields}\n}\n\n/**\n * Get a typed single helper, optionally with custom client options\n * @internal\n */\nfunction getSingle(clientOptions?: ClientOptions) {\n return single<${typeName}>('${endpoint}', clientOptions);\n}\n\nexport const ${serviceName} = {\n /**\n * Find the ${single.displayName} single type\n * @param options - Query options (populate)\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async find(options: FindOptions = {}, clientOptions?: ClientOptions): Promise<${typeName} | null> {\n try {\n const s = getSingle(clientOptions);\n const response = await s.find({\n${findParams}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * Update the ${single.displayName} single type\n * @param data - The data to update\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async update(data: Partial<Omit<${typeName}, ${omitFields}>>, clientOptions?: ClientOptions): Promise<${typeName}> {\n const s = getSingle(clientOptions);\n const response = await s.update(data);\n return response.data;\n },\n\n /**\n * Delete the ${single.displayName} single type\n * @param clientOptions - Optional client configuration (authToken, baseURL) - beta\n */\n async delete(clientOptions?: ClientOptions): Promise<void> {\n const s = getSingle(clientOptions);\n await s.delete();\n },\n};\n`;\n}\n\n// ============================================\n// Zod Schemas Generation (Reusable)\n// ============================================\n\n/**\n * Build a Map of component UIDs → schema variable names\n * by scanning attributes for component and dynamiczone types.\n */\nfunction buildComponentSchemaNames(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema\n): Map<string, string> {\n const map = new Map<string, string>();\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n const uid = attr.component;\n if (!map.has(uid)) {\n const componentName = uid.split('.').pop() || '';\n // Verify component exists in schema\n const exists = schema.components.some((c) => c.name === componentName);\n if (exists && componentName) {\n map.set(uid, `${toCamelCase(componentName)}Schema`);\n }\n }\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const uid of attr.components) {\n if (!map.has(uid)) {\n const componentName = uid.split('.').pop() || '';\n const exists = schema.components.some((c) => c.name === componentName);\n if (exists && componentName) {\n map.set(uid, `${toCamelCase(componentName)}Schema`);\n }\n }\n }\n }\n }\n\n return map;\n}\n\n/**\n * Generate import statements for component schemas referenced in attributes.\n * Returns a string with import lines (including trailing newline) or empty string.\n */\nfunction generateSchemaImports(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema,\n context: 'collection' | 'single' | 'component'\n): string {\n const imports = new Map<string, string>(); // schemaVarName → import path\n\n const relativePrefix = context === 'component' ? '.' : '../../components';\n\n for (const attr of Object.values(attributes)) {\n if (attr.type === 'component' && 'component' in attr && attr.component) {\n addComponentImport(attr.component, imports, schema, relativePrefix);\n }\n\n if (attr.type === 'dynamiczone' && 'components' in attr && attr.components) {\n for (const uid of attr.components) {\n addComponentImport(uid, imports, schema, relativePrefix);\n }\n }\n }\n\n if (imports.size === 0) return '';\n\n const lines: string[] = [];\n for (const [schemaVarName, importPath] of imports) {\n lines.push(`import { ${schemaVarName} } from '${importPath}';`);\n }\n return lines.join('\\n') + '\\n';\n}\n\nfunction addComponentImport(\n uid: string,\n imports: Map<string, string>,\n schema: ParsedSchema,\n relativePrefix: string\n): void {\n const componentName = uid.split('.').pop() || '';\n if (!componentName) return;\n\n const exists = schema.components.some((c) => c.name === componentName);\n if (!exists) return;\n\n const schemaVarName = `${toCamelCase(componentName)}Schema`;\n if (imports.has(schemaVarName)) return;\n\n const fileName = toKebabCase(componentName);\n imports.set(schemaVarName, `${relativePrefix}/${fileName}`);\n}\n\n/**\n * Generate Zod schemas for a collection type\n * These schemas can be reused with React Hook Form, TanStack Form, etc.\n */\nfunction generateCollectionSchemas(\n collection: CollectionType,\n schema: ParsedSchema,\n strapiVersion: \"v4\" | \"v5\" = \"v5\",\n advancedRelations: boolean = false\n): string {\n const name = toCamelCase(collection.singularName);\n const pascalName = toPascalCase(collection.singularName);\n\n const componentSchemaNames = buildComponentSchemaNames(collection.attributes, schema);\n const schemaImports = generateSchemaImports(collection.attributes, schema, 'collection');\n\n const schemaOptions: ZodMapperOptions = {\n isUpdate: false,\n strapiVersion,\n useAdvancedRelations: advancedRelations,\n componentSchemaNames,\n };\n const createResult = generateZodObjectSchema(collection.attributes, schemaOptions);\n const updateResult = generateZodObjectSchema(collection.attributes, { ...schemaOptions, isUpdate: true });\n\n return `/**\n * ${collection.displayName} Zod Schemas\n * ${collection.description || ''}\n * Generated by strapi2front\n *\n * These schemas can be used for:\n * - Form validation (React Hook Form, TanStack Form, Formik, etc.)\n * - API request/response validation\n * - Type inference\n */\n\nimport { z } from 'zod';\n${schemaImports}\n/**\n * Schema for creating a new ${collection.displayName}\n */\nexport const ${name}CreateSchema = ${createResult.schema};\n\n/**\n * Schema for updating a ${collection.displayName}\n * All fields are optional for partial updates\n */\nexport const ${name}UpdateSchema = ${updateResult.schema};\n\n/**\n * Inferred types from schemas\n * Use these for type-safe form handling\n */\nexport type ${pascalName}CreateInput = z.infer<typeof ${name}CreateSchema>;\nexport type ${pascalName}UpdateInput = z.infer<typeof ${name}UpdateSchema>;\n`;\n}\n\n/**\n * Generate Zod schemas for a single type\n */\nfunction generateSingleSchemas(\n single: SingleType,\n schema: ParsedSchema,\n strapiVersion: \"v4\" | \"v5\" = \"v5\",\n advancedRelations: boolean = false\n): string {\n const name = toCamelCase(single.singularName);\n const pascalName = toPascalCase(single.singularName);\n\n const componentSchemaNames = buildComponentSchemaNames(single.attributes, schema);\n const schemaImports = generateSchemaImports(single.attributes, schema, 'single');\n\n const updateResult = generateZodObjectSchema(single.attributes, {\n isUpdate: true,\n strapiVersion,\n useAdvancedRelations: advancedRelations,\n componentSchemaNames,\n });\n\n return `/**\n * ${single.displayName} Zod Schemas (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n *\n * These schemas can be used for:\n * - Form validation (React Hook Form, TanStack Form, Formik, etc.)\n * - API request/response validation\n * - Type inference\n */\n\nimport { z } from 'zod';\n${schemaImports}\n/**\n * Schema for updating ${single.displayName}\n * All fields are optional for partial updates\n */\nexport const ${name}UpdateSchema = ${updateResult.schema};\n\n/**\n * Inferred type from schema\n */\nexport type ${pascalName}UpdateInput = z.infer<typeof ${name}UpdateSchema>;\n`;\n}\n\n// ============================================\n// Collection Actions Generation\n// ============================================\n\ninterface ActionsGeneratorOptions {\n strapiVersion: \"v4\" | \"v5\";\n /** Whether schemas are generated separately (import from ./schemas) */\n useExternalSchemas: boolean;\n /** Whether the collection has draftAndPublish enabled */\n draftAndPublish?: boolean;\n}\n\nfunction generateCollectionActions(collection: CollectionType, options: ActionsGeneratorOptions): string {\n const { strapiVersion, useExternalSchemas, draftAndPublish = false } = options;\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const actionPrefix = toCamelCase(collection.singularName);\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idInputSchema = isV4 ? 'z.number().int().positive()' : 'z.string()';\n const idParamName = isV4 ? 'id' : 'documentId';\n\n // Status schema for draft and publish (only v5 has proper support)\n const statusSchema = \"z.enum(['draft', 'published']).optional()\";\n\n // Schema imports or inline fallback\n const schemaImport = useExternalSchemas\n ? `import { ${actionPrefix}CreateSchema, ${actionPrefix}UpdateSchema } from './schemas';`\n : '';\n\n const createSchema = useExternalSchemas\n ? `${actionPrefix}CreateSchema`\n : 'z.record(z.unknown())';\n\n const updateSchema = useExternalSchemas\n ? `${actionPrefix}UpdateSchema`\n : 'z.record(z.unknown())';\n\n return `/**\n * ${collection.displayName} Astro Actions\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\nimport { defineAction } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { ${serviceName} } from './service';\nimport type { ${typeName} } from './types';\n${schemaImport}\n\nexport const ${actionPrefix}Actions = {\n getMany: defineAction({\n input: z.object({\n page: z.number().optional(),\n pageSize: z.number().optional(),\n sort: z.string().optional(),\n }).optional(),\n handler: async (input) => {\n const { data, pagination } = await ${serviceName}.findMany({\n pagination: input ? { page: input.page, pageSize: input.pageSize } : undefined,\n sort: input?.sort,\n });\n return { data, pagination };\n },\n }),\n\n getOne: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async (input) => {\n const data = await ${serviceName}.findOne(input.${idParamName});\n return { data };\n },\n }),\n\n create: defineAction({\n input: z.object({\n data: ${createSchema},${draftAndPublish ? `\\n status: ${statusSchema},` : ''}\n }),\n handler: async (input) => {\n const data = await ${serviceName}.create(input.data as Partial<${typeName}>${draftAndPublish ? ', { status: input.status }' : ''});\n return { data };\n },\n }),\n\n update: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n data: ${updateSchema},${draftAndPublish ? `\\n status: ${statusSchema},` : ''}\n }),\n handler: async (input) => {\n const data = await ${serviceName}.update(input.${idParamName}, input.data as Partial<${typeName}>${draftAndPublish ? ', { status: input.status }' : ''});\n return { data };\n },\n }),\n\n delete: defineAction({\n input: z.object({\n ${idParamName}: ${idInputSchema},\n }),\n handler: async (input) => {\n await ${serviceName}.delete(input.${idParamName});\n return { success: true };\n },\n }),\n};\n`;\n}\n\n// ============================================\n// JSDoc Generators\n// ============================================\n\nfunction generateUtilityTypesJSDoc(blocksRendererInstalled: boolean, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const isV4 = strapiVersion === \"v4\";\n\n const blocksContentType = isV4\n ? `/**\n * Rich text content (Strapi v4)\n * Can be markdown string or custom JSON structure\n * @typedef {string} RichTextContent\n */`\n : blocksRendererInstalled\n ? `// BlocksContent - import from '@strapi/blocks-react-renderer' for full type support`\n : `/**\n * Blocks content type (Strapi v5 rich text)\n *\n * For full type support and rendering, install:\n * npm install @strapi/blocks-react-renderer\n *\n * Then re-run: npx strapi2front sync\n * @typedef {Array<Object>} BlocksContent\n */`;\n\n const baseEntity = isV4\n ? `/**\n * @typedef {Object} StrapiBaseEntity\n * @property {number} id\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt\n */`\n : `/**\n * @typedef {Object} StrapiBaseEntity\n * @property {number} id\n * @property {string} documentId\n * @property {string} createdAt\n * @property {string} updatedAt\n * @property {string|null} publishedAt\n */`;\n\n const mediaType = isV4\n ? `/**\n * @typedef {Object} StrapiMedia\n * @property {number} id\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {Object|null} formats\n * @property {StrapiMediaFormat} [formats.thumbnail]\n * @property {StrapiMediaFormat} [formats.small]\n * @property {StrapiMediaFormat} [formats.medium]\n * @property {StrapiMediaFormat} [formats.large]\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */`\n : `/**\n * @typedef {Object} StrapiMedia\n * @property {number} id\n * @property {string} documentId\n * @property {string} name\n * @property {string|null} alternativeText\n * @property {string|null} caption\n * @property {number} width\n * @property {number} height\n * @property {Object|null} formats\n * @property {StrapiMediaFormat} [formats.thumbnail]\n * @property {StrapiMediaFormat} [formats.small]\n * @property {StrapiMediaFormat} [formats.medium]\n * @property {StrapiMediaFormat} [formats.large]\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} size\n * @property {string} url\n * @property {string|null} previewUrl\n * @property {string} provider\n * @property {string} createdAt\n * @property {string} updatedAt\n */`;\n\n const v4RawResponseTypes = isV4 ? `\n\n/**\n * Strapi v4 raw API response item (with nested attributes)\n * @template T\n * @typedef {Object} StrapiV4RawItem\n * @property {number} id\n * @property {Omit<T, 'id'>} attributes\n */\n\n/**\n * Strapi v4 raw API response\n * @template T\n * @typedef {Object} StrapiV4RawResponse\n * @property {StrapiV4RawItem<T>} data\n * @property {Object} meta\n */\n\n/**\n * Strapi v4 raw list response\n * @template T\n * @typedef {Object} StrapiV4RawListResponse\n * @property {StrapiV4RawItem<T>[]} data\n * @property {Object} meta\n * @property {StrapiPagination} meta.pagination\n */\n\n/**\n * Flatten Strapi v4 response item\n * @template T\n * @param {StrapiV4RawItem<T>} item\n * @returns {T}\n */\nfunction flattenV4Response(item) {\n /** @type {any} */\n const merged = { id: item.id, ...item.attributes };\n return merged;\n}\n\n/**\n * Flatten Strapi v4 list response\n * @template T\n * @param {StrapiV4RawItem<T>[]} items\n * @returns {T[]}\n */\nfunction flattenV4ListResponse(items) {\n return items.map(item => flattenV4Response(item));\n}\n\n${useESM ? 'export { flattenV4Response, flattenV4ListResponse };' : 'module.exports = { flattenV4Response, flattenV4ListResponse };'}` : '';\n\n return `// @ts-check\n/**\n * Strapi utility types\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${mediaType}\n\n/**\n * @typedef {Object} StrapiMediaFormat\n * @property {string} name\n * @property {string} hash\n * @property {string} ext\n * @property {string} mime\n * @property {number} width\n * @property {number} height\n * @property {number} size\n * @property {string} url\n */\n\n/**\n * File metadata for uploads\n * @see https://docs.strapi.io/cms/api/client#upload\n * @typedef {Object} StrapiFileInfo\n * @property {string} [name]\n * @property {string} [alternativeText]\n * @property {string} [caption]\n */\n\n/**\n * @typedef {Object} StrapiPagination\n * @property {number} page\n * @property {number} pageSize\n * @property {number} pageCount\n * @property {number} total\n */\n\n/**\n * @template T\n * @typedef {Object} StrapiResponse\n * @property {T} data\n * @property {Object} meta\n * @property {StrapiPagination} [meta.pagination]\n */\n\n/**\n * @template T\n * @typedef {Object} StrapiListResponse\n * @property {T[]} data\n * @property {Object} meta\n * @property {StrapiPagination} meta.pagination\n */\n\n${baseEntity}\n${v4RawResponseTypes}\n${blocksContentType}\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateClientJSDoc(strapiVersion: \"v4\" | \"v5\", apiPrefix: string = \"/api\", useESM: boolean = false): string {\n const isV4 = strapiVersion === \"v4\";\n const normalizedPrefix = apiPrefix.startsWith('/') ? apiPrefix : '/' + apiPrefix;\n\n const importStatement = useESM\n ? `import { strapi as createStrapi } from '@strapi/client';`\n : `const { strapi: createStrapi } = require('@strapi/client');`;\n\n if (isV4) {\n return `// @ts-check\n/**\n * Strapi Client (v4)\n * Generated by strapi2front\n *\n * Note: @strapi/client officially supports Strapi v5+\n * This v4 client uses a compatibility layer for the nested attributes structure\n */\n\n${importStatement}\n\n// Initialize the Strapi client\nconst baseURL = (process.env.STRAPI_URL || 'http://localhost:1337') + '${normalizedPrefix}';\nconst authToken = process.env.STRAPI_TOKEN;\n\nconst strapiClient = createStrapi({\n baseURL,\n auth: authToken,\n});\n\n/** @type {import('./utils').StrapiPagination} */\nconst defaultPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n/**\n * Flatten a Strapi v4 response item (merges id with attributes)\n * @template T\n * @param {{ id: number, attributes: Omit<T, 'id'> }} item\n * @returns {T}\n */\nfunction flattenItem(item) {\n /** @type {any} */\n const merged = { id: item.id, ...item.attributes };\n return merged;\n}\n\n/**\n * Recursively flatten nested relations in Strapi v4 response\n * @template T\n * @param {T} data\n * @returns {T}\n */\nfunction flattenRelations(data) {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) {\n /** @type {any} */\n const mapped = data.map(item => flattenRelations(item));\n return mapped;\n }\n if (typeof data === 'object') {\n /** @type {Record<string, unknown>} */\n const result = {};\n for (const [key, value] of Object.entries(data)) {\n if (value && typeof value === 'object' && 'data' in value) {\n /** @type {any} */\n const wrapper = value;\n const relationData = wrapper.data;\n if (relationData === null) {\n result[key] = null;\n } else if (Array.isArray(relationData)) {\n result[key] = relationData.map((item) =>\n flattenRelations(flattenItem(item))\n );\n } else if (typeof relationData === 'object' && relationData !== null && 'id' in relationData && 'attributes' in relationData) {\n result[key] = flattenRelations(flattenItem(relationData));\n } else {\n result[key] = flattenRelations(value);\n }\n } else {\n result[key] = flattenRelations(value);\n }\n }\n /** @type {any} */\n const typed = result;\n return typed;\n }\n return data;\n}\n\n/**\n * Helper to get typed collection (v4 compatibility wrapper)\n * @template T\n * @param {string} pluralName\n */\nfunction collection(pluralName) {\n const col = strapiClient.collection(pluralName);\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T[], meta: { pagination: import('./utils').StrapiPagination } }>}\n */\n async find(params) {\n const response = await col.find(params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T[]} */\n const data = Array.isArray(rawData)\n ? rawData.map(item => flattenRelations(flattenItem(item)))\n : [];\n /** @type {any} */\n const rawMeta = response.meta;\n /** @type {any} */\n const rawPag = rawMeta?.pagination;\n /** @type {import('./utils').StrapiPagination} */\n const pagination = {\n page: rawPag?.page ?? defaultPagination.page,\n pageSize: rawPag?.pageSize ?? defaultPagination.pageSize,\n pageCount: rawPag?.pageCount ?? defaultPagination.pageCount,\n total: rawPag?.total ?? defaultPagination.total,\n };\n return { data, meta: { pagination } };\n },\n /**\n * @param {number|string} id\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async findOne(id, params) {\n const response = await col.findOne(String(id), params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = flattenRelations(flattenItem(rawData));\n return { data };\n },\n /**\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async create(data) {\n const response = await col.create(data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @param {number|string} id\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async update(id, data) {\n const response = await col.update(String(id), data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @param {number|string} id\n * @returns {Promise<void>}\n */\n async delete(id) {\n await col.delete(String(id));\n },\n };\n}\n\n/**\n * Helper to get typed single type (v4 compatibility wrapper)\n * @template T\n * @param {string} singularName\n */\nfunction single(singularName) {\n const singleType = strapiClient.single(singularName);\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async find(params) {\n const response = await singleType.find(params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = flattenRelations(flattenItem(rawData));\n return { data };\n },\n /**\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async update(data) {\n const response = await singleType.update(data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = flattenRelations(flattenItem(rawData));\n return { data: result };\n },\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nconst files = {\n /**\n * Upload a file to Strapi\n * @param {File|Blob} file\n * @param {{ fileInfo?: import('./utils').StrapiFileInfo }} [options]\n * @returns {Promise<import('./utils').StrapiMedia>}\n * @see https://docs.strapi.io/cms/api/client#upload\n */\n async upload(file, options) {\n /** @type {any} */\n const response = await strapiClient.files.upload(file, options);\n return response;\n },\n\n /**\n * Find files with optional filtering and sorting\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<import('./utils').StrapiMedia[]>}\n */\n async find(params) {\n /** @type {any} */\n const response = await strapiClient.files.find(params);\n return Array.isArray(response) ? response : [];\n },\n\n /**\n * Get a single file by ID\n * @param {number} fileId\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async findOne(fileId) {\n /** @type {any} */\n const response = await strapiClient.files.findOne(fileId);\n return response;\n },\n\n /**\n * Update file metadata (name, alternativeText, caption)\n * @param {number} fileId\n * @param {import('./utils').StrapiFileInfo} fileInfo\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async update(fileId, fileInfo) {\n /** @type {any} */\n const response = await strapiClient.files.update(fileId, fileInfo);\n return response;\n },\n\n /**\n * Delete a file by ID\n * @param {number} fileId\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async delete(fileId) {\n /** @type {any} */\n const response = await strapiClient.files.delete(fileId);\n return response;\n },\n};\n\n${useESM ? 'export { strapiClient, collection, single, files };' : 'module.exports = { strapiClient, collection, single, files };'}\n`;\n }\n\n return `// @ts-check\n/**\n * Strapi Client (v5)\n * Generated by strapi2front\n *\n * Using official @strapi/client\n * @see https://docs.strapi.io/cms/api/client\n */\n\n${importStatement}\n\n// Initialize the Strapi client\nconst baseURL = (process.env.STRAPI_URL || 'http://localhost:1337') + '${normalizedPrefix}';\nconst authToken = process.env.STRAPI_TOKEN;\n\nconst strapiClient = createStrapi({\n baseURL,\n auth: authToken,\n});\n\n/** @type {import('./utils').StrapiPagination} */\nconst defaultPagination = {\n page: 1,\n pageSize: 25,\n pageCount: 1,\n total: 0,\n};\n\n/**\n * Helper to get typed collection\n * @template T\n * @param {string} pluralName\n */\nfunction collection(pluralName) {\n const col = strapiClient.collection(pluralName);\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T[], meta: { pagination: import('./utils').StrapiPagination } }>}\n */\n async find(params) {\n const response = await col.find(params);\n /** @type {any} */\n const rawMeta = response.meta;\n /** @type {any} */\n const rawPag = rawMeta?.pagination;\n /** @type {import('./utils').StrapiPagination} */\n const pagination = {\n page: rawPag?.page ?? defaultPagination.page,\n pageSize: rawPag?.pageSize ?? defaultPagination.pageSize,\n pageCount: rawPag?.pageCount ?? defaultPagination.pageCount,\n total: rawPag?.total ?? defaultPagination.total,\n };\n /** @type {any} */\n const rawData = response.data;\n /** @type {T[]} */\n const data = Array.isArray(rawData) ? rawData : [];\n return { data, meta: { pagination } };\n },\n /**\n * @param {string} documentId\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async findOne(documentId, params) {\n const response = await col.findOne(documentId, params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = rawData;\n return { data };\n },\n /**\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async create(data) {\n const response = await col.create(data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @param {string} documentId\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async update(documentId, data) {\n const response = await col.update(documentId, data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @param {string} documentId\n * @returns {Promise<void>}\n */\n async delete(documentId) {\n await col.delete(documentId);\n },\n };\n}\n\n/**\n * Helper to get typed single type\n * @template T\n * @param {string} singularName\n */\nfunction single(singularName) {\n const singleType = strapiClient.single(singularName);\n return {\n /**\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<{ data: T }>}\n */\n async find(params) {\n const response = await singleType.find(params);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const data = rawData;\n return { data };\n },\n /**\n * @param {Partial<T>} data\n * @returns {Promise<{ data: T }>}\n */\n async update(data) {\n const response = await singleType.update(data);\n /** @type {any} */\n const rawData = response.data;\n /** @type {T} */\n const result = rawData;\n return { data: result };\n },\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await singleType.delete();\n },\n };\n}\n\n/**\n * File management helpers\n * Wraps @strapi/client file methods with proper typing\n * @see https://docs.strapi.io/cms/api/client#working-with-files\n */\nconst files = {\n /**\n * Upload a file to Strapi\n * @param {File|Blob} file\n * @param {{ fileInfo?: import('./utils').StrapiFileInfo }} [options]\n * @returns {Promise<import('./utils').StrapiMedia>}\n * @see https://docs.strapi.io/cms/api/client#upload\n */\n async upload(file, options) {\n /** @type {any} */\n const response = await strapiClient.files.upload(file, options);\n return response;\n },\n\n /**\n * Find files with optional filtering and sorting\n * @param {Record<string, unknown>} [params]\n * @returns {Promise<import('./utils').StrapiMedia[]>}\n */\n async find(params) {\n /** @type {any} */\n const response = await strapiClient.files.find(params);\n return Array.isArray(response) ? response : [];\n },\n\n /**\n * Get a single file by ID\n * @param {number} fileId\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async findOne(fileId) {\n /** @type {any} */\n const response = await strapiClient.files.findOne(fileId);\n return response;\n },\n\n /**\n * Update file metadata (name, alternativeText, caption)\n * @param {number} fileId\n * @param {import('./utils').StrapiFileInfo} fileInfo\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async update(fileId, fileInfo) {\n /** @type {any} */\n const response = await strapiClient.files.update(fileId, fileInfo);\n return response;\n },\n\n /**\n * Delete a file by ID\n * @param {number} fileId\n * @returns {Promise<import('./utils').StrapiMedia>}\n */\n async delete(fileId) {\n /** @type {any} */\n const response = await strapiClient.files.delete(fileId);\n return response;\n },\n};\n\n${useESM ? 'export { strapiClient, collection, single, files };' : 'module.exports = { strapiClient, collection, single, files };'}\n`;\n}\n\nfunction generateLocalesFileJSDoc(locales: StrapiLocale[], useESM: boolean = false): string {\n if (locales.length === 0) {\n return `// @ts-check\n/**\n * Strapi locales\n * Generated by strapi2front\n * Note: i18n is not enabled in Strapi\n */\n\n/** @type {readonly string[]} */\nconst locales = [];\n\n/** @typedef {string} Locale */\n\n/** @type {string} */\nconst defaultLocale = 'en';\n\n/** @type {Record<string, string>} */\nconst localeNames = {};\n\n/**\n * @param {string} _code\n * @returns {boolean}\n */\nfunction isValidLocale(_code) {\n return true;\n}\n\n/**\n * @param {string} code\n * @returns {string}\n */\nfunction getLocaleName(code) {\n return code;\n}\n\n${useESM ? 'export { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };' : 'module.exports = { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };'}\n`;\n }\n\n const localeCodes = locales.map(l => l.code);\n const defaultLocale = locales.find(l => l.isDefault)?.code || locales[0]?.code || 'en';\n\n return `// @ts-check\n/**\n * Strapi locales\n * Generated by strapi2front\n */\n\n/** @type {readonly [${localeCodes.map(c => `'${c}'`).join(', ')}]} */\nconst locales = [${localeCodes.map(c => `'${c}'`).join(', ')}];\n\n/** @typedef {${localeCodes.map(c => `'${c}'`).join(' | ')}} Locale */\n\n/** @type {Locale} */\nconst defaultLocale = '${defaultLocale}';\n\n/** @type {Record<Locale, string>} */\nconst localeNames = {\n${locales.map(l => ` '${l.code}': '${l.name}'`).join(',\\n')}\n};\n\n/**\n * @param {string} code\n * @returns {boolean}\n */\nfunction isValidLocale(code) {\n /** @type {readonly string[]} */\n const localeList = locales;\n return localeList.includes(code);\n}\n\n/**\n * @param {Locale} code\n * @returns {string}\n */\nfunction getLocaleName(code) {\n return localeNames[code] || code;\n}\n\n${useESM ? 'export { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };' : 'module.exports = { locales, defaultLocale, localeNames, isValidLocale, getLocaleName };'}\n`;\n}\n\n// ============================================\n// JSDoc Collection Types Generation\n// ============================================\n\nfunction generateCollectionTypesJSDoc(collection: CollectionType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(collection.singularName);\n const attributes = generateJSDocAttributes(collection.attributes, schema, 'collection');\n\n return `// @ts-check\n/**\n * ${collection.displayName}\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {import('../../shared/utils').StrapiBaseEntity & ${typeName}Attributes} ${typeName}\n */\n\n/**\n * @typedef {Object} ${typeName}Attributes\n${attributes}\n */\n\n/**\n * @typedef {Object} ${typeName}Filters\n * @property {number|{$eq?: number, $ne?: number, $in?: number[], $notIn?: number[]}} [id]\n * @property {string|{$eq?: string, $ne?: string}} [documentId]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [createdAt]\n * @property {string|{$eq?: string, $gt?: string, $gte?: string, $lt?: string, $lte?: string}} [updatedAt]\n * @property {string|null|{$eq?: string, $ne?: string, $null?: boolean}} [publishedAt]\n * @property {${typeName}Filters[]} [$and]\n * @property {${typeName}Filters[]} [$or]\n * @property {${typeName}Filters} [$not]\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateSingleTypesJSDoc(single: SingleType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(single.singularName);\n const attributes = generateJSDocAttributes(single.attributes, schema, 'single');\n\n return `// @ts-check\n/**\n * ${single.displayName}\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {import('../../shared/utils').StrapiBaseEntity & ${typeName}Attributes} ${typeName}\n */\n\n/**\n * @typedef {Object} ${typeName}Attributes\n${attributes}\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateComponentTypesJSDoc(component: ComponentType, schema: ParsedSchema, useESM: boolean = false): string {\n const typeName = toPascalCase(component.name);\n const attributes = generateJSDocAttributes(component.attributes, schema, 'component');\n\n return `// @ts-check\n/**\n * ${component.displayName} component\n * Category: ${component.category}\n * ${component.description || ''}\n * Generated by strapi2front\n */\n\n/**\n * @typedef {Object} ${typeName}\n * @property {number} id\n${attributes}\n */\n\n${useESM ? 'export {};' : 'module.exports = {};'}\n`;\n}\n\nfunction generateJSDocAttributes(\n attributes: Record<string, Attribute>,\n schema: ParsedSchema,\n context: 'collection' | 'single' | 'component'\n): string {\n const lines: string[] = [];\n const relativePrefix = context === 'component' ? '..' : '../..';\n\n for (const [name, attr] of Object.entries(attributes)) {\n const jsType = attributeToJSDocType(attr, schema, relativePrefix);\n const optional = attr.required ? '' : '[';\n const optionalEnd = attr.required ? '' : ']';\n lines.push(` * @property {${jsType}} ${optional}${name}${optionalEnd}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction attributeToJSDocType(\n attr: Attribute,\n schema: ParsedSchema,\n relativePrefix: string\n): string {\n switch (attr.type) {\n case 'string':\n case 'text':\n case 'richtext':\n case 'email':\n case 'password':\n case 'uid':\n return 'string';\n case 'blocks':\n return 'Array<Object>';\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'date':\n case 'time':\n case 'datetime':\n case 'timestamp':\n return 'string';\n case 'json':\n return 'Object';\n case 'enumeration':\n if ('enum' in attr && attr.enum) {\n return attr.enum.map(v => `'${v}'`).join('|');\n }\n return 'string';\n case 'media':\n if ('multiple' in attr && attr.multiple) {\n return `import(\"${relativePrefix}/shared/utils\").StrapiMedia[]`;\n }\n return `import(\"${relativePrefix}/shared/utils\").StrapiMedia|null`;\n case 'relation':\n if ('target' in attr && attr.target) {\n const targetName = attr.target.split('.').pop() || 'unknown';\n const typeName = toPascalCase(targetName);\n const fileName = toKebabCase(targetName);\n const isMany = attr.relation === 'oneToMany' || attr.relation === 'manyToMany';\n\n // Determine if target is a collection or single\n const isCollection = schema.collections.some(c => c.singularName === targetName);\n const isSingle = schema.singles.some(s => s.singularName === targetName);\n\n let importPath: string;\n if (isCollection) {\n importPath = `${relativePrefix}/collections/${fileName}/types`;\n } else if (isSingle) {\n importPath = `${relativePrefix}/singles/${fileName}/types`;\n } else {\n // Fallback - assume collection\n importPath = `${relativePrefix}/collections/${fileName}/types`;\n }\n\n const importType = `import(\"${importPath}\").${typeName}`;\n return isMany ? `${importType}[]` : `${importType}|null`;\n }\n return 'Object';\n case 'component':\n if ('component' in attr && attr.component) {\n const componentName = attr.component.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n const importPath = `${relativePrefix}/components/${fileName}`;\n const importType = `import(\"${importPath}\").${typeName}`;\n\n if ('repeatable' in attr && attr.repeatable) {\n return `${importType}[]`;\n }\n return `${importType}|null`;\n }\n return 'Object';\n case 'dynamiczone':\n if ('components' in attr && attr.components) {\n const types = attr.components.map(comp => {\n const componentName = comp.split('.').pop() || 'unknown';\n const typeName = toPascalCase(componentName);\n const fileName = toKebabCase(componentName);\n const importPath = `${relativePrefix}/components/${fileName}`;\n return `import(\"${importPath}\").${typeName}`;\n });\n return `(${types.join('|')})[]`;\n }\n return 'Object[]';\n default:\n return 'Object';\n }\n}\n\n// ============================================\n// JSDoc Collection Service Generation\n// ============================================\n\nfunction generateCollectionServiceJSDoc(collection: CollectionType, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const typeName = toPascalCase(collection.singularName);\n const serviceName = toCamelCase(collection.singularName) + 'Service';\n const endpoint = collection.pluralName;\n const hasSlug = 'slug' in collection.attributes;\n const { localized, draftAndPublish } = collection;\n const isV4 = strapiVersion === \"v4\";\n\n // V4 uses `id: number`, V5 uses `documentId: string`\n const idParam = isV4 ? 'id' : 'documentId';\n const idType = isV4 ? 'number' : 'string';\n\n const importStatement = useESM\n ? `import { collection } from '../../shared/client.js';`\n : `const { collection } = require('../../shared/client');`;\n\n return `// @ts-check\n/**\n * ${collection.displayName} Service\n * ${collection.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${importStatement}\n\n/**\n * @typedef {Object} FindManyOptions\n * @property {import('./types').${typeName}Filters} [filters]\n * @property {Object} [pagination]\n * @property {number} [pagination.page]\n * @property {number} [pagination.pageSize]\n * @property {number} [pagination.start]\n * @property {number} [pagination.limit]\n * @property {string|string[]} [sort]\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/**\n * @typedef {Object} FindOneOptions\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/** @type {ReturnType<typeof collection<import('./types').${typeName}>>} */\nconst ${toCamelCase(collection.singularName)}Collection = collection('${endpoint}');\n\nconst ${serviceName} = {\n /**\n * @param {FindManyOptions} [options]\n * @returns {Promise<{ data: import('./types').${typeName}[], pagination: import('../../shared/utils').StrapiPagination }>}\n */\n async findMany(options = {}) {\n const response = await ${toCamelCase(collection.singularName)}Collection.find({\n filters: options.filters,\n pagination: options.pagination,\n sort: options.sort,\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return {\n data: response.data,\n pagination: response.meta.pagination,\n };\n },\n\n /**\n * @param {Omit<FindManyOptions, 'pagination'>} [options]\n * @returns {Promise<import('./types').${typeName}[]>}\n */\n async findAll(options = {}) {\n /** @type {import('./types').${typeName}[]} */\n const allItems = [];\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const { data, pagination } = await this.findMany({\n ...options,\n pagination: { page, pageSize: 100 },\n });\n\n allItems.push(...data);\n hasMore = page < pagination.pageCount;\n page++;\n }\n\n return allItems;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @param {FindOneOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async findOne(${idParam}, options = {}) {\n try {\n const response = await ${toCamelCase(collection.singularName)}Collection.findOne(${idParam}, {\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n${hasSlug ? `\n /**\n * @param {string} slug\n * @param {FindOneOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async findBySlug(slug, options = {}) {\n const { data } = await this.findMany({\n filters: /** @type {import('./types').${typeName}Filters} */ ({ slug: { $eq: slug } }),\n pagination: { pageSize: 1 },\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return data[0] || null;\n },\n` : ''}\n /**\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async create(data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.create(data);\n return response.data;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async update(${idParam}, data) {\n const response = await ${toCamelCase(collection.singularName)}Collection.update(${idParam}, data);\n return response.data;\n },\n\n /**\n * @param {${idType}} ${idParam}\n * @returns {Promise<void>}\n */\n async delete(${idParam}) {\n await ${toCamelCase(collection.singularName)}Collection.delete(${idParam});\n },\n\n /**\n * @param {import('./types').${typeName}Filters} [filters]\n * @returns {Promise<number>}\n */\n async count(filters) {\n const { pagination } = await this.findMany({\n filters,\n pagination: { pageSize: 1 },\n });\n\n return pagination.total;\n },\n};\n\n${useESM ? `export { ${serviceName} };` : `module.exports = { ${serviceName} };`}\n`;\n}\n\n// ============================================\n// JSDoc Single Service Generation\n// ============================================\n\nfunction generateSingleServiceJSDoc(single: SingleType, strapiVersion: \"v4\" | \"v5\", useESM: boolean = false): string {\n const typeName = toPascalCase(single.singularName);\n const serviceName = toCamelCase(single.singularName) + 'Service';\n const endpoint = single.singularName;\n const { localized, draftAndPublish } = single;\n\n const importStatement = useESM\n ? `import { single } from '../../shared/client.js';`\n : `const { single } = require('../../shared/client');`;\n\n return `// @ts-check\n/**\n * ${single.displayName} Service (Single Type)\n * ${single.description || ''}\n * Generated by strapi2front\n * Strapi version: ${strapiVersion}\n */\n\n${importStatement}\n\n/**\n * @typedef {Object} FindOptions\n * @property {string|string[]|Record<string, unknown>} [populate]${localized ? '\\n * @property {string} [locale]' : ''}${draftAndPublish ? \"\\n * @property {'draft'|'published'} [status]\" : ''}\n */\n\n/** @type {ReturnType<typeof single<import('./types').${typeName}>>} */\nconst ${toCamelCase(single.singularName)}Single = single('${endpoint}');\n\nconst ${serviceName} = {\n /**\n * @param {FindOptions} [options]\n * @returns {Promise<import('./types').${typeName}|null>}\n */\n async find(options = {}) {\n try {\n const response = await ${toCamelCase(single.singularName)}Single.find({\n populate: options.populate,${localized ? '\\n locale: options.locale,' : ''}${draftAndPublish ? '\\n status: options.status,' : ''}\n });\n\n return response.data;\n } catch (error) {\n if (error instanceof Error && error.message.includes('404')) {\n return null;\n }\n throw error;\n }\n },\n\n /**\n * @param {Partial<import('./types').${typeName}>} data\n * @returns {Promise<import('./types').${typeName}>}\n */\n async update(data) {\n const response = await ${toCamelCase(single.singularName)}Single.update(data);\n return response.data;\n },\n\n /**\n * @returns {Promise<void>}\n */\n async delete() {\n await ${toCamelCase(single.singularName)}Single.delete();\n },\n};\n\n${useESM ? `export { ${serviceName} };` : `module.exports = { ${serviceName} };`}\n`;\n}\n\n// ============================================\n// Upload Helpers Generation\n// ============================================\n\nfunction generateUploadClientTS(): string {\n return `/**\n * Public Upload Client\n * Generated by strapi2front\n *\n * Uploads files directly from the browser to Strapi using a restricted public token.\n * This token should ONLY have upload permissions (no delete, no update).\n *\n * Required environment variables:\n * PUBLIC_STRAPI_URL - Your Strapi CMS base URL\n * PUBLIC_STRAPI_UPLOAD_TOKEN - Restricted API token (upload-only)\n *\n * Create the token in: Strapi Admin > Settings > API Tokens\n * Set permissions: Upload > upload (only)\n */\n\nimport type { StrapiMedia, StrapiFileInfo } from './utils';\n\nconst STRAPI_URL = import.meta.env.PUBLIC_STRAPI_URL || '';\nconst UPLOAD_TOKEN = import.meta.env.PUBLIC_STRAPI_UPLOAD_TOKEN || '';\n\n/**\n * Upload a single file to Strapi from the browser\n */\nexport async function uploadFile(\n file: File,\n fileInfo?: StrapiFileInfo\n): Promise<StrapiMedia> {\n const formData = new FormData();\n formData.append('files', file);\n\n if (fileInfo) {\n formData.append('fileInfo', JSON.stringify(fileInfo));\n }\n\n const response = await fetch(\\`\\${STRAPI_URL}/api/upload\\`, {\n method: 'POST',\n headers: {\n Authorization: \\`Bearer \\${UPLOAD_TOKEN}\\`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(\\`Upload failed: \\${response.status} \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n return Array.isArray(data) ? data[0] : data;\n}\n\n/**\n * Upload multiple files to Strapi from the browser\n */\nexport async function uploadFiles(\n files: File[],\n fileInfo?: StrapiFileInfo\n): Promise<StrapiMedia[]> {\n const formData = new FormData();\n files.forEach((f) => formData.append('files', f));\n\n if (fileInfo) {\n formData.append('fileInfo', JSON.stringify(fileInfo));\n }\n\n const response = await fetch(\\`\\${STRAPI_URL}/api/upload\\`, {\n method: 'POST',\n headers: {\n Authorization: \\`Bearer \\${UPLOAD_TOKEN}\\`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(\\`Upload failed: \\${response.status} \\${response.statusText}\\`);\n }\n\n return response.json();\n}\n`;\n}\n\nfunction generateUploadClientJSDoc(useESM: boolean): string {\n return `/**\n * Public Upload Client\n * Generated by strapi2front\n *\n * Uploads files directly from the browser to Strapi using a restricted public token.\n * This token should ONLY have upload permissions (no delete, no update).\n *\n * Required environment variables:\n * PUBLIC_STRAPI_URL - Your Strapi CMS base URL\n * PUBLIC_STRAPI_UPLOAD_TOKEN - Restricted API token (upload-only)\n *\n * Create the token in: Strapi Admin > Settings > API Tokens\n * Set permissions: Upload > upload (only)\n */\n\n/** @typedef {import('./utils').StrapiMedia} StrapiMedia */\n/** @typedef {import('./utils').StrapiFileInfo} StrapiFileInfo */\n\nconst STRAPI_URL = ${useESM ? \"import.meta.env.PUBLIC_STRAPI_URL || ''\" : \"process.env.PUBLIC_STRAPI_URL || ''\"};\nconst UPLOAD_TOKEN = ${useESM ? \"import.meta.env.PUBLIC_STRAPI_UPLOAD_TOKEN || ''\" : \"process.env.PUBLIC_STRAPI_UPLOAD_TOKEN || ''\"};\n\n/**\n * Upload a single file to Strapi from the browser\n * @param {File} file - The file to upload\n * @param {StrapiFileInfo} [fileInfo] - Optional file metadata\n * @returns {Promise<StrapiMedia>}\n */\n${useESM ? \"export \" : \"\"}async function uploadFile(file, fileInfo) {\n const formData = new FormData();\n formData.append('files', file);\n\n if (fileInfo) {\n formData.append('fileInfo', JSON.stringify(fileInfo));\n }\n\n const response = await fetch(\\`\\${STRAPI_URL}/api/upload\\`, {\n method: 'POST',\n headers: {\n Authorization: \\`Bearer \\${UPLOAD_TOKEN}\\`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(\\`Upload failed: \\${response.status} \\${response.statusText}\\`);\n }\n\n const data = await response.json();\n return Array.isArray(data) ? data[0] : data;\n}\n\n/**\n * Upload multiple files to Strapi from the browser\n * @param {File[]} files - The files to upload\n * @param {StrapiFileInfo} [fileInfo] - Optional file metadata (applied to all)\n * @returns {Promise<StrapiMedia[]>}\n */\n${useESM ? \"export \" : \"\"}async function uploadFiles(files, fileInfo) {\n const formData = new FormData();\n files.forEach((f) => formData.append('files', f));\n\n if (fileInfo) {\n formData.append('fileInfo', JSON.stringify(fileInfo));\n }\n\n const response = await fetch(\\`\\${STRAPI_URL}/api/upload\\`, {\n method: 'POST',\n headers: {\n Authorization: \\`Bearer \\${UPLOAD_TOKEN}\\`,\n },\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(\\`Upload failed: \\${response.status} \\${response.statusText}\\`);\n }\n\n return response.json();\n}\n\n${useESM ? \"\" : \"module.exports = { uploadFile, uploadFiles };\"}\n`;\n}\n\nfunction generateUploadActionTS(): string {\n return `/**\n * Upload Action\n * Generated by strapi2front\n *\n * Astro Action that receives files via FormData and uploads them to Strapi server-side.\n * Uses the private STRAPI_TOKEN — never exposed to the browser.\n *\n * Usage:\n * import { actions } from 'astro:actions';\n * const result = await actions.upload({ file: myFile, alternativeText: 'My image' });\n *\n * Register this action in src/actions/index.ts:\n * import { uploadAction, uploadMultipleAction } from '../strapi/shared/upload-action';\n * export const server = { upload: uploadAction, uploadMultiple: uploadMultipleAction };\n */\n\nimport { defineAction, ActionError } from 'astro:actions';\nimport { z } from 'astro:schema';\nimport { files } from './client';\n\n/**\n * Upload a single file via Astro Action (server-side, secure)\n */\nexport const uploadAction = defineAction({\n accept: 'form',\n input: z.object({\n file: z.instanceof(File),\n name: z.string().optional(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n }),\n handler: async (input) => {\n try {\n const { file, name, alternativeText, caption } = input;\n\n const fileInfo: Record<string, string> = {};\n if (name) fileInfo.name = name;\n if (alternativeText) fileInfo.alternativeText = alternativeText;\n if (caption) fileInfo.caption = caption;\n\n const result = await files.upload(file, {\n fileInfo: Object.keys(fileInfo).length > 0 ? fileInfo : undefined,\n });\n\n return result;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Upload failed',\n });\n }\n },\n});\n\n/**\n * Upload multiple files via Astro Action (server-side, secure)\n */\nexport const uploadMultipleAction = defineAction({\n accept: 'form',\n input: z.object({\n files: z.array(z.instanceof(File)).min(1),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n }),\n handler: async (input) => {\n try {\n const results = await Promise.all(\n input.files.map((file) =>\n files.upload(file, {\n fileInfo: {\n ...(input.alternativeText && { alternativeText: input.alternativeText }),\n ...(input.caption && { caption: input.caption }),\n },\n })\n )\n );\n return results;\n } catch (error) {\n throw new ActionError({\n code: 'INTERNAL_SERVER_ERROR',\n message: error instanceof Error ? error.message : 'Upload failed',\n });\n }\n },\n});\n`;\n}\n","/**\n * Next.js Server Actions generator\n * Generates type-safe Server Actions for Strapi content types\n *\n * Requirements:\n * - Next.js 14+ (Server Actions)\n * - TypeScript enabled\n *\n * Status: COMING SOON\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\n\nexport interface NextJsActionsOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Next.js Server Actions from parsed schema\n *\n * @throws Error - Not yet implemented\n */\nexport async function generateNextJsActions(\n _schema: ParsedSchema,\n _options: NextJsActionsOptions\n): Promise<string[]> {\n throw new Error(\n 'Next.js Server Actions generator is not yet implemented. ' +\n 'Coming soon! For now, you can use the generated services directly.'\n );\n}\n\n/**\n * Check if Next.js Server Actions are supported\n * Requires Next.js 14+ with App Router\n */\nexport function isNextJsActionsSupported(nextVersion: string | null): boolean {\n if (!nextVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = nextVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 14;\n}\n","/**\n * Nuxt Server Routes generator\n * Generates type-safe server routes for Strapi content types\n *\n * Requirements:\n * - Nuxt 3+\n * - TypeScript enabled\n *\n * Status: COMING SOON\n */\n\nimport type { ParsedSchema } from '@strapi2front/core';\nimport type { StrapiVersion } from '../../shared/types.js';\n\nexport interface NuxtServerRoutesOptions {\n outputDir: string;\n servicesImportPath: string;\n strapiVersion?: StrapiVersion;\n}\n\n/**\n * Generate Nuxt Server Routes from parsed schema\n *\n * @throws Error - Not yet implemented\n */\nexport async function generateNuxtServerRoutes(\n _schema: ParsedSchema,\n _options: NuxtServerRoutesOptions\n): Promise<string[]> {\n throw new Error(\n 'Nuxt Server Routes generator is not yet implemented. ' +\n 'Coming soon! For now, you can use the generated services directly.'\n );\n}\n\n/**\n * Check if Nuxt Server Routes are supported\n * Requires Nuxt 3+\n */\nexport function isNuxtServerRoutesSupported(nuxtVersion: string | null): boolean {\n if (!nuxtVersion) return false;\n\n // Remove ^ or ~ prefix and get major version\n const match = nuxtVersion.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n const majorVersion = match ? parseInt(match[1], 10) : null;\n\n return majorVersion !== null && majorVersion >= 3;\n}\n","/**\n * Framework-specific generators\n *\n * Each framework has its own approach to server-side data fetching:\n * - Astro: Actions (v4+)\n * - Next.js: Server Actions (v14+) - Coming Soon\n * - Nuxt: Server Routes (v3+) - Coming Soon\n */\n\n// Astro\nexport { generateAstroActions, isAstroActionsSupported } from './astro/actions.js';\nexport type { AstroActionsOptions } from './astro/actions.js';\n\n// Next.js (Coming Soon)\nexport { generateNextJsActions, isNextJsActionsSupported } from './nextjs/actions.js';\nexport type { NextJsActionsOptions } from './nextjs/actions.js';\n\n// Nuxt (Coming Soon)\nexport { generateNuxtServerRoutes, isNuxtServerRoutesSupported } from './nuxt/server-routes.js';\nexport type { NuxtServerRoutesOptions } from './nuxt/server-routes.js';\n\n/**\n * Supported frameworks for action generation\n */\nexport type SupportedFramework = 'astro' | 'nextjs' | 'nuxt';\n\n/**\n * Framework support status\n */\nexport const frameworkSupport: Record<SupportedFramework, { status: 'stable' | 'coming-soon'; minVersion: string }> = {\n astro: { status: 'stable', minVersion: '4.0.0' },\n nextjs: { status: 'coming-soon', minVersion: '14.0.0' },\n nuxt: { status: 'coming-soon', minVersion: '3.0.0' },\n};\n","/**\n * Zod Schemas generator\n * Generates Zod validation schemas for Strapi content types\n */\n\nimport path from 'node:path';\nimport type { ParsedSchema, CollectionType, SingleType, ComponentType } from '@strapi2front/core';\nimport { formatCode } from '../../utils/formatter.js';\nimport { writeFile, ensureDir } from '../../utils/file.js';\nimport { toCamelCase, toKebabCase, toPascalCase } from '../../utils/naming.js';\nimport { generateZodObjectSchema, type ZodMapperOptions } from '../../shared/zod-mapper.js';\n\nexport interface ZodSchemasOptions {\n outputDir: string;\n /** Generate schemas alongside types in by-feature structure */\n byFeature?: boolean;\n /** Strapi version - affects ID types for relations (v4: number, v5: string) */\n strapiVersion?: 'v4' | 'v5';\n}\n\nexport interface GeneratedSchemaInfo {\n /** File path where schema was written */\n filePath: string;\n /** Schema names generated */\n schemas: string[];\n}\n\n/**\n * Generate Zod schemas from parsed schema\n */\nexport async function generateZodSchemas(\n schema: ParsedSchema,\n options: ZodSchemasOptions\n): Promise<GeneratedSchemaInfo[]> {\n const { outputDir, byFeature = false, strapiVersion = 'v5' } = options;\n const generatedFiles: GeneratedSchemaInfo[] = [];\n\n await ensureDir(outputDir);\n\n if (byFeature) {\n // Generate schemas in by-feature structure (alongside types and services)\n for (const collection of schema.collections) {\n const dirPath = path.join(outputDir, 'collections', toKebabCase(collection.singularName));\n await ensureDir(dirPath);\n\n const filePath = path.join(dirPath, 'schemas.ts');\n const content = generateCollectionSchemas(collection, schema.components, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n\n generatedFiles.push({\n filePath,\n schemas: [\n `${toCamelCase(collection.singularName)}CreateSchema`,\n `${toCamelCase(collection.singularName)}UpdateSchema`,\n ],\n });\n }\n\n for (const single of schema.singles) {\n const dirPath = path.join(outputDir, 'singles', toKebabCase(single.singularName));\n await ensureDir(dirPath);\n\n const filePath = path.join(dirPath, 'schemas.ts');\n const content = generateSingleSchemas(single, schema.components, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n\n generatedFiles.push({\n filePath,\n schemas: [`${toCamelCase(single.singularName)}UpdateSchema`],\n });\n }\n } else {\n // Generate all schemas in a single file\n const filePath = path.join(outputDir, 'schemas.ts');\n const content = generateAllSchemas(schema, strapiVersion);\n await writeFile(filePath, await formatCode(content));\n\n const allSchemas: string[] = [];\n for (const collection of schema.collections) {\n allSchemas.push(`${toCamelCase(collection.singularName)}CreateSchema`);\n allSchemas.push(`${toCamelCase(collection.singularName)}UpdateSchema`);\n }\n for (const single of schema.singles) {\n allSchemas.push(`${toCamelCase(single.singularName)}UpdateSchema`);\n }\n\n generatedFiles.push({ filePath, schemas: allSchemas });\n }\n\n return generatedFiles;\n}\n\n/**\n * Generate all schemas in a single file\n */\nfunction generateAllSchemas(schema: ParsedSchema, strapiVersion: 'v4' | 'v5' = 'v5'): string {\n const sections: string[] = [];\n\n // Header\n sections.push(`/**\n * Zod Validation Schemas\n * Generated by strapi2front\n *\n * These schemas can be used for form validation, API input validation, etc.\n */\n\nimport { z } from 'zod';\n`);\n\n // Collection schemas\n if (schema.collections.length > 0) {\n sections.push('// ============================================');\n sections.push('// Collection Schemas');\n sections.push('// ============================================\\n');\n\n for (const collection of schema.collections) {\n sections.push(generateCollectionSchemaContent(collection, schema.components, strapiVersion));\n sections.push('');\n }\n }\n\n // Single type schemas\n if (schema.singles.length > 0) {\n sections.push('// ============================================');\n sections.push('// Single Type Schemas');\n sections.push('// ============================================\\n');\n\n for (const single of schema.singles) {\n sections.push(generateSingleSchemaContent(single, schema.components, strapiVersion));\n sections.push('');\n }\n }\n\n // Export all schemas\n sections.push('// ============================================');\n sections.push('// Schema Exports');\n sections.push('// ============================================\\n');\n\n const exports: string[] = [];\n for (const collection of schema.collections) {\n const name = toCamelCase(collection.singularName);\n exports.push(` ${name}CreateSchema,`);\n exports.push(` ${name}UpdateSchema,`);\n }\n for (const single of schema.singles) {\n const name = toCamelCase(single.singularName);\n exports.push(` ${name}UpdateSchema,`);\n }\n\n sections.push(`export const schemas = {\\n${exports.join('\\n')}\\n};`);\n\n return sections.join('\\n');\n}\n\n/**\n * Generate schemas for a collection type (separate file)\n */\nfunction generateCollectionSchemas(\n collection: CollectionType,\n _components: ComponentType[],\n strapiVersion: 'v4' | 'v5' = 'v5'\n): string {\n const name = toCamelCase(collection.singularName);\n const pascalName = toPascalCase(collection.singularName);\n\n return `/**\n * ${collection.displayName} Zod Schemas\n * ${collection.description || ''}\n * Generated by strapi2front\n */\n\nimport { z } from 'zod';\n\n${generateCollectionSchemaContent(collection, _components, strapiVersion)}\n\n// Type inference helpers\nexport type ${pascalName}CreateInput = z.infer<typeof ${name}CreateSchema>;\nexport type ${pascalName}UpdateInput = z.infer<typeof ${name}UpdateSchema>;\n`;\n}\n\n/**\n * Generate schemas for a single type (separate file)\n */\nfunction generateSingleSchemas(\n single: SingleType,\n _components: ComponentType[],\n strapiVersion: 'v4' | 'v5' = 'v5'\n): string {\n const name = toCamelCase(single.singularName);\n const pascalName = toPascalCase(single.singularName);\n\n return `/**\n * ${single.displayName} Zod Schemas\n * ${single.description || ''}\n * Generated by strapi2front\n */\n\nimport { z } from 'zod';\n\n${generateSingleSchemaContent(single, _components, strapiVersion)}\n\n// Type inference helpers\nexport type ${pascalName}UpdateInput = z.infer<typeof ${name}UpdateSchema>;\n`;\n}\n\n/**\n * Generate schema content for a collection\n */\nfunction generateCollectionSchemaContent(\n collection: CollectionType,\n _components: ComponentType[],\n strapiVersion: 'v4' | 'v5' = 'v5'\n): string {\n const name = toCamelCase(collection.singularName);\n const sections: string[] = [];\n\n // Create schema options\n const createOptions: ZodMapperOptions = {\n isUpdate: false,\n includeRelations: true,\n includeMedia: true,\n includeComponents: true,\n strapiVersion,\n };\n\n // Update schema options (all fields optional)\n const updateOptions: ZodMapperOptions = {\n isUpdate: true,\n includeRelations: true,\n includeMedia: true,\n includeComponents: true,\n strapiVersion,\n };\n\n // Generate create schema\n const createResult = generateZodObjectSchema(collection.attributes, createOptions);\n sections.push(`/**\n * Schema for creating a new ${collection.displayName}\n */\nexport const ${name}CreateSchema = ${createResult.schema};`);\n\n // Add comments about skipped fields if any\n if (createResult.skippedFields.length > 0) {\n sections.push(`// Skipped fields: ${createResult.skippedFields.map((f) => f.name).join(', ')}`);\n }\n\n sections.push('');\n\n // Generate update schema (all fields optional)\n const updateResult = generateZodObjectSchema(collection.attributes, updateOptions);\n sections.push(`/**\n * Schema for updating a ${collection.displayName}\n * All fields are optional for partial updates\n */\nexport const ${name}UpdateSchema = ${updateResult.schema};`);\n\n return sections.join('\\n');\n}\n\n/**\n * Generate schema content for a single type\n */\nfunction generateSingleSchemaContent(\n single: SingleType,\n _components: ComponentType[],\n strapiVersion: 'v4' | 'v5' = 'v5'\n): string {\n const name = toCamelCase(single.singularName);\n\n // Update schema options (all fields optional for single types)\n const updateOptions: ZodMapperOptions = {\n isUpdate: true,\n includeRelations: true,\n includeMedia: true,\n includeComponents: true,\n strapiVersion,\n };\n\n const updateResult = generateZodObjectSchema(single.attributes, updateOptions);\n\n return `/**\n * Schema for updating ${single.displayName}\n * All fields are optional for partial updates\n */\nexport const ${name}UpdateSchema = ${updateResult.schema};`;\n}\n"]}
|