@supernovaio/cli 2.0.41 → 2.0.42

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.
Files changed (81) hide show
  1. package/dist/code-analyzer/analyzers/component-usage.js.map +1 -1
  2. package/dist/code-analyzer/analyzers/helpers.js.map +1 -1
  3. package/dist/code-analyzer/analyzers/index.js.map +1 -1
  4. package/dist/code-analyzer/analyzers/jsdoc.js.map +1 -1
  5. package/dist/code-analyzer/analyzers/static-components.js.map +1 -1
  6. package/dist/code-analyzer/analyzers/storybook-docs.js.map +1 -1
  7. package/dist/code-analyzer/analyzers/storybook-stories.js.map +1 -1
  8. package/dist/code-analyzer/analyzers/types.js.map +1 -1
  9. package/dist/code-analyzer/analyzers/typescript-api.js.map +1 -1
  10. package/dist/code-analyzer/components/analyze.js.map +1 -1
  11. package/dist/code-analyzer/components/mappers/component.js.map +1 -1
  12. package/dist/code-analyzer/components/mappers/property.js.map +1 -1
  13. package/dist/code-analyzer/components/parser/index.js.map +1 -1
  14. package/dist/code-analyzer/components/parser/module-parser.js.map +1 -1
  15. package/dist/code-analyzer/components/parser/parser.js.map +1 -1
  16. package/dist/code-analyzer/components/parser/types.js.map +1 -1
  17. package/dist/code-analyzer/components/parser/utils/build-filter.js.map +1 -1
  18. package/dist/code-analyzer/components/parser/utils/filter-duplicates.js.map +1 -1
  19. package/dist/code-analyzer/components/parser/utils/is-react-component.js.map +1 -1
  20. package/dist/code-analyzer/components/parser/utils/trim-file-name.js.map +1 -1
  21. package/dist/code-analyzer/components/types.js.map +1 -1
  22. package/dist/code-analyzer/components/utils/get-module-exports-path.js.map +1 -1
  23. package/dist/code-analyzer/index.js.map +1 -1
  24. package/dist/code-analyzer/orchestrator/index.js.map +1 -1
  25. package/dist/code-analyzer/orchestrator/run-analysis.js.map +1 -1
  26. package/dist/code-analyzer/snapshot/index.js.map +1 -1
  27. package/dist/code-analyzer/snapshot/write-snapshot.js.map +1 -1
  28. package/dist/commands/analyze/adoption.js.map +1 -1
  29. package/dist/commands/analyze/components.js.map +1 -1
  30. package/dist/commands/analyze/status.js.map +1 -1
  31. package/dist/commands/analyze.js.map +1 -1
  32. package/dist/commands/components-import.js.map +1 -1
  33. package/dist/commands/describe-design-system.js.map +1 -1
  34. package/dist/commands/describe-workspaces.js.map +1 -1
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logout.js.map +1 -1
  37. package/dist/commands/publish-documentation.js.map +1 -1
  38. package/dist/commands/run-local-exporter.js.map +1 -1
  39. package/dist/commands/storybook-import.js.map +1 -1
  40. package/dist/commands/sync-tokens.js.map +1 -1
  41. package/dist/commands/template-upload.d.ts +0 -1
  42. package/dist/commands/template-upload.d.ts.map +1 -1
  43. package/dist/commands/template-upload.js +25 -34
  44. package/dist/commands/template-upload.js.map +1 -1
  45. package/dist/commands/whoami.js.map +1 -1
  46. package/dist/hooks/postrun/save-config.js.map +1 -1
  47. package/dist/hooks/prerun/load-config.js.map +1 -1
  48. package/dist/hooks/prerun/sentry.js.map +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/services/auth.service.js.map +1 -1
  51. package/dist/services/index.js.map +1 -1
  52. package/dist/services/user.service.d.ts.map +1 -1
  53. package/dist/services/user.service.js.map +1 -1
  54. package/dist/services/vault.service.js.map +1 -1
  55. package/dist/types/base-command.js.map +1 -1
  56. package/dist/types/config.js.map +1 -1
  57. package/dist/types/environment.js.map +1 -1
  58. package/dist/types/flags.js.map +1 -1
  59. package/dist/types/index.js.map +1 -1
  60. package/dist/types/login.js.map +1 -1
  61. package/dist/types/not-authorized.error.js.map +1 -1
  62. package/dist/types/sentry-command.js.map +1 -1
  63. package/dist/types/types.js.map +1 -1
  64. package/dist/utils/analyze-command.js.map +1 -1
  65. package/dist/utils/analyze-status.js.map +1 -1
  66. package/dist/utils/api-client.js.map +1 -1
  67. package/dist/utils/common.js.map +1 -1
  68. package/dist/utils/config.service.js.map +1 -1
  69. package/dist/utils/discover.d.ts +1 -1
  70. package/dist/utils/discover.d.ts.map +1 -1
  71. package/dist/utils/discover.js +5 -5
  72. package/dist/utils/discover.js.map +1 -1
  73. package/dist/utils/figma-tokens-data-loader.js.map +1 -1
  74. package/dist/utils/http-client.js.map +1 -1
  75. package/dist/utils/index.js.map +1 -1
  76. package/dist/utils/run-exporter/exporter-utils.js.map +1 -1
  77. package/dist/utils/sdk.js.map +1 -1
  78. package/dist/utils/validate-templates.js.map +1 -1
  79. package/oclif.manifest.json +1 -8
  80. package/package.json +11 -11
  81. package/dist/docker-scripts/extract-private-packages.js +0 -74
