geo-semantic-layer 3.0.0-alpha.1 → 3.0.1
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/auditor.js +2067 -0
- package/dist/auditor.js.map +1 -0
- package/dist/cli.js +5152 -0
- package/dist/cli.js.map +1 -0
- package/dist/extractor.js +596 -0
- package/dist/extractor.js.map +1 -0
- package/dist/index.js +3491 -0
- package/dist/index.js.map +1 -0
- package/dist/optimizer.js +523 -0
- package/dist/optimizer.js.map +1 -0
- package/package.json +9 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auditor/project-scanner.ts","../src/core/schemas/organization.ts","../src/core/schemas/person.ts","../src/core/schemas/product.ts","../src/core/schemas/article.ts","../src/core/schemas/faq.ts","../src/core/schemas/breadcrumb.ts","../src/core/schemas/webpage.ts","../src/core/schemas/opengraph.ts","../src/core/schemas/localbusiness.ts","../src/core/schemas/event.ts","../src/auditor/schema-validator.ts","../src/auditor/coverage-reporter.ts","../src/optimizer/llm-profiles.ts","../src/optimizer/token-analyzer.ts","../src/optimizer/semantic-scorer.ts","../src/auditor/optimizer-suggestions.ts","../src/auditor/index.ts"],"names":["z","fs2","path","hasField"],"mappings":"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","file":"auditor.js","sourcesContent":["/**\n * Project Scanner\n *\n * Escanea el proyecto local buscando:\n * 1. Archivos que usan funciones generateXSchema()\n * 2. Archivos de rutas (pages/app) que deberían tener schemas\n * 3. Detecta el framework usado (Next.js, Nuxt, Astro, etc.)\n *\n * NO escanea sitios remotos - solo archivos locales del proyecto.\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type {\n ProjectScanResult,\n ScanOptions,\n SchemaFile,\n RouteFile,\n FoundSchema,\n} from './types.js';\n\n/**\n * Patrones por defecto de archivos a incluir\n */\nconst DEFAULT_INCLUDE_PATTERNS = [\n '**/*.tsx',\n '**/*.jsx',\n '**/*.vue',\n '**/*.astro',\n '**/*.js',\n '**/*.ts',\n];\n\n/**\n * Patrones por defecto de archivos a excluir\n */\nconst DEFAULT_EXCLUDE_PATTERNS = [\n 'node_modules/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n '.nuxt/**',\n '.astro/**',\n 'coverage/**',\n '**/*.test.{ts,tsx,js,jsx}',\n '**/*.spec.{ts,tsx,js,jsx}',\n];\n\n/**\n * Expresiones regulares para detectar funciones generadoras\n */\nconst GENERATOR_PATTERNS = [\n /generate(Article|Product|Organization|LocalBusiness|Person|Event|WebPage|FAQ|Breadcrumb|OpenGraph)Schema/g,\n /new\\s+(Article|Product|Organization|LocalBusiness|Person|Event|WebPage|FAQ|Breadcrumb)Schema/g,\n];\n\n/**\n * Escanea un proyecto completo en busca de JSON-LD\n *\n * @param options - Opciones de escaneo\n * @returns Resultado del escaneo con archivos encontrados\n *\n * @example\n * ```typescript\n * const result = await scanProject({\n * rootDir: process.cwd(),\n * deepAnalysis: true\n * });\n *\n * console.log(`Found ${result.filesWithSchemas.length} files with schemas`);\n * ```\n */\nexport async function scanProject(options: ScanOptions = {}): Promise<ProjectScanResult> {\n const rootDir = options.rootDir || process.cwd();\n const include = options.include || DEFAULT_INCLUDE_PATTERNS;\n const exclude = options.exclude || DEFAULT_EXCLUDE_PATTERNS;\n\n // 1. Detectar framework\n const framework = await detectFramework(rootDir);\n\n // 2. Obtener todos los archivos del proyecto\n const allFiles = await getAllFiles(rootDir, {\n include,\n exclude,\n ...(options.maxDepth && { maxDepth: options.maxDepth }),\n });\n\n // 3. Filtrar archivos que contienen schemas\n const filesWithSchemas: SchemaFile[] = [];\n const routesWithoutSchemas: RouteFile[] = [];\n\n for (const filePath of allFiles) {\n const content = await fs.readFile(filePath, 'utf-8');\n const relativePath = path.relative(rootDir, filePath);\n\n // Detectar si tiene schemas\n const schemas = await detectSchemasInFile(content, filePath);\n\n if (schemas.length > 0) {\n filesWithSchemas.push({\n filePath: relativePath,\n fileType: path.extname(filePath).slice(1),\n schemas,\n linesOfCode: content.split('\\n').length,\n });\n } else if (isRouteFile(filePath, framework)) {\n // Es un archivo de ruta pero no tiene schemas\n const routeInfo = analyzeRouteFile(content, filePath, framework);\n if (routeInfo) {\n routesWithoutSchemas.push({\n filePath: relativePath,\n ...routeInfo,\n });\n }\n }\n }\n\n return {\n projectRoot: rootDir,\n framework,\n filesScanned: allFiles.length,\n filesWithSchemas,\n routesWithoutSchemas,\n scannedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Detecta qué framework está usando el proyecto\n *\n * Busca archivos de configuración característicos:\n * - next.config.js → Next.js\n * - nuxt.config.ts → Nuxt\n * - astro.config.mjs → Astro\n * - vite.config.ts → Vite\n */\nasync function detectFramework(\n rootDir: string\n): Promise<'next' | 'nuxt' | 'astro' | 'vite' | 'unknown'> {\n const configFiles = {\n next: ['next.config.js', 'next.config.mjs', 'next.config.ts'],\n nuxt: ['nuxt.config.js', 'nuxt.config.ts'],\n astro: ['astro.config.mjs', 'astro.config.ts'],\n vite: ['vite.config.js', 'vite.config.ts'],\n };\n\n for (const [framework, files] of Object.entries(configFiles)) {\n for (const file of files) {\n try {\n await fs.access(path.join(rootDir, file));\n return framework as any;\n } catch {\n // File doesn't exist, continue\n }\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Obtiene todos los archivos del proyecto que coinciden con los patrones\n */\nasync function getAllFiles(\n dir: string,\n options: {\n include: string[];\n exclude: string[];\n maxDepth?: number;\n },\n currentDepth = 0\n): Promise<string[]> {\n const files: string[] = [];\n\n // Verificar profundidad máxima\n if (options.maxDepth && currentDepth > options.maxDepth) {\n return files;\n }\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n // Verificar si está excluido\n if (isExcluded(relativePath, options.exclude)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n // Recursivo en subdirectorios\n const subFiles = await getAllFiles(fullPath, options, currentDepth + 1);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n // Verificar si coincide con los patrones de inclusión\n if (matchesPatterns(relativePath, options.include)) {\n files.push(fullPath);\n }\n }\n }\n } catch (error) {\n // Ignorar errores de permisos, etc.\n console.warn(`Warning: Could not read directory ${dir}`);\n }\n\n return files;\n}\n\n/**\n * Verifica si un archivo está excluido según los patrones\n */\nfunction isExcluded(filePath: string, excludePatterns: string[]): boolean {\n return excludePatterns.some((pattern) => {\n // Convertir glob pattern simple a regex\n const regex = globToRegex(pattern);\n return regex.test(filePath);\n });\n}\n\n/**\n * Verifica si un archivo coincide con algún patrón de inclusión\n */\nfunction matchesPatterns(filePath: string, includePatterns: string[]): boolean {\n return includePatterns.some((pattern) => {\n const regex = globToRegex(pattern);\n return regex.test(filePath);\n });\n}\n\n/**\n * Convierte un patrón glob simple a RegExp\n * Soporta:\n * - ** → cualquier directorio\n * - * → cualquier cosa menos /\n * - {a,b} → a o b\n */\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = pattern\n .replace(/\\*\\*/g, '%%%DOUBLESTAR%%%')\n .replace(/\\*/g, '[^/]*')\n .replace(/%%%DOUBLESTAR%%%/g, '.*')\n .replace(/\\./g, '\\\\.')\n .replace(/\\{([^}]+)\\}/g, (_, group) => `(${group.split(',').join('|')})`);\n\n return new RegExp(`^${regexStr}$`);\n}\n\n/**\n * Detecta schemas en el contenido de un archivo\n *\n * Busca llamadas a funciones como:\n * - generateArticleSchema(...)\n * - generateProductSchema(...)\n * - new ArticleSchema(...)\n */\nasync function detectSchemasInFile(\n content: string,\n _filePath: string\n): Promise<FoundSchema[]> {\n const schemas: FoundSchema[] = [];\n const lines = content.split('\\n');\n\n // Buscar cada patrón\n for (const pattern of GENERATOR_PATTERNS) {\n pattern.lastIndex = 0; // Reset regex\n let match;\n\n while ((match = pattern.exec(content)) !== null) {\n const matchText = match[0];\n const schemaType = match[1]; // Article, Product, etc.\n if (!schemaType) continue;\n\n // Encontrar línea y columna\n const position = match.index;\n let line = 0;\n let column = 0;\n let currentPos = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const currentLine = lines[i];\n if (!currentLine) continue;\n\n if (currentPos + currentLine.length >= position) {\n line = i + 1;\n column = position - currentPos;\n break;\n }\n currentPos += currentLine.length + 1; // +1 for newline\n }\n\n schemas.push({\n type: schemaType,\n generatorFunction: matchText,\n line,\n column,\n issues: [], // Se llenarán en la validación\n });\n }\n }\n\n return schemas;\n}\n\n/**\n * Determina si un archivo es una ruta/página según el framework\n *\n * Next.js:\n * - app/.../page.tsx (App Router)\n * - pages/.../[file].tsx (Pages Router)\n *\n * Nuxt:\n * - pages/.../[file].vue\n *\n * Astro:\n * - src/pages/.../[file].astro\n */\nfunction isRouteFile(\n filePath: string,\n framework: string | undefined\n): boolean {\n const normalized = filePath.replace(/\\\\/g, '/');\n\n switch (framework) {\n case 'next':\n return (\n /\\/app\\/.*\\/page\\.(tsx|jsx|ts|js)$/.test(normalized) ||\n /\\/pages\\/.*\\.(tsx|jsx|ts|js)$/.test(normalized)\n );\n\n case 'nuxt':\n return /\\/pages\\/.*\\.vue$/.test(normalized);\n\n case 'astro':\n return /\\/src\\/pages\\/.*\\.astro$/.test(normalized);\n\n default:\n // Para frameworks desconocidos, ser conservador\n return false;\n }\n}\n\n/**\n * Analiza un archivo de ruta para sugerir qué tipo de schema debería tener\n *\n * Usa heurísticas simples:\n * - Si contiene \"blog\", \"article\", \"post\" → Article\n * - Si contiene \"product\", \"item\" → Product\n * - Si contiene \"about\", \"company\" → Organization\n */\nfunction analyzeRouteFile(\n _content: string,\n filePath: string,\n framework: string | undefined\n): Omit<RouteFile, 'filePath'> | null {\n const normalized = filePath.toLowerCase().replace(/\\\\/g, '/');\n\n // Inferir ruta URL\n let routePath: string | undefined;\n\n if (framework === 'next') {\n // Next.js App Router: app/blog/[slug]/page.tsx → /blog/[slug]\n const appMatch = normalized.match(/\\/app\\/(.*)\\/page\\.(tsx|jsx|ts|js)$/);\n if (appMatch) {\n routePath = `/${appMatch[1]}`;\n }\n\n // Next.js Pages Router: pages/blog/[slug].tsx → /blog/[slug]\n const pagesMatch = normalized.match(/\\/pages\\/(.*)\\.(?:tsx|jsx|ts|js)$/);\n if (pagesMatch) {\n routePath = `/${pagesMatch[1]}`;\n }\n }\n\n // Heurística simple para sugerir tipo de schema\n let suggestedSchemaType: string | undefined;\n let confidence = 0;\n let reason: string | undefined;\n\n if (/blog|article|post|news/.test(normalized)) {\n suggestedSchemaType = 'Article';\n confidence = 0.8;\n reason = 'Path contains blog/article/post keywords';\n } else if (/product|item|shop/.test(normalized)) {\n suggestedSchemaType = 'Product';\n confidence = 0.75;\n reason = 'Path contains product/shop keywords';\n } else if (/about|company|contact/.test(normalized)) {\n suggestedSchemaType = 'Organization';\n confidence = 0.7;\n reason = 'Path suggests organization/company page';\n } else if (/event|calendar/.test(normalized)) {\n suggestedSchemaType = 'Event';\n confidence = 0.7;\n reason = 'Path suggests event page';\n }\n\n // Si no podemos hacer una sugerencia confiable, no sugerir nada\n if (!suggestedSchemaType || confidence < 0.6) {\n return null;\n }\n\n return {\n ...(routePath && { routePath }),\n suggestedSchemaType,\n confidence,\n ...(reason && { reason }),\n };\n}\n\n/**\n * Obtiene estadísticas rápidas del proyecto sin análisis profundo\n *\n * Útil para mostrar un resumen rápido antes del escaneo completo.\n */\nexport async function getProjectStats(rootDir: string = process.cwd()): Promise<{\n framework: string;\n estimatedFiles: number;\n hasPackageJson: boolean;\n}> {\n const framework = await detectFramework(rootDir);\n\n // Contar archivos aproximadamente (sin recursión profunda)\n let estimatedFiles = 0;\n try {\n const entries = await fs.readdir(rootDir, { withFileTypes: true });\n estimatedFiles = entries.filter((e) => e.isFile()).length;\n } catch {\n estimatedFiles = 0;\n }\n\n // Verificar package.json\n let hasPackageJson = false;\n try {\n await fs.access(path.join(rootDir, 'package.json'));\n hasPackageJson = true;\n } catch {\n hasPackageJson = false;\n }\n\n return {\n framework,\n estimatedFiles,\n hasPackageJson,\n };\n}\n","/**\n * Zod schema validation for Schema.org Organization type\n * @module schemas/organization\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org PostalAddress validation schema\n */\nexport const PostalAddressSchema = z.object({\n '@type': z.literal('PostalAddress').default('PostalAddress'),\n streetAddress: z.string().optional(),\n addressLocality: z.string().optional(),\n addressRegion: z.string().optional(),\n postalCode: z.string().optional(),\n addressCountry: z.string().length(2).optional(), // ISO 3166-1 alpha-2\n});\n\n/**\n * Schema.org ContactPoint validation schema\n */\nexport const ContactPointSchema = z.object({\n '@type': z.literal('ContactPoint').default('ContactPoint'),\n telephone: z.string().optional(),\n email: z.string().email().optional(),\n contactType: z\n .enum(['customer service', 'technical support', 'sales', 'billing'])\n .optional(),\n areaServed: z.string().optional(),\n availableLanguage: z.array(z.string()).optional(),\n});\n\n/**\n * Schema.org Organization validation schema\n *\n * @see https://schema.org/Organization\n * @see https://developers.google.com/search/docs/appearance/structured-data/organization\n */\nexport const OrganizationSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('Organization').default('Organization'),\n\n // Required fields\n name: z.string().min(1, 'Organization name is required'),\n url: z.string().url('Must be a valid URL'),\n\n // Recommended fields\n logo: z.string().url('Logo must be a valid URL').optional(),\n image: z.string().url('Image must be a valid URL').optional(),\n description: z.string().min(10, 'Description should be at least 10 characters').optional(),\n\n /**\n * CRITICAL for GEO: Entity disambiguation\n * Should include at least one social profile or authority ID (Wikidata, Wikipedia, etc.)\n */\n sameAs: z\n .array(z.string().url())\n .min(1, 'At least one sameAs URL is required for entity disambiguation')\n .describe('Social profiles, Wikidata ID, Wikipedia URL for entity disambiguation'),\n\n // Contact information\n email: z.string().email().optional(),\n telephone: z.string().optional(),\n address: PostalAddressSchema.optional(),\n contactPoint: z.union([ContactPointSchema, z.array(ContactPointSchema)]).optional(),\n\n // Additional information\n alternateName: z.string().optional(),\n foundingDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be in YYYY-MM-DD format').optional(),\n founder: z.array(z.string()).optional(),\n\n // Relationships\n parentOrganization: z.string().optional(),\n subOrganization: z.array(z.string()).optional(),\n});\n\n/**\n * TypeScript type inferred from Zod schema\n */\nexport type Organization = z.infer<typeof OrganizationSchema>;\n\n/**\n * Input type for creating Organization schema (before defaults are applied)\n */\nexport type OrganizationInput = z.input<typeof OrganizationSchema>;\n","/**\n * Zod schema validation for Schema.org Person type\n * @module schemas/person\n */\n\nimport { z } from 'zod';\n\nimport { PostalAddressSchema } from './organization.js';\n\n/**\n * Schema.org Person validation schema\n *\n * @see https://schema.org/Person\n * @see https://developers.google.com/search/docs/appearance/structured-data/person\n */\nexport const PersonSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('Person').default('Person'),\n\n // Required fields\n name: z.string().min(1, 'Person name is required'),\n url: z.string().url('Must be a valid URL').optional(),\n\n // Recommended fields\n image: z.string().url('Image must be a valid URL').optional(),\n description: z.string().min(10, 'Description should be at least 10 characters').optional(),\n\n /**\n * CRITICAL for GEO: Entity disambiguation\n * Should include social profiles, Wikidata ID, Wikipedia URL, etc.\n */\n sameAs: z\n .array(z.string().url())\n .min(1, 'At least one sameAs URL is required for entity disambiguation')\n .describe('Social profiles, Wikidata ID, Wikipedia URL for entity disambiguation'),\n\n // Contact information\n email: z.string().email().optional(),\n telephone: z.string().optional(),\n address: PostalAddressSchema.optional(),\n\n // Professional information\n jobTitle: z.string().optional(),\n worksFor: z\n .object({\n '@type': z.literal('Organization'),\n name: z.string(),\n url: z.string().url().optional(),\n })\n .optional(),\n\n // Additional information\n alternateName: z.string().optional(),\n birthDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/, 'Must be in YYYY-MM-DD format').optional(),\n nationality: z.string().optional(),\n\n // Relationships\n colleague: z.array(z.string()).optional(),\n alumniOf: z.string().optional(),\n});\n\n/**\n * TypeScript type inferred from Zod schema\n */\nexport type Person = z.infer<typeof PersonSchema>;\n\n/**\n * Input type for creating Person schema (before defaults are applied)\n */\nexport type PersonInput = z.input<typeof PersonSchema>;\n","/**\n * Zod schema validation for Schema.org Product type\n * @module schemas/product\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org Offer validation schema\n */\nexport const OfferSchema = z.object({\n '@type': z.literal('Offer').default('Offer'),\n price: z.union([z.string(), z.number()]),\n priceCurrency: z.string().length(3), // ISO 4217 currency code\n availability: z\n .string()\n .url()\n .optional()\n .describe('e.g., https://schema.org/InStock'),\n url: z.string().url().optional(),\n priceValidUntil: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/).optional(),\n seller: z\n .object({\n '@type': z.literal('Organization'),\n name: z.string(),\n })\n .optional(),\n});\n\n/**\n * Schema.org AggregateRating validation schema\n */\nexport const AggregateRatingSchema = z.object({\n '@type': z.literal('AggregateRating').default('AggregateRating'),\n ratingValue: z.union([z.string(), z.number()]),\n reviewCount: z.number().int().positive(),\n bestRating: z.union([z.string(), z.number()]).optional().default(5),\n worstRating: z.union([z.string(), z.number()]).optional().default(1),\n});\n\n/**\n * Schema.org Review validation schema\n */\nexport const ReviewSchema = z.object({\n '@type': z.literal('Review').default('Review'),\n author: z.object({\n '@type': z.literal('Person'),\n name: z.string(),\n }),\n datePublished: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}$/),\n reviewBody: z.string().min(10),\n reviewRating: z.object({\n '@type': z.literal('Rating'),\n ratingValue: z.union([z.string(), z.number()]),\n bestRating: z.union([z.string(), z.number()]).optional().default(5),\n }),\n});\n\n/**\n * Schema.org Product validation schema\n *\n * @see https://schema.org/Product\n * @see https://developers.google.com/search/docs/appearance/structured-data/product\n */\nexport const ProductSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('Product').default('Product'),\n\n // Required fields\n name: z.string().min(1, 'Product name is required'),\n\n // Recommended fields\n image: z.union([z.string().url(), z.array(z.string().url())]).optional(),\n description: z.string().min(10, 'Description should be at least 10 characters').optional(),\n\n // SKU or other identifiers\n sku: z.string().optional(),\n gtin: z.string().optional(),\n gtin8: z.string().optional(),\n gtin12: z.string().optional(),\n gtin13: z.string().optional(),\n gtin14: z.string().optional(),\n mpn: z.string().optional(),\n\n // Brand\n brand: z\n .object({\n '@type': z.literal('Brand'),\n name: z.string(),\n })\n .optional(),\n\n // Offers (pricing)\n offers: z.union([OfferSchema, z.array(OfferSchema)]).optional(),\n\n // Ratings and Reviews\n aggregateRating: AggregateRatingSchema.optional(),\n review: z.union([ReviewSchema, z.array(ReviewSchema)]).optional(),\n\n // Additional information\n category: z.string().optional(),\n color: z.union([z.string(), z.array(z.string())]).optional(),\n material: z.string().optional(),\n manufacturer: z\n .object({\n '@type': z.literal('Organization'),\n name: z.string(),\n })\n .optional(),\n});\n\n/**\n * TypeScript type inferred from Zod schema\n */\nexport type Product = z.infer<typeof ProductSchema>;\n\n/**\n * Input type for creating Product schema (before defaults are applied)\n */\nexport type ProductInput = z.input<typeof ProductSchema>;\n\nexport type Offer = z.infer<typeof OfferSchema>;\nexport type AggregateRating = z.infer<typeof AggregateRatingSchema>;\nexport type Review = z.infer<typeof ReviewSchema>;\n","/**\n * Zod schema validation for Schema.org Article type\n * @module schemas/article\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org Article validation schema\n *\n * @see https://schema.org/Article\n * @see https://developers.google.com/search/docs/appearance/structured-data/article\n */\nexport const ArticleSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z\n .enum(['Article', 'NewsArticle', 'BlogPosting', 'TechArticle'])\n .default('Article'),\n\n // Required fields\n headline: z\n .string()\n .min(1)\n .max(110, 'Headline should be less than 110 characters for optimal SEO'),\n image: z.union([z.string().url(), z.array(z.string().url())]),\n\n // Recommended fields\n author: z\n .union([\n z.object({\n '@type': z.enum(['Person', 'Organization']),\n name: z.string(),\n url: z.string().url().optional(),\n }),\n z.array(\n z.object({\n '@type': z.enum(['Person', 'Organization']),\n name: z.string(),\n url: z.string().url().optional(),\n })\n ),\n ])\n .describe('Author(s) of the article'),\n\n datePublished: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?$/, 'Must be ISO 8601 format'),\n\n dateModified: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?$/, 'Must be ISO 8601 format')\n .optional(),\n\n // Publisher (recommended for Google News)\n publisher: z\n .object({\n '@type': z.literal('Organization'),\n name: z.string(),\n logo: z\n .object({\n '@type': z.literal('ImageObject'),\n url: z.string().url(),\n width: z.number().optional(),\n height: z.number().optional(),\n })\n .optional(),\n })\n .optional(),\n\n // Content\n description: z.string().min(10).optional(),\n articleBody: z.string().min(50, 'Article body should be at least 50 characters').optional(),\n wordCount: z.number().int().positive().optional(),\n\n // Additional metadata\n url: z.string().url().optional(),\n mainEntityOfPage: z.string().url().optional(),\n keywords: z.union([z.string(), z.array(z.string())]).optional(),\n articleSection: z.string().optional(),\n inLanguage: z.string().optional(),\n});\n\n/**\n * Schema.org BlogPosting validation schema (extends Article)\n */\nexport const BlogPostingSchema = ArticleSchema.extend({\n '@type': z.literal('BlogPosting').default('BlogPosting'),\n});\n\n/**\n * Schema.org NewsArticle validation schema (extends Article)\n */\nexport const NewsArticleSchema = ArticleSchema.extend({\n '@type': z.literal('NewsArticle').default('NewsArticle'),\n dateline: z.string().optional(),\n});\n\n/**\n * TypeScript types inferred from Zod schemas\n */\nexport type Article = z.infer<typeof ArticleSchema>;\nexport type ArticleInput = z.input<typeof ArticleSchema>;\nexport type BlogPosting = z.infer<typeof BlogPostingSchema>;\nexport type NewsArticle = z.infer<typeof NewsArticleSchema>;\n","/**\n * Zod schema validation for Schema.org FAQPage type\n * @module schemas/faq\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org Question validation schema\n */\nexport const QuestionSchema = z.object({\n '@type': z.literal('Question').default('Question'),\n name: z.string().min(1, 'Question text is required'),\n acceptedAnswer: z.object({\n '@type': z.literal('Answer').default('Answer'),\n text: z.string().min(1, 'Answer text is required'),\n }),\n});\n\n/**\n * Schema.org FAQPage validation schema\n *\n * @see https://schema.org/FAQPage\n * @see https://developers.google.com/search/docs/appearance/structured-data/faqpage\n */\nexport const FAQPageSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('FAQPage').default('FAQPage'),\n\n mainEntity: z\n .array(QuestionSchema)\n .min(1, 'At least one question is required for FAQ')\n .describe('Array of questions and answers'),\n});\n\n/**\n * TypeScript types inferred from Zod schemas\n */\nexport type Question = z.infer<typeof QuestionSchema>;\nexport type FAQPage = z.infer<typeof FAQPageSchema>;\nexport type FAQPageInput = z.input<typeof FAQPageSchema>;\n","/**\n * Zod schema validation for Schema.org BreadcrumbList type\n * @module schemas/breadcrumb\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org ListItem validation schema\n */\nexport const ListItemSchema = z.object({\n '@type': z.literal('ListItem').default('ListItem'),\n position: z.number().int().positive(),\n name: z.string().min(1),\n item: z.string().url().optional(),\n});\n\n/**\n * Schema.org BreadcrumbList validation schema\n *\n * @see https://schema.org/BreadcrumbList\n * @see https://developers.google.com/search/docs/appearance/structured-data/breadcrumb\n */\nexport const BreadcrumbListSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('BreadcrumbList').default('BreadcrumbList'),\n\n itemListElement: z\n .array(ListItemSchema)\n .min(2, 'Breadcrumb list must have at least 2 items')\n .describe('Ordered list of breadcrumb items'),\n});\n\n/**\n * TypeScript types inferred from Zod schemas\n */\nexport type ListItem = z.infer<typeof ListItemSchema>;\nexport type BreadcrumbList = z.infer<typeof BreadcrumbListSchema>;\nexport type BreadcrumbListInput = z.input<typeof BreadcrumbListSchema>;\n","/**\n * Zod schema validation for Schema.org WebPage type\n * @module schemas/webpage\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org WebPage validation schema\n *\n * @see https://schema.org/WebPage\n */\nexport const WebPageSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.literal('WebPage').default('WebPage'),\n\n name: z.string().min(1),\n description: z.string().min(10).optional(),\n url: z.string().url(),\n\n // Optional fields\n inLanguage: z.string().optional(),\n isPartOf: z\n .object({\n '@type': z.literal('WebSite'),\n name: z.string(),\n url: z.string().url(),\n })\n .optional(),\n breadcrumb: z\n .object({\n '@type': z.literal('BreadcrumbList'),\n })\n .optional(),\n datePublished: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?$/).optional(),\n dateModified: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?$/).optional(),\n author: z\n .object({\n '@type': z.enum(['Person', 'Organization']),\n name: z.string(),\n })\n .optional(),\n});\n\n/**\n * TypeScript types inferred from Zod schemas\n */\nexport type WebPage = z.infer<typeof WebPageSchema>;\nexport type WebPageInput = z.input<typeof WebPageSchema>;\n","/**\n * OpenGraph and Twitter Cards metadata generation\n * @module schemas/opengraph\n */\n\nimport { z } from 'zod';\n\n/**\n * OpenGraph meta tag schema\n */\nexport const OpenGraphSchema = z.object({\n title: z.string().min(1).max(60, 'Title should be less than 60 characters for optimal display'),\n description: z.string().min(1).max(160, 'Description should be less than 160 characters'),\n url: z.string().url(),\n type: z.enum(['website', 'article', 'product', 'book', 'profile', 'music', 'video']).default('website'),\n image: z.string().url(),\n imageAlt: z.string().optional(),\n siteName: z.string().optional(),\n locale: z.string().default('en_US'),\n\n // Article-specific\n publishedTime: z.string().optional(),\n modifiedTime: z.string().optional(),\n author: z.string().optional(),\n section: z.string().optional(),\n tags: z.array(z.string()).optional(),\n\n // Product-specific\n price: z.union([z.string(), z.number()]).optional(),\n currency: z.string().length(3).optional(),\n});\n\n/**\n * Twitter Card meta tag schema\n */\nexport const TwitterCardSchema = z.object({\n card: z.enum(['summary', 'summary_large_image', 'app', 'player']).default('summary_large_image'),\n site: z.string().optional(), // @username\n creator: z.string().optional(), // @username\n title: z.string().min(1).max(70, 'Twitter title should be less than 70 characters'),\n description: z.string().min(1).max(200, 'Twitter description should be less than 200 characters'),\n image: z.string().url(),\n imageAlt: z.string().optional(),\n});\n\n/**\n * TypeScript types\n */\nexport type OpenGraph = z.infer<typeof OpenGraphSchema>;\nexport type TwitterCard = z.infer<typeof TwitterCardSchema>;\nexport type OpenGraphInput = z.input<typeof OpenGraphSchema>;\nexport type TwitterCardInput = z.input<typeof TwitterCardSchema>;\n","/**\n * Zod schema validation for Schema.org LocalBusiness type\n * @module schemas/localbusiness\n */\n\nimport { z } from 'zod';\nimport { PostalAddressSchema } from './organization.js';\n\n/**\n * Geographic coordinates schema\n */\nexport const GeoCoordinatesSchema = z.object({\n '@type': z.literal('GeoCoordinates').default('GeoCoordinates'),\n latitude: z.number().min(-90).max(90),\n longitude: z.number().min(-180).max(180),\n});\n\n/**\n * Opening hours specification schema\n */\nexport const OpeningHoursSchema = z.object({\n '@type': z.literal('OpeningHoursSpecification').default('OpeningHoursSpecification'),\n dayOfWeek: z.union([\n z.enum(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']),\n z.array(z.enum(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])),\n ]),\n opens: z.string().regex(/^([01]\\d|2[0-3]):([0-5]\\d)$/, 'Must be in HH:MM format'),\n closes: z.string().regex(/^([01]\\d|2[0-3]):([0-5]\\d)$/, 'Must be in HH:MM format'),\n});\n\n/**\n * Schema.org LocalBusiness validation schema\n *\n * @see https://schema.org/LocalBusiness\n * @see https://developers.google.com/search/docs/appearance/structured-data/local-business\n */\nexport const LocalBusinessSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.string().default('LocalBusiness'), // Can be Restaurant, Store, etc.\n\n // Required\n name: z.string().min(1, 'Business name is required'),\n image: z.union([z.string().url(), z.array(z.string().url())]),\n address: PostalAddressSchema,\n\n // Recommended\n '@id': z.string().url().optional(),\n url: z.string().url().optional(),\n telephone: z.string().optional(),\n priceRange: z.string().optional(), // e.g., \"$$\"\n\n // Location\n geo: GeoCoordinatesSchema.optional(),\n\n // Opening hours\n openingHoursSpecification: z.union([\n OpeningHoursSchema,\n z.array(OpeningHoursSchema),\n ]).optional(),\n\n // Ratings\n aggregateRating: z.object({\n '@type': z.literal('AggregateRating'),\n ratingValue: z.union([z.string(), z.number()]),\n reviewCount: z.number().int().positive(),\n }).optional(),\n\n // Additional info\n description: z.string().min(10).optional(),\n servesCuisine: z.union([z.string(), z.array(z.string())]).optional(), // For restaurants\n menu: z.string().url().optional(), // For restaurants\n acceptsReservations: z.union([z.boolean(), z.string()]).optional(),\n paymentAccepted: z.string().optional(),\n});\n\n/**\n * TypeScript types\n */\nexport type LocalBusiness = z.infer<typeof LocalBusinessSchema>;\nexport type LocalBusinessInput = z.input<typeof LocalBusinessSchema>;\nexport type GeoCoordinates = z.infer<typeof GeoCoordinatesSchema>;\nexport type OpeningHours = z.infer<typeof OpeningHoursSchema>;\n","/**\n * Zod schema validation for Schema.org Event type\n * @module schemas/event\n */\n\nimport { z } from 'zod';\n\n/**\n * Schema.org Place (for event location)\n */\nexport const PlaceSchema = z.object({\n '@type': z.literal('Place').default('Place'),\n name: z.string(),\n address: z.union([\n z.string(),\n z.object({\n '@type': z.literal('PostalAddress'),\n streetAddress: z.string().optional(),\n addressLocality: z.string().optional(),\n addressRegion: z.string().optional(),\n postalCode: z.string().optional(),\n addressCountry: z.string().optional(),\n }),\n ]).optional(),\n});\n\n/**\n * Schema.org Offer (for event tickets)\n */\nexport const EventOfferSchema = z.object({\n '@type': z.literal('Offer').default('Offer'),\n url: z.string().url().optional(),\n price: z.union([z.string(), z.number()]),\n priceCurrency: z.string().length(3),\n availability: z.string().url().optional(),\n validFrom: z.string().optional(),\n});\n\n/**\n * Schema.org Event validation schema\n *\n * @see https://schema.org/Event\n * @see https://developers.google.com/search/docs/appearance/structured-data/event\n */\nexport const EventSchema = z.object({\n '@context': z.literal('https://schema.org').default('https://schema.org'),\n '@type': z.enum(['Event', 'MusicEvent', 'BusinessEvent', 'SportsEvent', 'TheaterEvent', 'EducationEvent']).default('Event'),\n\n // Required\n name: z.string().min(1, 'Event name is required'),\n startDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}[+-]\\d{2}:\\d{2})?$/, 'Must be ISO 8601 format'),\n\n // Recommended\n endDate: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}[+-]\\d{2}:\\d{2})?$/, 'Must be ISO 8601 format').optional(),\n eventStatus: z.enum([\n 'https://schema.org/EventScheduled',\n 'https://schema.org/EventCancelled',\n 'https://schema.org/EventMovedOnline',\n 'https://schema.org/EventPostponed',\n 'https://schema.org/EventRescheduled',\n ]).optional(),\n eventAttendanceMode: z.enum([\n 'https://schema.org/OfflineEventAttendanceMode',\n 'https://schema.org/OnlineEventAttendanceMode',\n 'https://schema.org/MixedEventAttendanceMode',\n ]).optional(),\n\n location: z.union([PlaceSchema, z.string().url()]).optional(), // Can be Place or VirtualLocation URL\n\n image: z.union([z.string().url(), z.array(z.string().url())]).optional(),\n description: z.string().min(10).optional(),\n\n // Organizer\n organizer: z.object({\n '@type': z.enum(['Organization', 'Person']),\n name: z.string(),\n url: z.string().url().optional(),\n }).optional(),\n\n // Performer\n performer: z.union([\n z.object({\n '@type': z.enum(['Person', 'PerformingGroup']),\n name: z.string(),\n }),\n z.array(z.object({\n '@type': z.enum(['Person', 'PerformingGroup']),\n name: z.string(),\n })),\n ]).optional(),\n\n // Offers (tickets)\n offers: z.union([EventOfferSchema, z.array(EventOfferSchema)]).optional(),\n\n // Additional\n url: z.string().url().optional(),\n});\n\n/**\n * TypeScript types\n */\nexport type Event = z.infer<typeof EventSchema>;\nexport type EventInput = z.input<typeof EventSchema>;\nexport type Place = z.infer<typeof PlaceSchema>;\nexport type EventOffer = z.infer<typeof EventOfferSchema>;\n","/**\n * Schema Validator\n *\n * Valida schemas JSON-LD encontrados contra:\n * 1. Schemas Zod existentes (validación de tipos)\n * 2. Reglas de schema.org (campos requeridos/recomendados)\n * 3. Mejores prácticas (SEO, GEO)\n *\n * Genera issues con severidad (error/warning/info) y sugerencias de fix.\n */\n\nimport type {\n FoundSchema,\n SchemaIssue,\n ValidationResult,\n FileValidationResult,\n IssuesSummary,\n ValidateOptions,\n} from './types.js';\nimport type { ProjectScanResult } from './types.js';\n\n// Import schemas Zod para validación\nimport {\n ArticleSchema,\n ProductSchema,\n OrganizationSchema,\n PersonSchema,\n LocalBusinessSchema,\n EventSchema,\n WebPageSchema,\n FAQPageSchema,\n BreadcrumbListSchema,\n} from '../core/index.js';\n\n/**\n * Mapeo de tipos de schema a sus validadores Zod\n */\nconst SCHEMA_VALIDATORS: Record<string, any> = {\n Article: ArticleSchema,\n Product: ProductSchema,\n Organization: OrganizationSchema,\n Person: PersonSchema,\n LocalBusiness: LocalBusinessSchema,\n Event: EventSchema,\n WebPage: WebPageSchema,\n FAQPage: FAQPageSchema,\n BreadcrumbList: BreadcrumbListSchema,\n};\n\n/**\n * Campos requeridos por tipo de schema según schema.org\n */\nconst REQUIRED_FIELDS: Record<string, string[]> = {\n Article: ['@type', '@context', 'headline', 'author', 'datePublished'],\n Product: ['@type', '@context', 'name'],\n Organization: ['@type', '@context', 'name'],\n Person: ['@type', '@context', 'name'],\n LocalBusiness: ['@type', '@context', 'name', 'address'],\n Event: ['@type', '@context', 'name', 'startDate', 'location'],\n WebPage: ['@type', '@context', 'name'],\n FAQ: ['@type', '@context', 'mainEntity'],\n Breadcrumb: ['@type', '@context', 'itemListElement'],\n};\n\n/**\n * Campos recomendados (no requeridos pero importantes para SEO/GEO)\n */\nconst RECOMMENDED_FIELDS: Record<string, string[]> = {\n Article: ['image', 'dateModified', 'publisher', 'description'],\n Product: ['image', 'price', 'availability', 'brand', 'description'],\n Organization: ['url', 'logo', 'sameAs', 'contactPoint'],\n Person: ['image', 'url', 'sameAs', 'jobTitle'],\n LocalBusiness: ['telephone', 'geo', 'openingHours', 'image'],\n Event: ['description', 'image', 'organizer', 'eventStatus'],\n WebPage: ['description', 'url'],\n FAQ: [], // FAQ no tiene campos especialmente recomendados adicionales\n Breadcrumb: [], // Breadcrumb es simple\n};\n\n/**\n * Campos deprecated o desaconsejados\n */\nconst DEPRECATED_FIELDS: Record<string, string[]> = {\n Article: ['version'], // 'version' ya no se usa en Article\n Organization: ['founder'], // Bajo valor semántico para GEO\n Product: ['model'], // Confuso, mejor usar 'name' o 'mpn'\n};\n\n/**\n * Valida todos los schemas encontrados en el proyecto\n *\n * @param scanResult - Resultado del escaneo del proyecto\n * @param options - Opciones de validación\n * @returns Resultado de validación con issues encontrados\n *\n * @example\n * ```typescript\n * const scanResult = await scanProject();\n * const validation = await validateSchemas(scanResult, { strict: true });\n *\n * if (!validation.valid) {\n * console.error(`Found ${validation.errors} errors`);\n * }\n * ```\n */\nexport async function validateSchemas(\n scanResult: ProjectScanResult,\n options: ValidateOptions = {}\n): Promise<ValidationResult> {\n const fileResults: FileValidationResult[] = [];\n let totalSchemas = 0;\n let validSchemas = 0;\n let totalErrors = 0;\n let totalWarnings = 0;\n\n // Validar cada archivo con schemas\n for (const file of scanResult.filesWithSchemas) {\n // Filtrar por tipo si está especificado\n const schemasToValidate = options.schemaTypes\n ? file.schemas.filter((s) => options.schemaTypes!.includes(s.type))\n : file.schemas;\n\n const fileIssues: SchemaIssue[] = [];\n\n for (const schema of schemasToValidate) {\n totalSchemas++;\n\n // Validar el schema\n const issues = validateSchema(schema);\n schema.issues = issues;\n\n // Contar errores y warnings\n const errors = issues.filter((i) => i.severity === 'error').length;\n const warnings = issues.filter((i) => i.severity === 'warning').length;\n\n totalErrors += errors;\n totalWarnings += warnings;\n\n if (errors === 0) {\n validSchemas++;\n }\n\n fileIssues.push(...issues);\n }\n\n const fileValid =\n fileIssues.filter((i) => i.severity === 'error').length === 0 &&\n (!options.strict || fileIssues.filter((i) => i.severity === 'warning').length === 0);\n\n fileResults.push({\n filePath: file.filePath,\n valid: fileValid,\n schemas: schemasToValidate,\n issues: fileIssues,\n });\n }\n\n // Generar resumen de issues comunes\n const commonIssues = generateCommonIssues(fileResults);\n\n const valid =\n totalErrors === 0 && (!options.strict || totalWarnings === 0);\n\n return {\n valid,\n totalSchemas,\n validSchemas,\n errors: totalErrors,\n warnings: totalWarnings,\n fileResults,\n commonIssues,\n };\n}\n\n/**\n * Valida un schema individual\n *\n * Verifica:\n * 1. Campos requeridos presentes\n * 2. Campos recomendados (warnings)\n * 3. Campos deprecated (info)\n * 4. Validación Zod si el schema está disponible\n */\nfunction validateSchema(schema: FoundSchema): SchemaIssue[] {\n const issues: SchemaIssue[] = [];\n const schemaType = schema.type;\n\n // Si no tenemos el schema parseado, solo podemos hacer validaciones básicas\n if (!schema.schema) {\n issues.push({\n severity: 'info',\n message: `Could not parse schema for deep validation. Using '${schema.generatorFunction}' at line ${schema.line}.`,\n });\n return issues;\n }\n\n const data = schema.schema;\n\n // 1. Validar campos requeridos\n const requiredFields = REQUIRED_FIELDS[schemaType] || [];\n for (const field of requiredFields) {\n if (!hasField(data, field)) {\n const autoFix = generateAutoFix(field, schemaType);\n issues.push({\n severity: 'error',\n field,\n message: `Required field '${field}' is missing`,\n fix: `Add '${field}' field to your ${schemaType} schema`,\n ...(autoFix && { autoFixCode: autoFix }),\n });\n }\n }\n\n // 2. Validar campos recomendados (warnings)\n const recommendedFields = RECOMMENDED_FIELDS[schemaType] || [];\n for (const field of recommendedFields) {\n if (!hasField(data, field)) {\n issues.push({\n severity: 'warning',\n field,\n message: `Recommended field '${field}' is missing`,\n fix: `Consider adding '${field}' for better SEO and GEO`,\n });\n }\n }\n\n // 3. Detectar campos deprecated\n const deprecatedFields = DEPRECATED_FIELDS[schemaType] || [];\n for (const field of deprecatedFields) {\n if (hasField(data, field)) {\n issues.push({\n severity: 'info',\n field,\n message: `Field '${field}' is deprecated or has low semantic value`,\n fix: `Consider removing '${field}' to reduce token usage`,\n });\n }\n }\n\n // 4. Validar con Zod schema si está disponible\n const validator = SCHEMA_VALIDATORS[schemaType];\n if (validator) {\n try {\n validator.parse(data);\n } catch (error: any) {\n // Parsear errores de Zod\n if (error.errors) {\n for (const zodError of error.errors) {\n issues.push({\n severity: 'error',\n field: zodError.path.join('.'),\n message: zodError.message,\n fix: `Fix type or format of '${zodError.path.join('.')}'`,\n });\n }\n }\n }\n }\n\n // 5. Validaciones específicas por tipo\n issues.push(...validateSchemaSpecificRules(schemaType, data));\n\n return issues;\n}\n\n/**\n * Validaciones específicas según el tipo de schema\n */\nfunction validateSchemaSpecificRules(\n schemaType: string,\n data: any\n): SchemaIssue[] {\n const issues: SchemaIssue[] = [];\n\n switch (schemaType) {\n case 'Article':\n // datePublished debe ser anterior a dateModified\n if (data.datePublished && data.dateModified) {\n const published = new Date(data.datePublished);\n const modified = new Date(data.dateModified);\n if (published > modified) {\n issues.push({\n severity: 'error',\n field: 'dateModified',\n message: 'dateModified must be after datePublished',\n fix: 'Ensure dateModified is later than datePublished',\n });\n }\n }\n\n // wordCount debe ser razonable\n if (data.wordCount && (data.wordCount < 100 || data.wordCount > 10000)) {\n issues.push({\n severity: 'warning',\n field: 'wordCount',\n message: `wordCount seems unusual: ${data.wordCount}`,\n fix: 'Verify wordCount is calculated correctly',\n });\n }\n break;\n\n case 'Product':\n // Si hay price, debe haber priceCurrency\n if (data.price && !data.priceCurrency) {\n issues.push({\n severity: 'error',\n field: 'priceCurrency',\n message: 'priceCurrency is required when price is specified',\n fix: 'Add priceCurrency (e.g., \"USD\", \"EUR\")',\n });\n }\n\n // availability debe ser un valor válido\n if (data.availability) {\n const validAvailability = [\n 'InStock',\n 'OutOfStock',\n 'PreOrder',\n 'Discontinued',\n 'SoldOut',\n ];\n if (!validAvailability.includes(data.availability)) {\n issues.push({\n severity: 'warning',\n field: 'availability',\n message: `availability value '${data.availability}' is not standard`,\n fix: `Use one of: ${validAvailability.join(', ')}`,\n });\n }\n }\n break;\n\n case 'Organization':\n case 'LocalBusiness':\n // logo debe ser HTTPS\n if (data.logo && typeof data.logo === 'string') {\n if (!data.logo.startsWith('https://')) {\n issues.push({\n severity: 'warning',\n field: 'logo',\n message: 'Logo URL should use HTTPS',\n fix: 'Change logo URL to HTTPS',\n });\n }\n }\n\n // telephone debe tener formato correcto\n if (data.telephone && typeof data.telephone === 'string') {\n if (!/^\\+?[\\d\\s\\-()]+$/.test(data.telephone)) {\n issues.push({\n severity: 'info',\n field: 'telephone',\n message: 'Telephone format may not be standard',\n fix: 'Use international format (e.g., +1-555-1234)',\n });\n }\n }\n break;\n\n case 'Event':\n // startDate debe ser anterior a endDate\n if (data.startDate && data.endDate) {\n const start = new Date(data.startDate);\n const end = new Date(data.endDate);\n if (start > end) {\n issues.push({\n severity: 'error',\n field: 'endDate',\n message: 'endDate must be after startDate',\n fix: 'Ensure endDate is later than startDate',\n });\n }\n }\n break;\n }\n\n return issues;\n}\n\n/**\n * Verifica si un objeto tiene un campo (soporta nested paths)\n */\nfunction hasField(obj: any, fieldPath: string): boolean {\n const parts = fieldPath.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (!current || typeof current !== 'object' || !(part in current)) {\n return false;\n }\n current = current[part];\n }\n\n return current !== undefined && current !== null;\n}\n\n/**\n * Genera código para auto-fix de un campo faltante\n */\nfunction generateAutoFix(field: string, schemaType: string): string | undefined {\n // Ejemplos de auto-fix para campos comunes\n const fixes: Record<string, string> = {\n '@context': '\"@context\": \"https://schema.org\"',\n '@type': `\"@type\": \"${schemaType}\"`,\n headline: '\"headline\": \"Your article title\"',\n author: '\"author\": \"Author Name\"',\n datePublished: `\"datePublished\": new Date().toISOString()`,\n name: '\"name\": \"Item name\"',\n };\n\n return fixes[field];\n}\n\n/**\n * Genera resumen de issues más comunes\n */\nfunction generateCommonIssues(fileResults: FileValidationResult[]): IssuesSummary[] {\n const issueMap = new Map<string, IssuesSummary>();\n\n for (const fileResult of fileResults) {\n for (const issue of fileResult.issues) {\n const key = `${issue.severity}:${issue.message}`;\n\n if (issueMap.has(key)) {\n const existing = issueMap.get(key)!;\n existing.count++;\n if (!existing.affectedFiles.includes(fileResult.filePath)) {\n existing.affectedFiles.push(fileResult.filePath);\n }\n } else {\n issueMap.set(key, {\n type: issue.message,\n count: 1,\n severity: issue.severity,\n affectedFiles: [fileResult.filePath],\n });\n }\n }\n }\n\n // Ordenar por count descendente\n return Array.from(issueMap.values()).sort((a, b) => b.count - a.count);\n}\n\n/**\n * Valida un schema individual sin contexto de archivo\n *\n * Útil para validar schemas generados programáticamente.\n */\nexport function validateSingleSchema(\n schemaType: string,\n schemaData: any\n): SchemaIssue[] {\n const foundSchema: FoundSchema = {\n type: schemaType,\n generatorFunction: 'manual',\n line: 0,\n column: 0,\n schema: schemaData,\n issues: [],\n };\n\n return validateSchema(foundSchema);\n}\n","/**\n * Coverage Reporter\n *\n * Genera reportes de cobertura en múltiples formatos:\n * - JSON: Para integración con CI/CD o herramientas\n * - HTML: Reporte visual interactivo\n * - Markdown: Para documentación\n *\n * Incluye:\n * - Estadísticas generales\n * - Score del proyecto (0-100)\n * - Lista de archivos con/sin schemas\n * - Issues encontrados\n * - Sugerencias de optimización\n */\n\nimport * as fs from 'fs/promises';\nimport type {\n CoverageReport,\n ProjectScanResult,\n ValidationResult,\n ReportOptions,\n OptimizationSuggestion,\n} from './types.js';\n\n/**\n * Genera un reporte de cobertura completo\n *\n * @param scanResult - Resultado del escaneo del proyecto\n * @param validationResult - Resultado de la validación\n * @param optimizations - Sugerencias de optimización (opcional)\n * @returns Reporte de cobertura completo\n *\n * @example\n * ```typescript\n * const scanResult = await scanProject();\n * const validation = await validateSchemas(scanResult);\n * const report = generateCoverageReport(scanResult, validation);\n *\n * console.log(`Project score: ${report.score.total}/100`);\n * ```\n */\nexport function generateCoverageReport(\n scanResult: ProjectScanResult,\n validationResult: ValidationResult,\n optimizations: OptimizationSuggestion[] = []\n): CoverageReport {\n // Calcular estadísticas\n const totalFiles = scanResult.filesScanned;\n const filesWithSchemas = scanResult.filesWithSchemas.length;\n const routesWithoutSchemas = scanResult.routesWithoutSchemas.length;\n const totalSchemas = validationResult.totalSchemas;\n\n // Calcular cobertura (% de archivos con schemas vs archivos de ruta)\n const totalRoutes = filesWithSchemas + routesWithoutSchemas;\n const coverage = totalRoutes > 0 ? (filesWithSchemas / totalRoutes) * 100 : 0;\n\n // Contar schemas por tipo\n const schemasByType: Record<string, number> = {};\n for (const file of scanResult.filesWithSchemas) {\n for (const schema of file.schemas) {\n schemasByType[schema.type] = (schemasByType[schema.type] || 0) + 1;\n }\n }\n\n // Calcular score del proyecto\n const score = calculateProjectScore(scanResult, validationResult, coverage);\n\n // Recopilar todos los issues\n const allIssues = validationResult.fileResults.flatMap((f) => f.issues);\n\n return {\n project: {\n root: scanResult.projectRoot,\n ...(scanResult.framework && { framework: scanResult.framework }),\n scannedAt: scanResult.scannedAt,\n },\n stats: {\n totalFiles,\n filesWithSchemas,\n routesWithoutSchemas,\n totalSchemas,\n coverage: Math.round(coverage),\n },\n schemasByType,\n score,\n files: scanResult.filesWithSchemas,\n missingSchemas: scanResult.routesWithoutSchemas,\n issues: allIssues,\n optimizations,\n };\n}\n\n/**\n * Calcula el score general del proyecto (0-100)\n *\n * Breakdown:\n * - Presence (25%): ¿Existen schemas en el proyecto?\n * - Validity (35%): ¿Son válidos los schemas?\n * - Completeness (25%): ¿Tienen todos los campos importantes?\n * - Optimization (15%): ¿Están optimizados para LLMs?\n */\nfunction calculateProjectScore(\n _scanResult: ProjectScanResult,\n validationResult: ValidationResult,\n coverage: number\n): CoverageReport['score'] {\n // 1. Presence score (basado en cobertura)\n const presenceScore = coverage; // 0-100\n\n // 2. Validity score (basado en errores)\n const totalSchemas = validationResult.totalSchemas;\n const validSchemas = validationResult.validSchemas;\n const validityScore = totalSchemas > 0 ? (validSchemas / totalSchemas) * 100 : 0;\n\n // 3. Completeness score (basado en warnings de campos recomendados)\n const totalWarnings = validationResult.warnings;\n const maxExpectedWarnings = totalSchemas * 2; // Asumimos ~2 warnings por schema como aceptable\n const completenessScore = Math.max(\n 0,\n 100 - (totalWarnings / Math.max(1, maxExpectedWarnings)) * 100\n );\n\n // 4. Optimization score (placeholder - se mejorará con optimizer-suggestions)\n // Por ahora, asumimos que si no hay muchos info issues, está bien optimizado\n const infoIssues = validationResult.fileResults.flatMap((f) =>\n f.issues.filter((i) => i.severity === 'info')\n ).length;\n const optimizationScore = Math.max(0, 100 - infoIssues * 10);\n\n // Calcular score total ponderado\n const total = Math.round(\n presenceScore * 0.25 +\n validityScore * 0.35 +\n completenessScore * 0.25 +\n optimizationScore * 0.15\n );\n\n return {\n total: Math.min(100, Math.max(0, total)),\n breakdown: {\n presence: Math.round(presenceScore),\n validity: Math.round(validityScore),\n completeness: Math.round(completenessScore),\n optimization: Math.round(optimizationScore),\n },\n };\n}\n\n/**\n * Guarda un reporte en el formato especificado\n *\n * @param report - Reporte de cobertura\n * @param options - Opciones de formato y salida\n *\n * @example\n * ```typescript\n * await saveReport(report, {\n * format: 'html',\n * output: 'audit-report.html'\n * });\n * ```\n */\nexport async function saveReport(\n report: CoverageReport,\n options: ReportOptions = {}\n): Promise<void> {\n const format = options.format || 'json';\n\n let content: string;\n\n switch (format) {\n case 'json':\n content = generateJSONReport(report);\n break;\n case 'html':\n content = generateHTMLReport(report);\n break;\n case 'markdown':\n content = generateMarkdownReport(report);\n break;\n default:\n throw new Error(`Unknown format: ${format}`);\n }\n\n if (options.output) {\n await fs.writeFile(options.output, content, 'utf-8');\n } else {\n // Si no hay output, imprimir a stdout\n console.log(content);\n }\n}\n\n/**\n * Genera reporte en formato JSON\n */\nfunction generateJSONReport(report: CoverageReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n/**\n * Genera reporte en formato Markdown\n */\nfunction generateMarkdownReport(report: CoverageReport): string {\n const { project, stats, score, schemasByType, issues, missingSchemas } = report;\n\n let md = `# JSON-LD Audit Report\\n\\n`;\n md += `**Project:** ${project.root}\\n`;\n md += `**Framework:** ${project.framework || 'Unknown'}\\n`;\n md += `**Date:** ${new Date(project.scannedAt).toLocaleString()}\\n\\n`;\n\n md += `## Score: ${score.total}/100\\n\\n`;\n md += `- **Presence:** ${score.breakdown.presence}/100 (${stats.coverage}% coverage)\\n`;\n md += `- **Validity:** ${score.breakdown.validity}/100\\n`;\n md += `- **Completeness:** ${score.breakdown.completeness}/100\\n`;\n md += `- **Optimization:** ${score.breakdown.optimization}/100\\n\\n`;\n\n md += `## Statistics\\n\\n`;\n md += `- Total files scanned: ${stats.totalFiles}\\n`;\n md += `- Files with schemas: ${stats.filesWithSchemas}\\n`;\n md += `- Routes without schemas: ${stats.routesWithoutSchemas}\\n`;\n md += `- Total schemas: ${stats.totalSchemas}\\n\\n`;\n\n md += `## Schemas by Type\\n\\n`;\n for (const [type, count] of Object.entries(schemasByType)) {\n md += `- **${type}**: ${count}\\n`;\n }\n md += `\\n`;\n\n if (issues.length > 0) {\n md += `## Issues Found\\n\\n`;\n const errors = issues.filter((i) => i.severity === 'error');\n const warnings = issues.filter((i) => i.severity === 'warning');\n\n if (errors.length > 0) {\n md += `### Errors (${errors.length})\\n\\n`;\n errors.slice(0, 10).forEach((issue) => {\n md += `- **${issue.field || 'General'}**: ${issue.message}\\n`;\n if (issue.fix) md += ` - Fix: ${issue.fix}\\n`;\n });\n if (errors.length > 10) {\n md += `\\n... and ${errors.length - 10} more errors\\n`;\n }\n md += `\\n`;\n }\n\n if (warnings.length > 0) {\n md += `### Warnings (${warnings.length})\\n\\n`;\n warnings.slice(0, 10).forEach((issue) => {\n md += `- **${issue.field || 'General'}**: ${issue.message}\\n`;\n if (issue.fix) md += ` - Suggestion: ${issue.fix}\\n`;\n });\n if (warnings.length > 10) {\n md += `\\n... and ${warnings.length - 10} more warnings\\n`;\n }\n md += `\\n`;\n }\n }\n\n if (missingSchemas.length > 0) {\n md += `## Missing Schemas\\n\\n`;\n md += `Routes that should have schemas but don't:\\n\\n`;\n missingSchemas.slice(0, 10).forEach((route) => {\n md += `- **${route.filePath}**`;\n if (route.suggestedSchemaType) {\n md += ` → Suggested: ${route.suggestedSchemaType}`;\n }\n md += `\\n`;\n });\n if (missingSchemas.length > 10) {\n md += `\\n... and ${missingSchemas.length - 10} more routes\\n`;\n }\n md += `\\n`;\n }\n\n md += `---\\n\\n`;\n md += `Generated by [geo-semantic-layer](https://www.npmjs.com/package/geo-semantic-layer)\\n`;\n\n return md;\n}\n\n/**\n * Genera reporte en formato HTML interactivo\n */\nfunction generateHTMLReport(report: CoverageReport): string {\n const { project, stats, score, schemasByType, issues, missingSchemas } = report;\n\n const errors = issues.filter((i) => i.severity === 'error');\n const warnings = issues.filter((i) => i.severity === 'warning');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>JSON-LD Audit Report</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n line-height: 1.6;\n color: #333;\n background: #f5f5f5;\n padding: 20px;\n }\n .container {\n max-width: 1200px;\n margin: 0 auto;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n overflow: hidden;\n }\n header {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n padding: 30px;\n }\n h1 { font-size: 32px; margin-bottom: 10px; }\n .meta { opacity: 0.9; font-size: 14px; }\n .score-section {\n padding: 30px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n }\n .score-card {\n display: flex;\n align-items: center;\n gap: 30px;\n }\n .score-circle {\n width: 120px;\n height: 120px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 36px;\n font-weight: bold;\n color: white;\n flex-shrink: 0;\n }\n .score-excellent { background: #10b981; }\n .score-good { background: #3b82f6; }\n .score-warning { background: #f59e0b; }\n .score-poor { background: #ef4444; }\n .score-breakdown {\n flex: 1;\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 15px;\n }\n .score-item {\n background: white;\n padding: 15px;\n border-radius: 6px;\n border-left: 4px solid #667eea;\n }\n .score-item h3 { font-size: 14px; color: #6b7280; margin-bottom: 5px; }\n .score-item .value { font-size: 24px; font-weight: bold; color: #111827; }\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 20px;\n padding: 30px;\n }\n .stat-card {\n background: #f9fafb;\n padding: 20px;\n border-radius: 8px;\n border: 1px solid #e5e7eb;\n }\n .stat-card h3 { font-size: 14px; color: #6b7280; margin-bottom: 10px; }\n .stat-card .value { font-size: 32px; font-weight: bold; color: #111827; }\n .section {\n padding: 30px;\n border-bottom: 1px solid #e5e7eb;\n }\n .section h2 {\n font-size: 20px;\n margin-bottom: 20px;\n color: #111827;\n }\n .issue-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n .issue {\n padding: 15px;\n border-radius: 6px;\n border-left: 4px solid;\n }\n .issue-error {\n background: #fef2f2;\n border-left-color: #ef4444;\n }\n .issue-warning {\n background: #fffbeb;\n border-left-color: #f59e0b;\n }\n .issue-info {\n background: #eff6ff;\n border-left-color: #3b82f6;\n }\n .issue-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n }\n .issue-badge {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n }\n .badge-error { background: #ef4444; color: white; }\n .badge-warning { background: #f59e0b; color: white; }\n .badge-info { background: #3b82f6; color: white; }\n .issue-field {\n font-family: 'Courier New', monospace;\n font-size: 13px;\n color: #6b7280;\n }\n .issue-message { font-size: 14px; color: #111827; margin-bottom: 6px; }\n .issue-fix {\n font-size: 13px;\n color: #059669;\n font-style: italic;\n }\n .file-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .file-item {\n padding: 12px;\n background: #f9fafb;\n border-radius: 6px;\n border: 1px solid #e5e7eb;\n font-family: 'Courier New', monospace;\n font-size: 13px;\n }\n .schema-type {\n display: inline-block;\n padding: 2px 8px;\n background: #667eea;\n color: white;\n border-radius: 4px;\n font-size: 11px;\n margin-left: 8px;\n }\n footer {\n padding: 20px 30px;\n background: #f9fafb;\n text-align: center;\n color: #6b7280;\n font-size: 14px;\n }\n .chart {\n width: 100%;\n max-width: 400px;\n margin: 0 auto;\n }\n .chart-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 12px;\n }\n .chart-label {\n width: 100px;\n text-align: right;\n font-size: 14px;\n color: #6b7280;\n }\n .chart-track {\n flex: 1;\n height: 24px;\n background: #e5e7eb;\n border-radius: 4px;\n overflow: hidden;\n }\n .chart-fill {\n height: 100%;\n background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);\n transition: width 0.3s ease;\n }\n .chart-value {\n width: 40px;\n text-align: right;\n font-weight: bold;\n font-size: 14px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <h1>📊 JSON-LD Audit Report</h1>\n <div class=\"meta\">\n <strong>Project:</strong> ${project.root}<br>\n <strong>Framework:</strong> ${project.framework || 'Unknown'}<br>\n <strong>Date:</strong> ${new Date(project.scannedAt).toLocaleString()}\n </div>\n </header>\n\n <div class=\"score-section\">\n <div class=\"score-card\">\n <div class=\"score-circle ${getScoreClass(score.total)}\">\n ${score.total}\n </div>\n <div class=\"score-breakdown\">\n <div class=\"score-item\">\n <h3>Presence</h3>\n <div class=\"value\">${score.breakdown.presence}/100</div>\n </div>\n <div class=\"score-item\">\n <h3>Validity</h3>\n <div class=\"value\">${score.breakdown.validity}/100</div>\n </div>\n <div class=\"score-item\">\n <h3>Completeness</h3>\n <div class=\"value\">${score.breakdown.completeness}/100</div>\n </div>\n <div class=\"score-item\">\n <h3>Optimization</h3>\n <div class=\"value\">${score.breakdown.optimization}/100</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <h3>Files Scanned</h3>\n <div class=\"value\">${stats.totalFiles}</div>\n </div>\n <div class=\"stat-card\">\n <h3>With Schemas</h3>\n <div class=\"value\">${stats.filesWithSchemas}</div>\n </div>\n <div class=\"stat-card\">\n <h3>Coverage</h3>\n <div class=\"value\">${stats.coverage}%</div>\n </div>\n <div class=\"stat-card\">\n <h3>Total Schemas</h3>\n <div class=\"value\">${stats.totalSchemas}</div>\n </div>\n </div>\n\n <div class=\"section\">\n <h2>Schemas by Type</h2>\n <div class=\"chart\">\n ${Object.entries(schemasByType)\n .map(\n ([type, count]) => `\n <div class=\"chart-bar\">\n <div class=\"chart-label\">${type}</div>\n <div class=\"chart-track\">\n <div class=\"chart-fill\" style=\"width: ${(count / Math.max(...Object.values(schemasByType))) * 100}%\"></div>\n </div>\n <div class=\"chart-value\">${count}</div>\n </div>\n `\n )\n .join('')}\n </div>\n </div>\n\n ${\n errors.length > 0\n ? `\n <div class=\"section\">\n <h2>❌ Errors (${errors.length})</h2>\n <div class=\"issue-list\">\n ${errors\n .slice(0, 20)\n .map(\n (issue) => `\n <div class=\"issue issue-error\">\n <div class=\"issue-header\">\n <span class=\"issue-badge badge-error\">Error</span>\n ${issue.field ? `<span class=\"issue-field\">${issue.field}</span>` : ''}\n </div>\n <div class=\"issue-message\">${issue.message}</div>\n ${issue.fix ? `<div class=\"issue-fix\">💡 ${issue.fix}</div>` : ''}\n </div>\n `\n )\n .join('')}\n ${errors.length > 20 ? `<div class=\"file-item\">... and ${errors.length - 20} more errors</div>` : ''}\n </div>\n </div>\n `\n : ''\n }\n\n ${\n warnings.length > 0\n ? `\n <div class=\"section\">\n <h2>⚠️ Warnings (${warnings.length})</h2>\n <div class=\"issue-list\">\n ${warnings\n .slice(0, 20)\n .map(\n (issue) => `\n <div class=\"issue issue-warning\">\n <div class=\"issue-header\">\n <span class=\"issue-badge badge-warning\">Warning</span>\n ${issue.field ? `<span class=\"issue-field\">${issue.field}</span>` : ''}\n </div>\n <div class=\"issue-message\">${issue.message}</div>\n ${issue.fix ? `<div class=\"issue-fix\">💡 ${issue.fix}</div>` : ''}\n </div>\n `\n )\n .join('')}\n ${warnings.length > 20 ? `<div class=\"file-item\">... and ${warnings.length - 20} more warnings</div>` : ''}\n </div>\n </div>\n `\n : ''\n }\n\n ${\n missingSchemas.length > 0\n ? `\n <div class=\"section\">\n <h2>📄 Routes Without Schemas (${missingSchemas.length})</h2>\n <div class=\"file-list\">\n ${missingSchemas\n .slice(0, 20)\n .map(\n (route) => `\n <div class=\"file-item\">\n ${route.filePath}\n ${route.suggestedSchemaType ? `<span class=\"schema-type\">${route.suggestedSchemaType}</span>` : ''}\n ${route.reason ? `<br><small style=\"color: #6b7280;\">${route.reason}</small>` : ''}\n </div>\n `\n )\n .join('')}\n ${missingSchemas.length > 20 ? `<div class=\"file-item\">... and ${missingSchemas.length - 20} more routes</div>` : ''}\n </div>\n </div>\n `\n : ''\n }\n\n <footer>\n Generated by <strong>geo-semantic-layer</strong> · <a href=\"https://www.npmjs.com/package/geo-semantic-layer\" target=\"_blank\">npm</a>\n </footer>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Determina la clase CSS según el score\n */\nfunction getScoreClass(score: number): string {\n if (score >= 90) return 'score-excellent';\n if (score >= 70) return 'score-good';\n if (score >= 50) return 'score-warning';\n return 'score-poor';\n}\n","/**\n * LLM Model Profiles\n *\n * Defines characteristics of different LLM models for token optimization.\n */\n\nimport type { LLMProfile, LLMModel } from './types.js';\n\n/**\n * Profiles for different LLM models\n */\nexport const LLM_PROFILES: Record<LLMModel, LLMProfile> = {\n 'gpt-4': {\n model: 'gpt-4',\n tokensPerChar: 0.25, // ~4 chars per token (average for English)\n maxContextTokens: 8192,\n recommendedMaxTokens: 500,\n supportsFunctionCalling: true,\n },\n 'gpt-4-turbo': {\n model: 'gpt-4-turbo',\n tokensPerChar: 0.25,\n maxContextTokens: 128000,\n recommendedMaxTokens: 1000,\n supportsFunctionCalling: true,\n },\n 'gpt-3.5-turbo': {\n model: 'gpt-3.5-turbo',\n tokensPerChar: 0.25,\n maxContextTokens: 16385,\n recommendedMaxTokens: 400,\n supportsFunctionCalling: true,\n },\n 'claude-3-opus': {\n model: 'claude-3-opus',\n tokensPerChar: 0.27, // Slightly more efficient tokenization\n maxContextTokens: 200000,\n recommendedMaxTokens: 1000,\n supportsFunctionCalling: true,\n },\n 'claude-3-sonnet': {\n model: 'claude-3-sonnet',\n tokensPerChar: 0.27,\n maxContextTokens: 200000,\n recommendedMaxTokens: 800,\n supportsFunctionCalling: true,\n },\n 'claude-3-haiku': {\n model: 'claude-3-haiku',\n tokensPerChar: 0.27,\n maxContextTokens: 200000,\n recommendedMaxTokens: 600,\n supportsFunctionCalling: true,\n },\n 'claude-2': {\n model: 'claude-2',\n tokensPerChar: 0.27,\n maxContextTokens: 100000,\n recommendedMaxTokens: 600,\n supportsFunctionCalling: false,\n },\n 'gemini-pro': {\n model: 'gemini-pro',\n tokensPerChar: 0.26,\n maxContextTokens: 32760,\n recommendedMaxTokens: 600,\n supportsFunctionCalling: true,\n },\n 'gemini-ultra': {\n model: 'gemini-ultra',\n tokensPerChar: 0.26,\n maxContextTokens: 32760,\n recommendedMaxTokens: 800,\n supportsFunctionCalling: true,\n },\n};\n\n/**\n * Get profile for a specific model\n */\nexport function getModelProfile(model: LLMModel): LLMProfile {\n return LLM_PROFILES[model];\n}\n\n/**\n * Get recommended max tokens for a model\n */\nexport function getRecommendedMaxTokens(model: LLMModel): number {\n return LLM_PROFILES[model].recommendedMaxTokens;\n}\n\n/**\n * Check if model supports function calling\n */\nexport function supportsFunctionCalling(model: LLMModel): boolean {\n return LLM_PROFILES[model].supportsFunctionCalling;\n}\n","/**\n * Token Analysis\n *\n * Analyzes token usage in JSON-LD schemas.\n * Uses approximations for non-GPT models and exact counting for GPT models.\n */\n\nimport { encode } from 'gpt-tokenizer';\nimport type { LLMModel, TokenAnalysis } from './types.js';\nimport { getModelProfile } from './llm-profiles.js';\n\n/**\n * Analyze token usage for a schema\n */\nexport function analyzeTokenUsage(schema: any, model: LLMModel): TokenAnalysis {\n const serialized = JSON.stringify(schema, null, 2);\n\n // Calculate total tokens\n const totalTokens = estimateTokens(serialized, model);\n\n // Calculate tokens by field\n const byField = calculateTokensByField(schema, model);\n\n // Generate recommendations\n const recommendations = generateRecommendations(totalTokens, byField, model);\n\n return {\n totalTokens,\n byField,\n recommendations,\n model,\n };\n}\n\n/**\n * Estimate tokens for text using model-specific method\n */\nexport function estimateTokens(text: string, model: LLMModel): number {\n // For GPT models, use exact tokenizer\n if (model.startsWith('gpt-')) {\n try {\n return encode(text).length;\n } catch (e) {\n // Fallback to approximation if tokenizer fails\n return approximateTokens(text, model);\n }\n }\n\n // For other models, use approximation\n return approximateTokens(text, model);\n}\n\n/**\n * Approximate tokens based on model profile\n */\nfunction approximateTokens(text: string, model: LLMModel): number {\n const profile = getModelProfile(model);\n return Math.ceil(text.length * profile.tokensPerChar);\n}\n\n/**\n * Calculate token usage by field path\n */\nfunction calculateTokensByField(schema: any, model: LLMModel, path: string = ''): Record<string, number> {\n const result: Record<string, number> = {};\n\n if (schema === null || schema === undefined) {\n return result;\n }\n\n if (typeof schema !== 'object') {\n // Leaf value\n const serialized = JSON.stringify(schema);\n const tokens = estimateTokens(serialized, model);\n result[path || 'value'] = tokens;\n return result;\n }\n\n if (Array.isArray(schema)) {\n // Array\n schema.forEach((item, index) => {\n const itemPath = path ? `${path}[${index}]` : `[${index}]`;\n const itemTokens = calculateTokensByField(item, model, itemPath);\n Object.assign(result, itemTokens);\n });\n return result;\n }\n\n // Object\n for (const [key, value] of Object.entries(schema)) {\n const fieldPath = path ? `${path}.${key}` : key;\n\n // Count the key itself\n const keyTokens = estimateTokens(`\"${key}\":`, model);\n result[`${fieldPath}#key`] = keyTokens;\n\n // Count the value\n const valueTokens = calculateTokensByField(value, model, fieldPath);\n Object.assign(result, valueTokens);\n }\n\n return result;\n}\n\n/**\n * Generate optimization recommendations\n */\nfunction generateRecommendations(\n totalTokens: number,\n byField: Record<string, number>,\n model: LLMModel\n): string[] {\n const recommendations: string[] = [];\n const profile = getModelProfile(model);\n\n // Check if over recommended limit\n if (totalTokens > profile.recommendedMaxTokens) {\n const excess = totalTokens - profile.recommendedMaxTokens;\n const reduction = ((excess / totalTokens) * 100).toFixed(1);\n recommendations.push(\n `Schema uses ${totalTokens} tokens, ${excess} over recommended ${profile.recommendedMaxTokens} for ${model}. Consider reducing by ${reduction}%.`\n );\n }\n\n // Find expensive fields\n const sortedFields = Object.entries(byField)\n .filter(([key]) => !key.endsWith('#key')) // Exclude key tokens\n .sort(([, a], [, b]) => b - a)\n .slice(0, 5); // Top 5\n\n const topField = sortedFields[0];\n if (topField && topField[1] > totalTokens * 0.2) {\n recommendations.push(\n `Most expensive field: \"${topField[0]}\" (${topField[1]} tokens, ${((topField[1] / totalTokens) * 100).toFixed(1)}% of total)`\n );\n }\n\n // Check for long string values\n for (const [field, tokens] of Object.entries(byField)) {\n if (!field.endsWith('#key') && tokens > 100) {\n recommendations.push(`Consider shortening field \"${field}\" (${tokens} tokens)`);\n }\n }\n\n // Check for large arrays\n const arrayFields = Object.keys(byField).filter((key) => key.includes('[') && !key.endsWith('#key'));\n if (arrayFields.length > 10) {\n recommendations.push(`Schema contains ${arrayFields.length} array items. Consider limiting array sizes.`);\n }\n\n return recommendations;\n}\n\n/**\n * Calculate tokens for a specific field\n */\nexport function getFieldTokens(schema: any, fieldPath: string, model: LLMModel): number {\n const byField = calculateTokensByField(schema, model);\n return byField[fieldPath] || 0;\n}\n\n/**\n * Get total tokens for schema\n */\nexport function getTotalTokens(schema: any, model: LLMModel): number {\n const serialized = JSON.stringify(schema, null, 2);\n return estimateTokens(serialized, model);\n}\n","/**\n * Semantic Scoring\n *\n * Assigns semantic value scores to JSON-LD fields based on their importance\n * for LLM understanding and SEO.\n */\n\nimport type { FieldScore, FieldScores, SemanticWeights } from './types.js';\n\n/**\n * Default semantic weights for different field categories\n */\nexport const DEFAULT_SEMANTIC_WEIGHTS: SemanticWeights = {\n coreIdentity: 1.0,\n seoCritical: 0.85,\n authorship: 0.75,\n relationships: 0.6,\n decorative: 0.2,\n};\n\n/**\n * Field importance mapping\n * Maps field names to semantic value (0-1)\n */\nconst FIELD_IMPORTANCE: Record<string, number> = {\n // Core Identity (CRITICAL - never remove)\n '@context': 1.0,\n '@type': 1.0,\n name: 1.0,\n url: 0.95,\n\n // SEO Critical\n headline: 0.9,\n description: 0.85,\n title: 0.85,\n image: 0.8,\n\n // Authorship & Provenance\n author: 0.8,\n datePublished: 0.75,\n publisher: 0.75,\n dateModified: 0.7,\n\n // Content\n articleBody: 0.7,\n text: 0.7,\n about: 0.65,\n\n // Products\n price: 0.85,\n priceCurrency: 0.8,\n offers: 0.85,\n availability: 0.75,\n brand: 0.7,\n sku: 0.6,\n gtin: 0.55,\n\n // Relationships (good for context)\n sameAs: 0.6,\n isPartOf: 0.55,\n mainEntity: 0.6,\n mainEntityOfPage: 0.55,\n\n // Navigation\n breadcrumb: 0.65,\n itemListElement: 0.6,\n position: 0.5,\n\n // Medium importance\n keywords: 0.5,\n inLanguage: 0.5,\n wordCount: 0.45,\n commentCount: 0.4,\n\n // Low importance (decorative/verbose)\n alternateName: 0.3,\n disambiguatingDescription: 0.25,\n identifier: 0.2,\n potentialAction: 0.15,\n\n // Very low importance\n interactionStatistic: 0.1,\n subjectOf: 0.1,\n};\n\n/**\n * Score all fields in a schema\n */\nexport function scoreFields(\n schema: any,\n tokensByField: Record<string, number>,\n weights: SemanticWeights = DEFAULT_SEMANTIC_WEIGHTS\n): FieldScores {\n const scores: FieldScores = {};\n\n function traverse(obj: any, path: string = '') {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return;\n }\n\n if (Array.isArray(obj)) {\n obj.forEach((item, index) => {\n traverse(item, path ? `${path}[${index}]` : `[${index}]`);\n });\n return;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const fieldPath = path ? `${path}.${key}` : key;\n const tokenCost = tokensByField[fieldPath] || 0;\n\n // Calculate semantic value\n const semanticValue = calculateSemanticValue(key, value, weights);\n\n // Calculate efficiency (value per token)\n const efficiency = tokenCost > 0 ? semanticValue / tokenCost : 0;\n\n // Determine recommendation\n const { recommendation, reason } = determineRecommendation(\n semanticValue,\n efficiency,\n tokenCost\n );\n\n scores[fieldPath] = {\n semanticValue,\n tokenCost,\n efficiency,\n recommendation,\n ...(reason && { reason }),\n };\n\n // Recurse into nested objects\n if (typeof value === 'object' && value !== null) {\n traverse(value, fieldPath);\n }\n }\n }\n\n traverse(schema);\n\n return scores;\n}\n\n/**\n * Calculate semantic value for a field\n */\nfunction calculateSemanticValue(\n fieldName: string,\n value: any,\n _weights: SemanticWeights\n): number {\n // Get base importance from mapping\n const baseImportance = FIELD_IMPORTANCE[fieldName] || 0.5;\n\n // Adjust based on value characteristics\n let adjustedValue = baseImportance;\n\n // Penalize very long string values (likely bloat)\n if (typeof value === 'string' && value.length > 500) {\n adjustedValue *= 0.7;\n }\n\n // Penalize large arrays (often not all items are needed)\n if (Array.isArray(value) && value.length > 10) {\n adjustedValue *= 0.8;\n }\n\n // Boost if value is concise and informative\n if (typeof value === 'string' && value.length > 10 && value.length < 200) {\n adjustedValue *= 1.1;\n }\n\n // Cap at 1.0\n return Math.min(adjustedValue, 1.0);\n}\n\n/**\n * Determine recommendation for a field\n */\nfunction determineRecommendation(\n semanticValue: number,\n efficiency: number,\n tokenCost: number\n): { recommendation: 'keep' | 'optional' | 'remove'; reason?: string } {\n // Always keep critical fields\n if (semanticValue >= 0.9) {\n return { recommendation: 'keep', reason: 'Critical for schema validity' };\n }\n\n // Remove low-value fields\n if (semanticValue < 0.3) {\n return { recommendation: 'remove', reason: 'Low semantic value' };\n }\n\n // Remove inefficient fields (high token cost, low value)\n if (efficiency < 0.01 && tokenCost > 50) {\n return { recommendation: 'remove', reason: 'Inefficient (high cost, low value)' };\n }\n\n // Keep efficient fields\n if (efficiency > 0.05) {\n return { recommendation: 'keep', reason: 'High efficiency' };\n }\n\n // Middle ground - optional\n return { recommendation: 'optional', reason: 'Medium value/cost ratio' };\n}\n\n/**\n * Get top N most valuable fields\n */\nexport function getTopFields(scores: FieldScores, n: number = 10): Array<[string, FieldScore]> {\n return Object.entries(scores)\n .sort(([, a], [, b]) => b.semanticValue - a.semanticValue)\n .slice(0, n);\n}\n\n/**\n * Get fields recommended for removal\n */\nexport function getRemovableFields(scores: FieldScores): string[] {\n return Object.entries(scores)\n .filter(([, score]) => score.recommendation === 'remove')\n .map(([field]) => field);\n}\n\n/**\n * Get least efficient fields\n */\nexport function getLeastEfficient(scores: FieldScores, n: number = 5): Array<[string, FieldScore]> {\n return Object.entries(scores)\n .filter(([, score]) => score.tokenCost > 0)\n .sort(([, a], [, b]) => a.efficiency - b.efficiency)\n .slice(0, n);\n}\n\n/**\n * Calculate overall schema efficiency score\n */\nexport function calculateOverallEfficiency(scores: FieldScores): number {\n const entries = Object.values(scores);\n if (entries.length === 0) return 0;\n\n const totalValue = entries.reduce((sum, score) => sum + score.semanticValue, 0);\n const totalCost = entries.reduce((sum, score) => sum + score.tokenCost, 0);\n\n return totalCost > 0 ? totalValue / totalCost : 0;\n}\n","/**\n * Optimizer Suggestions\n *\n * Genera sugerencias de optimización para schemas encontrados en el proyecto.\n * Utiliza el optimizador existente para analizar schemas y sugerir mejoras.\n *\n * Sugiere:\n * - Reducción de tokens para LLMs\n * - Eliminación de campos de bajo valor semántico\n * - Mejoras en la estructura\n */\n\nimport type {\n ProjectScanResult,\n OptimizationSuggestion,\n} from './types.js';\nimport { analyzeTokenUsage, scoreFields } from '../optimizer/index.js';\n\n/**\n * Genera sugerencias de optimización para todos los schemas del proyecto\n *\n * @param scanResult - Resultado del escaneo del proyecto\n * @param targetModel - Modelo LLM objetivo (default: 'gpt-4')\n * @returns Lista de sugerencias de optimización\n *\n * @example\n * ```typescript\n * const scanResult = await scanProject();\n * const suggestions = await generateOptimizationSuggestions(scanResult, 'gpt-4');\n *\n * console.log(`Found ${suggestions.length} optimization opportunities`);\n * ```\n */\nexport async function generateOptimizationSuggestions(\n scanResult: ProjectScanResult,\n targetModel: 'gpt-4' | 'gpt-3.5' | 'claude-3' | 'claude-2' | 'gemini-pro' = 'gpt-4'\n): Promise<OptimizationSuggestion[]> {\n const suggestions: OptimizationSuggestion[] = [];\n\n for (const file of scanResult.filesWithSchemas) {\n for (const schema of file.schemas) {\n // Solo analizar si tenemos el schema parseado\n if (!schema.schema) continue;\n\n const schemaSuggestions = await analyzeSchemaOptimization(\n file.filePath,\n schema.type,\n schema.schema,\n targetModel\n );\n\n suggestions.push(...schemaSuggestions);\n }\n }\n\n // Ordenar por impacto (reducción de tokens)\n suggestions.sort((a, b) => {\n const reductionA = a.impact.reduction || 0;\n const reductionB = b.impact.reduction || 0;\n return reductionB - reductionA;\n });\n\n return suggestions;\n}\n\n/**\n * Analiza un schema individual y genera sugerencias\n */\nasync function analyzeSchemaOptimization(\n filePath: string,\n schemaType: string,\n schemaData: any,\n targetModel: string\n): Promise<OptimizationSuggestion[]> {\n const suggestions: OptimizationSuggestion[] = [];\n\n try {\n // 1. Analizar uso de tokens\n const tokenAnalysis = analyzeTokenUsage(schemaData, targetModel as any);\n const totalTokens = tokenAnalysis.totalTokens;\n\n // Si el schema es muy grande (>800 tokens), sugerir optimización general\n if (totalTokens > 800) {\n suggestions.push({\n filePath,\n schemaType,\n type: 'token-reduction',\n message: `Schema is large (${totalTokens} tokens). Consider optimizing for LLM consumption.`,\n impact: {\n tokensBefore: totalTokens,\n tokensAfter: Math.round(totalTokens * 0.6), // Estimación conservadora\n reduction: 40,\n },\n });\n }\n\n // 2. Analizar campos por valor semántico\n const fieldScores = scoreFields(schemaData, tokenAnalysis.byField);\n\n // Encontrar campos con bajo valor semántico pero alto costo\n const lowValueFields: string[] = [];\n for (const [field, score] of Object.entries(fieldScores)) {\n // Campo con bajo valor y alto costo = candidato para eliminación\n if (score.semanticValue < 0.4 && score.tokenCost > 20) {\n lowValueFields.push(field);\n }\n }\n\n if (lowValueFields.length > 0) {\n const tokenSavings = lowValueFields.reduce(\n (sum, field) => sum + (fieldScores[field]?.tokenCost || 0),\n 0\n );\n\n suggestions.push({\n filePath,\n schemaType,\n type: 'field-removal',\n message: `${lowValueFields.length} field(s) have low semantic value but high token cost.`,\n impact: {\n tokensBefore: totalTokens,\n tokensAfter: totalTokens - tokenSavings,\n reduction: Math.round((tokenSavings / totalTokens) * 100),\n },\n fields: lowValueFields,\n });\n }\n\n // 3. Detectar campos faltantes de alto valor\n const missingHighValueFields = detectMissingHighValueFields(schemaType, schemaData);\n if (missingHighValueFields.length > 0) {\n suggestions.push({\n filePath,\n schemaType,\n type: 'field-addition',\n message: `Consider adding high-value fields: ${missingHighValueFields.join(', ')}`,\n impact: {\n tokensBefore: totalTokens,\n tokensAfter: totalTokens + 50, // Estimación\n },\n fields: missingHighValueFields,\n });\n }\n\n // 4. Detectar estructuras redundantes o ineficientes\n const redundancySuggestions = detectRedundancies(schemaData, filePath, schemaType);\n suggestions.push(...redundancySuggestions);\n\n } catch (error) {\n // Si falla el análisis de este schema, continuar con los demás\n console.warn(`Failed to analyze schema in ${filePath}:`, error);\n }\n\n return suggestions;\n}\n\n/**\n * Detecta campos de alto valor que faltan\n */\nfunction detectMissingHighValueFields(schemaType: string, data: any): string[] {\n const missing: string[] = [];\n\n // Mapeo de campos de alto valor por tipo\n const highValueFields: Record<string, string[]> = {\n Article: ['image', 'dateModified', 'publisher', 'description', 'wordCount'],\n Product: ['image', 'brand', 'aggregateRating', 'review'],\n Organization: ['url', 'logo', 'sameAs', 'description'],\n Person: ['image', 'url', 'sameAs', 'description'],\n LocalBusiness: ['telephone', 'address', 'geo', 'openingHours'],\n Event: ['image', 'organizer', 'eventStatus', 'eventAttendanceMode'],\n };\n\n const recommendedFields = highValueFields[schemaType] || [];\n\n for (const field of recommendedFields) {\n if (!hasField(data, field)) {\n missing.push(field);\n }\n }\n\n return missing;\n}\n\n/**\n * Detecta redundancias y estructuras ineficientes\n */\nfunction detectRedundancies(\n data: any,\n filePath: string,\n schemaType: string\n): OptimizationSuggestion[] {\n const suggestions: OptimizationSuggestion[] = [];\n\n // 1. Detectar URLs duplicadas (común en publisher/@id y publisher/url)\n if (data.publisher) {\n if (data.publisher['@id'] && data.publisher.url) {\n if (data.publisher['@id'] === data.publisher.url) {\n suggestions.push({\n filePath,\n schemaType,\n type: 'field-removal',\n message: 'Redundant @id and url in publisher (same value)',\n impact: {\n reduction: 5,\n },\n fields: ['publisher.@id'],\n });\n }\n }\n }\n\n // 2. Detectar nested objects muy profundos (>3 niveles)\n const maxDepth = getMaxDepth(data);\n if (maxDepth > 4) {\n suggestions.push({\n filePath,\n schemaType,\n type: 'field-update',\n message: `Schema has deep nesting (${maxDepth} levels). Consider flattening.`,\n impact: {\n reduction: 10,\n },\n });\n }\n\n // 3. Detectar arrays muy grandes\n const largeArrays = findLargeArrays(data);\n if (largeArrays.length > 0) {\n suggestions.push({\n filePath,\n schemaType,\n type: 'field-update',\n message: `Large arrays found: ${largeArrays.join(', ')}. Consider limiting.`,\n impact: {\n reduction: 15,\n },\n fields: largeArrays,\n });\n }\n\n return suggestions;\n}\n\n/**\n * Verifica si un campo existe en el objeto (soporta nested paths)\n */\nfunction hasField(obj: any, fieldPath: string): boolean {\n const parts = fieldPath.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (!current || typeof current !== 'object' || !(part in current)) {\n return false;\n }\n current = current[part];\n }\n\n return current !== undefined && current !== null;\n}\n\n/**\n * Calcula la profundidad máxima de anidamiento\n */\nfunction getMaxDepth(obj: any, currentDepth = 0): number {\n if (typeof obj !== 'object' || obj === null) {\n return currentDepth;\n }\n\n let maxDepth = currentDepth;\n\n for (const value of Object.values(obj)) {\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const depth = getMaxDepth(value, currentDepth + 1);\n maxDepth = Math.max(maxDepth, depth);\n }\n }\n\n return maxDepth;\n}\n\n/**\n * Encuentra arrays grandes (>10 elementos)\n */\nfunction findLargeArrays(obj: any, path = ''): string[] {\n const largeArrays: string[] = [];\n\n if (Array.isArray(obj) && obj.length > 10) {\n largeArrays.push(path || 'root');\n }\n\n if (typeof obj === 'object' && obj !== null) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = path ? `${path}.${key}` : key;\n largeArrays.push(...findLargeArrays(value, newPath));\n }\n }\n\n return largeArrays;\n}\n\n/**\n * Genera un resumen rápido de oportunidades de optimización\n *\n * Útil para mostrar en la UI sin calcular todas las sugerencias.\n */\nexport function getOptimizationSummary(\n suggestions: OptimizationSuggestion[]\n): {\n totalReduction: number;\n byType: Record<string, number>;\n topOpportunities: OptimizationSuggestion[];\n} {\n const totalReduction = suggestions.reduce(\n (sum, s) => sum + (s.impact.reduction || 0),\n 0\n );\n\n const byType: Record<string, number> = {};\n for (const suggestion of suggestions) {\n byType[suggestion.type] = (byType[suggestion.type] || 0) + 1;\n }\n\n const topOpportunities = suggestions\n .slice(0, 5)\n .sort((a, b) => (b.impact.reduction || 0) - (a.impact.reduction || 0));\n\n return {\n totalReduction: Math.round(totalReduction / Math.max(1, suggestions.length)),\n byType,\n topOpportunities,\n };\n}\n","/**\n * Auditor Module\n *\n * Herramienta para auditar proyectos locales en busca de JSON-LD.\n *\n * Funcionalidades:\n * - Escanear archivos del proyecto\n * - Validar schemas existentes\n * - Generar reportes de cobertura\n * - Sugerir optimizaciones\n *\n * @example\n * ```typescript\n * import { auditProject } from 'geo-semantic-layer/auditor';\n *\n * const report = await auditProject({\n * rootDir: process.cwd(),\n * deepAnalysis: true\n * });\n *\n * console.log(`Score: ${report.score.total}/100`);\n * ```\n */\n\n// Export types\nexport * from './types.js';\n\n// Export core functions\nexport { scanProject, getProjectStats } from './project-scanner.js';\nexport { validateSchemas, validateSingleSchema } from './schema-validator.js';\nexport {\n generateCoverageReport,\n saveReport,\n} from './coverage-reporter.js';\nexport {\n generateOptimizationSuggestions,\n getOptimizationSummary,\n} from './optimizer-suggestions.js';\n\n// Import for main function\nimport { scanProject } from './project-scanner.js';\nimport { validateSchemas } from './schema-validator.js';\nimport {\n generateCoverageReport,\n saveReport,\n} from './coverage-reporter.js';\nimport { generateOptimizationSuggestions } from './optimizer-suggestions.js';\nimport type {\n ScanOptions,\n ValidateOptions,\n ReportOptions,\n CoverageReport,\n} from './types.js';\n\n/**\n * Audita un proyecto completo de una sola vez\n *\n * Esta es la función de alto nivel que orquesta todo el proceso:\n * 1. Escanea el proyecto\n * 2. Valida los schemas encontrados\n * 3. Genera sugerencias de optimización\n * 4. Crea el reporte de cobertura\n * 5. (Opcional) Guarda el reporte en archivo\n *\n * @param options - Opciones combinadas de escaneo, validación y reporte\n * @returns Reporte de cobertura completo\n *\n * @example\n * ```typescript\n * // Auditar proyecto y mostrar en consola\n * const report = await auditProject({\n * rootDir: './my-project',\n * strict: false\n * });\n *\n * // Auditar y guardar reporte HTML\n * const report = await auditProject({\n * rootDir: './my-project',\n * format: 'html',\n * output: './audit-report.html'\n * });\n * ```\n */\nexport async function auditProject(\n options: ScanOptions &\n ValidateOptions &\n ReportOptions & {\n /**\n * Modelo LLM objetivo para sugerencias de optimización\n */\n targetModel?: 'gpt-4' | 'gpt-3.5' | 'claude-3' | 'claude-2' | 'gemini-pro';\n\n /**\n * Incluir sugerencias de optimización en el reporte\n * Default: true\n */\n includeOptimizations?: boolean;\n } = {}\n): Promise<CoverageReport> {\n // 1. Escanear proyecto\n console.log('🔍 Scanning project...');\n const scanResult = await scanProject({\n ...(options.rootDir && { rootDir: options.rootDir }),\n ...(options.include && { include: options.include }),\n ...(options.exclude && { exclude: options.exclude }),\n ...(options.maxDepth && { maxDepth: options.maxDepth }),\n ...(options.deepAnalysis !== undefined && { deepAnalysis: options.deepAnalysis }),\n });\n\n console.log(\n `✅ Found ${scanResult.filesWithSchemas.length} files with schemas`\n );\n\n // 2. Validar schemas\n console.log('🔬 Validating schemas...');\n const validationResult = await validateSchemas(scanResult, {\n ...(options.strict !== undefined && { strict: options.strict }),\n ...(options.schemaTypes && { schemaTypes: options.schemaTypes }),\n ...(options.ignore && { ignore: options.ignore }),\n });\n\n if (validationResult.errors > 0) {\n console.log(`❌ Found ${validationResult.errors} errors`);\n }\n if (validationResult.warnings > 0) {\n console.log(`⚠️ Found ${validationResult.warnings} warnings`);\n }\n\n // 3. Generar sugerencias de optimización (si está habilitado)\n let optimizations: any[] = [];\n if (options.includeOptimizations !== false) {\n console.log('💡 Analyzing optimizations...');\n optimizations = await generateOptimizationSuggestions(\n scanResult,\n options.targetModel || 'gpt-4'\n );\n\n if (optimizations.length > 0) {\n console.log(`💡 Found ${optimizations.length} optimization opportunities`);\n }\n }\n\n // 4. Generar reporte\n console.log('📊 Generating report...');\n const report = generateCoverageReport(\n scanResult,\n validationResult,\n optimizations\n );\n\n // 5. Guardar reporte (si se especifica output)\n if (options.output) {\n await saveReport(report, {\n ...(options.format && { format: options.format }),\n output: options.output,\n });\n console.log(`✅ Report saved to: ${options.output}`);\n }\n\n return report;\n}\n\n/**\n * Función rápida para validar sin generar reporte completo\n *\n * Útil para pre-commit hooks o CI/CD.\n *\n * @param options - Opciones de escaneo y validación\n * @returns true si es válido, false si hay errores\n *\n * @example\n * ```typescript\n * const isValid = await quickValidate({ strict: true });\n * if (!isValid) {\n * process.exit(1);\n * }\n * ```\n */\nexport async function quickValidate(\n options: ScanOptions & ValidateOptions = {}\n): Promise<boolean> {\n const scanResult = await scanProject({\n ...(options.rootDir && { rootDir: options.rootDir }),\n ...(options.include && { include: options.include }),\n ...(options.exclude && { exclude: options.exclude }),\n });\n\n const validationResult = await validateSchemas(scanResult, {\n ...(options.strict !== undefined && { strict: options.strict }),\n ...(options.schemaTypes && { schemaTypes: options.schemaTypes }),\n ...(options.ignore && { ignore: options.ignore }),\n });\n\n return validationResult.valid;\n}\n\n/**\n * Genera solo el reporte sin ejecutar escaneo ni validación\n *\n * Útil cuando ya tienes los datos y solo quieres generar el HTML.\n */\nexport async function generateReportOnly(\n scanResult: any,\n validationResult: any,\n options: ReportOptions = {}\n): Promise<void> {\n const report = generateCoverageReport(scanResult, validationResult);\n await saveReport(report, options);\n}\n"]}
|