@fragments-sdk/cli 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +77 -14
- package/dist/bin.js +247 -247
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-CVXKXVOY.js → chunk-3T6QL7IY.js} +47 -29
- package/dist/chunk-3T6QL7IY.js.map +1 -0
- package/dist/{chunk-7OPWMLOE.js → chunk-7KUSBMI4.js} +114 -112
- package/dist/chunk-7KUSBMI4.js.map +1 -0
- package/dist/{chunk-XHUDJNN3.js → chunk-DH4ETVSM.js} +18 -18
- package/dist/chunk-DH4ETVSM.js.map +1 -0
- package/dist/{chunk-RVRTRESS.js → chunk-DQHWLAUV.js} +29 -29
- package/dist/chunk-DQHWLAUV.js.map +1 -0
- package/dist/{chunk-6JBGU74P.js → chunk-GHYYFAQN.js} +23 -23
- package/dist/chunk-GHYYFAQN.js.map +1 -0
- package/dist/{chunk-NWQ4CJOQ.js → chunk-GKX2HPZ6.js} +40 -40
- package/dist/chunk-GKX2HPZ6.js.map +1 -0
- package/dist/{chunk-TJ34N7C7.js → chunk-OOGTG5FM.js} +34 -33
- package/dist/chunk-OOGTG5FM.js.map +1 -0
- package/dist/{core-W2HYIQW6.js → core-UQXZTBFZ.js} +24 -26
- package/dist/{generate-LMTISDIJ.js → generate-GP6ZLAQB.js} +5 -5
- package/dist/generate-GP6ZLAQB.js.map +1 -0
- package/dist/index.d.ts +23 -27
- package/dist/index.js +10 -10
- package/dist/{init-7CHRKQ7P.js → init-W72WBSU2.js} +5 -5
- package/dist/{init-7CHRKQ7P.js.map → init-W72WBSU2.js.map} +1 -1
- package/dist/mcp-bin.js +73 -73
- package/dist/mcp-bin.js.map +1 -1
- package/dist/scan-V54HWRDY.js +12 -0
- package/dist/{service-T2L7VLTE.js → service-PVGTYUKX.js} +6 -6
- package/dist/{static-viewer-GBR7YNF3.js → static-viewer-KILKIVN7.js} +4 -4
- package/dist/{test-OJRXNDO2.js → test-3YRYQRGV.js} +19 -19
- package/dist/test-3YRYQRGV.js.map +1 -0
- package/dist/{tokens-3BWDESVM.js → tokens-IXSQHPQK.js} +5 -5
- package/dist/{viewer-SUFOISZM.js → viewer-K42REJU2.js} +199 -199
- package/dist/viewer-K42REJU2.js.map +1 -0
- package/package.json +13 -2
- package/src/ai.ts +5 -5
- package/src/analyze.ts +11 -11
- package/src/bin.ts +1 -1
- package/src/build.ts +37 -35
- package/src/commands/a11y.ts +6 -6
- package/src/commands/add.ts +11 -11
- package/src/commands/audit.ts +4 -4
- package/src/commands/baseline.ts +3 -3
- package/src/commands/build.ts +8 -8
- package/src/commands/compare.ts +20 -20
- package/src/commands/context.ts +16 -16
- package/src/commands/enhance.ts +36 -36
- package/src/commands/generate.ts +1 -1
- package/src/commands/graph.ts +5 -5
- package/src/commands/init.ts +1 -1
- package/src/commands/link/figma.ts +82 -82
- package/src/commands/link/index.ts +3 -3
- package/src/commands/link/storybook.ts +9 -9
- package/src/commands/list.ts +2 -2
- package/src/commands/reset.ts +15 -15
- package/src/commands/scan.ts +27 -27
- package/src/commands/storygen.ts +24 -24
- package/src/commands/validate.ts +2 -2
- package/src/commands/verify.ts +8 -8
- package/src/core/auto-props.ts +4 -4
- package/src/core/composition.test.ts +36 -36
- package/src/core/composition.ts +19 -19
- package/src/core/config.ts +6 -6
- package/src/core/{defineSegment.ts → defineFragment.ts} +16 -22
- package/src/core/discovery.ts +6 -6
- package/src/core/figma.ts +2 -2
- package/src/core/graph-extractor.test.ts +77 -77
- package/src/core/graph-extractor.ts +32 -32
- package/src/core/importAnalyzer.ts +1 -1
- package/src/core/index.ts +22 -23
- package/src/core/loader.ts +21 -24
- package/src/core/node.ts +5 -5
- package/src/core/parser.ts +71 -31
- package/src/core/previewLoader.ts +1 -1
- package/src/core/schema.ts +16 -16
- package/src/core/storyAdapter.test.ts +87 -87
- package/src/core/storyAdapter.ts +16 -16
- package/src/core/token-parser.ts +9 -1
- package/src/core/types.ts +21 -26
- package/src/diff.ts +22 -22
- package/src/index.ts +2 -2
- package/src/mcp/server.ts +80 -80
- package/src/migrate/__tests__/utils/utils.test.ts +3 -3
- package/src/migrate/bin.ts +4 -4
- package/src/migrate/converter.ts +16 -16
- package/src/migrate/index.ts +3 -3
- package/src/migrate/migrate.ts +3 -3
- package/src/migrate/parser.ts +8 -8
- package/src/migrate/report.ts +2 -2
- package/src/migrate/types.ts +4 -4
- package/src/screenshot.ts +22 -22
- package/src/service/__tests__/props-extractor.test.ts +15 -15
- package/src/service/analytics.ts +39 -39
- package/src/service/enhance/codebase-scanner.ts +1 -1
- package/src/service/enhance/index.ts +1 -1
- package/src/service/enhance/props-extractor.ts +2 -2
- package/src/service/enhance/types.ts +2 -2
- package/src/service/index.ts +2 -2
- package/src/service/metrics-store.ts +1 -1
- package/src/service/patch-generator.ts +1 -1
- package/src/setup.ts +52 -52
- package/src/shared/dev-server-client.ts +7 -7
- package/src/shared/fragment-loader.ts +59 -0
- package/src/shared/index.ts +1 -1
- package/src/shared/types.ts +4 -4
- package/src/static-viewer.ts +35 -35
- package/src/test/discovery.ts +6 -6
- package/src/test/index.ts +5 -5
- package/src/test/reporters/console.ts +1 -1
- package/src/test/reporters/junit.ts +1 -1
- package/src/test/runner.ts +7 -7
- package/src/test/types.ts +3 -3
- package/src/test/watch.ts +9 -9
- package/src/validators.ts +26 -26
- package/src/viewer/__tests__/render-utils.test.ts +28 -28
- package/src/viewer/__tests__/viewer-integration.test.ts +4 -4
- package/src/viewer/cli/health.ts +26 -26
- package/src/viewer/components/App.tsx +79 -79
- package/src/viewer/components/BottomPanel.tsx +17 -17
- package/src/viewer/components/CodePanel.tsx +3 -3
- package/src/viewer/components/CommandPalette.tsx +11 -11
- package/src/viewer/components/ComponentGraph.tsx +28 -28
- package/src/viewer/components/ComponentHeader.tsx +2 -2
- package/src/viewer/components/ContractPanel.tsx +6 -6
- package/src/viewer/components/FigmaEmbed.tsx +9 -9
- package/src/viewer/components/HealthDashboard.tsx +17 -17
- package/src/viewer/components/InteractionsPanel.tsx +2 -2
- package/src/viewer/components/IsolatedPreviewFrame.tsx +6 -6
- package/src/viewer/components/IsolatedRender.tsx +10 -10
- package/src/viewer/components/LeftSidebar.tsx +28 -28
- package/src/viewer/components/MultiViewportPreview.tsx +14 -14
- package/src/viewer/components/PreviewArea.tsx +11 -11
- package/src/viewer/components/PreviewFrameHost.tsx +51 -51
- package/src/viewer/components/RightSidebar.tsx +9 -9
- package/src/viewer/components/Sidebar.tsx +17 -17
- package/src/viewer/components/StoryRenderer.tsx +2 -2
- package/src/viewer/components/TokenStylePanel.tsx +1 -1
- package/src/viewer/components/UsageSection.tsx +2 -2
- package/src/viewer/components/VariantMatrix.tsx +11 -11
- package/src/viewer/components/VariantRenderer.tsx +3 -3
- package/src/viewer/components/VariantTabs.tsx +2 -2
- package/src/viewer/components/_future/CreatePage.tsx +6 -6
- package/src/viewer/composition-renderer.ts +11 -11
- package/src/viewer/entry.tsx +40 -40
- package/src/viewer/hooks/useFigmaIntegration.ts +1 -1
- package/src/viewer/hooks/usePreviewBridge.ts +5 -5
- package/src/viewer/hooks/useUrlState.ts +6 -6
- package/src/viewer/index.ts +2 -2
- package/src/viewer/intelligence/healthReport.ts +17 -17
- package/src/viewer/intelligence/styleDrift.ts +1 -1
- package/src/viewer/intelligence/usageScanner.ts +1 -1
- package/src/viewer/render-template.html +1 -1
- package/src/viewer/render-utils.ts +21 -21
- package/src/viewer/server.ts +18 -18
- package/src/viewer/utils/detectRelationships.ts +22 -22
- package/src/viewer/vite-plugin.ts +213 -213
- package/dist/chunk-6JBGU74P.js.map +0 -1
- package/dist/chunk-7OPWMLOE.js.map +0 -1
- package/dist/chunk-CVXKXVOY.js.map +0 -1
- package/dist/chunk-NWQ4CJOQ.js.map +0 -1
- package/dist/chunk-RVRTRESS.js.map +0 -1
- package/dist/chunk-TJ34N7C7.js.map +0 -1
- package/dist/chunk-XHUDJNN3.js.map +0 -1
- package/dist/generate-LMTISDIJ.js.map +0 -1
- package/dist/scan-WY23TJCP.js +0 -12
- package/dist/test-OJRXNDO2.js.map +0 -1
- package/dist/viewer-SUFOISZM.js.map +0 -1
- package/src/shared/segment-loader.ts +0 -59
- /package/dist/{core-W2HYIQW6.js.map → core-UQXZTBFZ.js.map} +0 -0
- /package/dist/{scan-WY23TJCP.js.map → scan-V54HWRDY.js.map} +0 -0
- /package/dist/{service-T2L7VLTE.js.map → service-PVGTYUKX.js.map} +0 -0
- /package/dist/{static-viewer-GBR7YNF3.js.map → static-viewer-KILKIVN7.js.map} +0 -0
- /package/dist/{tokens-3BWDESVM.js.map → tokens-IXSQHPQK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/static-viewer.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { CompiledFragmentsFile } from \"./core/index.js\";\nimport { BRAND } from \"./core/index.js\";\n\n/**\n * Generate a static HTML viewer for the fragments.json file.\n * This viewer shows component documentation without needing to render actual components.\n */\nexport function generateStaticViewer(data: CompiledFragmentsFile): string {\n const fragments = Object.values(data.fragments);\n\n // Group by category\n const categories = new Map<string, typeof fragments>();\n for (const fragment of fragments) {\n const category = fragment.meta.category ?? \"Uncategorized\";\n if (!categories.has(category)) {\n categories.set(category, []);\n }\n categories.get(category)!.push(fragment);\n }\n\n // Sort categories and components\n const sortedCategories = Array.from(categories.entries()).sort((a, b) =>\n a[0].localeCompare(b[0])\n );\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${BRAND.name} - Design System Viewer</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\" rel=\"stylesheet\">\n <style>\n :root {\n --bg-primary: #0a0a0f;\n --bg-secondary: #12121a;\n --bg-tertiary: #1a1a24;\n --bg-hover: #22222e;\n --border-color: #2a2a3a;\n --text-primary: #f5f5f7;\n --text-secondary: #a0a0b0;\n --text-muted: #606070;\n --accent: #6366f1;\n --accent-hover: #818cf8;\n --success: #22c55e;\n --warning: #f59e0b;\n --error: #ef4444;\n --code-bg: #1e1e2e;\n }\n \n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n \n body {\n font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n background: var(--bg-primary);\n color: var(--text-primary);\n line-height: 1.6;\n }\n \n .layout {\n display: grid;\n grid-template-columns: 280px 1fr;\n min-height: 100vh;\n }\n \n /* Sidebar */\n .sidebar {\n background: var(--bg-secondary);\n border-right: 1px solid var(--border-color);\n padding: 24px 0;\n position: sticky;\n top: 0;\n height: 100vh;\n overflow-y: auto;\n }\n \n .sidebar-header {\n padding: 0 20px 20px;\n border-bottom: 1px solid var(--border-color);\n margin-bottom: 16px;\n }\n \n .sidebar-header h1 {\n font-size: 20px;\n font-weight: 700;\n background: linear-gradient(135deg, var(--accent), #a855f7);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n \n .sidebar-header .subtitle {\n font-size: 12px;\n color: var(--text-muted);\n margin-top: 4px;\n }\n \n .sidebar-stats {\n display: flex;\n gap: 16px;\n padding: 12px 20px;\n background: var(--bg-tertiary);\n margin: 0 12px 16px;\n border-radius: 8px;\n }\n \n .stat {\n text-align: center;\n }\n \n .stat-value {\n font-size: 20px;\n font-weight: 700;\n color: var(--accent);\n }\n \n .stat-label {\n font-size: 11px;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n .category {\n margin-bottom: 8px;\n }\n \n .category-header {\n padding: 8px 20px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--text-muted);\n }\n \n .nav-item {\n display: block;\n padding: 8px 20px 8px 32px;\n color: var(--text-secondary);\n text-decoration: none;\n font-size: 14px;\n transition: all 0.15s;\n }\n \n .nav-item:hover {\n background: var(--bg-hover);\n color: var(--text-primary);\n }\n \n .nav-item.active {\n background: var(--accent);\n color: white;\n }\n \n /* Main Content */\n .main {\n padding: 40px 60px;\n max-width: 1000px;\n }\n \n .component-section {\n margin-bottom: 60px;\n scroll-margin-top: 40px;\n }\n \n .component-header {\n margin-bottom: 24px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--border-color);\n }\n \n .component-name {\n font-size: 32px;\n font-weight: 700;\n margin-bottom: 8px;\n }\n \n .component-description {\n font-size: 16px;\n color: var(--text-secondary);\n line-height: 1.7;\n }\n \n .component-meta {\n display: flex;\n gap: 16px;\n margin-top: 16px;\n }\n \n .meta-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: var(--bg-tertiary);\n border-radius: 20px;\n font-size: 12px;\n color: var(--text-secondary);\n }\n \n .meta-badge.status-stable { color: var(--success); }\n .meta-badge.status-beta { color: var(--warning); }\n .meta-badge.status-deprecated { color: var(--error); }\n \n /* Sections */\n .section {\n margin-bottom: 32px;\n }\n \n .section-title {\n font-size: 18px;\n font-weight: 600;\n margin-bottom: 16px;\n color: var(--text-primary);\n }\n \n /* Usage Guidelines */\n .usage-list {\n list-style: none;\n }\n \n .usage-item {\n display: flex;\n gap: 12px;\n padding: 12px 16px;\n background: var(--bg-secondary);\n border-radius: 8px;\n margin-bottom: 8px;\n font-size: 14px;\n }\n \n .usage-item.when::before {\n content: '✓';\n color: var(--success);\n font-weight: bold;\n }\n \n .usage-item.when-not::before {\n content: '✗';\n color: var(--error);\n font-weight: bold;\n }\n \n /* Props Table */\n .props-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 14px;\n }\n \n .props-table th {\n text-align: left;\n padding: 12px 16px;\n background: var(--bg-tertiary);\n font-weight: 600;\n color: var(--text-secondary);\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n \n .props-table td {\n padding: 12px 16px;\n border-bottom: 1px solid var(--border-color);\n vertical-align: top;\n }\n \n .props-table tr:hover td {\n background: var(--bg-secondary);\n }\n \n .prop-name {\n font-family: 'JetBrains Mono', monospace;\n color: var(--accent);\n }\n \n .prop-type {\n font-family: 'JetBrains Mono', monospace;\n font-size: 13px;\n color: var(--text-muted);\n }\n \n .prop-required {\n color: var(--error);\n font-size: 11px;\n font-weight: 600;\n }\n \n .prop-default {\n font-family: 'JetBrains Mono', monospace;\n font-size: 13px;\n color: var(--text-muted);\n background: var(--code-bg);\n padding: 2px 6px;\n border-radius: 4px;\n }\n \n /* Variants */\n .variants-grid {\n display: grid;\n gap: 16px;\n }\n \n .variant-card {\n background: var(--bg-secondary);\n border: 1px solid var(--border-color);\n border-radius: 12px;\n padding: 20px;\n }\n \n .variant-name {\n font-weight: 600;\n margin-bottom: 8px;\n }\n \n .variant-description {\n font-size: 14px;\n color: var(--text-secondary);\n margin-bottom: 12px;\n }\n \n .variant-code {\n font-family: 'JetBrains Mono', monospace;\n font-size: 13px;\n background: var(--code-bg);\n padding: 12px 16px;\n border-radius: 8px;\n overflow-x: auto;\n color: var(--text-secondary);\n }\n \n /* Relations */\n .relations-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n \n .relation-tag {\n padding: 6px 14px;\n background: var(--bg-tertiary);\n border: 1px solid var(--border-color);\n border-radius: 20px;\n font-size: 13px;\n color: var(--text-secondary);\n text-decoration: none;\n transition: all 0.15s;\n }\n \n .relation-tag:hover {\n border-color: var(--accent);\n color: var(--accent);\n }\n \n /* Search */\n .search-container {\n padding: 0 12px 16px;\n }\n \n .search-input {\n width: 100%;\n padding: 10px 14px;\n background: var(--bg-tertiary);\n border: 1px solid var(--border-color);\n border-radius: 8px;\n color: var(--text-primary);\n font-size: 14px;\n outline: none;\n transition: border-color 0.15s;\n }\n \n .search-input:focus {\n border-color: var(--accent);\n }\n \n .search-input::placeholder {\n color: var(--text-muted);\n }\n \n /* Empty State */\n .empty-state {\n text-align: center;\n padding: 80px 40px;\n color: var(--text-muted);\n }\n \n .empty-state h2 {\n font-size: 24px;\n margin-bottom: 12px;\n color: var(--text-secondary);\n }\n \n @media (max-width: 900px) {\n .layout {\n grid-template-columns: 1fr;\n }\n \n .sidebar {\n position: relative;\n height: auto;\n border-right: none;\n border-bottom: 1px solid var(--border-color);\n }\n \n .main {\n padding: 24px;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"layout\">\n <aside class=\"sidebar\">\n <div class=\"sidebar-header\">\n <h1>${BRAND.name}</h1>\n <div class=\"subtitle\">Design System Documentation</div>\n </div>\n \n <div class=\"sidebar-stats\">\n <div class=\"stat\">\n <div class=\"stat-value\">${fragments.length}</div>\n <div class=\"stat-label\">Components</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-value\">${fragments.reduce(\n (sum, s) => sum + s.variants.length,\n 0\n )}</div>\n <div class=\"stat-label\">Variants</div>\n </div>\n </div>\n \n <div class=\"search-container\">\n <input type=\"text\" class=\"search-input\" placeholder=\"Search components...\" id=\"search\">\n </div>\n \n <nav id=\"nav\">\n ${sortedCategories\n .map(\n ([category, items]) => `\n <div class=\"category\">\n <div class=\"category-header\">${category}</div>\n ${items\n .sort((a, b) => a.meta.name.localeCompare(b.meta.name))\n .map(\n (item) => `\n <a href=\"#${item.meta.name}\" class=\"nav-item\">${item.meta.name}</a>\n `\n )\n .join(\"\")}\n </div>\n `\n )\n .join(\"\")}\n </nav>\n </aside>\n \n <main class=\"main\" id=\"main\">\n ${\n fragments.length === 0\n ? `\n <div class=\"empty-state\">\n <h2>No Components Found</h2>\n <p>Run <code>fragments build</code> to compile your fragment files.</p>\n </div>\n `\n : fragments\n .sort((a, b) => a.meta.name.localeCompare(b.meta.name))\n .map(\n (fragment) => `\n <section class=\"component-section\" id=\"${fragment.meta.name}\">\n <div class=\"component-header\">\n <h2 class=\"component-name\">${fragment.meta.name}</h2>\n <p class=\"component-description\">${fragment.meta.description}</p>\n <div class=\"component-meta\">\n ${\n fragment.meta.status\n ? `<span class=\"meta-badge status-${fragment.meta.status}\">${fragment.meta.status}</span>`\n : \"\"\n }\n ${\n fragment.meta.category\n ? `<span class=\"meta-badge\">${fragment.meta.category}</span>`\n : \"\"\n }\n ${\n fragment.meta.tags\n ?.map((tag) => `<span class=\"meta-badge\">${tag}</span>`)\n .join(\"\") ?? \"\"\n }\n </div>\n </div>\n \n ${\n fragment.usage\n ? `\n <div class=\"section\">\n <h3 class=\"section-title\">Usage Guidelines</h3>\n ${\n fragment.usage.when?.length\n ? `\n <ul class=\"usage-list\">\n ${fragment.usage.when\n .map((item) => `<li class=\"usage-item when\">${item}</li>`)\n .join(\"\")}\n </ul>\n `\n : \"\"\n }\n ${\n fragment.usage.whenNot?.length\n ? `\n <ul class=\"usage-list\" style=\"margin-top: 12px;\">\n ${fragment.usage.whenNot\n .map(\n (item) => `<li class=\"usage-item when-not\">${item}</li>`\n )\n .join(\"\")}\n </ul>\n `\n : \"\"\n }\n </div>\n `\n : \"\"\n }\n \n ${\n fragment.props && Object.keys(fragment.props).length\n ? `\n <div class=\"section\">\n <h3 class=\"section-title\">Props</h3>\n <table class=\"props-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Default</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n ${Object.entries(fragment.props)\n .map(\n ([name, prop]) => `\n <tr>\n <td>\n <span class=\"prop-name\">${name}</span>\n ${\n prop.required\n ? '<span class=\"prop-required\">*</span>'\n : \"\"\n }\n </td>\n <td><span class=\"prop-type\">${prop.type}</span></td>\n <td>${\n prop.default !== undefined\n ? `<span class=\"prop-default\">${prop.default}</span>`\n : \"—\"\n }</td>\n <td>${prop.description ?? \"\"}</td>\n </tr>\n `\n )\n .join(\"\")}\n </tbody>\n </table>\n </div>\n `\n : \"\"\n }\n \n ${\n fragment.variants?.length\n ? `\n <div class=\"section\">\n <h3 class=\"section-title\">Variants</h3>\n <div class=\"variants-grid\">\n ${fragment.variants\n .map(\n (variant) => `\n <div class=\"variant-card\">\n <div class=\"variant-name\">${variant.name}</div>\n ${\n variant.description\n ? `<div class=\"variant-description\">${variant.description}</div>`\n : \"\"\n }\n ${\n variant.code\n ? `<pre class=\"variant-code\">${escapeHtml(\n variant.code\n )}</pre>`\n : \"\"\n }\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n `\n : \"\"\n }\n \n ${\n fragment.relations?.length\n ? `\n <div class=\"section\">\n <h3 class=\"section-title\">Related Components</h3>\n <div class=\"relations-list\">\n ${fragment.relations\n .map(\n (rel) =>\n `<a href=\"#${\n rel.component\n }\" class=\"relation-tag\" title=\"${rel.note}\">${\n rel.relationship === \"parent\"\n ? \"↑\"\n : rel.relationship === \"child\"\n ? \"↓\"\n : \"↔\"\n } ${rel.component}</a>`\n )\n .join(\"\")}\n </div>\n </div>\n `\n : \"\"\n }\n </section>\n `\n )\n .join(\"\")\n }\n </main>\n </div>\n \n <script>\n // Search functionality\n const searchInput = document.getElementById('search');\n const nav = document.getElementById('nav');\n const main = document.getElementById('main');\n \n searchInput.addEventListener('input', (e) => {\n const query = e.target.value.toLowerCase();\n \n // Filter nav items\n nav.querySelectorAll('.nav-item').forEach(item => {\n const name = item.textContent.toLowerCase();\n item.style.display = name.includes(query) ? '' : 'none';\n });\n \n // Show/hide categories with no visible items\n nav.querySelectorAll('.category').forEach(cat => {\n const hasVisible = Array.from(cat.querySelectorAll('.nav-item')).some(\n item => item.style.display !== 'none'\n );\n cat.style.display = hasVisible ? '' : 'none';\n });\n \n // Filter main sections\n main.querySelectorAll('.component-section').forEach(section => {\n const name = section.id.toLowerCase();\n section.style.display = name.includes(query) ? '' : 'none';\n });\n });\n \n // Highlight active nav item on scroll\n const sections = document.querySelectorAll('.component-section');\n const navItems = document.querySelectorAll('.nav-item');\n \n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n navItems.forEach(item => {\n item.classList.toggle('active', item.getAttribute('href') === '#' + entry.target.id);\n });\n }\n });\n }, { threshold: 0.3 });\n \n sections.forEach(section => observer.observe(section));\n </script>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n/**\n * Load fragments.json and generate static viewer\n */\nexport async function generateViewerFromJson(\n jsonPath: string\n): Promise<string> {\n const content = await readFile(jsonPath, \"utf-8\");\n const data = JSON.parse(content) as CompiledFragmentsFile;\n return generateStaticViewer(data);\n}\n"],"mappings":";;;;;;AAAA,SAAS,gBAAgB;AASlB,SAAS,qBAAqB,MAAqC;AACxE,QAAM,YAAY,OAAO,OAAO,KAAK,SAAS;AAG9C,QAAM,aAAa,oBAAI,IAA8B;AACrD,aAAW,YAAY,WAAW;AAChC,UAAM,WAAW,SAAS,KAAK,YAAY;AAC3C,QAAI,CAAC,WAAW,IAAI,QAAQ,GAAG;AAC7B,iBAAW,IAAI,UAAU,CAAC,CAAC;AAAA,IAC7B;AACA,eAAW,IAAI,QAAQ,EAAG,KAAK,QAAQ;AAAA,EACzC;AAGA,QAAM,mBAAmB,MAAM,KAAK,WAAW,QAAQ,CAAC,EAAE;AAAA,IAAK,CAAC,GAAG,MACjE,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAAA,EACzB;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKE,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":[]}
|
|
@@ -109,7 +109,7 @@ var figmaPropMappingSchema = z.discriminatedUnion("__type", [
|
|
|
109
109
|
figmaChildrenMappingSchema,
|
|
110
110
|
figmaTextContentMappingSchema
|
|
111
111
|
]);
|
|
112
|
-
var
|
|
112
|
+
var fragmentMetaSchema = z.object({
|
|
113
113
|
name: z.string().min(1),
|
|
114
114
|
description: z.string().min(1),
|
|
115
115
|
category: z.string().min(1),
|
|
@@ -119,7 +119,7 @@ var segmentMetaSchema = z.object({
|
|
|
119
119
|
figma: z.string().url().optional(),
|
|
120
120
|
figmaProps: z.record(figmaPropMappingSchema).optional()
|
|
121
121
|
});
|
|
122
|
-
var
|
|
122
|
+
var fragmentUsageSchema = z.object({
|
|
123
123
|
when: z.array(z.string()).min(1),
|
|
124
124
|
whenNot: z.array(z.string()).min(1),
|
|
125
125
|
guidelines: z.array(z.string()).optional(),
|
|
@@ -161,24 +161,24 @@ var componentRelationSchema = z.object({
|
|
|
161
161
|
relationship: relationshipTypeSchema,
|
|
162
162
|
note: z.string().min(1)
|
|
163
163
|
});
|
|
164
|
-
var
|
|
164
|
+
var fragmentVariantSchema = z.object({
|
|
165
165
|
name: z.string().min(1),
|
|
166
166
|
description: z.string().min(1),
|
|
167
167
|
render: z.function().returns(z.unknown()),
|
|
168
168
|
code: z.string().optional(),
|
|
169
169
|
figma: z.string().url().optional()
|
|
170
170
|
});
|
|
171
|
-
var
|
|
171
|
+
var fragmentBanSchema = z.object({
|
|
172
172
|
pattern: z.string().min(1),
|
|
173
173
|
message: z.string().min(1)
|
|
174
174
|
});
|
|
175
|
-
var
|
|
175
|
+
var fragmentContractSchema = z.object({
|
|
176
176
|
propsSummary: z.array(z.string()).optional(),
|
|
177
177
|
a11yRules: z.array(z.string()).optional(),
|
|
178
|
-
bans: z.array(
|
|
178
|
+
bans: z.array(fragmentBanSchema).optional(),
|
|
179
179
|
scenarioTags: z.array(z.string()).optional()
|
|
180
180
|
});
|
|
181
|
-
var
|
|
181
|
+
var fragmentGeneratedSchema = z.object({
|
|
182
182
|
source: z.enum(["storybook", "manual", "ai"]),
|
|
183
183
|
sourceFile: z.string().optional(),
|
|
184
184
|
confidence: z.number().min(0).max(1).optional(),
|
|
@@ -198,20 +198,20 @@ var blockDefinitionSchema = z.object({
|
|
|
198
198
|
code: z.string().min(1),
|
|
199
199
|
tags: z.array(z.string()).optional()
|
|
200
200
|
});
|
|
201
|
-
var
|
|
201
|
+
var fragmentDefinitionSchema = z.object({
|
|
202
202
|
component: z.any(),
|
|
203
203
|
// Allow any component type (function, class, forwardRef, etc.)
|
|
204
|
-
meta:
|
|
205
|
-
usage:
|
|
204
|
+
meta: fragmentMetaSchema,
|
|
205
|
+
usage: fragmentUsageSchema,
|
|
206
206
|
props: z.record(propDefinitionSchema),
|
|
207
207
|
relations: z.array(componentRelationSchema).optional(),
|
|
208
|
-
variants: z.array(
|
|
208
|
+
variants: z.array(fragmentVariantSchema),
|
|
209
209
|
// Allow empty variants array
|
|
210
|
-
contract:
|
|
210
|
+
contract: fragmentContractSchema.optional(),
|
|
211
211
|
ai: aiMetadataSchema.optional(),
|
|
212
|
-
_generated:
|
|
212
|
+
_generated: fragmentGeneratedSchema.optional()
|
|
213
213
|
});
|
|
214
|
-
var
|
|
214
|
+
var fragmentsConfigSchema = z.object({
|
|
215
215
|
include: z.array(z.string()).min(1),
|
|
216
216
|
exclude: z.array(z.string()).optional(),
|
|
217
217
|
components: z.array(z.string()).optional(),
|
|
@@ -232,18 +232,18 @@ export {
|
|
|
232
232
|
BRAND,
|
|
233
233
|
DEFAULTS,
|
|
234
234
|
figmaPropMappingSchema,
|
|
235
|
-
|
|
236
|
-
|
|
235
|
+
fragmentMetaSchema,
|
|
236
|
+
fragmentUsageSchema,
|
|
237
237
|
propDefinitionSchema,
|
|
238
238
|
componentRelationSchema,
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
239
|
+
fragmentVariantSchema,
|
|
240
|
+
fragmentBanSchema,
|
|
241
|
+
fragmentContractSchema,
|
|
242
|
+
fragmentGeneratedSchema,
|
|
243
243
|
aiMetadataSchema,
|
|
244
244
|
blockDefinitionSchema,
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
fragmentDefinitionSchema,
|
|
246
|
+
fragmentsConfigSchema,
|
|
247
247
|
recipeDefinitionSchema
|
|
248
248
|
};
|
|
249
|
-
//# sourceMappingURL=chunk-
|
|
249
|
+
//# sourceMappingURL=chunk-GHYYFAQN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.ts","../src/core/schema.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files (e.g., \".fragment.tsx\") */\n fileExtension: \".fragment.tsx\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","import { z } from 'zod';\n\n/**\n * Zod schemas for runtime validation of fragment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal('figma-string'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal('figma-boolean'),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal('figma-enum'),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal('figma-instance'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal('figma-children'),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal('figma-text-content'),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion('__type', [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const fragmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n since: z.string().optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const fragmentUsageSchema = z.object({\n when: z.array(z.string()).min(1),\n whenNot: z.array(z.string()).min(1),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n 'string',\n 'number',\n 'boolean',\n 'enum',\n 'function',\n 'node',\n 'element',\n 'object',\n 'array',\n 'union',\n 'custom',\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n 'alternative',\n 'sibling',\n 'parent',\n 'child',\n 'composition',\n 'complementary',\n 'used-by',\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const fragmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.function().returns(z.unknown()),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const fragmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const fragmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(fragmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated fragments\n */\nexport const fragmentGeneratedSchema = z.object({\n source: z.enum(['storybook', 'manual', 'ai']),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for AI-specific metadata for playground context generation\n */\nexport const aiMetadataSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for block definitions\n */\nexport const blockDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const fragmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: fragmentMetaSchema,\n usage: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(fragmentVariantSchema), // Allow empty variants array\n contract: fragmentContractSchema.optional(),\n ai: aiMetadataSchema.optional(),\n _generated: fragmentGeneratedSchema.optional(),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const fragmentsConfigSchema = z.object({\n include: z.array(z.string()).min(1),\n exclude: z.array(z.string()).optional(),\n components: z.array(z.string()).optional(),\n outFile: z.string().optional(),\n framework: z.enum(['react', 'vue', 'svelte']).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: z.object({\n include: z.array(z.string()).min(1),\n }).passthrough().optional(),\n});\n\n/**\n * @deprecated Use blockDefinitionSchema instead\n */\nexport const recipeDefinitionSchema = blockDefinitionSchema;\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import { createRequire as __banner_createRequire } from 'module'; const require
|
|
|
2
2
|
import {
|
|
3
3
|
BRAND,
|
|
4
4
|
DEFAULTS
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-GHYYFAQN.js";
|
|
6
6
|
|
|
7
7
|
// src/service/browser-pool.ts
|
|
8
8
|
import { chromium } from "playwright";
|
|
@@ -1475,22 +1475,22 @@ function createFigmaClient(accessToken) {
|
|
|
1475
1475
|
|
|
1476
1476
|
// src/service/analytics.ts
|
|
1477
1477
|
function analyzeDesignSystem(data) {
|
|
1478
|
-
const
|
|
1478
|
+
const fragments = Object.values(data.fragments);
|
|
1479
1479
|
const analyzedAt = /* @__PURE__ */ new Date();
|
|
1480
|
-
const summaries =
|
|
1481
|
-
const coverage = calculateCoverage(
|
|
1482
|
-
const quality = calculateQuality(
|
|
1483
|
-
const distribution = buildDistribution(
|
|
1480
|
+
const summaries = fragments.map((s) => buildComponentSummary(s));
|
|
1481
|
+
const coverage = calculateCoverage(fragments, summaries);
|
|
1482
|
+
const quality = calculateQuality(fragments, summaries);
|
|
1483
|
+
const distribution = buildDistribution(fragments, summaries);
|
|
1484
1484
|
const inventory = buildInventory(summaries);
|
|
1485
1485
|
const recommendations = generateRecommendations(coverage, quality, summaries);
|
|
1486
1486
|
const overallScore = calculateOverallScore(coverage, quality, summaries);
|
|
1487
|
-
const categories = [...new Set(
|
|
1487
|
+
const categories = [...new Set(fragments.map((s) => s.meta.category))].sort();
|
|
1488
1488
|
return {
|
|
1489
1489
|
analyzedAt,
|
|
1490
1490
|
summary: {
|
|
1491
|
-
totalComponents:
|
|
1492
|
-
totalVariants:
|
|
1493
|
-
totalProps:
|
|
1491
|
+
totalComponents: fragments.length,
|
|
1492
|
+
totalVariants: fragments.reduce((sum, s) => sum + s.variants.length, 0),
|
|
1493
|
+
totalProps: fragments.reduce(
|
|
1494
1494
|
(sum, s) => sum + Object.keys(s.props ?? {}).length,
|
|
1495
1495
|
0
|
|
1496
1496
|
),
|
|
@@ -1504,16 +1504,16 @@ function analyzeDesignSystem(data) {
|
|
|
1504
1504
|
recommendations
|
|
1505
1505
|
};
|
|
1506
1506
|
}
|
|
1507
|
-
function buildComponentSummary(
|
|
1508
|
-
const propCount = Object.keys(
|
|
1509
|
-
const hasUsageWhen = (
|
|
1510
|
-
const hasUsageWhenNot = (
|
|
1511
|
-
const hasGuidelines = (
|
|
1512
|
-
const hasRelations = (
|
|
1507
|
+
function buildComponentSummary(fragment) {
|
|
1508
|
+
const propCount = Object.keys(fragment.props ?? {}).length;
|
|
1509
|
+
const hasUsageWhen = (fragment.usage?.when?.length ?? 0) > 0;
|
|
1510
|
+
const hasUsageWhenNot = (fragment.usage?.whenNot?.length ?? 0) > 0;
|
|
1511
|
+
const hasGuidelines = (fragment.usage?.guidelines?.length ?? 0) > 0;
|
|
1512
|
+
const hasRelations = (fragment.relations?.length ?? 0) > 0;
|
|
1513
1513
|
let docScore = 0;
|
|
1514
1514
|
let docTotal = 0;
|
|
1515
1515
|
docTotal += 20;
|
|
1516
|
-
if (
|
|
1516
|
+
if (fragment.meta.description && fragment.meta.description.length > 20) {
|
|
1517
1517
|
docScore += 20;
|
|
1518
1518
|
}
|
|
1519
1519
|
docTotal += 20;
|
|
@@ -1526,7 +1526,7 @@ function buildComponentSummary(segment) {
|
|
|
1526
1526
|
if (hasRelations) docScore += 10;
|
|
1527
1527
|
docTotal += 15;
|
|
1528
1528
|
if (propCount > 0) {
|
|
1529
|
-
const documentedProps = Object.values(
|
|
1529
|
+
const documentedProps = Object.values(fragment.props ?? {}).filter(
|
|
1530
1530
|
(p) => p.description && p.description.length > 5
|
|
1531
1531
|
).length;
|
|
1532
1532
|
docScore += Math.round(documentedProps / propCount * 15);
|
|
@@ -1534,10 +1534,10 @@ function buildComponentSummary(segment) {
|
|
|
1534
1534
|
docScore += 15;
|
|
1535
1535
|
}
|
|
1536
1536
|
return {
|
|
1537
|
-
name:
|
|
1538
|
-
category:
|
|
1539
|
-
status:
|
|
1540
|
-
variantCount:
|
|
1537
|
+
name: fragment.meta.name,
|
|
1538
|
+
category: fragment.meta.category,
|
|
1539
|
+
status: fragment.meta.status ?? "stable",
|
|
1540
|
+
variantCount: fragment.variants.length,
|
|
1541
1541
|
propCount,
|
|
1542
1542
|
hasUsageWhen,
|
|
1543
1543
|
hasUsageWhenNot,
|
|
@@ -1546,11 +1546,11 @@ function buildComponentSummary(segment) {
|
|
|
1546
1546
|
documentationScore: Math.round(docScore / docTotal * 100)
|
|
1547
1547
|
};
|
|
1548
1548
|
}
|
|
1549
|
-
function calculateCoverage(
|
|
1550
|
-
const total =
|
|
1549
|
+
function calculateCoverage(fragments, summaries) {
|
|
1550
|
+
const total = fragments.length;
|
|
1551
1551
|
const fields = {
|
|
1552
1552
|
description: {
|
|
1553
|
-
covered:
|
|
1553
|
+
covered: fragments.filter(
|
|
1554
1554
|
(s) => s.meta.description && s.meta.description.length > 10
|
|
1555
1555
|
).length,
|
|
1556
1556
|
total,
|
|
@@ -1572,7 +1572,7 @@ function calculateCoverage(segments, summaries) {
|
|
|
1572
1572
|
percentage: 0
|
|
1573
1573
|
},
|
|
1574
1574
|
accessibility: {
|
|
1575
|
-
covered:
|
|
1575
|
+
covered: fragments.filter((s) => (s.usage?.accessibility?.length ?? 0) > 0).length,
|
|
1576
1576
|
total,
|
|
1577
1577
|
percentage: 0
|
|
1578
1578
|
},
|
|
@@ -1592,8 +1592,8 @@ function calculateCoverage(segments, summaries) {
|
|
|
1592
1592
|
percentage: 0
|
|
1593
1593
|
}
|
|
1594
1594
|
};
|
|
1595
|
-
for (const
|
|
1596
|
-
const props = Object.values(
|
|
1595
|
+
for (const fragment of fragments) {
|
|
1596
|
+
const props = Object.values(fragment.props ?? {});
|
|
1597
1597
|
fields.propDescriptions.total += props.length;
|
|
1598
1598
|
fields.propConstraints.total += props.length;
|
|
1599
1599
|
fields.propDescriptions.covered += props.filter(
|
|
@@ -1622,21 +1622,21 @@ function calculateCoverage(segments, summaries) {
|
|
|
1622
1622
|
);
|
|
1623
1623
|
return { overall, fields, incomplete };
|
|
1624
1624
|
}
|
|
1625
|
-
function calculateQuality(
|
|
1625
|
+
function calculateQuality(fragments, summaries) {
|
|
1626
1626
|
const missingWhenNot = summaries.filter((s) => !s.hasUsageWhenNot).map((s) => s.name);
|
|
1627
1627
|
const isolated = summaries.filter((s) => !s.hasRelations).map((s) => s.name);
|
|
1628
1628
|
const deprecated = summaries.filter((s) => s.status === "deprecated").map((s) => s.name);
|
|
1629
1629
|
const fewVariants = summaries.filter((s) => s.variantCount < 2).map((s) => s.name);
|
|
1630
1630
|
const undocumentedProps = [];
|
|
1631
1631
|
const unconstrainedProps = [];
|
|
1632
|
-
for (const
|
|
1633
|
-
for (const [propName, prop] of Object.entries(
|
|
1632
|
+
for (const fragment of fragments) {
|
|
1633
|
+
for (const [propName, prop] of Object.entries(fragment.props ?? {})) {
|
|
1634
1634
|
if (!prop.description || prop.description.length < 5) {
|
|
1635
|
-
undocumentedProps.push({ component:
|
|
1635
|
+
undocumentedProps.push({ component: fragment.meta.name, prop: propName });
|
|
1636
1636
|
}
|
|
1637
1637
|
if ((prop.constraints?.length ?? 0) === 0 && prop.type !== "boolean" && prop.type !== "function") {
|
|
1638
1638
|
unconstrainedProps.push({
|
|
1639
|
-
component:
|
|
1639
|
+
component: fragment.meta.name,
|
|
1640
1640
|
prop: propName
|
|
1641
1641
|
});
|
|
1642
1642
|
}
|
|
@@ -1651,7 +1651,7 @@ function calculateQuality(segments, summaries) {
|
|
|
1651
1651
|
unconstrainedProps
|
|
1652
1652
|
};
|
|
1653
1653
|
}
|
|
1654
|
-
function buildDistribution(
|
|
1654
|
+
function buildDistribution(fragments, summaries) {
|
|
1655
1655
|
const variantsPerComponent = summaries.map((s) => ({ name: s.name, count: s.variantCount })).sort((a, b) => b.count - a.count);
|
|
1656
1656
|
const propsPerComponent = summaries.map((s) => ({ name: s.name, count: s.propCount })).sort((a, b) => b.count - a.count);
|
|
1657
1657
|
const categoryMap = /* @__PURE__ */ new Map();
|
|
@@ -1665,8 +1665,8 @@ function buildDistribution(segments, summaries) {
|
|
|
1665
1665
|
}
|
|
1666
1666
|
const statusDistribution = Array.from(statusMap.entries()).map(([status, count]) => ({ status, count })).sort((a, b) => b.count - a.count);
|
|
1667
1667
|
const tagMap = /* @__PURE__ */ new Map();
|
|
1668
|
-
for (const
|
|
1669
|
-
for (const tag of
|
|
1668
|
+
for (const fragment of fragments) {
|
|
1669
|
+
for (const tag of fragment.meta.tags ?? []) {
|
|
1670
1670
|
tagMap.set(tag, (tagMap.get(tag) ?? 0) + 1);
|
|
1671
1671
|
}
|
|
1672
1672
|
}
|
|
@@ -4726,7 +4726,7 @@ var DEFAULT_EXCLUDE = [
|
|
|
4726
4726
|
"**/*.test.*",
|
|
4727
4727
|
"**/*.spec.*",
|
|
4728
4728
|
"**/*.stories.*",
|
|
4729
|
-
"**/*.
|
|
4729
|
+
"**/*.fragment.*",
|
|
4730
4730
|
"**/storybook-static/**"
|
|
4731
4731
|
];
|
|
4732
4732
|
async function scanCodebase(options) {
|
|
@@ -6206,7 +6206,7 @@ function inferComponentName2(filePath) {
|
|
|
6206
6206
|
}
|
|
6207
6207
|
return name;
|
|
6208
6208
|
}
|
|
6209
|
-
function
|
|
6209
|
+
function convertToFragmentProps(props) {
|
|
6210
6210
|
const result = {};
|
|
6211
6211
|
for (const prop of props) {
|
|
6212
6212
|
const definition = {
|
|
@@ -6627,7 +6627,7 @@ export {
|
|
|
6627
6627
|
generateUserPrompt,
|
|
6628
6628
|
extractPropsFromFile,
|
|
6629
6629
|
extractPropsFromSource,
|
|
6630
|
-
|
|
6630
|
+
convertToFragmentProps,
|
|
6631
6631
|
extractPropsForComponent,
|
|
6632
6632
|
extractAllComponentProps,
|
|
6633
6633
|
renderVariants,
|
|
@@ -6635,4 +6635,4 @@ export {
|
|
|
6635
6635
|
getStorybookStoryIds,
|
|
6636
6636
|
renderAllComponentVariants
|
|
6637
6637
|
};
|
|
6638
|
-
//# sourceMappingURL=chunk-
|
|
6638
|
+
//# sourceMappingURL=chunk-GKX2HPZ6.js.map
|