@tpitre/story-ui 2.1.5 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.sample +82 -11
- package/README.md +130 -4
- package/dist/cli/deploy.d.ts +17 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +696 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +55 -2
- package/dist/cli/setup.d.ts +11 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +437 -110
- package/dist/mcp-server/index.d.ts +2 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +138 -6
- package/dist/mcp-server/mcp-stdio-server.d.ts +3 -0
- package/dist/mcp-server/mcp-stdio-server.d.ts.map +1 -0
- package/dist/mcp-server/mcp-stdio-server.js +638 -0
- package/dist/mcp-server/routes/claude.d.ts +3 -0
- package/dist/mcp-server/routes/claude.d.ts.map +1 -0
- package/dist/mcp-server/routes/claude.js +60 -23
- package/dist/mcp-server/routes/components.d.ts +4 -0
- package/dist/mcp-server/routes/components.d.ts.map +1 -0
- package/dist/mcp-server/routes/frameworks.d.ts +38 -0
- package/dist/mcp-server/routes/frameworks.d.ts.map +1 -0
- package/dist/mcp-server/routes/frameworks.js +183 -0
- package/dist/mcp-server/routes/generateStory.d.ts +3 -0
- package/dist/mcp-server/routes/generateStory.d.ts.map +1 -0
- package/dist/mcp-server/routes/generateStory.js +274 -115
- package/dist/mcp-server/routes/generateStoryStream.d.ts +12 -0
- package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -0
- package/dist/mcp-server/routes/generateStoryStream.js +947 -0
- package/dist/mcp-server/routes/hybridStories.d.ts +18 -0
- package/dist/mcp-server/routes/hybridStories.d.ts.map +1 -0
- package/dist/mcp-server/routes/hybridStories.js +214 -0
- package/dist/mcp-server/routes/mcpRemote.d.ts +14 -0
- package/dist/mcp-server/routes/mcpRemote.d.ts.map +1 -0
- package/dist/mcp-server/routes/mcpRemote.js +489 -0
- package/dist/mcp-server/routes/memoryStories.d.ts +26 -0
- package/dist/mcp-server/routes/memoryStories.d.ts.map +1 -0
- package/dist/mcp-server/routes/memoryStories.js +13 -7
- package/dist/mcp-server/routes/providers.d.ts +89 -0
- package/dist/mcp-server/routes/providers.d.ts.map +1 -0
- package/dist/mcp-server/routes/providers.js +369 -0
- package/dist/mcp-server/routes/storySync.d.ts +26 -0
- package/dist/mcp-server/routes/storySync.d.ts.map +1 -0
- package/dist/mcp-server/routes/streamTypes.d.ts +110 -0
- package/dist/mcp-server/routes/streamTypes.d.ts.map +1 -0
- package/dist/mcp-server/routes/streamTypes.js +18 -0
- package/dist/mcp-server/sessionManager.d.ts +50 -0
- package/dist/mcp-server/sessionManager.d.ts.map +1 -0
- package/dist/mcp-server/sessionManager.js +125 -0
- package/dist/story-generator/componentBlacklist.d.ts +21 -0
- package/dist/story-generator/componentBlacklist.d.ts.map +1 -0
- package/dist/story-generator/componentBlacklist.js +4 -0
- package/dist/story-generator/componentDiscovery.d.ts +28 -0
- package/dist/story-generator/componentDiscovery.d.ts.map +1 -0
- package/dist/story-generator/componentRegistryGenerator.d.ts +49 -0
- package/dist/story-generator/componentRegistryGenerator.d.ts.map +1 -0
- package/dist/story-generator/componentRegistryGenerator.js +205 -0
- package/dist/story-generator/configLoader.d.ts +33 -0
- package/dist/story-generator/configLoader.d.ts.map +1 -0
- package/dist/story-generator/configLoader.js +8 -1
- package/dist/story-generator/considerationsLoader.d.ts +32 -0
- package/dist/story-generator/considerationsLoader.d.ts.map +1 -0
- package/dist/story-generator/considerationsLoader.js +2 -1
- package/dist/story-generator/documentation-sources.d.ts +28 -0
- package/dist/story-generator/documentation-sources.d.ts.map +1 -0
- package/dist/story-generator/documentationLoader.d.ts +64 -0
- package/dist/story-generator/documentationLoader.d.ts.map +1 -0
- package/dist/story-generator/documentationLoader.js +4 -3
- package/dist/story-generator/dynamicPackageDiscovery.d.ts +97 -0
- package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -0
- package/dist/story-generator/dynamicPackageDiscovery.js +31 -22
- package/dist/story-generator/enhancedComponentDiscovery.d.ts +125 -0
- package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -0
- package/dist/story-generator/enhancedComponentDiscovery.js +162 -21
- package/dist/story-generator/framework-adapters/angular-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/angular-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/angular-adapter.js +427 -0
- package/dist/story-generator/framework-adapters/base-adapter.d.ts +75 -0
- package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/base-adapter.js +147 -0
- package/dist/story-generator/framework-adapters/framework-detector.d.ts +55 -0
- package/dist/story-generator/framework-adapters/framework-detector.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/framework-detector.js +323 -0
- package/dist/story-generator/framework-adapters/index.d.ts +97 -0
- package/dist/story-generator/framework-adapters/index.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/index.js +198 -0
- package/dist/story-generator/framework-adapters/react-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/react-adapter.js +316 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.d.ts +40 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/svelte-adapter.js +372 -0
- package/dist/story-generator/framework-adapters/types.d.ts +182 -0
- package/dist/story-generator/framework-adapters/types.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/types.js +8 -0
- package/dist/story-generator/framework-adapters/vue-adapter.d.ts +36 -0
- package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/vue-adapter.js +336 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.d.ts +54 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -0
- package/dist/story-generator/framework-adapters/web-components-adapter.js +387 -0
- package/dist/story-generator/generateStory.d.ts +7 -0
- package/dist/story-generator/generateStory.d.ts.map +1 -0
- package/dist/story-generator/gitignoreManager.d.ts +50 -0
- package/dist/story-generator/gitignoreManager.d.ts.map +1 -0
- package/dist/story-generator/gitignoreManager.js +7 -6
- package/dist/story-generator/imageProcessor.d.ts +80 -0
- package/dist/story-generator/imageProcessor.d.ts.map +1 -0
- package/dist/story-generator/imageProcessor.js +391 -0
- package/dist/story-generator/inMemoryStoryService.d.ts +89 -0
- package/dist/story-generator/inMemoryStoryService.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/base-provider.d.ts +36 -0
- package/dist/story-generator/llm-providers/base-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/base-provider.js +135 -0
- package/dist/story-generator/llm-providers/claude-provider.d.ts +23 -0
- package/dist/story-generator/llm-providers/claude-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/claude-provider.js +414 -0
- package/dist/story-generator/llm-providers/gemini-provider.d.ts +24 -0
- package/dist/story-generator/llm-providers/gemini-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/gemini-provider.js +406 -0
- package/dist/story-generator/llm-providers/index.d.ts +63 -0
- package/dist/story-generator/llm-providers/index.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/index.js +169 -0
- package/dist/story-generator/llm-providers/openai-provider.d.ts +24 -0
- package/dist/story-generator/llm-providers/openai-provider.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/openai-provider.js +458 -0
- package/dist/story-generator/llm-providers/settings-manager.d.ts +75 -0
- package/dist/story-generator/llm-providers/settings-manager.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/settings-manager.js +173 -0
- package/dist/story-generator/llm-providers/story-llm-service.d.ts +79 -0
- package/dist/story-generator/llm-providers/story-llm-service.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/story-llm-service.js +240 -0
- package/dist/story-generator/llm-providers/types.d.ts +153 -0
- package/dist/story-generator/llm-providers/types.d.ts.map +1 -0
- package/dist/story-generator/llm-providers/types.js +8 -0
- package/dist/story-generator/logger.d.ts +14 -0
- package/dist/story-generator/logger.d.ts.map +1 -0
- package/dist/story-generator/logger.js +119 -0
- package/dist/story-generator/postProcessStory.d.ts +6 -0
- package/dist/story-generator/postProcessStory.d.ts.map +1 -0
- package/dist/story-generator/postProcessStory.js +8 -7
- package/dist/story-generator/productionGitignoreManager.d.ts +91 -0
- package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -0
- package/dist/story-generator/productionGitignoreManager.js +11 -10
- package/dist/story-generator/promptGenerator.d.ts +48 -0
- package/dist/story-generator/promptGenerator.d.ts.map +1 -0
- package/dist/story-generator/promptGenerator.js +186 -1
- package/dist/story-generator/storyHistory.d.ts +44 -0
- package/dist/story-generator/storyHistory.d.ts.map +1 -0
- package/dist/story-generator/storySync.d.ts +68 -0
- package/dist/story-generator/storySync.d.ts.map +1 -0
- package/dist/story-generator/storyTracker.d.ts +48 -0
- package/dist/story-generator/storyTracker.d.ts.map +1 -0
- package/dist/story-generator/storyTracker.js +2 -1
- package/dist/story-generator/storyValidator.d.ts +6 -0
- package/dist/story-generator/storyValidator.d.ts.map +1 -0
- package/dist/story-generator/universalDesignSystemAdapter.d.ts +68 -0
- package/dist/story-generator/universalDesignSystemAdapter.d.ts.map +1 -0
- package/dist/story-generator/universalDesignSystemAdapter.js +141 -3
- package/dist/story-generator/urlRedirectService.d.ts +21 -0
- package/dist/story-generator/urlRedirectService.d.ts.map +1 -0
- package/dist/story-generator/urlRedirectService.js +140 -0
- package/dist/story-generator/validateStory.d.ts +19 -0
- package/dist/story-generator/validateStory.d.ts.map +1 -0
- package/dist/story-generator/validateStory.js +6 -2
- package/dist/story-generator/visionPrompts.d.ts +88 -0
- package/dist/story-generator/visionPrompts.d.ts.map +1 -0
- package/dist/story-generator/visionPrompts.js +462 -0
- package/dist/story-ui.config.d.ts +78 -0
- package/dist/story-ui.config.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.d.ts +4 -0
- package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.js +1874 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +18 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +1 -0
- package/dist/templates/StoryUI/StoryUIPanel.stories.js +37 -0
- package/dist/templates/StoryUI/index.d.ts +3 -0
- package/dist/templates/StoryUI/index.d.ts.map +1 -0
- package/dist/templates/StoryUI/index.js +2 -0
- package/package.json +35 -4
- package/templates/StoryUI/StoryUIPanel.tsx +1973 -388
- package/templates/StoryUI/index.tsx +1 -1
- package/templates/StoryUI/manager.tsx +264 -0
- package/templates/mcp-config-claude.json +11 -0
- package/templates/mcp-example.md +76 -0
- package/templates/production-app/.env.example +11 -0
- package/templates/production-app/index.html +66 -0
- package/templates/production-app/package.json +30 -0
- package/templates/production-app/public/favicon.svg +5 -0
- package/templates/production-app/src/App.tsx +1157 -0
- package/templates/production-app/src/LivePreviewRenderer.tsx +420 -0
- package/templates/production-app/src/componentRegistry.ts +315 -0
- package/templates/production-app/src/considerations.ts +16 -0
- package/templates/production-app/src/index.css +284 -0
- package/templates/production-app/src/main.tsx +25 -0
- package/templates/production-app/tsconfig.json +32 -0
- package/templates/production-app/tsconfig.node.json +11 -0
- package/templates/production-app/vite.config.ts +83 -0
- package/templates/react-import-rule.json +2 -2
- package/dist/index.js +0 -12
- package/dist/story-ui.config.loader.js +0 -205
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-detector.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/framework-detector.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,aAAa,EAGb,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAmGpB;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,mBAAmB,CAAgB;gBAE/B,WAAW,GAAE,MAAsB;IAI/C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAkDjD;;OAEG;YACW,eAAe;IAwB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwD1B;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO;CAchD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAGvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAE5E"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Detection System
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects the component framework and story framework
|
|
5
|
+
* used in a project by analyzing package.json, config files, and
|
|
6
|
+
* file patterns.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { logger } from '../logger.js';
|
|
11
|
+
const FRAMEWORK_PATTERNS = [
|
|
12
|
+
// React
|
|
13
|
+
{
|
|
14
|
+
framework: 'react',
|
|
15
|
+
storyFramework: 'storybook-react',
|
|
16
|
+
packageIndicators: ['react', 'react-dom', '@storybook/react', '@storybook/react-vite', '@storybook/react-webpack5'],
|
|
17
|
+
configFiles: ['.storybook/main.js', '.storybook/main.ts', '.storybook/preview.js'],
|
|
18
|
+
filePatterns: ['*.jsx', '*.tsx', '*.stories.tsx', '*.stories.jsx'],
|
|
19
|
+
weight: 10,
|
|
20
|
+
},
|
|
21
|
+
// Vue 3
|
|
22
|
+
{
|
|
23
|
+
framework: 'vue',
|
|
24
|
+
storyFramework: 'storybook-vue3',
|
|
25
|
+
packageIndicators: ['vue', '@vue/runtime-core', '@storybook/vue3', '@storybook/vue3-vite'],
|
|
26
|
+
configFiles: ['vite.config.ts', 'vue.config.js', 'nuxt.config.ts'],
|
|
27
|
+
filePatterns: ['*.vue', '*.stories.ts'],
|
|
28
|
+
weight: 10,
|
|
29
|
+
},
|
|
30
|
+
// Angular
|
|
31
|
+
{
|
|
32
|
+
framework: 'angular',
|
|
33
|
+
storyFramework: 'storybook-angular',
|
|
34
|
+
packageIndicators: ['@angular/core', '@angular/common', '@storybook/angular'],
|
|
35
|
+
configFiles: ['angular.json', 'ng-package.json'],
|
|
36
|
+
filePatterns: ['*.component.ts', '*.stories.ts'],
|
|
37
|
+
weight: 10,
|
|
38
|
+
},
|
|
39
|
+
// Svelte
|
|
40
|
+
{
|
|
41
|
+
framework: 'svelte',
|
|
42
|
+
storyFramework: 'storybook-svelte',
|
|
43
|
+
packageIndicators: ['svelte', '@sveltejs/kit', '@storybook/svelte', '@storybook/svelte-vite'],
|
|
44
|
+
configFiles: ['svelte.config.js', 'svelte.config.ts'],
|
|
45
|
+
filePatterns: ['*.svelte', '*.stories.svelte'],
|
|
46
|
+
weight: 10,
|
|
47
|
+
},
|
|
48
|
+
// Web Components
|
|
49
|
+
{
|
|
50
|
+
framework: 'web-components',
|
|
51
|
+
storyFramework: 'storybook-web-components',
|
|
52
|
+
packageIndicators: ['lit', 'lit-element', 'lit-html', '@storybook/web-components', '@open-wc/testing'],
|
|
53
|
+
configFiles: ['web-dev-server.config.js', 'custom-elements.json'],
|
|
54
|
+
filePatterns: ['*.element.ts', '*.element.js'],
|
|
55
|
+
weight: 10,
|
|
56
|
+
},
|
|
57
|
+
// Solid
|
|
58
|
+
{
|
|
59
|
+
framework: 'solid',
|
|
60
|
+
storyFramework: 'storybook-react', // Uses React adapter with solid-js
|
|
61
|
+
packageIndicators: ['solid-js', '@solidjs/router'],
|
|
62
|
+
configFiles: ['vite.config.ts'],
|
|
63
|
+
filePatterns: ['*.tsx', '*.jsx'],
|
|
64
|
+
weight: 8,
|
|
65
|
+
},
|
|
66
|
+
// Qwik
|
|
67
|
+
{
|
|
68
|
+
framework: 'qwik',
|
|
69
|
+
storyFramework: 'custom',
|
|
70
|
+
packageIndicators: ['@builder.io/qwik', '@builder.io/qwik-city'],
|
|
71
|
+
configFiles: ['qwik.config.ts'],
|
|
72
|
+
filePatterns: ['*.tsx'],
|
|
73
|
+
weight: 8,
|
|
74
|
+
},
|
|
75
|
+
// Histoire (Vue alternative)
|
|
76
|
+
{
|
|
77
|
+
framework: 'vue',
|
|
78
|
+
storyFramework: 'histoire',
|
|
79
|
+
packageIndicators: ['histoire', '@histoire/plugin-vue'],
|
|
80
|
+
configFiles: ['histoire.config.ts', 'histoire.config.js'],
|
|
81
|
+
filePatterns: ['*.story.vue'],
|
|
82
|
+
weight: 12,
|
|
83
|
+
},
|
|
84
|
+
// Ladle (React alternative)
|
|
85
|
+
{
|
|
86
|
+
framework: 'react',
|
|
87
|
+
storyFramework: 'ladle',
|
|
88
|
+
packageIndicators: ['@ladle/react'],
|
|
89
|
+
configFiles: ['.ladle/config.mjs'],
|
|
90
|
+
filePatterns: ['*.stories.tsx'],
|
|
91
|
+
weight: 12,
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
/**
|
|
95
|
+
* Framework Detector Class
|
|
96
|
+
*/
|
|
97
|
+
export class FrameworkDetector {
|
|
98
|
+
constructor(projectRoot = process.cwd()) {
|
|
99
|
+
this.packageJson = null;
|
|
100
|
+
this.dependencies = {};
|
|
101
|
+
this.detectedConfigFiles = [];
|
|
102
|
+
this.projectRoot = projectRoot;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Detect frameworks used in the project
|
|
106
|
+
*/
|
|
107
|
+
async detect() {
|
|
108
|
+
logger.debug('Starting framework detection', { projectRoot: this.projectRoot });
|
|
109
|
+
// Load package.json
|
|
110
|
+
await this.loadPackageJson();
|
|
111
|
+
// Scan for config files
|
|
112
|
+
this.scanConfigFiles();
|
|
113
|
+
// Score each framework pattern
|
|
114
|
+
const frameworkScores = this.scoreFrameworks();
|
|
115
|
+
// Sort by score descending
|
|
116
|
+
const sortedFrameworks = frameworkScores
|
|
117
|
+
.filter(f => f.score > 0)
|
|
118
|
+
.sort((a, b) => b.score - a.score);
|
|
119
|
+
// Convert to DetectedFramework objects
|
|
120
|
+
const detectedFrameworks = sortedFrameworks.map(f => ({
|
|
121
|
+
componentFramework: f.pattern.framework,
|
|
122
|
+
storyFramework: f.pattern.storyFramework,
|
|
123
|
+
version: this.getFrameworkVersion(f.pattern.framework),
|
|
124
|
+
config: this.getFrameworkConfig(f.pattern.framework),
|
|
125
|
+
confidence: Math.min(f.score / 30, 1), // Normalize to 0-1
|
|
126
|
+
}));
|
|
127
|
+
// Default to React if nothing detected
|
|
128
|
+
const defaultFramework = {
|
|
129
|
+
componentFramework: 'react',
|
|
130
|
+
storyFramework: 'storybook-react',
|
|
131
|
+
config: this.getFrameworkConfig('react'),
|
|
132
|
+
confidence: 0.5,
|
|
133
|
+
};
|
|
134
|
+
const primary = detectedFrameworks[0] || defaultFramework;
|
|
135
|
+
logger.info('Framework detection complete', {
|
|
136
|
+
primary: primary.componentFramework,
|
|
137
|
+
storyFramework: primary.storyFramework,
|
|
138
|
+
confidence: primary.confidence,
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
frameworks: detectedFrameworks.length > 0 ? detectedFrameworks : [defaultFramework],
|
|
142
|
+
primary,
|
|
143
|
+
dependencies: this.dependencies,
|
|
144
|
+
configFiles: this.detectedConfigFiles,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Load and parse package.json
|
|
149
|
+
*/
|
|
150
|
+
async loadPackageJson() {
|
|
151
|
+
const packagePath = path.join(this.projectRoot, 'package.json');
|
|
152
|
+
try {
|
|
153
|
+
if (fs.existsSync(packagePath)) {
|
|
154
|
+
const content = fs.readFileSync(packagePath, 'utf-8');
|
|
155
|
+
this.packageJson = JSON.parse(content);
|
|
156
|
+
// Merge all dependencies
|
|
157
|
+
this.dependencies = {
|
|
158
|
+
...(this.packageJson?.dependencies || {}),
|
|
159
|
+
...(this.packageJson?.devDependencies || {}),
|
|
160
|
+
...(this.packageJson?.peerDependencies || {}),
|
|
161
|
+
};
|
|
162
|
+
logger.debug('Loaded package.json', {
|
|
163
|
+
dependencyCount: Object.keys(this.dependencies).length,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
logger.warn('Failed to load package.json', { error });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Scan for framework configuration files
|
|
173
|
+
*/
|
|
174
|
+
scanConfigFiles() {
|
|
175
|
+
const allConfigFiles = new Set();
|
|
176
|
+
for (const pattern of FRAMEWORK_PATTERNS) {
|
|
177
|
+
for (const configFile of pattern.configFiles) {
|
|
178
|
+
allConfigFiles.add(configFile);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
for (const configFile of allConfigFiles) {
|
|
182
|
+
const fullPath = path.join(this.projectRoot, configFile);
|
|
183
|
+
if (fs.existsSync(fullPath)) {
|
|
184
|
+
this.detectedConfigFiles.push(configFile);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
logger.debug('Config files detected', {
|
|
188
|
+
configFiles: this.detectedConfigFiles,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Score each framework pattern based on evidence
|
|
193
|
+
*/
|
|
194
|
+
scoreFrameworks() {
|
|
195
|
+
return FRAMEWORK_PATTERNS.map(pattern => {
|
|
196
|
+
let score = 0;
|
|
197
|
+
// Check package indicators
|
|
198
|
+
for (const pkg of pattern.packageIndicators) {
|
|
199
|
+
if (this.dependencies[pkg]) {
|
|
200
|
+
score += pattern.weight;
|
|
201
|
+
// Extra weight for Storybook packages
|
|
202
|
+
if (pkg.startsWith('@storybook/')) {
|
|
203
|
+
score += 5;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Check config files
|
|
208
|
+
for (const configFile of pattern.configFiles) {
|
|
209
|
+
if (this.detectedConfigFiles.includes(configFile)) {
|
|
210
|
+
score += pattern.weight / 2;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return { pattern, score };
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get framework version from dependencies
|
|
218
|
+
*/
|
|
219
|
+
getFrameworkVersion(framework) {
|
|
220
|
+
const versionMap = {
|
|
221
|
+
'react': ['react'],
|
|
222
|
+
'vue': ['vue'],
|
|
223
|
+
'angular': ['@angular/core'],
|
|
224
|
+
'svelte': ['svelte'],
|
|
225
|
+
'web-components': ['lit', 'lit-element'],
|
|
226
|
+
'solid': ['solid-js'],
|
|
227
|
+
'qwik': ['@builder.io/qwik'],
|
|
228
|
+
};
|
|
229
|
+
const packages = versionMap[framework] || [];
|
|
230
|
+
for (const pkg of packages) {
|
|
231
|
+
if (this.dependencies[pkg]) {
|
|
232
|
+
return this.dependencies[pkg].replace(/[\^~]/, '');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get framework-specific configuration
|
|
239
|
+
*/
|
|
240
|
+
getFrameworkConfig(framework) {
|
|
241
|
+
const configs = {
|
|
242
|
+
'react': {
|
|
243
|
+
importStyle: 'named',
|
|
244
|
+
storyExtension: '.stories.tsx',
|
|
245
|
+
typescript: true,
|
|
246
|
+
jsx: true,
|
|
247
|
+
componentExtension: '.tsx',
|
|
248
|
+
},
|
|
249
|
+
'vue': {
|
|
250
|
+
importStyle: 'default',
|
|
251
|
+
storyExtension: '.stories.ts',
|
|
252
|
+
typescript: true,
|
|
253
|
+
jsx: false,
|
|
254
|
+
componentExtension: '.vue',
|
|
255
|
+
},
|
|
256
|
+
'angular': {
|
|
257
|
+
importStyle: 'named',
|
|
258
|
+
storyExtension: '.stories.ts',
|
|
259
|
+
typescript: true,
|
|
260
|
+
jsx: false,
|
|
261
|
+
componentExtension: '.component.ts',
|
|
262
|
+
},
|
|
263
|
+
'svelte': {
|
|
264
|
+
importStyle: 'default',
|
|
265
|
+
storyExtension: '.stories.svelte',
|
|
266
|
+
typescript: true,
|
|
267
|
+
jsx: false,
|
|
268
|
+
componentExtension: '.svelte',
|
|
269
|
+
},
|
|
270
|
+
'web-components': {
|
|
271
|
+
importStyle: 'named',
|
|
272
|
+
storyExtension: '.stories.ts',
|
|
273
|
+
typescript: true,
|
|
274
|
+
jsx: false,
|
|
275
|
+
componentExtension: '.ts',
|
|
276
|
+
},
|
|
277
|
+
'solid': {
|
|
278
|
+
importStyle: 'named',
|
|
279
|
+
storyExtension: '.stories.tsx',
|
|
280
|
+
typescript: true,
|
|
281
|
+
jsx: true,
|
|
282
|
+
componentExtension: '.tsx',
|
|
283
|
+
},
|
|
284
|
+
'qwik': {
|
|
285
|
+
importStyle: 'named',
|
|
286
|
+
storyExtension: '.stories.tsx',
|
|
287
|
+
typescript: true,
|
|
288
|
+
jsx: true,
|
|
289
|
+
componentExtension: '.tsx',
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
return configs[framework] || configs['react'];
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Quick check for a specific framework
|
|
296
|
+
*/
|
|
297
|
+
hasFramework(framework) {
|
|
298
|
+
const packageMap = {
|
|
299
|
+
'react': ['react', 'react-dom'],
|
|
300
|
+
'vue': ['vue'],
|
|
301
|
+
'angular': ['@angular/core'],
|
|
302
|
+
'svelte': ['svelte'],
|
|
303
|
+
'web-components': ['lit', 'lit-element', '@open-wc/testing'],
|
|
304
|
+
'solid': ['solid-js'],
|
|
305
|
+
'qwik': ['@builder.io/qwik'],
|
|
306
|
+
};
|
|
307
|
+
const packages = packageMap[framework] || [];
|
|
308
|
+
return packages.some(pkg => !!this.dependencies[pkg]);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Factory function for framework detection
|
|
313
|
+
*/
|
|
314
|
+
export function detectFramework(projectRoot) {
|
|
315
|
+
const detector = new FrameworkDetector(projectRoot);
|
|
316
|
+
return detector.detect();
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get framework detector instance
|
|
320
|
+
*/
|
|
321
|
+
export function getFrameworkDetector(projectRoot) {
|
|
322
|
+
return new FrameworkDetector(projectRoot);
|
|
323
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Adapters Module
|
|
3
|
+
*
|
|
4
|
+
* Exports framework detection, adapters, and the adapter registry.
|
|
5
|
+
*/
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export { FrameworkDetector, detectFramework, getFrameworkDetector, } from './framework-detector.js';
|
|
8
|
+
export { BaseFrameworkAdapter } from './base-adapter.js';
|
|
9
|
+
export { ReactAdapter, createReactAdapter } from './react-adapter.js';
|
|
10
|
+
export { WebComponentsAdapter, createWebComponentsAdapter } from './web-components-adapter.js';
|
|
11
|
+
export { VueAdapter, createVueAdapter } from './vue-adapter.js';
|
|
12
|
+
export { AngularAdapter, createAngularAdapter } from './angular-adapter.js';
|
|
13
|
+
export { SvelteAdapter, createSvelteAdapter } from './svelte-adapter.js';
|
|
14
|
+
import { FrameworkType, FrameworkAdapter, DetectedFramework, FrameworkPrompt, StoryGenerationOptions } from './types.js';
|
|
15
|
+
import { StoryUIConfig } from '../../story-ui.config.js';
|
|
16
|
+
import { DiscoveredComponent } from '../componentDiscovery.js';
|
|
17
|
+
/**
|
|
18
|
+
* Framework Adapter Registry
|
|
19
|
+
*
|
|
20
|
+
* Manages available framework adapters and provides
|
|
21
|
+
* automatic framework detection and adapter selection.
|
|
22
|
+
*/
|
|
23
|
+
declare class AdapterRegistry {
|
|
24
|
+
private adapters;
|
|
25
|
+
private defaultAdapter;
|
|
26
|
+
private detectedFramework;
|
|
27
|
+
constructor();
|
|
28
|
+
/**
|
|
29
|
+
* Register built-in framework adapters
|
|
30
|
+
*/
|
|
31
|
+
private registerBuiltInAdapters;
|
|
32
|
+
/**
|
|
33
|
+
* Register a framework adapter
|
|
34
|
+
*/
|
|
35
|
+
register(adapter: FrameworkAdapter): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get adapter by framework type
|
|
38
|
+
*/
|
|
39
|
+
get(type: FrameworkType): FrameworkAdapter | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Get all registered adapters
|
|
42
|
+
*/
|
|
43
|
+
getAll(): FrameworkAdapter[];
|
|
44
|
+
/**
|
|
45
|
+
* Get available framework types
|
|
46
|
+
*/
|
|
47
|
+
getAvailableTypes(): FrameworkType[];
|
|
48
|
+
/**
|
|
49
|
+
* Get available framework types (alias for getAvailableTypes)
|
|
50
|
+
*/
|
|
51
|
+
getAvailableFrameworks(): FrameworkType[];
|
|
52
|
+
/**
|
|
53
|
+
* Get adapter by framework type (alias for get with default fallback)
|
|
54
|
+
*/
|
|
55
|
+
getAdapter(type: FrameworkType): FrameworkAdapter;
|
|
56
|
+
/**
|
|
57
|
+
* Get the default adapter
|
|
58
|
+
*/
|
|
59
|
+
getDefault(): FrameworkAdapter;
|
|
60
|
+
/**
|
|
61
|
+
* Set the default adapter
|
|
62
|
+
*/
|
|
63
|
+
setDefault(type: FrameworkType): void;
|
|
64
|
+
/**
|
|
65
|
+
* Auto-detect framework and return appropriate adapter
|
|
66
|
+
*/
|
|
67
|
+
autoDetect(projectRoot?: string): Promise<FrameworkAdapter>;
|
|
68
|
+
/**
|
|
69
|
+
* Get the last detected framework info
|
|
70
|
+
*/
|
|
71
|
+
getDetectedFramework(): DetectedFramework | null;
|
|
72
|
+
/**
|
|
73
|
+
* Generate prompt using the appropriate adapter
|
|
74
|
+
*/
|
|
75
|
+
generatePrompt(config: StoryUIConfig, components: DiscoveredComponent[], options?: StoryGenerationOptions): Promise<FrameworkPrompt>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get the global adapter registry instance
|
|
79
|
+
*/
|
|
80
|
+
export declare function getAdapterRegistry(): AdapterRegistry;
|
|
81
|
+
/**
|
|
82
|
+
* Get adapter for a specific framework
|
|
83
|
+
*/
|
|
84
|
+
export declare function getAdapter(type: FrameworkType): FrameworkAdapter | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Get the default adapter
|
|
87
|
+
*/
|
|
88
|
+
export declare function getDefaultAdapter(): FrameworkAdapter;
|
|
89
|
+
/**
|
|
90
|
+
* Auto-detect framework and get appropriate adapter
|
|
91
|
+
*/
|
|
92
|
+
export declare function autoDetectAdapter(projectRoot?: string): Promise<FrameworkAdapter>;
|
|
93
|
+
/**
|
|
94
|
+
* Generate framework-specific prompt
|
|
95
|
+
*/
|
|
96
|
+
export declare function generateFrameworkPrompt(config: StoryUIConfig, components: DiscoveredComponent[], options?: StoryGenerationOptions): Promise<FrameworkPrompt>;
|
|
97
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D;;;;;GAKG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAmD;IACnE,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,iBAAiB,CAAkC;;IAU3D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIzC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS;IAItD;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE;IAI5B;;OAEG;IACH,iBAAiB,IAAI,aAAa,EAAE;IAIpC;;OAEG;IACH,sBAAsB,IAAI,aAAa,EAAE;IAIzC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB;IAIjD;;OAEG;IACH,UAAU,IAAI,gBAAgB;IAI9B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAQrC;;OAEG;IACG,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBjE;;OAEG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,IAAI;IAIhD;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC;CA8B5B;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAE5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,gBAAgB,CAEpD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,eAAe,CAAC,CAE1B"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Adapters Module
|
|
3
|
+
*
|
|
4
|
+
* Exports framework detection, adapters, and the adapter registry.
|
|
5
|
+
*/
|
|
6
|
+
// Types
|
|
7
|
+
export * from './types.js';
|
|
8
|
+
// Framework Detection
|
|
9
|
+
export { FrameworkDetector, detectFramework, getFrameworkDetector, } from './framework-detector.js';
|
|
10
|
+
// Base Adapter
|
|
11
|
+
export { BaseFrameworkAdapter } from './base-adapter.js';
|
|
12
|
+
// Framework Adapters
|
|
13
|
+
export { ReactAdapter, createReactAdapter } from './react-adapter.js';
|
|
14
|
+
export { WebComponentsAdapter, createWebComponentsAdapter } from './web-components-adapter.js';
|
|
15
|
+
export { VueAdapter, createVueAdapter } from './vue-adapter.js';
|
|
16
|
+
export { AngularAdapter, createAngularAdapter } from './angular-adapter.js';
|
|
17
|
+
export { SvelteAdapter, createSvelteAdapter } from './svelte-adapter.js';
|
|
18
|
+
import { ReactAdapter } from './react-adapter.js';
|
|
19
|
+
import { WebComponentsAdapter } from './web-components-adapter.js';
|
|
20
|
+
import { VueAdapter } from './vue-adapter.js';
|
|
21
|
+
import { AngularAdapter } from './angular-adapter.js';
|
|
22
|
+
import { SvelteAdapter } from './svelte-adapter.js';
|
|
23
|
+
import { detectFramework } from './framework-detector.js';
|
|
24
|
+
import { logger } from '../logger.js';
|
|
25
|
+
/**
|
|
26
|
+
* Framework Adapter Registry
|
|
27
|
+
*
|
|
28
|
+
* Manages available framework adapters and provides
|
|
29
|
+
* automatic framework detection and adapter selection.
|
|
30
|
+
*/
|
|
31
|
+
class AdapterRegistry {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.adapters = new Map();
|
|
34
|
+
this.detectedFramework = null;
|
|
35
|
+
// Register built-in adapters
|
|
36
|
+
this.registerBuiltInAdapters();
|
|
37
|
+
// Default to React
|
|
38
|
+
this.defaultAdapter = this.adapters.get('react');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Register built-in framework adapters
|
|
42
|
+
*/
|
|
43
|
+
registerBuiltInAdapters() {
|
|
44
|
+
this.register(new ReactAdapter());
|
|
45
|
+
this.register(new WebComponentsAdapter());
|
|
46
|
+
this.register(new VueAdapter());
|
|
47
|
+
this.register(new AngularAdapter());
|
|
48
|
+
this.register(new SvelteAdapter());
|
|
49
|
+
logger.debug('Registered framework adapters', {
|
|
50
|
+
adapters: Array.from(this.adapters.keys()),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Register a framework adapter
|
|
55
|
+
*/
|
|
56
|
+
register(adapter) {
|
|
57
|
+
this.adapters.set(adapter.type, adapter);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get adapter by framework type
|
|
61
|
+
*/
|
|
62
|
+
get(type) {
|
|
63
|
+
return this.adapters.get(type);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all registered adapters
|
|
67
|
+
*/
|
|
68
|
+
getAll() {
|
|
69
|
+
return Array.from(this.adapters.values());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get available framework types
|
|
73
|
+
*/
|
|
74
|
+
getAvailableTypes() {
|
|
75
|
+
return Array.from(this.adapters.keys());
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get available framework types (alias for getAvailableTypes)
|
|
79
|
+
*/
|
|
80
|
+
getAvailableFrameworks() {
|
|
81
|
+
return this.getAvailableTypes();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get adapter by framework type (alias for get with default fallback)
|
|
85
|
+
*/
|
|
86
|
+
getAdapter(type) {
|
|
87
|
+
return this.adapters.get(type) || this.defaultAdapter;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the default adapter
|
|
91
|
+
*/
|
|
92
|
+
getDefault() {
|
|
93
|
+
return this.defaultAdapter;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set the default adapter
|
|
97
|
+
*/
|
|
98
|
+
setDefault(type) {
|
|
99
|
+
const adapter = this.adapters.get(type);
|
|
100
|
+
if (adapter) {
|
|
101
|
+
this.defaultAdapter = adapter;
|
|
102
|
+
logger.debug('Set default framework adapter', { type });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Auto-detect framework and return appropriate adapter
|
|
107
|
+
*/
|
|
108
|
+
async autoDetect(projectRoot) {
|
|
109
|
+
const result = await detectFramework(projectRoot);
|
|
110
|
+
this.detectedFramework = result.primary;
|
|
111
|
+
const adapter = this.adapters.get(result.primary.componentFramework);
|
|
112
|
+
if (adapter) {
|
|
113
|
+
logger.info('Auto-detected framework', {
|
|
114
|
+
framework: result.primary.componentFramework,
|
|
115
|
+
confidence: result.primary.confidence,
|
|
116
|
+
});
|
|
117
|
+
return adapter;
|
|
118
|
+
}
|
|
119
|
+
logger.warn('No adapter for detected framework, using default', {
|
|
120
|
+
detected: result.primary.componentFramework,
|
|
121
|
+
using: this.defaultAdapter.type,
|
|
122
|
+
});
|
|
123
|
+
return this.defaultAdapter;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the last detected framework info
|
|
127
|
+
*/
|
|
128
|
+
getDetectedFramework() {
|
|
129
|
+
return this.detectedFramework;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Generate prompt using the appropriate adapter
|
|
133
|
+
*/
|
|
134
|
+
async generatePrompt(config, components, options) {
|
|
135
|
+
// Determine which adapter to use
|
|
136
|
+
let adapter;
|
|
137
|
+
if (options?.framework) {
|
|
138
|
+
// Explicit framework specified
|
|
139
|
+
adapter = this.adapters.get(options.framework) || this.defaultAdapter;
|
|
140
|
+
}
|
|
141
|
+
else if (this.detectedFramework) {
|
|
142
|
+
// Use previously detected framework
|
|
143
|
+
adapter = this.adapters.get(this.detectedFramework.componentFramework) || this.defaultAdapter;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Auto-detect
|
|
147
|
+
adapter = await this.autoDetect();
|
|
148
|
+
}
|
|
149
|
+
logger.debug('Generating prompt with adapter', { adapter: adapter.type });
|
|
150
|
+
return {
|
|
151
|
+
systemPrompt: adapter.generateSystemPrompt(config, options),
|
|
152
|
+
componentReference: adapter.generateComponentReference(components, config),
|
|
153
|
+
layoutInstructions: '', // TODO: Implement layout instructions
|
|
154
|
+
examples: adapter.generateExamples(config),
|
|
155
|
+
sampleStory: adapter.generateSampleStory(config, components),
|
|
156
|
+
framework: this.detectedFramework || {
|
|
157
|
+
componentFramework: adapter.type,
|
|
158
|
+
storyFramework: adapter.supportedStoryFrameworks[0],
|
|
159
|
+
confidence: 1,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Singleton registry instance
|
|
165
|
+
let registryInstance = null;
|
|
166
|
+
/**
|
|
167
|
+
* Get the global adapter registry instance
|
|
168
|
+
*/
|
|
169
|
+
export function getAdapterRegistry() {
|
|
170
|
+
if (!registryInstance) {
|
|
171
|
+
registryInstance = new AdapterRegistry();
|
|
172
|
+
}
|
|
173
|
+
return registryInstance;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get adapter for a specific framework
|
|
177
|
+
*/
|
|
178
|
+
export function getAdapter(type) {
|
|
179
|
+
return getAdapterRegistry().get(type);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the default adapter
|
|
183
|
+
*/
|
|
184
|
+
export function getDefaultAdapter() {
|
|
185
|
+
return getAdapterRegistry().getDefault();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Auto-detect framework and get appropriate adapter
|
|
189
|
+
*/
|
|
190
|
+
export async function autoDetectAdapter(projectRoot) {
|
|
191
|
+
return getAdapterRegistry().autoDetect(projectRoot);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Generate framework-specific prompt
|
|
195
|
+
*/
|
|
196
|
+
export async function generateFrameworkPrompt(config, components, options) {
|
|
197
|
+
return getAdapterRegistry().generatePrompt(config, components, options);
|
|
198
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Framework Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generates Storybook stories for React components.
|
|
5
|
+
* Supports CSF 3.0 format with TypeScript.
|
|
6
|
+
*/
|
|
7
|
+
import { FrameworkType, StoryFramework, StoryGenerationOptions } from './types.js';
|
|
8
|
+
import { BaseFrameworkAdapter } from './base-adapter.js';
|
|
9
|
+
import { StoryUIConfig } from '../../story-ui.config.js';
|
|
10
|
+
import { DiscoveredComponent } from '../componentDiscovery.js';
|
|
11
|
+
export declare class ReactAdapter extends BaseFrameworkAdapter {
|
|
12
|
+
readonly type: FrameworkType;
|
|
13
|
+
readonly name = "React";
|
|
14
|
+
readonly supportedStoryFrameworks: StoryFramework[];
|
|
15
|
+
readonly defaultExtension = ".stories.tsx";
|
|
16
|
+
generateSystemPrompt(config: StoryUIConfig, options?: StoryGenerationOptions): string;
|
|
17
|
+
/**
|
|
18
|
+
* FIX #2: Detect if the project uses Chakra UI v3
|
|
19
|
+
*/
|
|
20
|
+
private isChakraUIProject;
|
|
21
|
+
generateExamples(config: StoryUIConfig): string;
|
|
22
|
+
generateSampleStory(config: StoryUIConfig, components: DiscoveredComponent[]): string;
|
|
23
|
+
getStoryTemplate(options?: StoryGenerationOptions): string;
|
|
24
|
+
/**
|
|
25
|
+
* Post-process React stories
|
|
26
|
+
*/
|
|
27
|
+
postProcess(storyContent: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Validate React story
|
|
30
|
+
*/
|
|
31
|
+
validate(storyContent: string): {
|
|
32
|
+
valid: boolean;
|
|
33
|
+
errors: string[];
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Factory function
|
|
38
|
+
*/
|
|
39
|
+
export declare function createReactAdapter(): ReactAdapter;
|
|
40
|
+
//# sourceMappingURL=react-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-adapter.d.ts","sourceRoot":"","sources":["../../../story-generator/framework-adapters/react-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,sBAAsB,EACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,qBAAa,YAAa,SAAQ,oBAAoB;IACpD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAW;IACvC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,wBAAwB,EAAE,cAAc,EAAE,CAIjD;IACF,QAAQ,CAAC,gBAAgB,kBAAkB;IAE3C,oBAAoB,CAClB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM;IA+GT;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;IAgE/C,mBAAmB,CACjB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,mBAAmB,EAAE,GAChC,MAAM;IA4CT,gBAAgB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM;IA0B1D;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IA4BzC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CA2BrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
|