@@ -1 +1 @@
1
- {"version":3,"file":"component-usage.js","sources":["../../../src/code-analyzer/analyzers/component-usage.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport ts from \"typescript\"\n\nimport { collectFiles, componentKeyFrom, toRelative } from \"./helpers.js\"\nimport { ComponentDescriptor, UsageRecord, UsageSnippet } from \"./types.js\"\n\nconst sourcePattern = \"**/*.{ts,tsx,js,jsx}\"\nconst excludedFilePatterns = [\".stories.\", \".test.\", \".spec.\"]\nconst minFallbackModuleScore = 3\n\ntype ImportBinding = {\n imported: string\n local: string\n moduleSpecifier: string\n}\n\ntype PropUsageAccumulator = {\n count: number\n values: Map<string, number>\n}\n\nfunction escapeForRegex(input: string): string {\n return input.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n}\n\nfunction findImports(content: string, sourcePath: string): ImportBinding[] {\n const imports: ImportBinding[] = []\n const scriptKind = sourcePath.endsWith(\".tsx\")\n ? ts.ScriptKind.TSX\n : sourcePath.endsWith(\".jsx\")\n ? ts.ScriptKind.JSX\n : ts.ScriptKind.TS\n\n const sourceFile = ts.createSourceFile(sourcePath, content, ts.ScriptTarget.Latest, true, scriptKind)\n\n sourceFile.forEachChild(node => {\n if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) {\n return\n }\n\n const {importClause} = node\n if (!importClause) {\n return\n }\n\n if (importClause.name) {\n imports.push({\n imported: \"default\",\n local: importClause.name.getText(sourceFile),\n moduleSpecifier: node.moduleSpecifier.text,\n })\n }\n\n if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) {\n for (const namedImport of importClause.namedBindings.elements) {\n const imported = namedImport.propertyName\n ? namedImport.propertyName.getText(sourceFile)\n : namedImport.name.getText(sourceFile)\n const local = namedImport.name.getText(sourceFile)\n imports.push({\n imported,\n local,\n moduleSpecifier: node.moduleSpecifier.text,\n })\n }\n }\n })\n\n return imports\n}\n\nfunction findImportedLocalNames(\n content: string,\n importFrom: string | string[],\n sourcePath: string,\n): Array<{ imported: string; local: string; moduleSpecifier: string }> {\n const importFromSet = new Set(Array.isArray(importFrom) ? importFrom : [importFrom])\n\n const isImportFromMatch = (moduleSpecifier: string): boolean => {\n for (const packageName of importFromSet) {\n if (moduleSpecifier === packageName || moduleSpecifier.startsWith(`${packageName}/`)) {\n return true\n }\n }\n\n return false\n }\n\n return findImports(content, sourcePath)\n .filter(binding => isImportFromMatch(binding.moduleSpecifier))\n .map(binding => ({ imported: binding.imported, local: binding.local, moduleSpecifier: binding.moduleSpecifier }))\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction extractJsxBlocks(content: string, localName: string, sourcePath: string): UsageSnippet[] {\n const escapedName = escapeForRegex(localName)\n const tagPattern = new RegExp(`<\\\\/?${escapedName}\\\\b[^>]*>`, \"g\")\n const tags = [...content.matchAll(tagPattern)]\n const snippets: UsageSnippet[] = []\n\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i]\n const tagText = tag[0]\n const startIndex = tag.index ?? 0\n\n if (tagText.startsWith(\"</\")) {\n continue\n }\n\n if (tagText.endsWith(\"/>\")) {\n const endIndex = startIndex + tagText.length\n snippets.push({\n lineEnd: lineAt(content, endIndex),\n lineStart: lineAt(content, startIndex),\n snippet: content.slice(startIndex, endIndex).trim(),\n sourcePath,\n })\n continue\n }\n\n let depth = 1\n let endIndex = startIndex + tagText.length\n\n for (let j = i + 1; j < tags.length; j++) {\n const innerTag = tags[j]\n const innerText = innerTag[0]\n const innerIndex = innerTag.index ?? 0\n\n if (innerText.startsWith(\"</\")) {\n depth -= 1\n if (depth === 0) {\n endIndex = innerIndex + innerText.length\n break\n }\n\n continue\n }\n\n if (!innerText.endsWith(\"/>\")) {\n depth += 1\n }\n }\n\n snippets.push({\n lineEnd: lineAt(content, endIndex),\n lineStart: lineAt(content, startIndex),\n snippet: content.slice(startIndex, endIndex).trim(),\n sourcePath,\n })\n }\n\n return snippets\n}\n\nfunction extractCallUsages(content: string, localName: string, sourcePath: string): UsageSnippet[] {\n const callPattern = new RegExp(`${escapeForRegex(localName)}\\\\s*\\\\(`, \"g\")\n const snippets: UsageSnippet[] = []\n\n for (const match of content.matchAll(callPattern)) {\n const index = match.index ?? 0\n const line = lineAt(content, index)\n const lineText = content.split(\"\\n\")[line - 1] ?? \"\"\n\n snippets.push({\n lineEnd: line,\n lineStart: line,\n snippet: lineText.trim(),\n sourcePath,\n })\n }\n\n return snippets\n}\n\nfunction normalizeValueText(input: string, maxLength = 120): string {\n const normalized = input.replaceAll(/\\s+/g, \" \").trim()\n if (normalized.length <= maxLength) {\n return normalized\n }\n\n return `${normalized.slice(0, maxLength - 1)}…`\n}\n\nfunction extractJsxPropUsage(content: string, localName: string, sourcePath: string): Map<string, PropUsageAccumulator> {\n const propUsage = new Map<string, PropUsageAccumulator>()\n const scriptKind = sourcePath.endsWith(\".tsx\")\n ? ts.ScriptKind.TSX\n : sourcePath.endsWith(\".jsx\")\n ? ts.ScriptKind.JSX\n : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(sourcePath, content, ts.ScriptTarget.Latest, true, scriptKind)\n\n const getTagName = (name: ts.JsxTagNameExpression): string | null => {\n if (ts.isIdentifier(name)) {\n return name.text\n }\n\n if (ts.isPropertyAccessExpression(name)) {\n return name.name.text\n }\n\n return null\n }\n\n const readJsxAttributeValue = (attribute: ts.JsxAttribute): string => {\n if (!attribute.initializer) {\n return \"{true}\"\n }\n\n if (ts.isStringLiteral(attribute.initializer)) {\n return `\"${normalizeValueText(attribute.initializer.text)}\"`\n }\n\n if (ts.isJsxExpression(attribute.initializer)) {\n if (!attribute.initializer.expression) {\n return \"{}\"\n }\n\n const {expression} = attribute.initializer\n if (\n ts.isStringLiteralLike(expression) ||\n ts.isNumericLiteral(expression) ||\n expression.kind === ts.SyntaxKind.TrueKeyword ||\n expression.kind === ts.SyntaxKind.FalseKeyword ||\n expression.kind === ts.SyntaxKind.NullKeyword\n ) {\n return normalizeValueText(expression.getText(sourceFile))\n }\n\n return `{${normalizeValueText(expression.getText(sourceFile))}}`\n }\n\n return normalizeValueText(attribute.initializer.getText(sourceFile))\n }\n\n const addPropUsage = (propName: string, value: string): void => {\n const existing = propUsage.get(propName) ?? { count: 0, values: new Map<string, number>() }\n existing.count += 1\n existing.values.set(value, (existing.values.get(value) ?? 0) + 1)\n propUsage.set(propName, existing)\n }\n\n const inspectOpeningLikeElement = (node: ts.JsxOpeningLikeElement): void => {\n const tagName = getTagName(node.tagName)\n if (tagName !== localName) {\n return\n }\n\n for (const attribute of node.attributes.properties) {\n if (ts.isJsxSpreadAttribute(attribute)) {\n continue\n }\n\n const propName = attribute.name.getText(sourceFile)\n const propValue = readJsxAttributeValue(attribute)\n addPropUsage(propName, propValue)\n }\n }\n\n const visit = (node: ts.Node): void => {\n if (ts.isJsxSelfClosingElement(node)) {\n inspectOpeningLikeElement(node)\n } else if (ts.isJsxOpeningElement(node)) {\n inspectOpeningLikeElement(node)\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return propUsage\n}\n\nfunction mergePropUsage(\n target: Record<string, PropUsageAccumulator> | undefined,\n incoming: Map<string, PropUsageAccumulator>,\n): Record<string, PropUsageAccumulator> {\n const out = target ?? {}\n\n for (const [propName, usage] of incoming.entries()) {\n const existing = out[propName] ?? { count: 0, values: new Map<string, number>() }\n existing.count += usage.count\n for (const [value, valueCount] of usage.values.entries()) {\n existing.values.set(value, (existing.values.get(value) ?? 0) + valueCount)\n }\n\n out[propName] = existing\n }\n\n return out\n}\n\nexport async function analyzeComponentUsage(\n projectRoot: string,\n components: ComponentDescriptor[],\n importFrom: string | string[],\n excludePaths: string[] = [],\n): Promise<{ components: ComponentDescriptor[]; records: Record<string, UsageRecord> }> {\n const files = await collectFiles({\n excludePaths,\n pattern: sourcePattern,\n projectRoot,\n })\n const records: Record<string, UsageRecord> = {}\n const componentByExportName = new Map(components.map(component => [component.exportName, component]))\n const inferredComponentsByExportName = new Map<string, ComponentDescriptor>()\n const inferredKeys = new Set<string>()\n const fallbackModuleScores = new Map<string, number>()\n\n const resolveComponent = (imported: string, local: string, moduleSpecifier: string): ComponentDescriptor | undefined => {\n const known = componentByExportName.get(imported)\n if (known) {\n return known\n }\n\n const inferredName = imported === \"default\" ? local : imported\n if (!inferredName || inferredName === \"default\") {\n return undefined\n }\n\n const existing = inferredComponentsByExportName.get(inferredName)\n if (existing) {\n return existing\n }\n\n const descriptor: ComponentDescriptor = {\n componentKey: componentKeyFrom(inferredName, `${moduleSpecifier}:${inferredName}`, inferredKeys),\n componentPath: moduleSpecifier,\n exportName: inferredName,\n }\n inferredComponentsByExportName.set(inferredName, descriptor)\n return descriptor\n }\n\n const runScan = async (targetImportFrom: string | string[]): Promise<void> => {\n const targetImportFromList = Array.isArray(targetImportFrom) ? targetImportFrom : [targetImportFrom]\n for (const file of files) {\n if (excludedFilePatterns.some(pattern => file.includes(pattern))) {\n continue\n }\n\n const relativePath = toRelative(projectRoot, file)\n const content = await readFile(file, \"utf8\")\n\n // Gather potential fallback module names based on import overlap with known DS components.\n for (const binding of findImports(content, relativePath)) {\n if (binding.moduleSpecifier.startsWith(\".\")) {\n continue\n }\n\n if (!componentByExportName.has(binding.imported)) {\n continue\n }\n\n fallbackModuleScores.set(binding.moduleSpecifier, (fallbackModuleScores.get(binding.moduleSpecifier) ?? 0) + 1)\n }\n\n const importBindings = findImportedLocalNames(content, targetImportFromList, relativePath)\n if (importBindings.length === 0) {\n continue\n }\n\n for (const importBinding of importBindings) {\n const component = resolveComponent(importBinding.imported, importBinding.local, importBinding.moduleSpecifier)\n if (!component) {\n continue\n }\n\n const jsxSnippets = extractJsxBlocks(content, importBinding.local, relativePath)\n const snippets = jsxSnippets.length > 0 ? jsxSnippets : extractCallUsages(content, importBinding.local, relativePath)\n const propUsage = extractJsxPropUsage(content, importBinding.local, relativePath)\n\n if (snippets.length === 0) {\n continue\n }\n\n const existing = records[component.componentKey] ?? {\n count: 0,\n files: [],\n propUsage: {},\n snippets: [],\n }\n\n existing.count += snippets.length\n existing.files.push(relativePath)\n existing.snippets.push(...snippets)\n existing.propUsage = mergePropUsage(existing.propUsage as Record<string, PropUsageAccumulator> | undefined, propUsage) as unknown as UsageRecord[\"propUsage\"]\n records[component.componentKey] = existing\n }\n }\n }\n\n const importFromList = Array.isArray(importFrom) ? importFrom : [importFrom]\n await runScan(importFromList)\n\n const hasUsage = Object.values(records).some(record => record.count > 0)\n if (!hasUsage) {\n const bestFallback = [...fallbackModuleScores.entries()]\n .filter(([moduleName, score]) => !importFromList.includes(moduleName) && score >= minFallbackModuleScore)\n .sort((a, b) => b[1] - a[1])[0]\n\n if (bestFallback) {\n await runScan(bestFallback[0])\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey].files = [...new Set(records[componentKey].files)].sort((a, b) => a.localeCompare(b)).slice(0, 30)\n records[componentKey].snippets = records[componentKey].snippets\n .sort((a, b) => {\n if (a.sourcePath === b.sourcePath) {\n return a.lineStart - b.lineStart\n }\n\n return a.sourcePath.localeCompare(b.sourcePath)\n })\n\n const currentPropUsage = records[componentKey].propUsage as unknown as Record<string, PropUsageAccumulator> | undefined\n if (currentPropUsage) {\n records[componentKey].propUsage = Object.fromEntries(\n Object.entries(currentPropUsage)\n .sort((a, b) => b[1].count - a[1].count || a[0].localeCompare(b[0]))\n .map(([propName, usage]) => [\n propName,\n {\n count: usage.count,\n values: [...usage.values.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([value, count]) => ({ count, value })),\n },\n ]),\n )\n }\n\n }\n\n const resolvedComponents = components.length > 0 ? components : [...inferredComponentsByExportName.values()]\n\n return {\n components: resolvedComponents.sort((a, b) => a.componentKey.localeCompare(b.componentKey)),\n records,\n }\n}\n"],"names":[],"mappings":"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","debug_id":"cc1a69aa-37dd-535d-be5f-16be012f5e8a"}
1
+ {"version":3,"file":"component-usage.js","sources":["../../../src/code-analyzer/analyzers/component-usage.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport ts from \"typescript\"\n\nimport { collectFiles, componentKeyFrom, toRelative } from \"./helpers.js\"\nimport { ComponentDescriptor, UsageRecord, UsageSnippet } from \"./types.js\"\n\nconst sourcePattern = \"**/*.{ts,tsx,js,jsx}\"\nconst excludedFilePatterns = [\".stories.\", \".test.\", \".spec.\"]\nconst minFallbackModuleScore = 3\n\ntype ImportBinding = {\n imported: string\n local: string\n moduleSpecifier: string\n}\n\ntype PropUsageAccumulator = {\n count: number\n values: Map<string, number>\n}\n\nfunction escapeForRegex(input: string): string {\n return input.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n}\n\nfunction findImports(content: string, sourcePath: string): ImportBinding[] {\n const imports: ImportBinding[] = []\n const scriptKind = sourcePath.endsWith(\".tsx\")\n ? ts.ScriptKind.TSX\n : sourcePath.endsWith(\".jsx\")\n ? ts.ScriptKind.JSX\n : ts.ScriptKind.TS\n\n const sourceFile = ts.createSourceFile(sourcePath, content, ts.ScriptTarget.Latest, true, scriptKind)\n\n sourceFile.forEachChild(node => {\n if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) {\n return\n }\n\n const {importClause} = node\n if (!importClause) {\n return\n }\n\n if (importClause.name) {\n imports.push({\n imported: \"default\",\n local: importClause.name.getText(sourceFile),\n moduleSpecifier: node.moduleSpecifier.text,\n })\n }\n\n if (importClause.namedBindings && ts.isNamedImports(importClause.namedBindings)) {\n for (const namedImport of importClause.namedBindings.elements) {\n const imported = namedImport.propertyName\n ? namedImport.propertyName.getText(sourceFile)\n : namedImport.name.getText(sourceFile)\n const local = namedImport.name.getText(sourceFile)\n imports.push({\n imported,\n local,\n moduleSpecifier: node.moduleSpecifier.text,\n })\n }\n }\n })\n\n return imports\n}\n\nfunction findImportedLocalNames(\n content: string,\n importFrom: string | string[],\n sourcePath: string,\n): Array<{ imported: string; local: string; moduleSpecifier: string }> {\n const importFromSet = new Set(Array.isArray(importFrom) ? importFrom : [importFrom])\n\n const isImportFromMatch = (moduleSpecifier: string): boolean => {\n for (const packageName of importFromSet) {\n if (moduleSpecifier === packageName || moduleSpecifier.startsWith(`${packageName}/`)) {\n return true\n }\n }\n\n return false\n }\n\n return findImports(content, sourcePath)\n .filter(binding => isImportFromMatch(binding.moduleSpecifier))\n .map(binding => ({ imported: binding.imported, local: binding.local, moduleSpecifier: binding.moduleSpecifier }))\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction extractJsxBlocks(content: string, localName: string, sourcePath: string): UsageSnippet[] {\n const escapedName = escapeForRegex(localName)\n const tagPattern = new RegExp(`<\\\\/?${escapedName}\\\\b[^>]*>`, \"g\")\n const tags = [...content.matchAll(tagPattern)]\n const snippets: UsageSnippet[] = []\n\n for (let i = 0; i < tags.length; i++) {\n const tag = tags[i]\n const tagText = tag[0]\n const startIndex = tag.index ?? 0\n\n if (tagText.startsWith(\"</\")) {\n continue\n }\n\n if (tagText.endsWith(\"/>\")) {\n const endIndex = startIndex + tagText.length\n snippets.push({\n lineEnd: lineAt(content, endIndex),\n lineStart: lineAt(content, startIndex),\n snippet: content.slice(startIndex, endIndex).trim(),\n sourcePath,\n })\n continue\n }\n\n let depth = 1\n let endIndex = startIndex + tagText.length\n\n for (let j = i + 1; j < tags.length; j++) {\n const innerTag = tags[j]\n const innerText = innerTag[0]\n const innerIndex = innerTag.index ?? 0\n\n if (innerText.startsWith(\"</\")) {\n depth -= 1\n if (depth === 0) {\n endIndex = innerIndex + innerText.length\n break\n }\n\n continue\n }\n\n if (!innerText.endsWith(\"/>\")) {\n depth += 1\n }\n }\n\n snippets.push({\n lineEnd: lineAt(content, endIndex),\n lineStart: lineAt(content, startIndex),\n snippet: content.slice(startIndex, endIndex).trim(),\n sourcePath,\n })\n }\n\n return snippets\n}\n\nfunction extractCallUsages(content: string, localName: string, sourcePath: string): UsageSnippet[] {\n const callPattern = new RegExp(`${escapeForRegex(localName)}\\\\s*\\\\(`, \"g\")\n const snippets: UsageSnippet[] = []\n\n for (const match of content.matchAll(callPattern)) {\n const index = match.index ?? 0\n const line = lineAt(content, index)\n const lineText = content.split(\"\\n\")[line - 1] ?? \"\"\n\n snippets.push({\n lineEnd: line,\n lineStart: line,\n snippet: lineText.trim(),\n sourcePath,\n })\n }\n\n return snippets\n}\n\nfunction normalizeValueText(input: string, maxLength = 120): string {\n const normalized = input.replaceAll(/\\s+/g, \" \").trim()\n if (normalized.length <= maxLength) {\n return normalized\n }\n\n return `${normalized.slice(0, maxLength - 1)}…`\n}\n\nfunction extractJsxPropUsage(content: string, localName: string, sourcePath: string): Map<string, PropUsageAccumulator> {\n const propUsage = new Map<string, PropUsageAccumulator>()\n const scriptKind = sourcePath.endsWith(\".tsx\")\n ? ts.ScriptKind.TSX\n : sourcePath.endsWith(\".jsx\")\n ? ts.ScriptKind.JSX\n : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(sourcePath, content, ts.ScriptTarget.Latest, true, scriptKind)\n\n const getTagName = (name: ts.JsxTagNameExpression): string | null => {\n if (ts.isIdentifier(name)) {\n return name.text\n }\n\n if (ts.isPropertyAccessExpression(name)) {\n return name.name.text\n }\n\n return null\n }\n\n const readJsxAttributeValue = (attribute: ts.JsxAttribute): string => {\n if (!attribute.initializer) {\n return \"{true}\"\n }\n\n if (ts.isStringLiteral(attribute.initializer)) {\n return `\"${normalizeValueText(attribute.initializer.text)}\"`\n }\n\n if (ts.isJsxExpression(attribute.initializer)) {\n if (!attribute.initializer.expression) {\n return \"{}\"\n }\n\n const {expression} = attribute.initializer\n if (\n ts.isStringLiteralLike(expression) ||\n ts.isNumericLiteral(expression) ||\n expression.kind === ts.SyntaxKind.TrueKeyword ||\n expression.kind === ts.SyntaxKind.FalseKeyword ||\n expression.kind === ts.SyntaxKind.NullKeyword\n ) {\n return normalizeValueText(expression.getText(sourceFile))\n }\n\n return `{${normalizeValueText(expression.getText(sourceFile))}}`\n }\n\n return normalizeValueText(attribute.initializer.getText(sourceFile))\n }\n\n const addPropUsage = (propName: string, value: string): void => {\n const existing = propUsage.get(propName) ?? { count: 0, values: new Map<string, number>() }\n existing.count += 1\n existing.values.set(value, (existing.values.get(value) ?? 0) + 1)\n propUsage.set(propName, existing)\n }\n\n const inspectOpeningLikeElement = (node: ts.JsxOpeningLikeElement): void => {\n const tagName = getTagName(node.tagName)\n if (tagName !== localName) {\n return\n }\n\n for (const attribute of node.attributes.properties) {\n if (ts.isJsxSpreadAttribute(attribute)) {\n continue\n }\n\n const propName = attribute.name.getText(sourceFile)\n const propValue = readJsxAttributeValue(attribute)\n addPropUsage(propName, propValue)\n }\n }\n\n const visit = (node: ts.Node): void => {\n if (ts.isJsxSelfClosingElement(node)) {\n inspectOpeningLikeElement(node)\n } else if (ts.isJsxOpeningElement(node)) {\n inspectOpeningLikeElement(node)\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n return propUsage\n}\n\nfunction mergePropUsage(\n target: Record<string, PropUsageAccumulator> | undefined,\n incoming: Map<string, PropUsageAccumulator>,\n): Record<string, PropUsageAccumulator> {\n const out = target ?? {}\n\n for (const [propName, usage] of incoming.entries()) {\n const existing = out[propName] ?? { count: 0, values: new Map<string, number>() }\n existing.count += usage.count\n for (const [value, valueCount] of usage.values.entries()) {\n existing.values.set(value, (existing.values.get(value) ?? 0) + valueCount)\n }\n\n out[propName] = existing\n }\n\n return out\n}\n\nexport async function analyzeComponentUsage(\n projectRoot: string,\n components: ComponentDescriptor[],\n importFrom: string | string[],\n excludePaths: string[] = [],\n): Promise<{ components: ComponentDescriptor[]; records: Record<string, UsageRecord> }> {\n const files = await collectFiles({\n excludePaths,\n pattern: sourcePattern,\n projectRoot,\n })\n const records: Record<string, UsageRecord> = {}\n const componentByExportName = new Map(components.map(component => [component.exportName, component]))\n const inferredComponentsByExportName = new Map<string, ComponentDescriptor>()\n const inferredKeys = new Set<string>()\n const fallbackModuleScores = new Map<string, number>()\n\n const resolveComponent = (imported: string, local: string, moduleSpecifier: string): ComponentDescriptor | undefined => {\n const known = componentByExportName.get(imported)\n if (known) {\n return known\n }\n\n const inferredName = imported === \"default\" ? local : imported\n if (!inferredName || inferredName === \"default\") {\n return undefined\n }\n\n const existing = inferredComponentsByExportName.get(inferredName)\n if (existing) {\n return existing\n }\n\n const descriptor: ComponentDescriptor = {\n componentKey: componentKeyFrom(inferredName, `${moduleSpecifier}:${inferredName}`, inferredKeys),\n componentPath: moduleSpecifier,\n exportName: inferredName,\n }\n inferredComponentsByExportName.set(inferredName, descriptor)\n return descriptor\n }\n\n const runScan = async (targetImportFrom: string | string[]): Promise<void> => {\n const targetImportFromList = Array.isArray(targetImportFrom) ? targetImportFrom : [targetImportFrom]\n for (const file of files) {\n if (excludedFilePatterns.some(pattern => file.includes(pattern))) {\n continue\n }\n\n const relativePath = toRelative(projectRoot, file)\n const content = await readFile(file, \"utf8\")\n\n // Gather potential fallback module names based on import overlap with known DS components.\n for (const binding of findImports(content, relativePath)) {\n if (binding.moduleSpecifier.startsWith(\".\")) {\n continue\n }\n\n if (!componentByExportName.has(binding.imported)) {\n continue\n }\n\n fallbackModuleScores.set(binding.moduleSpecifier, (fallbackModuleScores.get(binding.moduleSpecifier) ?? 0) + 1)\n }\n\n const importBindings = findImportedLocalNames(content, targetImportFromList, relativePath)\n if (importBindings.length === 0) {\n continue\n }\n\n for (const importBinding of importBindings) {\n const component = resolveComponent(importBinding.imported, importBinding.local, importBinding.moduleSpecifier)\n if (!component) {\n continue\n }\n\n const jsxSnippets = extractJsxBlocks(content, importBinding.local, relativePath)\n const snippets = jsxSnippets.length > 0 ? jsxSnippets : extractCallUsages(content, importBinding.local, relativePath)\n const propUsage = extractJsxPropUsage(content, importBinding.local, relativePath)\n\n if (snippets.length === 0) {\n continue\n }\n\n const existing = records[component.componentKey] ?? {\n count: 0,\n files: [],\n propUsage: {},\n snippets: [],\n }\n\n existing.count += snippets.length\n existing.files.push(relativePath)\n existing.snippets.push(...snippets)\n existing.propUsage = mergePropUsage(existing.propUsage as Record<string, PropUsageAccumulator> | undefined, propUsage) as unknown as UsageRecord[\"propUsage\"]\n records[component.componentKey] = existing\n }\n }\n }\n\n const importFromList = Array.isArray(importFrom) ? importFrom : [importFrom]\n await runScan(importFromList)\n\n const hasUsage = Object.values(records).some(record => record.count > 0)\n if (!hasUsage) {\n const bestFallback = [...fallbackModuleScores.entries()]\n .filter(([moduleName, score]) => !importFromList.includes(moduleName) && score >= minFallbackModuleScore)\n .sort((a, b) => b[1] - a[1])[0]\n\n if (bestFallback) {\n await runScan(bestFallback[0])\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey].files = [...new Set(records[componentKey].files)].sort((a, b) => a.localeCompare(b)).slice(0, 30)\n records[componentKey].snippets = records[componentKey].snippets\n .sort((a, b) => {\n if (a.sourcePath === b.sourcePath) {\n return a.lineStart - b.lineStart\n }\n\n return a.sourcePath.localeCompare(b.sourcePath)\n })\n\n const currentPropUsage = records[componentKey].propUsage as unknown as Record<string, PropUsageAccumulator> | undefined\n if (currentPropUsage) {\n records[componentKey].propUsage = Object.fromEntries(\n Object.entries(currentPropUsage)\n .sort((a, b) => b[1].count - a[1].count || a[0].localeCompare(b[0]))\n .map(([propName, usage]) => [\n propName,\n {\n count: usage.count,\n values: [...usage.values.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([value, count]) => ({ count, value })),\n },\n ]),\n )\n }\n\n }\n\n const resolvedComponents = components.length > 0 ? components : [...inferredComponentsByExportName.values()]\n\n return {\n components: resolvedComponents.sort((a, b) => a.componentKey.localeCompare(b.componentKey)),\n records,\n }\n}\n"],"names":[],"mappings":"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","debugId":"cc1a69aa-37dd-535d-be5f-16be012f5e8a"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/code-analyzer/analyzers/helpers.ts"],"sourceRoot":"","sourcesContent":["import { createHash } from \"node:crypto\"\nimport { globSync } from \"glob\"\nimport path from \"node:path\"\n\nconst ignoredDirectories = [\n \"**/.git/**\",\n \"**/.next/**\",\n \"**/.supernova/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/node_modules/**\",\n \"**/out/**\",\n]\n\nexport type CollectFilesInput = {\n excludePaths?: string[]\n pattern: string\n projectRoot: string\n}\n\nexport function normalizeExcludePath(excludePath: string): string {\n return excludePath.trim().replaceAll(\"\\\\\", \"/\").replace(/^\\.?\\//, \"\").replace(/\\/+$/, \"\")\n}\n\nfunction isExcluded(relativePath: string, excludePaths: string[]): boolean {\n return excludePaths.some(excludePath => relativePath === excludePath || relativePath.startsWith(`${excludePath}/`))\n}\n\nexport async function collectFiles(input: CollectFilesInput): Promise<string[]> {\n const excludePaths = (input.excludePaths ?? []).map(normalizeExcludePath).filter(path => path.length > 0)\n const files = globSync(input.pattern, {\n absolute: true,\n cwd: input.projectRoot,\n dot: false,\n ignore: ignoredDirectories,\n nodir: true,\n })\n\n const filtered = excludePaths.length > 0\n ? files.filter(file => !isExcluded(toRelative(input.projectRoot, file), excludePaths))\n : files\n\n return filtered.sort((a, b) => a.localeCompare(b))\n}\n\nexport function componentKeyFrom(exportName: string, componentPath: string, existing: Set<string>): string {\n const normalized = exportName\n .replaceAll(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replaceAll(/[^a-zA-Z0-9]+/g, \"-\")\n .replaceAll(/-{2,}/g, \"-\")\n .replaceAll(/^-|-$/g, \"\")\n .toLowerCase()\n\n if (!existing.has(normalized)) {\n existing.add(normalized)\n return normalized\n }\n\n const suffix = createHash(\"sha1\").update(componentPath).digest(\"hex\").slice(0, 6)\n const key = `${normalized}-${suffix}`\n existing.add(key)\n return key\n}\n\nexport function toRelative(projectRoot: string, absolutePath: string): string {\n return path.relative(projectRoot, absolutePath).split(path.sep).join(\"/\")\n}\n\nexport function uniqueSorted(values: string[]): string[] {\n return [...new Set(values)].sort((a, b) => a.localeCompare(b))\n}\n"],"names":[],"mappings":"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","debug_id":"43307c53-48e5-5451-9244-aa434fa6d8dc"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/code-analyzer/analyzers/helpers.ts"],"sourceRoot":"","sourcesContent":["import { createHash } from \"node:crypto\"\nimport { globSync } from \"glob\"\nimport path from \"node:path\"\n\nconst ignoredDirectories = [\n \"**/.git/**\",\n \"**/.next/**\",\n \"**/.supernova/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/node_modules/**\",\n \"**/out/**\",\n]\n\nexport type CollectFilesInput = {\n excludePaths?: string[]\n pattern: string\n projectRoot: string\n}\n\nexport function normalizeExcludePath(excludePath: string): string {\n return excludePath.trim().replaceAll(\"\\\\\", \"/\").replace(/^\\.?\\//, \"\").replace(/\\/+$/, \"\")\n}\n\nfunction isExcluded(relativePath: string, excludePaths: string[]): boolean {\n return excludePaths.some(excludePath => relativePath === excludePath || relativePath.startsWith(`${excludePath}/`))\n}\n\nexport async function collectFiles(input: CollectFilesInput): Promise<string[]> {\n const excludePaths = (input.excludePaths ?? []).map(normalizeExcludePath).filter(path => path.length > 0)\n const files = globSync(input.pattern, {\n absolute: true,\n cwd: input.projectRoot,\n dot: false,\n ignore: ignoredDirectories,\n nodir: true,\n })\n\n const filtered = excludePaths.length > 0\n ? files.filter(file => !isExcluded(toRelative(input.projectRoot, file), excludePaths))\n : files\n\n return filtered.sort((a, b) => a.localeCompare(b))\n}\n\nexport function componentKeyFrom(exportName: string, componentPath: string, existing: Set<string>): string {\n const normalized = exportName\n .replaceAll(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replaceAll(/[^a-zA-Z0-9]+/g, \"-\")\n .replaceAll(/-{2,}/g, \"-\")\n .replaceAll(/^-|-$/g, \"\")\n .toLowerCase()\n\n if (!existing.has(normalized)) {\n existing.add(normalized)\n return normalized\n }\n\n const suffix = createHash(\"sha1\").update(componentPath).digest(\"hex\").slice(0, 6)\n const key = `${normalized}-${suffix}`\n existing.add(key)\n return key\n}\n\nexport function toRelative(projectRoot: string, absolutePath: string): string {\n return path.relative(projectRoot, absolutePath).split(path.sep).join(\"/\")\n}\n\nexport function uniqueSorted(values: string[]): string[] {\n return [...new Set(values)].sort((a, b) => a.localeCompare(b))\n}\n"],"names":[],"mappings":"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","debugId":"43307c53-48e5-5451-9244-aa434fa6d8dc"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/code-analyzer/analyzers/index.ts"],"sourceRoot":"","sourcesContent":["export * from \"./component-usage.js\"\nexport * from \"./jsdoc.js\"\nexport * from \"./static-components.js\"\nexport * from \"./storybook-docs.js\"\nexport * from \"./storybook-stories.js\"\nexport * from \"./types.js\"\nexport * from \"./typescript-api.js\"\n"],"names":[],"mappings":";;AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA","debug_id":"d56c2179-2ee1-50d2-b46c-8d3cd6a08c67"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/code-analyzer/analyzers/index.ts"],"sourceRoot":"","sourcesContent":["export * from \"./component-usage.js\"\nexport * from \"./jsdoc.js\"\nexport * from \"./static-components.js\"\nexport * from \"./storybook-docs.js\"\nexport * from \"./storybook-stories.js\"\nexport * from \"./types.js\"\nexport * from \"./typescript-api.js\"\n"],"names":[],"mappings":";;AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,YAAY,CAAA;AAC1B,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,YAAY,CAAA;AAC1B,cAAc,qBAAqB,CAAA","debugId":"d56c2179-2ee1-50d2-b46c-8d3cd6a08c67"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc.js","sources":["../../../src/code-analyzer/analyzers/jsdoc.ts"],"sourceRoot":"","sourcesContent":["import { JsDocRecord, StaticComponentAnalyzerResult } from \"./types.js\"\n\nexport async function analyzeJsDoc(\n staticComponentsResult: StaticComponentAnalyzerResult,\n): Promise<Record<string, JsDocRecord>> {\n return staticComponentsResult.jsdocByComponentKey\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,sBAAqD;IAErD,OAAO,sBAAsB,CAAC,mBAAmB,CAAA;AACnD,CAAC","debug_id":"d212b647-6cc0-5c22-9a60-f3e400d4e881"}
1
+ {"version":3,"file":"jsdoc.js","sources":["../../../src/code-analyzer/analyzers/jsdoc.ts"],"sourceRoot":"","sourcesContent":["import { JsDocRecord, StaticComponentAnalyzerResult } from \"./types.js\"\n\nexport async function analyzeJsDoc(\n staticComponentsResult: StaticComponentAnalyzerResult,\n): Promise<Record<string, JsDocRecord>> {\n return staticComponentsResult.jsdocByComponentKey\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,sBAAqD;IAErD,OAAO,sBAAsB,CAAC,mBAAmB,CAAA;AACnD,CAAC","debugId":"d212b647-6cc0-5c22-9a60-f3e400d4e881"}
@@ -1 +1 @@
1
- {"version":3,"file":"static-components.js","sources":["../../../src/code-analyzer/analyzers/static-components.ts"],"sourceRoot":"","sourcesContent":["import { access, readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { globSync } from \"glob\"\nimport * as ts from \"typescript\"\n\nimport { analyzeComponents } from \"../components/analyze.js\"\nimport { Component, ComponentProperty } from \"../components/types.js\"\nimport { componentKeyFrom } from \"./helpers.js\"\nimport {\n ComponentApiProperty,\n ComponentDescriptor,\n JsDocRecord,\n LinkedTypeRecord,\n StaticComponentAnalyzerResult,\n} from \"./types.js\"\n\ntype WorkspacePackageJson = {\n name?: string\n workspaces?: string[] | { packages?: string[] }\n}\n\nfunction getWorkspacePatterns(packageJson: WorkspacePackageJson): string[] {\n const raw = packageJson.workspaces\n if (!raw) {\n return []\n }\n\n return Array.isArray(raw) ? raw : (raw.packages ?? [])\n}\n\ntype AnalyzeTarget = {\n importFrom: string\n rootDir: string\n}\n\ntype AnalyzeComponentsResult = {\n components: Component[]\n sourceRootDir: string\n}\n\ntype LocalTypeDeclaration = {\n definition: string\n lineEnd: number\n lineStart: number\n name: string\n}\n\ntype ImportedTypeBinding = {\n importedName: string\n sourceFilePath: string\n}\n\nconst ignoredReferenceTypeNames = new Set([\n \"AbortSignal\",\n \"Array\",\n \"ArrayBuffer\",\n \"Blob\",\n \"Booleanish\",\n \"ChangeEvent\",\n \"ClassName\",\n \"CSSProperties\",\n \"Date\",\n \"ElementType\",\n \"Error\",\n \"Event\",\n \"Exclude\",\n \"Extract\",\n \"FocusEvent\",\n \"FormEvent\",\n \"HTMLElement\",\n \"HTMLInputElement\",\n \"HTMLLabelElement\",\n \"IntersectionObserver\",\n \"JSX\",\n \"KeyboardEvent\",\n \"LegacyRef\",\n \"Map\",\n \"MouseEvent\",\n \"NonNullable\",\n \"Omit\",\n \"Partial\",\n \"Pick\",\n \"PointerEvent\",\n \"Promise\",\n \"PropsWithChildren\",\n \"Readonly\",\n \"Record\",\n \"Ref\",\n \"RefObject\",\n \"Required\",\n \"ReturnType\",\n \"Set\",\n \"String\",\n \"SubmitEvent\",\n \"SyntheticEvent\",\n \"Uint8Array\",\n \"URL\",\n])\n\nfunction serializePropType(type: unknown): string {\n if (type == null) {\n return \"unknown\"\n }\n\n if (typeof type === \"string\") {\n return type\n }\n\n if (typeof type === \"object\") {\n const maybeRaw = (type as { raw?: unknown }).raw\n if (typeof maybeRaw === \"string\" && maybeRaw.trim().length > 0) {\n return maybeRaw.replaceAll(/\\s+/g, \" \").trim()\n }\n }\n\n return JSON.stringify(type).replaceAll(/\\s+/g, \" \").trim()\n}\n\nfunction isLikelyReactNativeProp(property: ComponentProperty): boolean {\n const declarations = property.declarations ?? []\n if (declarations.length === 0) {\n return false\n }\n\n return declarations.every(declaration => {\n const file = declaration.fileName\n return (\n file.includes(\"node_modules/@types/react\") ||\n file.includes(\"node_modules/react\") ||\n file.includes(\"node_modules/@types/react-dom\")\n )\n })\n}\n\nfunction shouldIncludeProp(property: ComponentProperty): boolean {\n if (!isLikelyReactNativeProp(property)) {\n return true\n }\n\n return property.description.trim().length > 0\n}\n\nfunction extractTypeReferences(typeText: string): string[] {\n const matches = typeText.match(/\\b[A-Z][A-Za-z0-9_]*\\b/g) ?? []\n return [...new Set(matches.filter(token => !ignoredReferenceTypeNames.has(token)))]\n}\n\nfunction resolveRelativeImportPath(fromFilePath: string, moduleSpecifier: string): string | null {\n if (!moduleSpecifier.startsWith(\".\")) {\n return null\n }\n\n const basePath = path.resolve(path.dirname(fromFilePath), moduleSpecifier)\n const candidates = [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.d.ts`,\n path.join(basePath, \"index.ts\"),\n path.join(basePath, \"index.tsx\"),\n path.join(basePath, \"index.d.ts\"),\n ]\n\n return candidates.find(candidate => ts.sys.fileExists(candidate)) ?? null\n}\n\nfunction collectImportedTypeBindings(filePath: string): Map<string, ImportedTypeBinding> {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return new Map<string, ImportedTypeBinding>()\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const imports = new Map<string, ImportedTypeBinding>()\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue\n }\n\n const resolvedImportPath = resolveRelativeImportPath(filePath, statement.moduleSpecifier.text)\n if (!resolvedImportPath) {\n continue\n }\n\n const namedBindings = statement.importClause?.namedBindings\n if (!namedBindings || !ts.isNamedImports(namedBindings)) {\n continue\n }\n\n for (const element of namedBindings.elements) {\n const localName = element.name.getText(sourceFile)\n const importedName = element.propertyName ? element.propertyName.getText(sourceFile) : localName\n imports.set(localName, { importedName, sourceFilePath: resolvedImportPath })\n }\n }\n\n return imports\n}\n\nfunction collectRelativeImportSourceFiles(filePath: string): string[] {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return []\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const importSourceFiles = new Set<string>()\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue\n }\n\n const resolvedImportPath = resolveRelativeImportPath(filePath, statement.moduleSpecifier.text)\n if (resolvedImportPath) {\n importSourceFiles.add(resolvedImportPath)\n }\n }\n\n return [...importSourceFiles]\n}\n\nfunction collectLocalTypeDeclarations(filePath: string): Map<string, LocalTypeDeclaration> {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return new Map<string, LocalTypeDeclaration>()\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const declarations = new Map<string, LocalTypeDeclaration>()\n\n const collectNode = (node: ts.Node): void => {\n if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd())\n const declaration = {\n definition: node.getText(sourceFile).trim(),\n lineEnd: end.line + 1,\n lineStart: start.line + 1,\n name: node.name.getText(sourceFile),\n }\n declarations.set(declaration.name, declaration)\n }\n }\n\n for (const statement of sourceFile.statements) {\n collectNode(statement)\n }\n\n return declarations\n}\n\nfunction resolveLinkedTypes(component: Component, sourceRootDir: string): LinkedTypeRecord[] {\n const fileCandidates = [\n path.resolve(sourceRootDir, component.componentPath),\n path.resolve(sourceRootDir, \"src\", component.componentPath),\n ]\n const componentFilePath = fileCandidates.find(candidate => ts.sys.fileExists(candidate))\n if (!componentFilePath) {\n return []\n }\n\n const declarationsByFile = new Map<string, Map<string, LocalTypeDeclaration>>()\n const importsByFile = new Map<string, Map<string, ImportedTypeBinding>>()\n const importSourceFilesByFile = new Map<string, string[]>()\n\n const ensureFileData = (filePath: string): void => {\n if (!declarationsByFile.has(filePath)) {\n declarationsByFile.set(filePath, collectLocalTypeDeclarations(filePath))\n }\n\n if (!importsByFile.has(filePath)) {\n importsByFile.set(filePath, collectImportedTypeBindings(filePath))\n }\n\n if (!importSourceFilesByFile.has(filePath)) {\n importSourceFilesByFile.set(filePath, collectRelativeImportSourceFiles(filePath))\n }\n }\n\n ensureFileData(componentFilePath)\n const queue: Array<{ contextFilePath: string; typeName: string }> = []\n const seen = new Set<string>()\n\n for (const property of Object.values(component.properties)) {\n const serialized = serializePropType(property.type)\n for (const reference of extractTypeReferences(serialized)) {\n queue.push({ contextFilePath: componentFilePath, typeName: reference })\n }\n }\n\n const resolved: LinkedTypeRecord[] = []\n const added = new Set<string>()\n\n const toDisplaySourcePath = (filePath: string): string => {\n const sourceRelative = path.relative(sourceRootDir, filePath).replaceAll(path.sep, \"/\")\n return sourceRelative.startsWith(\"src/\") ? sourceRelative.slice(4) : sourceRelative\n }\n\n while (queue.length > 0) {\n const current = queue.shift()\n if (!current) {\n continue\n }\n\n const stateKey = `${current.contextFilePath}::${current.typeName}`\n if (seen.has(stateKey)) {\n continue\n }\n\n seen.add(stateKey)\n\n ensureFileData(current.contextFilePath)\n const fileDeclarations = declarationsByFile.get(current.contextFilePath) ?? new Map()\n const declaration = fileDeclarations.get(current.typeName)\n\n if (declaration) {\n const addedKey = `${current.contextFilePath}::${declaration.name}`\n if (!added.has(addedKey)) {\n resolved.push({\n definition: declaration.definition,\n lineEnd: declaration.lineEnd,\n lineStart: declaration.lineStart,\n name: declaration.name,\n sourcePath: toDisplaySourcePath(current.contextFilePath),\n })\n added.add(addedKey)\n }\n\n // Expand only nested local declarations from the same file to avoid noisy dependency explosion.\n for (const nestedReference of extractTypeReferences(declaration.definition)) {\n if (fileDeclarations.has(nestedReference)) {\n queue.push({ contextFilePath: current.contextFilePath, typeName: nestedReference })\n }\n }\n\n continue\n }\n\n const fileImports = importsByFile.get(current.contextFilePath) ?? new Map()\n const importedBinding = fileImports.get(current.typeName)\n if (importedBinding) {\n queue.push({ contextFilePath: importedBinding.sourceFilePath, typeName: importedBinding.importedName })\n continue\n }\n\n // Fallback: unresolved type may come transitively from a locally imported file\n // (e.g. prop type is Responsive<Size>, where Size is declared in an imported types file).\n const candidateFiles = importSourceFilesByFile.get(current.contextFilePath) ?? []\n const matchingFiles: string[] = []\n for (const candidateFilePath of candidateFiles) {\n ensureFileData(candidateFilePath)\n const declarations = declarationsByFile.get(candidateFilePath)\n if (declarations?.has(current.typeName)) {\n matchingFiles.push(candidateFilePath)\n }\n }\n\n if (matchingFiles.length === 1) {\n queue.push({ contextFilePath: matchingFiles[0], typeName: current.typeName })\n }\n }\n\n return resolved.sort((a, b) => {\n if (a.name === b.name) {\n return a.sourcePath.localeCompare(b.sourcePath)\n }\n\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction mapProps(component: Component): ComponentApiProperty[] {\n return Object.values(component.properties)\n .filter(property => shouldIncludeProp(property))\n .map(property => ({\n name: property.name,\n required: property.required,\n type: serializePropType(property.type),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n } catch {\n return false\n }\n}\n\nasync function resolveWorkspacePackageDirectory(projectRoot: string, importFrom: string): Promise<string | null> {\n const rootPackageJsonPath = path.join(projectRoot, \"package.json\")\n if (!(await fileExists(rootPackageJsonPath))) {\n return null\n }\n\n const rootPackageJson = JSON.parse(await readFile(rootPackageJsonPath, \"utf8\")) as WorkspacePackageJson\n const workspacePatterns = getWorkspacePatterns(rootPackageJson)\n\n for (const workspacePattern of workspacePatterns) {\n const packageJsonFiles = globSync(`${workspacePattern}/package.json`, {\n absolute: true,\n cwd: projectRoot,\n nodir: true,\n })\n\n for (const packageJsonFile of packageJsonFiles) {\n const packageJson = JSON.parse(await readFile(packageJsonFile, \"utf8\")) as WorkspacePackageJson\n if (packageJson.name === importFrom) {\n return path.dirname(packageJsonFile)\n }\n }\n }\n\n return null\n}\n\nasync function analyzeComponentsFromBestTarget(projectRoot: string, importFrom: string): Promise<AnalyzeComponentsResult> {\n const localWorkspacePackageDir = await resolveWorkspacePackageDirectory(projectRoot, importFrom)\n\n const candidates: AnalyzeTarget[] = []\n if (localWorkspacePackageDir) {\n const sourceDir = path.join(localWorkspacePackageDir, \"src\")\n if ((await fileExists(path.join(sourceDir, \"index.ts\"))) || (await fileExists(path.join(sourceDir, \"index.tsx\")))) {\n candidates.push({ importFrom: \"src\", rootDir: localWorkspacePackageDir })\n }\n\n candidates.push({ importFrom: \".\", rootDir: localWorkspacePackageDir })\n }\n\n candidates.push({ importFrom, rootDir: projectRoot })\n\n let lastError: unknown\n\n for (const candidate of candidates) {\n try {\n const components = await analyzeComponents({\n importFrom: candidate.importFrom,\n rootDir: candidate.rootDir,\n })\n\n if (components.length > 0) {\n return {\n components,\n sourceRootDir: candidate.rootDir,\n }\n }\n } catch (error) {\n lastError = error\n continue\n }\n }\n\n if (lastError) {\n throw lastError\n }\n\n return {\n components: [],\n sourceRootDir: projectRoot,\n }\n}\n\nexport async function analyzeStaticComponents(projectRoot: string, importFrom: string): Promise<StaticComponentAnalyzerResult> {\n const { components, sourceRootDir } = await analyzeComponentsFromBestTarget(projectRoot, importFrom)\n\n const descriptors: ComponentDescriptor[] = []\n const jsdocByComponentKey: Record<string, JsDocRecord> = {}\n const typescriptApiByComponentKey: StaticComponentAnalyzerResult[\"typescriptApiByComponentKey\"] = {}\n const existingKeys = new Set<string>()\n\n for (const component of components.sort((a, b) => a.exportName.localeCompare(b.exportName))) {\n const componentKey = componentKeyFrom(component.exportName, component.componentPath, existingKeys)\n\n descriptors.push({\n componentKey,\n componentPath: component.componentPath,\n exportName: component.exportName,\n })\n\n if (component.description.trim().length > 0) {\n jsdocByComponentKey[componentKey] = {\n description: component.description,\n sourcePath: component.componentPath,\n }\n }\n\n const props = mapProps(component)\n if (props.length > 0) {\n const linkedTypes = resolveLinkedTypes(component, sourceRootDir)\n typescriptApiByComponentKey[componentKey] = {\n linkedTypes,\n props,\n sourcePath: component.componentPath,\n }\n }\n }\n\n return {\n components: descriptors.sort((a, b) => a.componentKey.localeCompare(b.componentKey)),\n jsdocByComponentKey,\n typescriptApiByComponentKey,\n }\n}\n"],"names":[],"mappings":"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","debug_id":"2d262f78-ace0-5edb-971a-e5a64f11140a"}
1
+ {"version":3,"file":"static-components.js","sources":["../../../src/code-analyzer/analyzers/static-components.ts"],"sourceRoot":"","sourcesContent":["import { access, readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { globSync } from \"glob\"\nimport * as ts from \"typescript\"\n\nimport { analyzeComponents } from \"../components/analyze.js\"\nimport { Component, ComponentProperty } from \"../components/types.js\"\nimport { componentKeyFrom } from \"./helpers.js\"\nimport {\n ComponentApiProperty,\n ComponentDescriptor,\n JsDocRecord,\n LinkedTypeRecord,\n StaticComponentAnalyzerResult,\n} from \"./types.js\"\n\ntype WorkspacePackageJson = {\n name?: string\n workspaces?: string[] | { packages?: string[] }\n}\n\nfunction getWorkspacePatterns(packageJson: WorkspacePackageJson): string[] {\n const raw = packageJson.workspaces\n if (!raw) {\n return []\n }\n\n return Array.isArray(raw) ? raw : (raw.packages ?? [])\n}\n\ntype AnalyzeTarget = {\n importFrom: string\n rootDir: string\n}\n\ntype AnalyzeComponentsResult = {\n components: Component[]\n sourceRootDir: string\n}\n\ntype LocalTypeDeclaration = {\n definition: string\n lineEnd: number\n lineStart: number\n name: string\n}\n\ntype ImportedTypeBinding = {\n importedName: string\n sourceFilePath: string\n}\n\nconst ignoredReferenceTypeNames = new Set([\n \"AbortSignal\",\n \"Array\",\n \"ArrayBuffer\",\n \"Blob\",\n \"Booleanish\",\n \"ChangeEvent\",\n \"ClassName\",\n \"CSSProperties\",\n \"Date\",\n \"ElementType\",\n \"Error\",\n \"Event\",\n \"Exclude\",\n \"Extract\",\n \"FocusEvent\",\n \"FormEvent\",\n \"HTMLElement\",\n \"HTMLInputElement\",\n \"HTMLLabelElement\",\n \"IntersectionObserver\",\n \"JSX\",\n \"KeyboardEvent\",\n \"LegacyRef\",\n \"Map\",\n \"MouseEvent\",\n \"NonNullable\",\n \"Omit\",\n \"Partial\",\n \"Pick\",\n \"PointerEvent\",\n \"Promise\",\n \"PropsWithChildren\",\n \"Readonly\",\n \"Record\",\n \"Ref\",\n \"RefObject\",\n \"Required\",\n \"ReturnType\",\n \"Set\",\n \"String\",\n \"SubmitEvent\",\n \"SyntheticEvent\",\n \"Uint8Array\",\n \"URL\",\n])\n\nfunction serializePropType(type: unknown): string {\n if (type == null) {\n return \"unknown\"\n }\n\n if (typeof type === \"string\") {\n return type\n }\n\n if (typeof type === \"object\") {\n const maybeRaw = (type as { raw?: unknown }).raw\n if (typeof maybeRaw === \"string\" && maybeRaw.trim().length > 0) {\n return maybeRaw.replaceAll(/\\s+/g, \" \").trim()\n }\n }\n\n return JSON.stringify(type).replaceAll(/\\s+/g, \" \").trim()\n}\n\nfunction isLikelyReactNativeProp(property: ComponentProperty): boolean {\n const declarations = property.declarations ?? []\n if (declarations.length === 0) {\n return false\n }\n\n return declarations.every(declaration => {\n const file = declaration.fileName\n return (\n file.includes(\"node_modules/@types/react\") ||\n file.includes(\"node_modules/react\") ||\n file.includes(\"node_modules/@types/react-dom\")\n )\n })\n}\n\nfunction shouldIncludeProp(property: ComponentProperty): boolean {\n if (!isLikelyReactNativeProp(property)) {\n return true\n }\n\n return property.description.trim().length > 0\n}\n\nfunction extractTypeReferences(typeText: string): string[] {\n const matches = typeText.match(/\\b[A-Z][A-Za-z0-9_]*\\b/g) ?? []\n return [...new Set(matches.filter(token => !ignoredReferenceTypeNames.has(token)))]\n}\n\nfunction resolveRelativeImportPath(fromFilePath: string, moduleSpecifier: string): string | null {\n if (!moduleSpecifier.startsWith(\".\")) {\n return null\n }\n\n const basePath = path.resolve(path.dirname(fromFilePath), moduleSpecifier)\n const candidates = [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.d.ts`,\n path.join(basePath, \"index.ts\"),\n path.join(basePath, \"index.tsx\"),\n path.join(basePath, \"index.d.ts\"),\n ]\n\n return candidates.find(candidate => ts.sys.fileExists(candidate)) ?? null\n}\n\nfunction collectImportedTypeBindings(filePath: string): Map<string, ImportedTypeBinding> {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return new Map<string, ImportedTypeBinding>()\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const imports = new Map<string, ImportedTypeBinding>()\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue\n }\n\n const resolvedImportPath = resolveRelativeImportPath(filePath, statement.moduleSpecifier.text)\n if (!resolvedImportPath) {\n continue\n }\n\n const namedBindings = statement.importClause?.namedBindings\n if (!namedBindings || !ts.isNamedImports(namedBindings)) {\n continue\n }\n\n for (const element of namedBindings.elements) {\n const localName = element.name.getText(sourceFile)\n const importedName = element.propertyName ? element.propertyName.getText(sourceFile) : localName\n imports.set(localName, { importedName, sourceFilePath: resolvedImportPath })\n }\n }\n\n return imports\n}\n\nfunction collectRelativeImportSourceFiles(filePath: string): string[] {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return []\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const importSourceFiles = new Set<string>()\n\n for (const statement of sourceFile.statements) {\n if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {\n continue\n }\n\n const resolvedImportPath = resolveRelativeImportPath(filePath, statement.moduleSpecifier.text)\n if (resolvedImportPath) {\n importSourceFiles.add(resolvedImportPath)\n }\n }\n\n return [...importSourceFiles]\n}\n\nfunction collectLocalTypeDeclarations(filePath: string): Map<string, LocalTypeDeclaration> {\n const sourceText = ts.sys.readFile(filePath)\n if (!sourceText) {\n return new Map<string, LocalTypeDeclaration>()\n }\n\n const scriptKind = filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, scriptKind)\n const declarations = new Map<string, LocalTypeDeclaration>()\n\n const collectNode = (node: ts.Node): void => {\n if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node)) {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile))\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd())\n const declaration = {\n definition: node.getText(sourceFile).trim(),\n lineEnd: end.line + 1,\n lineStart: start.line + 1,\n name: node.name.getText(sourceFile),\n }\n declarations.set(declaration.name, declaration)\n }\n }\n\n for (const statement of sourceFile.statements) {\n collectNode(statement)\n }\n\n return declarations\n}\n\nfunction resolveLinkedTypes(component: Component, sourceRootDir: string): LinkedTypeRecord[] {\n const fileCandidates = [\n path.resolve(sourceRootDir, component.componentPath),\n path.resolve(sourceRootDir, \"src\", component.componentPath),\n ]\n const componentFilePath = fileCandidates.find(candidate => ts.sys.fileExists(candidate))\n if (!componentFilePath) {\n return []\n }\n\n const declarationsByFile = new Map<string, Map<string, LocalTypeDeclaration>>()\n const importsByFile = new Map<string, Map<string, ImportedTypeBinding>>()\n const importSourceFilesByFile = new Map<string, string[]>()\n\n const ensureFileData = (filePath: string): void => {\n if (!declarationsByFile.has(filePath)) {\n declarationsByFile.set(filePath, collectLocalTypeDeclarations(filePath))\n }\n\n if (!importsByFile.has(filePath)) {\n importsByFile.set(filePath, collectImportedTypeBindings(filePath))\n }\n\n if (!importSourceFilesByFile.has(filePath)) {\n importSourceFilesByFile.set(filePath, collectRelativeImportSourceFiles(filePath))\n }\n }\n\n ensureFileData(componentFilePath)\n const queue: Array<{ contextFilePath: string; typeName: string }> = []\n const seen = new Set<string>()\n\n for (const property of Object.values(component.properties)) {\n const serialized = serializePropType(property.type)\n for (const reference of extractTypeReferences(serialized)) {\n queue.push({ contextFilePath: componentFilePath, typeName: reference })\n }\n }\n\n const resolved: LinkedTypeRecord[] = []\n const added = new Set<string>()\n\n const toDisplaySourcePath = (filePath: string): string => {\n const sourceRelative = path.relative(sourceRootDir, filePath).replaceAll(path.sep, \"/\")\n return sourceRelative.startsWith(\"src/\") ? sourceRelative.slice(4) : sourceRelative\n }\n\n while (queue.length > 0) {\n const current = queue.shift()\n if (!current) {\n continue\n }\n\n const stateKey = `${current.contextFilePath}::${current.typeName}`\n if (seen.has(stateKey)) {\n continue\n }\n\n seen.add(stateKey)\n\n ensureFileData(current.contextFilePath)\n const fileDeclarations = declarationsByFile.get(current.contextFilePath) ?? new Map()\n const declaration = fileDeclarations.get(current.typeName)\n\n if (declaration) {\n const addedKey = `${current.contextFilePath}::${declaration.name}`\n if (!added.has(addedKey)) {\n resolved.push({\n definition: declaration.definition,\n lineEnd: declaration.lineEnd,\n lineStart: declaration.lineStart,\n name: declaration.name,\n sourcePath: toDisplaySourcePath(current.contextFilePath),\n })\n added.add(addedKey)\n }\n\n // Expand only nested local declarations from the same file to avoid noisy dependency explosion.\n for (const nestedReference of extractTypeReferences(declaration.definition)) {\n if (fileDeclarations.has(nestedReference)) {\n queue.push({ contextFilePath: current.contextFilePath, typeName: nestedReference })\n }\n }\n\n continue\n }\n\n const fileImports = importsByFile.get(current.contextFilePath) ?? new Map()\n const importedBinding = fileImports.get(current.typeName)\n if (importedBinding) {\n queue.push({ contextFilePath: importedBinding.sourceFilePath, typeName: importedBinding.importedName })\n continue\n }\n\n // Fallback: unresolved type may come transitively from a locally imported file\n // (e.g. prop type is Responsive<Size>, where Size is declared in an imported types file).\n const candidateFiles = importSourceFilesByFile.get(current.contextFilePath) ?? []\n const matchingFiles: string[] = []\n for (const candidateFilePath of candidateFiles) {\n ensureFileData(candidateFilePath)\n const declarations = declarationsByFile.get(candidateFilePath)\n if (declarations?.has(current.typeName)) {\n matchingFiles.push(candidateFilePath)\n }\n }\n\n if (matchingFiles.length === 1) {\n queue.push({ contextFilePath: matchingFiles[0], typeName: current.typeName })\n }\n }\n\n return resolved.sort((a, b) => {\n if (a.name === b.name) {\n return a.sourcePath.localeCompare(b.sourcePath)\n }\n\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction mapProps(component: Component): ComponentApiProperty[] {\n return Object.values(component.properties)\n .filter(property => shouldIncludeProp(property))\n .map(property => ({\n name: property.name,\n required: property.required,\n type: serializePropType(property.type),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath)\n return true\n } catch {\n return false\n }\n}\n\nasync function resolveWorkspacePackageDirectory(projectRoot: string, importFrom: string): Promise<string | null> {\n const rootPackageJsonPath = path.join(projectRoot, \"package.json\")\n if (!(await fileExists(rootPackageJsonPath))) {\n return null\n }\n\n const rootPackageJson = JSON.parse(await readFile(rootPackageJsonPath, \"utf8\")) as WorkspacePackageJson\n const workspacePatterns = getWorkspacePatterns(rootPackageJson)\n\n for (const workspacePattern of workspacePatterns) {\n const packageJsonFiles = globSync(`${workspacePattern}/package.json`, {\n absolute: true,\n cwd: projectRoot,\n nodir: true,\n })\n\n for (const packageJsonFile of packageJsonFiles) {\n const packageJson = JSON.parse(await readFile(packageJsonFile, \"utf8\")) as WorkspacePackageJson\n if (packageJson.name === importFrom) {\n return path.dirname(packageJsonFile)\n }\n }\n }\n\n return null\n}\n\nasync function analyzeComponentsFromBestTarget(projectRoot: string, importFrom: string): Promise<AnalyzeComponentsResult> {\n const localWorkspacePackageDir = await resolveWorkspacePackageDirectory(projectRoot, importFrom)\n\n const candidates: AnalyzeTarget[] = []\n if (localWorkspacePackageDir) {\n const sourceDir = path.join(localWorkspacePackageDir, \"src\")\n if ((await fileExists(path.join(sourceDir, \"index.ts\"))) || (await fileExists(path.join(sourceDir, \"index.tsx\")))) {\n candidates.push({ importFrom: \"src\", rootDir: localWorkspacePackageDir })\n }\n\n candidates.push({ importFrom: \".\", rootDir: localWorkspacePackageDir })\n }\n\n candidates.push({ importFrom, rootDir: projectRoot })\n\n let lastError: unknown\n\n for (const candidate of candidates) {\n try {\n const components = await analyzeComponents({\n importFrom: candidate.importFrom,\n rootDir: candidate.rootDir,\n })\n\n if (components.length > 0) {\n return {\n components,\n sourceRootDir: candidate.rootDir,\n }\n }\n } catch (error) {\n lastError = error\n continue\n }\n }\n\n if (lastError) {\n throw lastError\n }\n\n return {\n components: [],\n sourceRootDir: projectRoot,\n }\n}\n\nexport async function analyzeStaticComponents(projectRoot: string, importFrom: string): Promise<StaticComponentAnalyzerResult> {\n const { components, sourceRootDir } = await analyzeComponentsFromBestTarget(projectRoot, importFrom)\n\n const descriptors: ComponentDescriptor[] = []\n const jsdocByComponentKey: Record<string, JsDocRecord> = {}\n const typescriptApiByComponentKey: StaticComponentAnalyzerResult[\"typescriptApiByComponentKey\"] = {}\n const existingKeys = new Set<string>()\n\n for (const component of components.sort((a, b) => a.exportName.localeCompare(b.exportName))) {\n const componentKey = componentKeyFrom(component.exportName, component.componentPath, existingKeys)\n\n descriptors.push({\n componentKey,\n componentPath: component.componentPath,\n exportName: component.exportName,\n })\n\n if (component.description.trim().length > 0) {\n jsdocByComponentKey[componentKey] = {\n description: component.description,\n sourcePath: component.componentPath,\n }\n }\n\n const props = mapProps(component)\n if (props.length > 0) {\n const linkedTypes = resolveLinkedTypes(component, sourceRootDir)\n typescriptApiByComponentKey[componentKey] = {\n linkedTypes,\n props,\n sourcePath: component.componentPath,\n }\n }\n }\n\n return {\n components: descriptors.sort((a, b) => a.componentKey.localeCompare(b.componentKey)),\n jsdocByComponentKey,\n typescriptApiByComponentKey,\n }\n}\n"],"names":[],"mappings":"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","debugId":"2d262f78-ace0-5edb-971a-e5a64f11140a"}
@@ -1 +1 @@
1
- {"version":3,"file":"storybook-docs.js","sources":["../../../src/code-analyzer/analyzers/storybook-docs.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport { collectFiles, toRelative } from \"./helpers.js\"\nimport { ComponentDescriptor, DocRecord } from \"./types.js\"\n\nconst docsPattern = \"**/*.{md,mdx}\"\nconst snippetWindowBefore = 3\nconst snippetWindowAfter = 8\nconst maxReferenceSnippetsPerFile = 3\n\nfunction extractTitle(content: string): string | undefined {\n const headingMatch = content.match(/^#\\s+(.+)$/m)\n if (headingMatch?.[1]) {\n return headingMatch[1].trim()\n }\n\n const metaMatch = content.match(/<Meta\\s+title=[\"']([^\"']+)[\"']/)\n return metaMatch?.[1]?.trim()\n}\n\nfunction escapeRegex(input: string): string {\n return input.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n}\n\nfunction toPosix(input: string): string {\n return input.split(path.sep).join(\"/\")\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction normalizeLine(input: string): string {\n return input.replaceAll(/\\s+/g, \" \").trim().toLowerCase()\n}\n\nfunction createSnippet(content: string, line: number): { lineEnd: number; lineStart: number; snippet: string } {\n const lines = content.split(\"\\n\")\n const lineIndex = Math.max(0, Math.min(lines.length - 1, line - 1))\n\n let lineStart = Math.max(1, line - snippetWindowBefore)\n let lineEnd = Math.min(lines.length, line + snippetWindowAfter)\n\n for (let i = lineIndex; i >= lineStart - 1; i -= 1) {\n if (lines[i]?.trim() === \"\") {\n lineStart = i + 2\n break\n }\n }\n\n for (let i = lineIndex; i <= lineEnd - 1; i += 1) {\n if (lines[i]?.trim() === \"\") {\n lineEnd = i\n break\n }\n }\n\n if (lineStart > lineEnd) {\n lineStart = line\n lineEnd = line\n }\n\n const snippet = lines.slice(lineStart - 1, lineEnd).join(\"\\n\").trimEnd()\n return { lineEnd, lineStart, snippet }\n}\n\nfunction classifyDocRecord(\n relativePath: string,\n component: ComponentDescriptor,\n content: string,\n): { kind: \"doc\" | \"reference\"; score: number } {\n const normalizedPath = toPosix(relativePath).toLowerCase()\n const componentPath = toPosix(component.componentPath).toLowerCase()\n const componentDir = path.posix.dirname(componentPath)\n const fileName = path.posix.basename(normalizedPath)\n const exportName = component.exportName.toLowerCase()\n const title = extractTitle(content)\n const normalizedTitle = title ? normalizeLine(title) : \"\"\n const componentToken = normalizeLine(component.exportName)\n\n const inComponentDir = normalizedPath.startsWith(`${componentDir}/`)\n const isReadme = fileName === \"readme.md\" || fileName === \"readme.mdx\"\n const isDocsLike = fileName.startsWith(\"docs.\") || fileName.endsWith(\".docs.md\") || fileName.endsWith(\".docs.mdx\")\n const fileContainsName = fileName.includes(exportName)\n const titleContainsName = normalizedTitle.includes(componentToken)\n\n if (inComponentDir && isReadme) {\n return { kind: \"doc\", score: 100 }\n }\n\n if (inComponentDir && isDocsLike) {\n return { kind: \"doc\", score: 95 }\n }\n\n if (inComponentDir) {\n return { kind: \"doc\", score: 90 }\n }\n\n if (fileContainsName || titleContainsName) {\n return { kind: \"doc\", score: 80 }\n }\n\n if (normalizedPath.includes(\"/docs/\") || normalizedPath.includes(\"/documentation/\")) {\n return { kind: \"reference\", score: 40 }\n }\n\n if (normalizedPath.includes(\"/storybook/\") || normalizedPath.includes(\".stories.\")) {\n return { kind: \"reference\", score: 35 }\n }\n\n return { kind: \"reference\", score: 20 }\n}\n\nexport async function analyzeStorybookDocs(\n projectRoot: string,\n components: ComponentDescriptor[],\n excludePaths: string[] = [],\n): Promise<Record<string, DocRecord[]>> {\n const files = await collectFiles({\n excludePaths,\n pattern: docsPattern,\n projectRoot,\n })\n const records: Record<string, DocRecord[]> = {}\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\")\n const title = extractTitle(content)\n const relativePath = toRelative(projectRoot, file)\n\n for (const component of components) {\n const classification = classifyDocRecord(relativePath, component, content)\n const componentPattern = new RegExp(`\\\\b${escapeRegex(component.exportName)}\\\\b`, \"gm\")\n const matches = [...content.matchAll(componentPattern)]\n\n const isFullDoc = classification.kind === \"doc\"\n\n if (!isFullDoc && matches.length === 0) {\n continue\n }\n\n if (!records[component.componentKey]) {\n records[component.componentKey] = []\n }\n\n if (isFullDoc) {\n const firstMatchIndex = typeof matches[0]?.index === \"number\" ? matches[0].index : 0\n const line = lineAt(content, firstMatchIndex)\n records[component.componentKey].push({\n content,\n docPath: relativePath,\n kind: \"doc\",\n lineEnd: line,\n lineStart: line,\n score: classification.score,\n title,\n })\n continue\n }\n\n const snippetMatches = matches.slice(0, maxReferenceSnippetsPerFile)\n for (const match of snippetMatches) {\n if (typeof match.index !== \"number\") {\n continue\n }\n\n const matchLine = lineAt(content, match.index)\n const snippet = createSnippet(content, matchLine)\n records[component.componentKey].push({\n docPath: relativePath,\n kind: \"reference\",\n lineEnd: snippet.lineEnd,\n lineStart: snippet.lineStart,\n score: classification.score,\n snippet: snippet.snippet,\n title,\n })\n }\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey] = records[componentKey].sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score\n }\n\n if (a.kind !== b.kind) {\n return a.kind === \"doc\" ? -1 : 1\n }\n\n if (a.docPath === b.docPath) {\n if (a.lineStart === b.lineStart) {\n return a.lineEnd - b.lineEnd\n }\n\n return a.lineStart - b.lineStart\n }\n\n return a.docPath.localeCompare(b.docPath)\n })\n }\n\n return records\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGvD,MAAM,WAAW,GAAG,eAAe,CAAA;AACnC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AAC7B,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,2BAA2B,GAAG,CAAC,CAAA;AAErC,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IACjD,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACjE,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAA,KAAK,CAAC,CAAA;AACjE,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,MAAM,CAAC,OAAe,EAAE,KAAa;IAC5C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,IAAY;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;IAEnE,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,mBAAmB,CAAC,CAAA;IACvD,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,GAAG,kBAAkB,CAAC,CAAA;IAE/D,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5B,SAAS,GAAG,CAAC,GAAG,CAAC,CAAA;YACjB,MAAK;QACP,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAA;YACX,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;QACxB,SAAS,GAAG,IAAI,CAAA;QAChB,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;IACxE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAoB,EACpB,SAA8B,EAC9B,OAAe;IAEf,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;IACpE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IACpD,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,WAAW,EAAE,CAAA;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzD,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IAE1D,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,YAAY,CAAA;IACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAClH,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IACtD,MAAM,iBAAiB,GAAG,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;IAElE,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IACpC,CAAC;IAED,IAAI,cAAc,IAAI,UAAU,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACnC,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACzC,CAAC;IAED,IAAI,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IACzC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,UAAiC,EACjC,eAAyB,EAAE;IAE3B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;QAC/B,YAAY;QACZ,OAAO,EAAE,WAAW;QACpB,WAAW;KACZ,CAAC,CAAA;IACF,MAAM,OAAO,GAAgC,EAAE,CAAA;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QAElD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,cAAc,GAAG,iBAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;YAC1E,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACvF,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAA;YAEvD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,KAAK,KAAK,CAAA;YAE/C,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,SAAQ;YACV,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAA;YACtC,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,eAAe,GAAG,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACpF,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;gBAC7C,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;oBACnC,OAAO;oBACP,OAAO,EAAE,YAAY;oBACrB,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,IAAI;oBACf,KAAK,EAAE,cAAc,CAAC,KAAK;oBAC3B,KAAK;iBACN,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;YAED,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAA;YACpE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACpC,SAAQ;gBACV,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;gBAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;gBACjD,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;oBACnC,OAAO,EAAE,YAAY;oBACrB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,KAAK,EAAE,cAAc,CAAC,KAAK;oBAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,KAAK;iBACN,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1D,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAA;YAC1B,CAAC;YAED,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAClC,CAAC;YAED,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;oBAChC,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;gBAC9B,CAAC;gBAED,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAA;YAClC,CAAC;YAED,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC","debug_id":"0ce14f9a-c743-50b2-959b-559515b5fa6c"}
1
+ {"version":3,"file":"storybook-docs.js","sources":["../../../src/code-analyzer/analyzers/storybook-docs.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport { collectFiles, toRelative } from \"./helpers.js\"\nimport { ComponentDescriptor, DocRecord } from \"./types.js\"\n\nconst docsPattern = \"**/*.{md,mdx}\"\nconst snippetWindowBefore = 3\nconst snippetWindowAfter = 8\nconst maxReferenceSnippetsPerFile = 3\n\nfunction extractTitle(content: string): string | undefined {\n const headingMatch = content.match(/^#\\s+(.+)$/m)\n if (headingMatch?.[1]) {\n return headingMatch[1].trim()\n }\n\n const metaMatch = content.match(/<Meta\\s+title=[\"']([^\"']+)[\"']/)\n return metaMatch?.[1]?.trim()\n}\n\nfunction escapeRegex(input: string): string {\n return input.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n}\n\nfunction toPosix(input: string): string {\n return input.split(path.sep).join(\"/\")\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction normalizeLine(input: string): string {\n return input.replaceAll(/\\s+/g, \" \").trim().toLowerCase()\n}\n\nfunction createSnippet(content: string, line: number): { lineEnd: number; lineStart: number; snippet: string } {\n const lines = content.split(\"\\n\")\n const lineIndex = Math.max(0, Math.min(lines.length - 1, line - 1))\n\n let lineStart = Math.max(1, line - snippetWindowBefore)\n let lineEnd = Math.min(lines.length, line + snippetWindowAfter)\n\n for (let i = lineIndex; i >= lineStart - 1; i -= 1) {\n if (lines[i]?.trim() === \"\") {\n lineStart = i + 2\n break\n }\n }\n\n for (let i = lineIndex; i <= lineEnd - 1; i += 1) {\n if (lines[i]?.trim() === \"\") {\n lineEnd = i\n break\n }\n }\n\n if (lineStart > lineEnd) {\n lineStart = line\n lineEnd = line\n }\n\n const snippet = lines.slice(lineStart - 1, lineEnd).join(\"\\n\").trimEnd()\n return { lineEnd, lineStart, snippet }\n}\n\nfunction classifyDocRecord(\n relativePath: string,\n component: ComponentDescriptor,\n content: string,\n): { kind: \"doc\" | \"reference\"; score: number } {\n const normalizedPath = toPosix(relativePath).toLowerCase()\n const componentPath = toPosix(component.componentPath).toLowerCase()\n const componentDir = path.posix.dirname(componentPath)\n const fileName = path.posix.basename(normalizedPath)\n const exportName = component.exportName.toLowerCase()\n const title = extractTitle(content)\n const normalizedTitle = title ? normalizeLine(title) : \"\"\n const componentToken = normalizeLine(component.exportName)\n\n const inComponentDir = normalizedPath.startsWith(`${componentDir}/`)\n const isReadme = fileName === \"readme.md\" || fileName === \"readme.mdx\"\n const isDocsLike = fileName.startsWith(\"docs.\") || fileName.endsWith(\".docs.md\") || fileName.endsWith(\".docs.mdx\")\n const fileContainsName = fileName.includes(exportName)\n const titleContainsName = normalizedTitle.includes(componentToken)\n\n if (inComponentDir && isReadme) {\n return { kind: \"doc\", score: 100 }\n }\n\n if (inComponentDir && isDocsLike) {\n return { kind: \"doc\", score: 95 }\n }\n\n if (inComponentDir) {\n return { kind: \"doc\", score: 90 }\n }\n\n if (fileContainsName || titleContainsName) {\n return { kind: \"doc\", score: 80 }\n }\n\n if (normalizedPath.includes(\"/docs/\") || normalizedPath.includes(\"/documentation/\")) {\n return { kind: \"reference\", score: 40 }\n }\n\n if (normalizedPath.includes(\"/storybook/\") || normalizedPath.includes(\".stories.\")) {\n return { kind: \"reference\", score: 35 }\n }\n\n return { kind: \"reference\", score: 20 }\n}\n\nexport async function analyzeStorybookDocs(\n projectRoot: string,\n components: ComponentDescriptor[],\n excludePaths: string[] = [],\n): Promise<Record<string, DocRecord[]>> {\n const files = await collectFiles({\n excludePaths,\n pattern: docsPattern,\n projectRoot,\n })\n const records: Record<string, DocRecord[]> = {}\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\")\n const title = extractTitle(content)\n const relativePath = toRelative(projectRoot, file)\n\n for (const component of components) {\n const classification = classifyDocRecord(relativePath, component, content)\n const componentPattern = new RegExp(`\\\\b${escapeRegex(component.exportName)}\\\\b`, \"gm\")\n const matches = [...content.matchAll(componentPattern)]\n\n const isFullDoc = classification.kind === \"doc\"\n\n if (!isFullDoc && matches.length === 0) {\n continue\n }\n\n if (!records[component.componentKey]) {\n records[component.componentKey] = []\n }\n\n if (isFullDoc) {\n const firstMatchIndex = typeof matches[0]?.index === \"number\" ? matches[0].index : 0\n const line = lineAt(content, firstMatchIndex)\n records[component.componentKey].push({\n content,\n docPath: relativePath,\n kind: \"doc\",\n lineEnd: line,\n lineStart: line,\n score: classification.score,\n title,\n })\n continue\n }\n\n const snippetMatches = matches.slice(0, maxReferenceSnippetsPerFile)\n for (const match of snippetMatches) {\n if (typeof match.index !== \"number\") {\n continue\n }\n\n const matchLine = lineAt(content, match.index)\n const snippet = createSnippet(content, matchLine)\n records[component.componentKey].push({\n docPath: relativePath,\n kind: \"reference\",\n lineEnd: snippet.lineEnd,\n lineStart: snippet.lineStart,\n score: classification.score,\n snippet: snippet.snippet,\n title,\n })\n }\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey] = records[componentKey].sort((a, b) => {\n if (a.score !== b.score) {\n return b.score - a.score\n }\n\n if (a.kind !== b.kind) {\n return a.kind === \"doc\" ? -1 : 1\n }\n\n if (a.docPath === b.docPath) {\n if (a.lineStart === b.lineStart) {\n return a.lineEnd - b.lineEnd\n }\n\n return a.lineStart - b.lineStart\n }\n\n return a.docPath.localeCompare(b.docPath)\n })\n }\n\n return records\n}\n"],"names":[],"mappings":"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","debugId":"0ce14f9a-c743-50b2-959b-559515b5fa6c"}
@@ -1 +1 @@
1
- {"version":3,"file":"storybook-stories.js","sources":["../../../src/code-analyzer/analyzers/storybook-stories.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport { collectFiles, toRelative, uniqueSorted } from \"./helpers.js\"\nimport { ComponentDescriptor, StoryRecord } from \"./types.js\"\n\nconst storiesPattern = \"**/*.stories.{ts,tsx,js,jsx,mdx}\"\n\nfunction inferCandidatesFromFile(storyPath: string): string[] {\n const fileName = path.basename(storyPath)\n const [baseName] = fileName.split(\".stories\")\n return uniqueSorted([baseName, baseName.replaceAll(/[-_]+(.)/g, (_, c: string) => c.toUpperCase())])\n}\n\nfunction inferCandidatesFromMeta(content: string): string[] {\n const titleMatch = content.match(/title\\s*:\\s*[\"']([^\"']+)[\"']/)\n if (!titleMatch?.[1]) {\n return []\n }\n\n const parts = titleMatch[1].split(\"/\").filter(Boolean)\n const maybeComponent = parts.at(-1)\n if (!maybeComponent) {\n return []\n }\n\n return [maybeComponent]\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction extractStoryExports(content: string): Array<{ lineEnd: number; lineStart: number; snippet: string; storyName: string }> {\n const exports = [...content.matchAll(/export\\s+(?:const|function)\\s+([A-Za-z0-9_]+)/g)].filter(\n match => match[1] !== \"default\",\n )\n\n return exports\n .map((match, index) => {\n const storyName = match[1]\n const start = match.index ?? 0\n const nextStart = exports[index + 1]?.index\n const endExclusive = typeof nextStart === \"number\" ? nextStart : content.length\n const snippet = content.slice(start, endExclusive).trim()\n\n return {\n lineEnd: lineAt(content, Math.max(start, endExclusive - 1)),\n lineStart: lineAt(content, start),\n snippet,\n storyName,\n }\n })\n .sort((a, b) => a.storyName.localeCompare(b.storyName))\n}\n\nexport async function analyzeStorybookStories(\n projectRoot: string,\n components: ComponentDescriptor[],\n excludePaths: string[] = [],\n): Promise<Record<string, StoryRecord[]>> {\n const files = await collectFiles({\n excludePaths,\n pattern: storiesPattern,\n projectRoot,\n })\n const byExportName = new Map(components.map(component => [component.exportName.toLowerCase(), component]))\n const records: Record<string, StoryRecord[]> = {}\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\")\n const stories = extractStoryExports(content)\n\n if (stories.length === 0) {\n continue\n }\n\n const relativePath = toRelative(projectRoot, file)\n const candidates = uniqueSorted([...inferCandidatesFromFile(relativePath), ...inferCandidatesFromMeta(content)])\n\n for (const candidate of candidates) {\n const component = byExportName.get(candidate.toLowerCase())\n if (!component) {\n continue\n }\n\n if (!records[component.componentKey]) {\n records[component.componentKey] = []\n }\n\n for (const story of stories) {\n records[component.componentKey].push({\n lineEnd: story.lineEnd,\n lineStart: story.lineStart,\n snippet: story.snippet,\n storyName: story.storyName,\n storyPath: relativePath,\n })\n }\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey] = records[componentKey].sort((a, b) => {\n if (a.storyPath === b.storyPath) {\n return a.lineStart - b.lineStart\n }\n\n return a.storyPath.localeCompare(b.storyPath)\n })\n }\n\n return records\n}\n"],"names":[],"mappings":"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","debug_id":"4689362b-19c7-5ab6-9737-f981273ed47f"}
1
+ {"version":3,"file":"storybook-stories.js","sources":["../../../src/code-analyzer/analyzers/storybook-stories.ts"],"sourceRoot":"","sourcesContent":["import { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport { collectFiles, toRelative, uniqueSorted } from \"./helpers.js\"\nimport { ComponentDescriptor, StoryRecord } from \"./types.js\"\n\nconst storiesPattern = \"**/*.stories.{ts,tsx,js,jsx,mdx}\"\n\nfunction inferCandidatesFromFile(storyPath: string): string[] {\n const fileName = path.basename(storyPath)\n const [baseName] = fileName.split(\".stories\")\n return uniqueSorted([baseName, baseName.replaceAll(/[-_]+(.)/g, (_, c: string) => c.toUpperCase())])\n}\n\nfunction inferCandidatesFromMeta(content: string): string[] {\n const titleMatch = content.match(/title\\s*:\\s*[\"']([^\"']+)[\"']/)\n if (!titleMatch?.[1]) {\n return []\n }\n\n const parts = titleMatch[1].split(\"/\").filter(Boolean)\n const maybeComponent = parts.at(-1)\n if (!maybeComponent) {\n return []\n }\n\n return [maybeComponent]\n}\n\nfunction lineAt(content: string, index: number): number {\n return content.slice(0, index).split(\"\\n\").length\n}\n\nfunction extractStoryExports(content: string): Array<{ lineEnd: number; lineStart: number; snippet: string; storyName: string }> {\n const exports = [...content.matchAll(/export\\s+(?:const|function)\\s+([A-Za-z0-9_]+)/g)].filter(\n match => match[1] !== \"default\",\n )\n\n return exports\n .map((match, index) => {\n const storyName = match[1]\n const start = match.index ?? 0\n const nextStart = exports[index + 1]?.index\n const endExclusive = typeof nextStart === \"number\" ? nextStart : content.length\n const snippet = content.slice(start, endExclusive).trim()\n\n return {\n lineEnd: lineAt(content, Math.max(start, endExclusive - 1)),\n lineStart: lineAt(content, start),\n snippet,\n storyName,\n }\n })\n .sort((a, b) => a.storyName.localeCompare(b.storyName))\n}\n\nexport async function analyzeStorybookStories(\n projectRoot: string,\n components: ComponentDescriptor[],\n excludePaths: string[] = [],\n): Promise<Record<string, StoryRecord[]>> {\n const files = await collectFiles({\n excludePaths,\n pattern: storiesPattern,\n projectRoot,\n })\n const byExportName = new Map(components.map(component => [component.exportName.toLowerCase(), component]))\n const records: Record<string, StoryRecord[]> = {}\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\")\n const stories = extractStoryExports(content)\n\n if (stories.length === 0) {\n continue\n }\n\n const relativePath = toRelative(projectRoot, file)\n const candidates = uniqueSorted([...inferCandidatesFromFile(relativePath), ...inferCandidatesFromMeta(content)])\n\n for (const candidate of candidates) {\n const component = byExportName.get(candidate.toLowerCase())\n if (!component) {\n continue\n }\n\n if (!records[component.componentKey]) {\n records[component.componentKey] = []\n }\n\n for (const story of stories) {\n records[component.componentKey].push({\n lineEnd: story.lineEnd,\n lineStart: story.lineStart,\n snippet: story.snippet,\n storyName: story.storyName,\n storyPath: relativePath,\n })\n }\n }\n }\n\n for (const componentKey of Object.keys(records)) {\n records[componentKey] = records[componentKey].sort((a, b) => {\n if (a.storyPath === b.storyPath) {\n return a.lineStart - b.lineStart\n }\n\n return a.storyPath.localeCompare(b.storyPath)\n })\n }\n\n return records\n}\n"],"names":[],"mappings":"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","debugId":"4689362b-19c7-5ab6-9737-f981273ed47f"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/code-analyzer/analyzers/types.ts"],"sourceRoot":"","sourcesContent":["export const analyzerNames = [\n \"static-components\",\n \"typescript-api\",\n \"storybook-stories\",\n \"storybook-docs\",\n \"jsdoc\",\n \"component-usage\",\n] as const\n\nexport type AnalyzerName = (typeof analyzerNames)[number]\n\nexport type AnalyzerStatus = \"done\" | \"warning\" | \"skipped\" | \"failed\"\n\nexport type ComponentDescriptor = {\n componentKey: string\n componentPath: string\n exportName: string\n}\n\nexport type ComponentApiProperty = {\n name: string\n required: boolean\n type: string\n}\n\nexport type LinkedTypeRecord = {\n definition: string\n lineEnd: number\n lineStart: number\n name: string\n sourcePath: string\n}\n\nexport type ComponentApiRecord = {\n linkedTypes?: LinkedTypeRecord[]\n props: ComponentApiProperty[]\n sourcePath: string\n}\n\nexport type StoryRecord = {\n lineEnd: number\n lineStart: number\n snippet: string\n storyName: string\n storyPath: string\n}\n\nexport type DocRecord = {\n content?: string\n docPath: string\n kind: \"doc\" | \"reference\"\n lineEnd: number\n lineStart: number\n score: number\n snippet?: string\n title?: string\n}\n\nexport type JsDocRecord = {\n description: string\n sourcePath: string\n}\n\nexport type UsageSnippet = {\n lineEnd: number\n lineStart: number\n sourcePath: string\n snippet: string\n}\n\nexport type PropValueUsage = {\n count: number\n value: string\n}\n\nexport type PropUsageRecord = {\n count: number\n values: PropValueUsage[]\n}\n\nexport type UsageRecord = {\n count: number\n files: string[]\n propUsage?: Record<string, PropUsageRecord>\n snippets: UsageSnippet[]\n}\n\nexport type StaticComponentAnalyzerResult = {\n components: ComponentDescriptor[]\n jsdocByComponentKey: Record<string, JsDocRecord>\n typescriptApiByComponentKey: Record<string, ComponentApiRecord>\n}\n\nexport type AnalyzerArtifacts = {\n componentUsage: Record<string, UsageRecord>\n jsdoc: Record<string, JsDocRecord>\n staticComponents: ComponentDescriptor[]\n storybookDocs: Record<string, DocRecord[]>\n storybookStories: Record<string, StoryRecord[]>\n typescriptApi: Record<string, ComponentApiRecord>\n}\n\nexport type AnalyzerRun = {\n analyzer: AnalyzerName\n durationMs: number\n finishedAt: string\n message?: string\n startedAt: string\n status: AnalyzerStatus\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,OAAO;IACP,iBAAiB;CACT,CAAA","debug_id":"e36afcef-a73e-5ed3-adab-f3ac7ee84e87"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/code-analyzer/analyzers/types.ts"],"sourceRoot":"","sourcesContent":["export const analyzerNames = [\n \"static-components\",\n \"typescript-api\",\n \"storybook-stories\",\n \"storybook-docs\",\n \"jsdoc\",\n \"component-usage\",\n] as const\n\nexport type AnalyzerName = (typeof analyzerNames)[number]\n\nexport type AnalyzerStatus = \"done\" | \"warning\" | \"skipped\" | \"failed\"\n\nexport type ComponentDescriptor = {\n componentKey: string\n componentPath: string\n exportName: string\n}\n\nexport type ComponentApiProperty = {\n name: string\n required: boolean\n type: string\n}\n\nexport type LinkedTypeRecord = {\n definition: string\n lineEnd: number\n lineStart: number\n name: string\n sourcePath: string\n}\n\nexport type ComponentApiRecord = {\n linkedTypes?: LinkedTypeRecord[]\n props: ComponentApiProperty[]\n sourcePath: string\n}\n\nexport type StoryRecord = {\n lineEnd: number\n lineStart: number\n snippet: string\n storyName: string\n storyPath: string\n}\n\nexport type DocRecord = {\n content?: string\n docPath: string\n kind: \"doc\" | \"reference\"\n lineEnd: number\n lineStart: number\n score: number\n snippet?: string\n title?: string\n}\n\nexport type JsDocRecord = {\n description: string\n sourcePath: string\n}\n\nexport type UsageSnippet = {\n lineEnd: number\n lineStart: number\n sourcePath: string\n snippet: string\n}\n\nexport type PropValueUsage = {\n count: number\n value: string\n}\n\nexport type PropUsageRecord = {\n count: number\n values: PropValueUsage[]\n}\n\nexport type UsageRecord = {\n count: number\n files: string[]\n propUsage?: Record<string, PropUsageRecord>\n snippets: UsageSnippet[]\n}\n\nexport type StaticComponentAnalyzerResult = {\n components: ComponentDescriptor[]\n jsdocByComponentKey: Record<string, JsDocRecord>\n typescriptApiByComponentKey: Record<string, ComponentApiRecord>\n}\n\nexport type AnalyzerArtifacts = {\n componentUsage: Record<string, UsageRecord>\n jsdoc: Record<string, JsDocRecord>\n staticComponents: ComponentDescriptor[]\n storybookDocs: Record<string, DocRecord[]>\n storybookStories: Record<string, StoryRecord[]>\n typescriptApi: Record<string, ComponentApiRecord>\n}\n\nexport type AnalyzerRun = {\n analyzer: AnalyzerName\n durationMs: number\n finishedAt: string\n message?: string\n startedAt: string\n status: AnalyzerStatus\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;IAChB,OAAO;IACP,iBAAiB;CACT,CAAA","debugId":"e36afcef-a73e-5ed3-adab-f3ac7ee84e87"}
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-api.js","sources":["../../../src/code-analyzer/analyzers/typescript-api.ts"],"sourceRoot":"","sourcesContent":["import { ComponentApiRecord, StaticComponentAnalyzerResult } from \"./types.js\"\n\nexport async function analyzeTypescriptApi(\n staticComponentsResult: StaticComponentAnalyzerResult,\n): Promise<Record<string, ComponentApiRecord>> {\n return staticComponentsResult.typescriptApiByComponentKey\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,sBAAqD;IAErD,OAAO,sBAAsB,CAAC,2BAA2B,CAAA;AAC3D,CAAC","debug_id":"ee0feb56-41c1-5764-bbe2-8aaa2d9cee89"}
1
+ {"version":3,"file":"typescript-api.js","sources":["../../../src/code-analyzer/analyzers/typescript-api.ts"],"sourceRoot":"","sourcesContent":["import { ComponentApiRecord, StaticComponentAnalyzerResult } from \"./types.js\"\n\nexport async function analyzeTypescriptApi(\n staticComponentsResult: StaticComponentAnalyzerResult,\n): Promise<Record<string, ComponentApiRecord>> {\n return staticComponentsResult.typescriptApiByComponentKey\n}\n"],"names":[],"mappings":";;AAEA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,sBAAqD;IAErD,OAAO,sBAAsB,CAAC,2BAA2B,CAAA;AAC3D,CAAC","debugId":"ee0feb56-41c1-5764-bbe2-8aaa2d9cee89"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sources":["../../../src/code-analyzer/components/analyze.ts"],"sourceRoot":"","sourcesContent":["import { globSync } from \"glob\"\nimport path from \"node:path\"\nimport * as ts from \"typescript\"\n\nimport { mapToSupernovaComponent } from \"./mappers/component.js\"\nimport { defaultOptions, ModuleParser } from \"./parser/index.js\"\nimport { Component } from \"./types.js\"\nimport { getModuleEntryPath } from \"./utils/get-module-exports-path.js\"\n\ntype Input = {\n /**\n * Where to import components from within the package\n */\n importFrom: string\n\n /**\n * Root directory of the package where the import should resolve from\n */\n rootDir: string\n}\n\n/**\n * Finds and parses a tsconfig.json file from a specific directory\n */\nfunction findAndParseTsConfig(directory: string): ts.ParsedCommandLine | undefined {\n const tsconfigPath = path.join(directory, \"tsconfig.json\")\n\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile)\n\n if (configFile.error) {\n return undefined\n }\n\n return ts.parseJsonConfigFileContent(configFile.config, ts.sys, directory, undefined, tsconfigPath)\n}\n\nasync function getDefaultFiles(rootDir: string) {\n return globSync(\"**/*.{ts,tsx}\", {\n absolute: true,\n cwd: rootDir,\n ignore: [\"dist\", \"build\", \"node_modules\"],\n })\n}\n\nexport async function analyzeComponents(input: Input): Promise<Component[]> {\n // Construct the module path\n const entryFilePath = await getModuleEntryPath(input.rootDir, input.importFrom)\n\n const tsConfig = findAndParseTsConfig(input.rootDir)\n\n const isNodeModuleImport = entryFilePath.includes(\"/node_modules/\")\n\n // inlcude ts files defined in tsConfig. If not, include all ts and tsx files in the root dir\n const discoveredTsFiles =\n tsConfig?.fileNames.length && !isNodeModuleImport\n ? tsConfig.fileNames\n : await getDefaultFiles(isNodeModuleImport ? `${input.rootDir}/node_modules` : input.rootDir)\n const tsFiles = discoveredTsFiles.includes(entryFilePath) ? discoveredTsFiles : [entryFilePath, ...discoveredTsFiles]\n\n const program = ts.createProgram(tsFiles, tsConfig?.options ?? defaultOptions)\n\n const moduleParser = new ModuleParser(program, entryFilePath)\n const moduleComponentsInfo = moduleParser.parseModule()\n\n return moduleComponentsInfo.map(componentInfo => mapToSupernovaComponent(componentInfo, path.dirname(entryFilePath)))\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAiBvE,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;IAE1D,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;AACrG,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,OAAO,QAAQ,CAAC,eAAe,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC;KAC1C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAY;IAElD,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAE/E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEpD,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAGnE,MAAM,iBAAiB,GACrB,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB;QAC/C,CAAC,CAAC,QAAQ,CAAC,SAAS;QACpB,CAAC,CAAC,MAAM,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjG,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,iBAAiB,CAAC,CAAA;IAErH,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,cAAc,CAAC,CAAA;IAE9E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC7D,MAAM,oBAAoB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;IAEvD,OAAO,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AACvH,CAAC","debug_id":"704550dc-53b0-515d-9357-8888cdbe85bf"}
1
+ {"version":3,"file":"analyze.js","sources":["../../../src/code-analyzer/components/analyze.ts"],"sourceRoot":"","sourcesContent":["import { globSync } from \"glob\"\nimport path from \"node:path\"\nimport * as ts from \"typescript\"\n\nimport { mapToSupernovaComponent } from \"./mappers/component.js\"\nimport { defaultOptions, ModuleParser } from \"./parser/index.js\"\nimport { Component } from \"./types.js\"\nimport { getModuleEntryPath } from \"./utils/get-module-exports-path.js\"\n\ntype Input = {\n /**\n * Where to import components from within the package\n */\n importFrom: string\n\n /**\n * Root directory of the package where the import should resolve from\n */\n rootDir: string\n}\n\n/**\n * Finds and parses a tsconfig.json file from a specific directory\n */\nfunction findAndParseTsConfig(directory: string): ts.ParsedCommandLine | undefined {\n const tsconfigPath = path.join(directory, \"tsconfig.json\")\n\n const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile)\n\n if (configFile.error) {\n return undefined\n }\n\n return ts.parseJsonConfigFileContent(configFile.config, ts.sys, directory, undefined, tsconfigPath)\n}\n\nasync function getDefaultFiles(rootDir: string) {\n return globSync(\"**/*.{ts,tsx}\", {\n absolute: true,\n cwd: rootDir,\n ignore: [\"dist\", \"build\", \"node_modules\"],\n })\n}\n\nexport async function analyzeComponents(input: Input): Promise<Component[]> {\n // Construct the module path\n const entryFilePath = await getModuleEntryPath(input.rootDir, input.importFrom)\n\n const tsConfig = findAndParseTsConfig(input.rootDir)\n\n const isNodeModuleImport = entryFilePath.includes(\"/node_modules/\")\n\n // inlcude ts files defined in tsConfig. If not, include all ts and tsx files in the root dir\n const discoveredTsFiles =\n tsConfig?.fileNames.length && !isNodeModuleImport\n ? tsConfig.fileNames\n : await getDefaultFiles(isNodeModuleImport ? `${input.rootDir}/node_modules` : input.rootDir)\n const tsFiles = discoveredTsFiles.includes(entryFilePath) ? discoveredTsFiles : [entryFilePath, ...discoveredTsFiles]\n\n const program = ts.createProgram(tsFiles, tsConfig?.options ?? defaultOptions)\n\n const moduleParser = new ModuleParser(program, entryFilePath)\n const moduleComponentsInfo = moduleParser.parseModule()\n\n return moduleComponentsInfo.map(componentInfo => mapToSupernovaComponent(componentInfo, path.dirname(entryFilePath)))\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAiBvE,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;IAE1D,MAAM,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,EAAE,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;AACrG,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAe;IAC5C,OAAO,QAAQ,CAAC,eAAe,EAAE;QAC/B,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC;KAC1C,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAY;IAElD,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;IAE/E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEpD,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAGnE,MAAM,iBAAiB,GACrB,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,kBAAkB;QAC/C,CAAC,CAAC,QAAQ,CAAC,SAAS;QACpB,CAAC,CAAC,MAAM,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjG,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,iBAAiB,CAAC,CAAA;IAErH,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,cAAc,CAAC,CAAA;IAE9E,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC7D,MAAM,oBAAoB,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;IAEvD,OAAO,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AACvH,CAAC","debugId":"704550dc-53b0-515d-9357-8888cdbe85bf"}
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../../../src/code-analyzer/components/mappers/component.ts"],"sourceRoot":"","sourcesContent":["import { ComponentDoc } from \"../parser/types.js\"\nimport { Component, ComponentProperty } from \"../types.js\"\nimport { mapToSupernovaProperty } from \"./property.js\"\nimport path from \"node:path\"\n\n/**\n * Maps docgen results to supernova component\n */\nexport function mapToSupernovaComponent(component: ComponentDoc, entryPath: string): Component {\n return {\n exportName: component.exportName,\n description: component.description,\n tags: component.tags ?? null,\n componentPath: path.relative(entryPath, component.filePath),\n properties: Object.entries(component.props).reduce(\n (acc, [name, property]) => {\n if (property.name !== \"key\") {\n // skip react key prop\n acc[name] = mapToSupernovaProperty(property, entryPath)\n }\n\n return acc\n },\n {} as Record<string, ComponentProperty>,\n ),\n }\n}\n"],"names":[],"mappings":";;AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,MAAM,UAAU,uBAAuB,CAAC,SAAuB,EAAE,SAAiB;IAChF,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,IAAI;QAC5B,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC3D,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;YACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAE5B,GAAG,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YACzD,CAAC;YAED,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAAuC,CACxC;KACF,CAAA;AACH,CAAC","debug_id":"566e4b83-5d2e-5906-b97d-7d50b06c7e23"}
1
+ {"version":3,"file":"component.js","sources":["../../../../src/code-analyzer/components/mappers/component.ts"],"sourceRoot":"","sourcesContent":["import { ComponentDoc } from \"../parser/types.js\"\nimport { Component, ComponentProperty } from \"../types.js\"\nimport { mapToSupernovaProperty } from \"./property.js\"\nimport path from \"node:path\"\n\n/**\n * Maps docgen results to supernova component\n */\nexport function mapToSupernovaComponent(component: ComponentDoc, entryPath: string): Component {\n return {\n exportName: component.exportName,\n description: component.description,\n tags: component.tags ?? null,\n componentPath: path.relative(entryPath, component.filePath),\n properties: Object.entries(component.props).reduce(\n (acc, [name, property]) => {\n if (property.name !== \"key\") {\n // skip react key prop\n acc[name] = mapToSupernovaProperty(property, entryPath)\n }\n\n return acc\n },\n {} as Record<string, ComponentProperty>,\n ),\n }\n}\n"],"names":[],"mappings":";;AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,MAAM,UAAU,uBAAuB,CAAC,SAAuB,EAAE,SAAiB;IAChF,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,IAAI;QAC5B,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC3D,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;YACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAE5B,GAAG,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YACzD,CAAC;YAED,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAAuC,CACxC;KACF,CAAA;AACH,CAAC","debugId":"566e4b83-5d2e-5906-b97d-7d50b06c7e23"}
@@ -1 +1 @@
1
- {"version":3,"file":"property.js","sources":["../../../../src/code-analyzer/components/mappers/property.ts"],"sourceRoot":"","sourcesContent":["import path from \"node:path\"\nimport { PropItem } from \"../parser/types.js\"\nimport { ComponentProperty } from \"../types.js\"\n\nexport function mapToSupernovaProperty(property: PropItem, entryPath: string): ComponentProperty {\n return {\n defaultValue: property.defaultValue?.value,\n name: property.name,\n required: property.required,\n description: property.description,\n type: property.resolvedType,\n tags: property.tags,\n declarations: property.declarations?.map(declaration => ({\n ...declaration,\n fileName: path.relative(entryPath, declaration.fileName),\n })),\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,MAAM,UAAU,sBAAsB,CAAC,QAAkB,EAAE,SAAiB;IAC1E,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK;QAC1C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,QAAQ,CAAC,YAAY;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvD,GAAG,WAAW;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC;SACzD,CAAC,CAAC;KACJ,CAAA;AACH,CAAC","debug_id":"4509b925-b6a0-5733-bc8b-ff7b6007813f"}
1
+ {"version":3,"file":"property.js","sources":["../../../../src/code-analyzer/components/mappers/property.ts"],"sourceRoot":"","sourcesContent":["import path from \"node:path\"\nimport { PropItem } from \"../parser/types.js\"\nimport { ComponentProperty } from \"../types.js\"\n\nexport function mapToSupernovaProperty(property: PropItem, entryPath: string): ComponentProperty {\n return {\n defaultValue: property.defaultValue?.value,\n name: property.name,\n required: property.required,\n description: property.description,\n type: property.resolvedType,\n tags: property.tags,\n declarations: property.declarations?.map(declaration => ({\n ...declaration,\n fileName: path.relative(entryPath, declaration.fileName),\n })),\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,MAAM,UAAU,sBAAsB,CAAC,QAAkB,EAAE,SAAiB;IAC1E,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,KAAK;QAC1C,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,IAAI,EAAE,QAAQ,CAAC,YAAY;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACvD,GAAG,WAAW;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC;SACzD,CAAC,CAAC;KACJ,CAAA;AACH,CAAC","debugId":"4509b925-b6a0-5733-bc8b-ff7b6007813f"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/code-analyzer/components/parser/index.ts"],"sourceRoot":"","sourcesContent":["/**\n * These files were adapted from https://github.com/styleguidist/react-docgen-typescript\n * with adjustments and additions for our specific needs.\n */\n\nexport * from \"./module-parser.js\"\nexport * from \"./parser.js\"\n\nexport * from \"./types.js\"\n\nexport * from \"./utils/filter-duplicates.js\"\n\nexport * from \"./utils/is-react-component.js\"\n"],"names":[],"mappings":";;AAKA,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAE3B,cAAc,YAAY,CAAA;AAE1B,cAAc,8BAA8B,CAAA;AAE5C,cAAc,+BAA+B,CAAA","debug_id":"bb8db7f1-b961-5eca-a419-07bf2ed174d7"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/code-analyzer/components/parser/index.ts"],"sourceRoot":"","sourcesContent":["/**\n * These files were adapted from https://github.com/styleguidist/react-docgen-typescript\n * with adjustments and additions for our specific needs.\n */\n\nexport * from \"./module-parser.js\"\nexport * from \"./parser.js\"\n\nexport * from \"./types.js\"\n\nexport * from \"./utils/filter-duplicates.js\"\n\nexport * from \"./utils/is-react-component.js\"\n"],"names":[],"mappings":";;AAKA,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAE3B,cAAc,YAAY,CAAA;AAE1B,cAAc,8BAA8B,CAAA;AAE5C,cAAc,+BAA+B,CAAA","debugId":"bb8db7f1-b961-5eca-a419-07bf2ed174d7"}
@@ -1 +1 @@
1
- {"version":3,"file":"module-parser.js","sources":["../../../../src/code-analyzer/components/parser/module-parser.ts"],"sourceRoot":"","sourcesContent":["import * as fs from \"node:fs\"\nimport path from \"node:path\"\nimport * as ts from \"typescript\"\n\nimport { Parser } from \"./parser.js\"\nimport { ComponentDoc } from \"./types.js\"\nimport { filterDuplicates } from \"./utils/filter-duplicates.js\"\n\n/**\n * resolve module path from the import whenever it is file or submodule\n */\nfunction resolveModulePath(basePath: string, modulePath: string) {\n const resolvedPath = path.resolve(path.dirname(basePath), modulePath)\n\n if (fs.existsSync(resolvedPath)) {\n const stats = fs.statSync(resolvedPath)\n if (stats.isDirectory()) {\n // Find index file in directory\n const dirContents = fs.readdirSync(resolvedPath)\n const indexFile = dirContents.find(file => file.startsWith(\"index.\"))\n if (indexFile) {\n return path.join(resolvedPath, indexFile)\n }\n\n return null\n }\n }\n\n // Find file with matching name but different extension\n const dir = path.dirname(resolvedPath)\n const basename = path.basename(resolvedPath)\n if (fs.existsSync(dir)) {\n const dirContents = fs.readdirSync(dir)\n const matchingFile = dirContents.find(file => file.match(new RegExp(`^${basename}.tsx?$`)))\n if (matchingFile) {\n return path.join(dir, matchingFile)\n }\n }\n\n return null\n}\n\nexport class ModuleParser {\n private checker: ts.TypeChecker\n private entryFilePath: string\n private parser: Parser\n private program: ts.Program\n\n constructor(program: ts.Program, entryFilePath: string) {\n this.program = program\n this.parser = new Parser(program, {})\n this.entryFilePath = entryFilePath\n this.checker = program.getTypeChecker()\n }\n\n public parseModule(): ComponentDoc[] {\n const sourceFile = this.program.getSourceFile(this.entryFilePath)\n\n if (!sourceFile) {\n throw new Error(`Could not find source file for path ${this.entryFilePath}`)\n }\n\n const componentsInfo = this.parseFile(sourceFile)\n return filterDuplicates(componentsInfo)\n }\n\n private parseFile(scannedSource: ts.SourceFile): ComponentDoc[] {\n const componentsInfo: ComponentDoc[] = []\n\n const moduleSymbol = this.checker.getSymbolAtLocation(scannedSource)\n if (!moduleSymbol) {\n throw new Error(`Could not find module symbol for source file: ${scannedSource.fileName}`)\n }\n\n // iterate through file symbols. We cannot use just getModuleExports. It don't show all exports. This is more reliable.\n ts.forEachChild(scannedSource, node => {\n // Handle named exports (export { X })\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const exportSpecifier of node.exportClause.elements) {\n const symbol = this.checker.getSymbolAtLocation(exportSpecifier.name)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n }\n\n return\n }\n\n // Handle direct exports of functions and classes (export class X, export const X, etc)\n if ((ts.isClassDeclaration(node) || ts.isFunctionDeclaration(node)) && hasExportModifier(node)) {\n const symbol = node.name ? this.checker.getSymbolAtLocation(node.name) : undefined\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n\n return\n }\n\n // handle direct export of variables, e.g. export const X\n if (ts.isVariableStatement(node) && hasExportModifier(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n const symbol = this.checker.getSymbolAtLocation(declaration.name)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n }\n }\n\n return\n }\n\n // Handle default exports (export default X)\n if (ts.isExportAssignment(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.expression)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n\n return\n }\n\n // Handle re-exports (export * from 'module')\n if (ts.isExportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {\n const modulePath = node.moduleSpecifier.text\n\n // star export = export * from 'module'\n const isStarExport = !node.exportClause || ts.isNamespaceExport(node.exportClause)\n\n if (!isStarExport) {\n return\n }\n\n const resolvedPath = resolveModulePath(scannedSource.fileName, modulePath)\n if (!resolvedPath || !fs.existsSync(resolvedPath)) {\n // ignore star export if module path does not exist\n return\n }\n\n const newScannedSource = this.program.getSourceFile(resolvedPath)\n if (newScannedSource) {\n const newComponents = this.parseFile(newScannedSource)\n componentsInfo.push(...newComponents)\n }\n }\n })\n\n return componentsInfo\n }\n}\n\n// Helper function to check if node has export modifier\nfunction hasExportModifier(node: ts.Node): boolean {\n return (ts.canHaveModifiers(node) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword)) || false\n}\n"],"names":[],"mappings":"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","debug_id":"7d3a3281-a8cb-50f9-a44c-29a0855836d6"}
1
+ {"version":3,"file":"module-parser.js","sources":["../../../../src/code-analyzer/components/parser/module-parser.ts"],"sourceRoot":"","sourcesContent":["import * as fs from \"node:fs\"\nimport path from \"node:path\"\nimport * as ts from \"typescript\"\n\nimport { Parser } from \"./parser.js\"\nimport { ComponentDoc } from \"./types.js\"\nimport { filterDuplicates } from \"./utils/filter-duplicates.js\"\n\n/**\n * resolve module path from the import whenever it is file or submodule\n */\nfunction resolveModulePath(basePath: string, modulePath: string) {\n const resolvedPath = path.resolve(path.dirname(basePath), modulePath)\n\n if (fs.existsSync(resolvedPath)) {\n const stats = fs.statSync(resolvedPath)\n if (stats.isDirectory()) {\n // Find index file in directory\n const dirContents = fs.readdirSync(resolvedPath)\n const indexFile = dirContents.find(file => file.startsWith(\"index.\"))\n if (indexFile) {\n return path.join(resolvedPath, indexFile)\n }\n\n return null\n }\n }\n\n // Find file with matching name but different extension\n const dir = path.dirname(resolvedPath)\n const basename = path.basename(resolvedPath)\n if (fs.existsSync(dir)) {\n const dirContents = fs.readdirSync(dir)\n const matchingFile = dirContents.find(file => file.match(new RegExp(`^${basename}.tsx?$`)))\n if (matchingFile) {\n return path.join(dir, matchingFile)\n }\n }\n\n return null\n}\n\nexport class ModuleParser {\n private checker: ts.TypeChecker\n private entryFilePath: string\n private parser: Parser\n private program: ts.Program\n\n constructor(program: ts.Program, entryFilePath: string) {\n this.program = program\n this.parser = new Parser(program, {})\n this.entryFilePath = entryFilePath\n this.checker = program.getTypeChecker()\n }\n\n public parseModule(): ComponentDoc[] {\n const sourceFile = this.program.getSourceFile(this.entryFilePath)\n\n if (!sourceFile) {\n throw new Error(`Could not find source file for path ${this.entryFilePath}`)\n }\n\n const componentsInfo = this.parseFile(sourceFile)\n return filterDuplicates(componentsInfo)\n }\n\n private parseFile(scannedSource: ts.SourceFile): ComponentDoc[] {\n const componentsInfo: ComponentDoc[] = []\n\n const moduleSymbol = this.checker.getSymbolAtLocation(scannedSource)\n if (!moduleSymbol) {\n throw new Error(`Could not find module symbol for source file: ${scannedSource.fileName}`)\n }\n\n // iterate through file symbols. We cannot use just getModuleExports. It don't show all exports. This is more reliable.\n ts.forEachChild(scannedSource, node => {\n // Handle named exports (export { X })\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const exportSpecifier of node.exportClause.elements) {\n const symbol = this.checker.getSymbolAtLocation(exportSpecifier.name)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n }\n\n return\n }\n\n // Handle direct exports of functions and classes (export class X, export const X, etc)\n if ((ts.isClassDeclaration(node) || ts.isFunctionDeclaration(node)) && hasExportModifier(node)) {\n const symbol = node.name ? this.checker.getSymbolAtLocation(node.name) : undefined\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n\n return\n }\n\n // handle direct export of variables, e.g. export const X\n if (ts.isVariableStatement(node) && hasExportModifier(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n const symbol = this.checker.getSymbolAtLocation(declaration.name)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n }\n }\n\n return\n }\n\n // Handle default exports (export default X)\n if (ts.isExportAssignment(node)) {\n const symbol = this.checker.getSymbolAtLocation(node.expression)\n if (symbol) {\n componentsInfo.push(...this.parser.parseExportSymbol(symbol, scannedSource))\n }\n\n return\n }\n\n // Handle re-exports (export * from 'module')\n if (ts.isExportDeclaration(node) && node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {\n const modulePath = node.moduleSpecifier.text\n\n // star export = export * from 'module'\n const isStarExport = !node.exportClause || ts.isNamespaceExport(node.exportClause)\n\n if (!isStarExport) {\n return\n }\n\n const resolvedPath = resolveModulePath(scannedSource.fileName, modulePath)\n if (!resolvedPath || !fs.existsSync(resolvedPath)) {\n // ignore star export if module path does not exist\n return\n }\n\n const newScannedSource = this.program.getSourceFile(resolvedPath)\n if (newScannedSource) {\n const newComponents = this.parseFile(newScannedSource)\n componentsInfo.push(...newComponents)\n }\n }\n })\n\n return componentsInfo\n }\n}\n\n// Helper function to check if node has export modifier\nfunction hasExportModifier(node: ts.Node): boolean {\n return (ts.canHaveModifiers(node) && node.modifiers?.some(mod => mod.kind === ts.SyntaxKind.ExportKeyword)) || false\n}\n"],"names":[],"mappings":"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","debugId":"7d3a3281-a8cb-50f9-a44c-29a0855836d6"}