codemeld 2.1.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/README.md +514 -0
- package/bin/cli.js +2 -0
- package/dist/ai/agent.d.ts +124 -0
- package/dist/ai/agent.d.ts.map +1 -0
- package/dist/ai/agent.js +289 -0
- package/dist/ai/agent.js.map +1 -0
- package/dist/ai/index.d.ts +10 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +10 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/prompts.d.ts +35 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +166 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/refinement-loop.d.ts +29 -0
- package/dist/ai/refinement-loop.d.ts.map +1 -0
- package/dist/ai/refinement-loop.js +180 -0
- package/dist/ai/refinement-loop.js.map +1 -0
- package/dist/ai/tools.d.ts +17 -0
- package/dist/ai/tools.d.ts.map +1 -0
- package/dist/ai/tools.js +353 -0
- package/dist/ai/tools.js.map +1 -0
- package/dist/ai/visual-compare.d.ts +43 -0
- package/dist/ai/visual-compare.d.ts.map +1 -0
- package/dist/ai/visual-compare.js +176 -0
- package/dist/ai/visual-compare.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +179 -0
- package/dist/cli.js.map +1 -0
- package/dist/converter.d.ts +10 -0
- package/dist/converter.d.ts.map +1 -0
- package/dist/converter.js +836 -0
- package/dist/converter.js.map +1 -0
- package/dist/deconverter.d.ts +19 -0
- package/dist/deconverter.d.ts.map +1 -0
- package/dist/deconverter.js +188 -0
- package/dist/deconverter.js.map +1 -0
- package/dist/frameworks/angular-adapter.d.ts +27 -0
- package/dist/frameworks/angular-adapter.d.ts.map +1 -0
- package/dist/frameworks/angular-adapter.js +617 -0
- package/dist/frameworks/angular-adapter.js.map +1 -0
- package/dist/frameworks/index.d.ts +10 -0
- package/dist/frameworks/index.d.ts.map +1 -0
- package/dist/frameworks/index.js +21 -0
- package/dist/frameworks/index.js.map +1 -0
- package/dist/frameworks/nextjs-adapter.d.ts +22 -0
- package/dist/frameworks/nextjs-adapter.d.ts.map +1 -0
- package/dist/frameworks/nextjs-adapter.js +392 -0
- package/dist/frameworks/nextjs-adapter.js.map +1 -0
- package/dist/frameworks/react-adapter.d.ts +21 -0
- package/dist/frameworks/react-adapter.d.ts.map +1 -0
- package/dist/frameworks/react-adapter.js +71 -0
- package/dist/frameworks/react-adapter.js.map +1 -0
- package/dist/frameworks/svelte-adapter.d.ts +27 -0
- package/dist/frameworks/svelte-adapter.d.ts.map +1 -0
- package/dist/frameworks/svelte-adapter.js +519 -0
- package/dist/frameworks/svelte-adapter.js.map +1 -0
- package/dist/frameworks/types.d.ts +78 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +2 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/frameworks/vue-adapter.d.ts +34 -0
- package/dist/frameworks/vue-adapter.d.ts.map +1 -0
- package/dist/frameworks/vue-adapter.js +632 -0
- package/dist/frameworks/vue-adapter.js.map +1 -0
- package/dist/generators/accessibility-generator.d.ts +43 -0
- package/dist/generators/accessibility-generator.d.ts.map +1 -0
- package/dist/generators/accessibility-generator.js +507 -0
- package/dist/generators/accessibility-generator.js.map +1 -0
- package/dist/generators/asset-handler.d.ts +14 -0
- package/dist/generators/asset-handler.d.ts.map +1 -0
- package/dist/generators/asset-handler.js +79 -0
- package/dist/generators/asset-handler.js.map +1 -0
- package/dist/generators/build-verifier.d.ts +8 -0
- package/dist/generators/build-verifier.d.ts.map +1 -0
- package/dist/generators/build-verifier.js +64 -0
- package/dist/generators/build-verifier.js.map +1 -0
- package/dist/generators/component-extractor.d.ts +25 -0
- package/dist/generators/component-extractor.d.ts.map +1 -0
- package/dist/generators/component-extractor.js +146 -0
- package/dist/generators/component-extractor.js.map +1 -0
- package/dist/generators/component-generator.d.ts +12 -0
- package/dist/generators/component-generator.d.ts.map +1 -0
- package/dist/generators/component-generator.js +724 -0
- package/dist/generators/component-generator.js.map +1 -0
- package/dist/generators/deploy-generator.d.ts +9 -0
- package/dist/generators/deploy-generator.d.ts.map +1 -0
- package/dist/generators/deploy-generator.js +409 -0
- package/dist/generators/deploy-generator.js.map +1 -0
- package/dist/generators/error-boundary.d.ts +5 -0
- package/dist/generators/error-boundary.d.ts.map +1 -0
- package/dist/generators/error-boundary.js +59 -0
- package/dist/generators/error-boundary.js.map +1 -0
- package/dist/generators/form-generator.d.ts +42 -0
- package/dist/generators/form-generator.d.ts.map +1 -0
- package/dist/generators/form-generator.js +662 -0
- package/dist/generators/form-generator.js.map +1 -0
- package/dist/generators/hooks-generator.d.ts +40 -0
- package/dist/generators/hooks-generator.d.ts.map +1 -0
- package/dist/generators/hooks-generator.js +297 -0
- package/dist/generators/hooks-generator.js.map +1 -0
- package/dist/generators/html-generator.d.ts +27 -0
- package/dist/generators/html-generator.d.ts.map +1 -0
- package/dist/generators/html-generator.js +772 -0
- package/dist/generators/html-generator.js.map +1 -0
- package/dist/generators/jquery-converter.d.ts +41 -0
- package/dist/generators/jquery-converter.d.ts.map +1 -0
- package/dist/generators/jquery-converter.js +594 -0
- package/dist/generators/jquery-converter.js.map +1 -0
- package/dist/generators/pattern-implementer.d.ts +26 -0
- package/dist/generators/pattern-implementer.d.ts.map +1 -0
- package/dist/generators/pattern-implementer.js +336 -0
- package/dist/generators/pattern-implementer.js.map +1 -0
- package/dist/generators/performance-generator.d.ts +51 -0
- package/dist/generators/performance-generator.d.ts.map +1 -0
- package/dist/generators/performance-generator.js +428 -0
- package/dist/generators/performance-generator.js.map +1 -0
- package/dist/generators/router-generator.d.ts +21 -0
- package/dist/generators/router-generator.d.ts.map +1 -0
- package/dist/generators/router-generator.js +178 -0
- package/dist/generators/router-generator.js.map +1 -0
- package/dist/generators/scaffolder.d.ts +28 -0
- package/dist/generators/scaffolder.d.ts.map +1 -0
- package/dist/generators/scaffolder.js +266 -0
- package/dist/generators/scaffolder.js.map +1 -0
- package/dist/generators/seo-generator.d.ts +29 -0
- package/dist/generators/seo-generator.d.ts.map +1 -0
- package/dist/generators/seo-generator.js +223 -0
- package/dist/generators/seo-generator.js.map +1 -0
- package/dist/generators/test-generator.d.ts +19 -0
- package/dist/generators/test-generator.d.ts.map +1 -0
- package/dist/generators/test-generator.js +398 -0
- package/dist/generators/test-generator.js.map +1 -0
- package/dist/generators/type-generator.d.ts +33 -0
- package/dist/generators/type-generator.d.ts.map +1 -0
- package/dist/generators/type-generator.js +663 -0
- package/dist/generators/type-generator.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/css-processor.d.ts +23 -0
- package/dist/parsers/css-processor.d.ts.map +1 -0
- package/dist/parsers/css-processor.js +129 -0
- package/dist/parsers/css-processor.js.map +1 -0
- package/dist/parsers/framework-parser.d.ts +48 -0
- package/dist/parsers/framework-parser.d.ts.map +1 -0
- package/dist/parsers/framework-parser.js +770 -0
- package/dist/parsers/framework-parser.js.map +1 -0
- package/dist/parsers/html-parser.d.ts +12 -0
- package/dist/parsers/html-parser.d.ts.map +1 -0
- package/dist/parsers/html-parser.js +444 -0
- package/dist/parsers/html-parser.js.map +1 -0
- package/dist/parsers/js-analyzer.d.ts +199 -0
- package/dist/parsers/js-analyzer.d.ts.map +1 -0
- package/dist/parsers/js-analyzer.js +680 -0
- package/dist/parsers/js-analyzer.js.map +1 -0
- package/dist/parsers/js-resolver.d.ts +8 -0
- package/dist/parsers/js-resolver.d.ts.map +1 -0
- package/dist/parsers/js-resolver.js +45 -0
- package/dist/parsers/js-resolver.js.map +1 -0
- package/dist/parsers/tailwind-detector.d.ts +23 -0
- package/dist/parsers/tailwind-detector.d.ts.map +1 -0
- package/dist/parsers/tailwind-detector.js +104 -0
- package/dist/parsers/tailwind-detector.js.map +1 -0
- package/dist/tests/advanced-features.test.d.ts +2 -0
- package/dist/tests/advanced-features.test.d.ts.map +1 -0
- package/dist/tests/advanced-features.test.js +235 -0
- package/dist/tests/advanced-features.test.js.map +1 -0
- package/dist/tests/css-modules.test.d.ts +2 -0
- package/dist/tests/css-modules.test.d.ts.map +1 -0
- package/dist/tests/css-modules.test.js +61 -0
- package/dist/tests/css-modules.test.js.map +1 -0
- package/dist/tests/css-processor.test.d.ts +2 -0
- package/dist/tests/css-processor.test.d.ts.map +1 -0
- package/dist/tests/css-processor.test.js +48 -0
- package/dist/tests/css-processor.test.js.map +1 -0
- package/dist/tests/html-parser.test.d.ts +2 -0
- package/dist/tests/html-parser.test.d.ts.map +1 -0
- package/dist/tests/html-parser.test.js +78 -0
- package/dist/tests/html-parser.test.js.map +1 -0
- package/dist/tests/integration.test.d.ts +2 -0
- package/dist/tests/integration.test.d.ts.map +1 -0
- package/dist/tests/integration.test.js +65 -0
- package/dist/tests/integration.test.js.map +1 -0
- package/dist/tests/js-analyzer.test.d.ts +2 -0
- package/dist/tests/js-analyzer.test.d.ts.map +1 -0
- package/dist/tests/js-analyzer.test.js +58 -0
- package/dist/tests/js-analyzer.test.js.map +1 -0
- package/dist/tests/naming.test.d.ts +2 -0
- package/dist/tests/naming.test.d.ts.map +1 -0
- package/dist/tests/naming.test.js +43 -0
- package/dist/tests/naming.test.js.map +1 -0
- package/dist/tests/router-generator.test.d.ts +2 -0
- package/dist/tests/router-generator.test.d.ts.map +1 -0
- package/dist/tests/router-generator.test.js +60 -0
- package/dist/tests/router-generator.test.js.map +1 -0
- package/dist/tui/chat.d.ts +13 -0
- package/dist/tui/chat.d.ts.map +1 -0
- package/dist/tui/chat.js +499 -0
- package/dist/tui/chat.js.map +1 -0
- package/dist/tui/design-guide.d.ts +41 -0
- package/dist/tui/design-guide.d.ts.map +1 -0
- package/dist/tui/design-guide.js +184 -0
- package/dist/tui/design-guide.js.map +1 -0
- package/dist/tui/input.d.ts +30 -0
- package/dist/tui/input.d.ts.map +1 -0
- package/dist/tui/input.js +239 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/renderer.d.ts +48 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +212 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/tools.d.ts +14 -0
- package/dist/tui/tools.d.ts.map +1 -0
- package/dist/tui/tools.js +1370 -0
- package/dist/tui/tools.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +20 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +33 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/formatter.d.ts +5 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +68 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +19 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/naming.d.ts +17 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +48 -0
- package/dist/utils/naming.js.map +1 -0
- package/dist/utils/report.d.ts +56 -0
- package/dist/utils/report.d.ts.map +1 -0
- package/dist/utils/report.js +339 -0
- package/dist/utils/report.js.map +1 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
# CodeMeld
|
|
2
|
+
|
|
3
|
+
Bidirectional converter between HTML/CSS/JS and modern frameworks (React, Next.js, Vue, Svelte, Angular).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Bidirectional Conversion** — Convert HTML/CSS/JS to React *and* reverse-convert React/Vue/Svelte/Angular back to static HTML
|
|
8
|
+
- **HTML Parsing** — Extracts structure, inline styles, inline scripts, linked resources using Cheerio
|
|
9
|
+
- **HTML to JSX Conversion** — Converts `class` to `className`, `for` to `htmlFor`, self-closes void elements, converts inline styles to object syntax, escapes literal braces in text content
|
|
10
|
+
- **CSS Processing** — Supports global CSS and CSS Modules mode, rewrites asset URLs, merges stylesheets
|
|
11
|
+
- **JavaScript Analysis** — Detects mutable variables to `useState`, DOM event listeners to event handlers, `DOMContentLoaded` to `useEffect`, form handlers with proper event typing, DOM mutations to React state
|
|
12
|
+
- **Smart Component Extraction** — Automatically splits large HTML files into smaller, reusable React components based on semantic sections (`<nav>`, `<header>`, `<section>`, `<footer>`, etc.)
|
|
13
|
+
- **Custom React Hooks** — Generates `useFetch`, `useLocalStorage`, `useInterval`, `useTimeout` hooks when patterns are detected
|
|
14
|
+
- **Tailwind CSS Detection** — Automatically detects and configures Tailwind CSS (or force/disable with flags)
|
|
15
|
+
- **Multi-Framework Support** — Target React, Next.js, Vue, Svelte, or Angular
|
|
16
|
+
- **Project Scaffolding** — Generates complete Vite + React + TypeScript project with proper config files
|
|
17
|
+
- **Multi-page Support** — Converts multiple HTML pages into separate React components with React Router
|
|
18
|
+
- **Hash-based Routing** — Automatically detects and preserves hash-based SPA routing
|
|
19
|
+
- **Asset Handling** — Discovers and copies images, fonts, and other assets to the correct directories
|
|
20
|
+
- **Build Verification** — Optional `--verify` flag installs deps and runs `vite build` to validate output
|
|
21
|
+
- **AI-Powered Refinement** — Optional `--ai` flag uses Claude to fix build errors, enhance components, and improve code quality
|
|
22
|
+
- **Visual Comparison** — Optional `--visual-compare` flag takes Playwright screenshots of original vs converted sites
|
|
23
|
+
- **Interactive AI Chat** — Claude Code-style TUI for iterating on your project with AI assistance
|
|
24
|
+
- **SEO Generation** — Sitemap, robots.txt, web manifest, and meta tag components
|
|
25
|
+
- **Accessibility Enhancement** — ARIA labels, semantic HTML, skip navigation
|
|
26
|
+
- **Performance Optimizations** — React.memo, lazy loading, code splitting
|
|
27
|
+
- **Interactive Pattern Detection** — Auto-detects scroll animations, tabs, accordions, hamburger menus and generates vanilla JS for deconverted output
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install -g codemeld
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or use directly with npx:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx codemeld <input-dir> <output-dir>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Or clone and build from source:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/hansade2005/html-to-vite-react.git
|
|
45
|
+
cd html-to-vite-react
|
|
46
|
+
npm install
|
|
47
|
+
npm run build
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Then run with:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
node dist/cli.js convert <input-dir> <output-dir>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Quick Start
|
|
57
|
+
|
|
58
|
+
### 1. Convert a single-page HTML site
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
codemeld ./my-website ./my-react-app
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This reads all `.html`, `.css`, and `.js` files from `./my-website`, converts them into React components, and outputs a complete Vite project in `./my-react-app`.
|
|
65
|
+
|
|
66
|
+
### 2. Reverse-convert a React app back to HTML
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
codemeld deconvert ./my-react-app ./my-html-site
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 3. Install dependencies and run
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cd my-react-app
|
|
76
|
+
npm install
|
|
77
|
+
npm run dev
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Your converted site is now running as a React app at `http://localhost:5173`.
|
|
81
|
+
|
|
82
|
+
### 4. Build for production
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npm run build
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## CLI Reference
|
|
89
|
+
|
|
90
|
+
### `convert` (default command)
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
codemeld convert <input> <output> [options]
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Since `convert` is the default command, you can omit it:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
codemeld ./site ./app
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Arguments:**
|
|
103
|
+
|
|
104
|
+
| Argument | Description |
|
|
105
|
+
|----------|-------------|
|
|
106
|
+
| `<input>` | Path to the HTML/CSS/JS source directory |
|
|
107
|
+
| `<output>` | Path for the generated Vite + React project |
|
|
108
|
+
|
|
109
|
+
**Options:**
|
|
110
|
+
|
|
111
|
+
| Option | Description | Default |
|
|
112
|
+
|--------|-------------|---------|
|
|
113
|
+
| `-n, --name <name>` | Project/component name | Directory name |
|
|
114
|
+
| `-m, --css-modules` | Use CSS Modules instead of global CSS | `false` |
|
|
115
|
+
| `-p, --preserve-structure` | Preserve original file/folder structure | `false` |
|
|
116
|
+
| `-f, --framework <fw>` | Target framework: `react`, `nextjs`, `vue`, `svelte`, `angular` | `react` |
|
|
117
|
+
| `--verify` | Run `npm install && vite build` after conversion to verify output | `false` |
|
|
118
|
+
| `--no-verify` | Skip build verification | — |
|
|
119
|
+
| `--no-extract` | Disable smart component extraction (keep everything in one component) | — |
|
|
120
|
+
| `--no-prettier` | Disable Prettier formatting on generated code | — |
|
|
121
|
+
| `--tailwind <mode>` | Tailwind CSS handling: `auto`, `force`, `disable` | `auto` |
|
|
122
|
+
| `--ai` | Enable AI-powered refinement after conversion (requires API key) | `false` |
|
|
123
|
+
| `--ai-max-steps <n>` | Maximum AI agent iterations | `50` |
|
|
124
|
+
| `--ai-mode <mode>` | AI mode: `full`, `build-fix`, `enhance`, `visual` | `full` |
|
|
125
|
+
| `--ai-verbose` | Show AI agent reasoning in real-time | `false` |
|
|
126
|
+
| `--visual-compare` | Take screenshots comparing original vs converted (requires Playwright) | `false` |
|
|
127
|
+
| `--tests` | Generate Vitest test files for components | `false` |
|
|
128
|
+
| `--deploy` | Generate deployment configs (Docker, CI/CD, Vercel, Netlify) | `false` |
|
|
129
|
+
| `--seo` | Generate SEO files (sitemap, robots.txt, manifest, meta tags) | `false` |
|
|
130
|
+
| `--seo-url <url>` | Base URL for SEO files | `https://example.com` |
|
|
131
|
+
| `--a11y` | Enhance accessibility (ARIA labels, semantic HTML, skip nav) | `false` |
|
|
132
|
+
| `--perf` | Add performance optimizations (React.memo, lazy loading, code splitting) | `false` |
|
|
133
|
+
| `--forms` | Generate form handling with validation | `false` |
|
|
134
|
+
| `--types` | Generate TypeScript type definitions | `false` |
|
|
135
|
+
| `--all-extras` | Enable all extras: `--tests --deploy --seo --a11y --perf --forms --types` | `false` |
|
|
136
|
+
|
|
137
|
+
### `deconvert`
|
|
138
|
+
|
|
139
|
+
Reverse-convert a framework project back to static HTML/CSS/JS:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
codemeld deconvert <input> <output> [options]
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
| Option | Description |
|
|
146
|
+
|--------|-------------|
|
|
147
|
+
| `-f, --framework <fw>` | Force framework detection: `react`, `nextjs`, `vue`, `svelte`, `angular` |
|
|
148
|
+
| `--no-prettier` | Disable Prettier formatting |
|
|
149
|
+
|
|
150
|
+
### `chat`
|
|
151
|
+
|
|
152
|
+
Start an interactive AI chat session for your project:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
codemeld chat [directory]
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
This opens a Claude Code-style terminal UI where you can ask the AI to read files, edit code, run commands, and fix build errors interactively.
|
|
159
|
+
|
|
160
|
+
| Argument | Description | Default |
|
|
161
|
+
|----------|-------------|---------|
|
|
162
|
+
| `[directory]` | Project directory to work in | Current directory |
|
|
163
|
+
|
|
164
|
+
## Usage Examples
|
|
165
|
+
|
|
166
|
+
### Basic conversion
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
codemeld ./my-html-site ./my-react-app
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Convert with CSS Modules
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
codemeld ./site ./app --css-modules
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Each component gets its own `.module.css` file with scoped class names.
|
|
179
|
+
|
|
180
|
+
### Convert with build verification
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
codemeld ./site ./app --verify
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
After conversion, automatically runs `npm install` and `vite build` to confirm the output compiles without errors.
|
|
187
|
+
|
|
188
|
+
### Convert with AI refinement
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
codemeld ./site ./app --ai --verify
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
After the initial conversion, an AI agent analyzes build errors and TypeScript issues, then iteratively fixes them. Modes:
|
|
195
|
+
|
|
196
|
+
- `full` — Fix build errors, then enhance component quality
|
|
197
|
+
- `build-fix` — Only fix build/TypeScript errors
|
|
198
|
+
- `enhance` — Only improve code quality (assumes it already builds)
|
|
199
|
+
- `visual` — Focus on visual fidelity with the original
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Only fix build errors, up to 20 iterations
|
|
203
|
+
codemeld ./site ./app --ai --ai-mode build-fix --ai-max-steps 20
|
|
204
|
+
|
|
205
|
+
# Full refinement with verbose logging
|
|
206
|
+
codemeld ./site ./app --ai --ai-verbose
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Convert and compare visually
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
codemeld ./site ./app --verify --visual-compare
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Takes Playwright screenshots of the original HTML site and the converted Vite app side by side.
|
|
216
|
+
|
|
217
|
+
### Keep everything in one component
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
codemeld ./site ./app --no-extract
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Disables smart component extraction — the entire page is kept as a single React component.
|
|
224
|
+
|
|
225
|
+
### Custom project name
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
codemeld ./site ./app --name "My Dashboard"
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Target a different framework
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
codemeld ./site ./app --framework vue
|
|
235
|
+
codemeld ./site ./app --framework nextjs
|
|
236
|
+
codemeld ./site ./app --framework svelte
|
|
237
|
+
codemeld ./site ./app --framework angular
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Disable Tailwind detection
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
codemeld ./site ./app --tailwind disable
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Convert a multi-page site
|
|
247
|
+
|
|
248
|
+
If your input directory contains multiple `.html` files:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
my-site/
|
|
252
|
+
├── index.html
|
|
253
|
+
├── about.html
|
|
254
|
+
├── contact.html
|
|
255
|
+
├── styles.css
|
|
256
|
+
└── script.js
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
codemeld ./my-site ./my-app
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Each HTML file becomes a React component, and React Router is configured automatically:
|
|
264
|
+
|
|
265
|
+
- `index.html` → `/`
|
|
266
|
+
- `about.html` → `/about`
|
|
267
|
+
- `contact.html` → `/contact`
|
|
268
|
+
|
|
269
|
+
### Enable all extras
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
codemeld ./site ./app --all-extras --verify
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Generates tests, deployment configs, SEO files, accessibility enhancements, performance optimizations, form handling, and TypeScript types.
|
|
276
|
+
|
|
277
|
+
## What Gets Converted
|
|
278
|
+
|
|
279
|
+
### HTML to React Components
|
|
280
|
+
|
|
281
|
+
| HTML | React/JSX |
|
|
282
|
+
|------|-----------|
|
|
283
|
+
| `class="foo"` | `className="foo"` |
|
|
284
|
+
| `for="input"` | `htmlFor="input"` |
|
|
285
|
+
| `tabindex="0"` | `tabIndex="0"` |
|
|
286
|
+
| `readonly` | `readOnly` |
|
|
287
|
+
| `<img src="x">` | `<img src="x" />` |
|
|
288
|
+
| `<br>` | `<br />` |
|
|
289
|
+
| `style="color: red; font-size: 14px"` | `style={{color: 'red', fontSize: '14px'}}` |
|
|
290
|
+
| `onclick="fn()"` | `onClick={() => { fn() }}` |
|
|
291
|
+
| `onsubmit="handleSubmit(event)"` | `onSubmit={(e) => { handleSubmit(e) }}` |
|
|
292
|
+
| `<!-- comment -->` | `{/* comment */}` |
|
|
293
|
+
| `checked` (boolean) | `defaultChecked` |
|
|
294
|
+
| `<option selected>` | `<select defaultValue="...">` |
|
|
295
|
+
| Text with `{ braces }` | Text with `{ braces }` |
|
|
296
|
+
|
|
297
|
+
### JavaScript to React Patterns
|
|
298
|
+
|
|
299
|
+
| Vanilla JS | React |
|
|
300
|
+
|-----------|-------|
|
|
301
|
+
| `let count = 0; count = 1;` | `const [count, setCount] = useState(0)` |
|
|
302
|
+
| `DOMContentLoaded` handler | `useEffect(() => {...}, [])` |
|
|
303
|
+
| `addEventListener('click', ...)` | `onClick={handler}` |
|
|
304
|
+
| `element.classList.toggle('active')` | `const [isActive, setIsActive] = useState(false)` |
|
|
305
|
+
| `element.style.display = 'none'` | State-driven conditional rendering |
|
|
306
|
+
| `element.textContent = 'Hello'` | State-driven text content |
|
|
307
|
+
| `document.getElementById('x').value` | `new FormData(e.currentTarget).get('x')` |
|
|
308
|
+
| `this.reset()` | `(e.target as HTMLFormElement).reset()` |
|
|
309
|
+
| `setInterval(fn, 1000)` | `useInterval(fn, 1000)` custom hook |
|
|
310
|
+
| `setTimeout(fn, 500)` | `useTimeout(fn, 500)` custom hook |
|
|
311
|
+
| `fetch('/api/data')` | `useFetch('/api/data')` custom hook |
|
|
312
|
+
| `localStorage.getItem('key')` | `useLocalStorage('key', default)` custom hook |
|
|
313
|
+
|
|
314
|
+
### SVG Attributes
|
|
315
|
+
|
|
316
|
+
All hyphenated SVG attributes are converted to their camelCase JSX equivalents:
|
|
317
|
+
|
|
318
|
+
`stroke-width` → `strokeWidth`, `fill-opacity` → `fillOpacity`, `clip-path` → `clipPath`, etc.
|
|
319
|
+
|
|
320
|
+
### Event Handler Types
|
|
321
|
+
|
|
322
|
+
Generated handlers include proper TypeScript event types:
|
|
323
|
+
|
|
324
|
+
| Event | Type |
|
|
325
|
+
|-------|------|
|
|
326
|
+
| `onSubmit` | `React.FormEvent<HTMLFormElement>` |
|
|
327
|
+
| `onChange` | `React.ChangeEvent<HTMLInputElement>` |
|
|
328
|
+
| `onClick` | `React.MouseEvent<HTMLElement>` |
|
|
329
|
+
| `onKeyDown` | `React.KeyboardEvent<HTMLElement>` |
|
|
330
|
+
| `onFocus` | `React.FocusEvent<HTMLElement>` |
|
|
331
|
+
| `onBlur` | `React.FocusEvent<HTMLElement>` |
|
|
332
|
+
| `onInput` | `React.FormEvent<HTMLInputElement>` |
|
|
333
|
+
|
|
334
|
+
## Output Project Structure
|
|
335
|
+
|
|
336
|
+
### Single-page site
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
output/
|
|
340
|
+
├── index.html
|
|
341
|
+
├── package.json
|
|
342
|
+
├── tsconfig.json
|
|
343
|
+
├── tsconfig.node.json
|
|
344
|
+
├── vite.config.ts
|
|
345
|
+
├── .gitignore
|
|
346
|
+
├── public/
|
|
347
|
+
│ └── (fonts, other assets)
|
|
348
|
+
└── src/
|
|
349
|
+
├── main.tsx
|
|
350
|
+
├── App.tsx
|
|
351
|
+
├── vite-env.d.ts
|
|
352
|
+
├── assets/
|
|
353
|
+
│ └── (images)
|
|
354
|
+
├── components/
|
|
355
|
+
│ ├── index.tsx # Main page component
|
|
356
|
+
│ ├── index.css # Page styles
|
|
357
|
+
│ ├── nav.tsx # Extracted <nav> component
|
|
358
|
+
│ ├── footer.tsx # Extracted <footer> component
|
|
359
|
+
│ ├── hero-section.tsx # Extracted <section> components
|
|
360
|
+
│ └── ...
|
|
361
|
+
├── hooks/
|
|
362
|
+
│ ├── useInterval.ts # Generated if setInterval detected
|
|
363
|
+
│ ├── useTimeout.ts # Generated if setTimeout detected
|
|
364
|
+
│ ├── useFetch.ts # Generated if fetch() detected
|
|
365
|
+
│ └── useLocalStorage.ts # Generated if localStorage detected
|
|
366
|
+
└── styles/
|
|
367
|
+
└── global.css
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Multi-page site
|
|
371
|
+
|
|
372
|
+
```
|
|
373
|
+
output/
|
|
374
|
+
└── src/
|
|
375
|
+
├── main.tsx
|
|
376
|
+
├── App.tsx # React Router setup
|
|
377
|
+
└── components/
|
|
378
|
+
├── index.tsx # Home page (/)
|
|
379
|
+
├── index.css
|
|
380
|
+
├── about.tsx # About page (/about)
|
|
381
|
+
├── about.css
|
|
382
|
+
├── contact.tsx # Contact page (/contact)
|
|
383
|
+
└── contact.css
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Programmatic API
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
import { convert } from 'codemeld';
|
|
390
|
+
|
|
391
|
+
const result = await convert({
|
|
392
|
+
input: './my-html-site',
|
|
393
|
+
output: './my-react-app',
|
|
394
|
+
cssModules: false,
|
|
395
|
+
verify: true,
|
|
396
|
+
extractComponents: true,
|
|
397
|
+
prettier: true,
|
|
398
|
+
tailwind: 'auto',
|
|
399
|
+
framework: 'react',
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
console.log(result.components); // ['Index', 'Nav', 'Footer', 'HeroSection']
|
|
403
|
+
console.log(result.buildSuccess); // true
|
|
404
|
+
console.log(result.errors); // []
|
|
405
|
+
console.log(result.warnings); // ['Some CSS property not supported...']
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Options
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
interface ConversionOptions {
|
|
412
|
+
input: string; // Source directory path
|
|
413
|
+
output: string; // Output directory path
|
|
414
|
+
componentName?: string; // Custom component name
|
|
415
|
+
cssModules?: boolean; // Use CSS Modules (default: false)
|
|
416
|
+
preserveStructure?: boolean; // Keep original file structure (default: false)
|
|
417
|
+
verify?: boolean; // Run build verification (default: false)
|
|
418
|
+
extractComponents?: boolean; // Smart component extraction (default: true)
|
|
419
|
+
prettier?: boolean; // Format with Prettier (default: true)
|
|
420
|
+
tailwind?: 'auto' | 'force' | 'disable'; // Tailwind handling (default: 'auto')
|
|
421
|
+
framework?: 'react' | 'nextjs' | 'vue' | 'svelte' | 'angular'; // Target framework
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Result
|
|
426
|
+
|
|
427
|
+
```typescript
|
|
428
|
+
interface ConversionResult {
|
|
429
|
+
outputDir: string; // Path to generated project
|
|
430
|
+
components: string[]; // List of generated component names
|
|
431
|
+
assets: string[]; // List of copied asset files
|
|
432
|
+
buildSuccess: boolean; // Whether build verification passed
|
|
433
|
+
errors: string[]; // Any errors encountered
|
|
434
|
+
warnings: string[]; // Non-fatal warnings
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## Testing
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
# Run unit tests
|
|
442
|
+
npm test
|
|
443
|
+
|
|
444
|
+
# Run visual comparison tests (requires Playwright)
|
|
445
|
+
npx playwright install chromium
|
|
446
|
+
npm run test:visual
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Development
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
git clone https://github.com/hansade2005/html-to-vite-react.git
|
|
453
|
+
cd html-to-vite-react
|
|
454
|
+
npm install
|
|
455
|
+
npm run build
|
|
456
|
+
npm run dev # watch mode
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
## Architecture
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
src/
|
|
463
|
+
├── cli.ts # CLI entry point (Commander)
|
|
464
|
+
├── converter.ts # Main conversion pipeline orchestrator
|
|
465
|
+
├── deconverter.ts # Reverse conversion pipeline
|
|
466
|
+
├── index.ts # Public API exports
|
|
467
|
+
├── types.ts # TypeScript interfaces
|
|
468
|
+
├── parsers/
|
|
469
|
+
│ ├── html-parser.ts # HTML parsing & JSX conversion (Cheerio)
|
|
470
|
+
│ ├── css-processor.ts # CSS processing & modules (css-tree)
|
|
471
|
+
│ ├── js-analyzer.ts # JavaScript analysis & React conversion
|
|
472
|
+
│ ├── js-resolver.ts # JS file resolution & bundling
|
|
473
|
+
│ ├── framework-parser.ts # Reverse: parse React/Vue/Svelte/Angular back to data
|
|
474
|
+
│ └── tailwind-detector.ts # Tailwind CSS detection & config
|
|
475
|
+
├── generators/
|
|
476
|
+
│ ├── component-generator.ts # React component code generation
|
|
477
|
+
│ ├── component-extractor.ts # Smart component extraction by section
|
|
478
|
+
│ ├── scaffolder.ts # Vite project scaffolding
|
|
479
|
+
│ ├── router-generator.ts # React Router setup for multi-page
|
|
480
|
+
│ ├── hooks-generator.ts # Custom React hooks generation
|
|
481
|
+
│ ├── html-generator.ts # Reverse: generate static HTML/CSS/JS
|
|
482
|
+
│ ├── asset-handler.ts # Asset discovery & copying
|
|
483
|
+
│ ├── seo-generator.ts # SEO file generation
|
|
484
|
+
│ ├── error-boundary.ts # Error boundary component
|
|
485
|
+
│ └── build-verifier.ts # Build verification runner
|
|
486
|
+
├── ai/
|
|
487
|
+
│ ├── agent.ts # AI API client (native fetch, retry)
|
|
488
|
+
│ ├── refinement-loop.ts # AI-powered build fix & enhancement loop
|
|
489
|
+
│ ├── visual-compare.ts # Playwright screenshot comparison
|
|
490
|
+
│ ├── prompts.ts # AI system prompts
|
|
491
|
+
│ └── index.ts # AI module exports
|
|
492
|
+
├── tui/
|
|
493
|
+
│ ├── chat.ts # Interactive AI chat TUI
|
|
494
|
+
│ ├── input.ts # Terminal input handling & clipboard
|
|
495
|
+
│ ├── renderer.ts # Terminal UI rendering
|
|
496
|
+
│ ├── design-guide.ts # Design guide generator
|
|
497
|
+
│ └── tools.ts # Chat tool definitions
|
|
498
|
+
└── utils/
|
|
499
|
+
├── naming.ts # Name conversion utilities (kebab, pascal)
|
|
500
|
+
├── config.ts # Configuration file loader
|
|
501
|
+
├── formatter.ts # Prettier formatting
|
|
502
|
+
├── report.ts # Conversion report generator
|
|
503
|
+
└── logger.ts # Colored console output
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
## Requirements
|
|
507
|
+
|
|
508
|
+
- Node.js >= 18.0.0
|
|
509
|
+
- For `--visual-compare`: Playwright (`npx playwright install chromium`)
|
|
510
|
+
- For `--ai`: API key configured for AI refinement
|
|
511
|
+
|
|
512
|
+
## License
|
|
513
|
+
|
|
514
|
+
MIT
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent Client — OpenAI-compatible chat completions wrapper
|
|
3
|
+
* Uses the3rdacademy.com/api/chat/completions (no API key required)
|
|
4
|
+
* Uses native Node.js fetch — no curl dependency, no timeouts from external processes.
|
|
5
|
+
*/
|
|
6
|
+
export interface ChatMessage {
|
|
7
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
8
|
+
content: string | null;
|
|
9
|
+
tool_calls?: ToolCall[];
|
|
10
|
+
tool_call_id?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ToolCall {
|
|
14
|
+
id: string;
|
|
15
|
+
type: 'function';
|
|
16
|
+
function: {
|
|
17
|
+
name: string;
|
|
18
|
+
arguments: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface ToolDefinition {
|
|
22
|
+
type: 'function';
|
|
23
|
+
function: {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
parameters: Record<string, unknown>;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface ChatCompletionRequest {
|
|
30
|
+
messages: ChatMessage[];
|
|
31
|
+
model?: string;
|
|
32
|
+
max_tokens?: number;
|
|
33
|
+
temperature?: number;
|
|
34
|
+
stream?: boolean;
|
|
35
|
+
tools?: ToolDefinition[];
|
|
36
|
+
tool_choice?: unknown;
|
|
37
|
+
multistep?: boolean;
|
|
38
|
+
max_steps?: number;
|
|
39
|
+
direct_kilo?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface ChatCompletionChoice {
|
|
42
|
+
index: number;
|
|
43
|
+
message: ChatMessage;
|
|
44
|
+
finish_reason: 'stop' | 'tool_calls';
|
|
45
|
+
}
|
|
46
|
+
export interface ChatCompletionResponse {
|
|
47
|
+
id: string;
|
|
48
|
+
object: string;
|
|
49
|
+
created: number;
|
|
50
|
+
model: string;
|
|
51
|
+
choices: ChatCompletionChoice[];
|
|
52
|
+
usage: {
|
|
53
|
+
prompt_tokens: number;
|
|
54
|
+
completion_tokens: number;
|
|
55
|
+
total_tokens: number;
|
|
56
|
+
};
|
|
57
|
+
_meta?: {
|
|
58
|
+
internal_tool_calls: number;
|
|
59
|
+
tools_used: string[];
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface StreamDelta {
|
|
63
|
+
content?: string;
|
|
64
|
+
tool_calls?: Array<{
|
|
65
|
+
index: number;
|
|
66
|
+
id?: string;
|
|
67
|
+
type?: string;
|
|
68
|
+
function?: {
|
|
69
|
+
name?: string;
|
|
70
|
+
arguments?: string;
|
|
71
|
+
};
|
|
72
|
+
}>;
|
|
73
|
+
custom_status?: {
|
|
74
|
+
type: 'tool_start' | 'tool_done';
|
|
75
|
+
name: string;
|
|
76
|
+
arguments?: Record<string, unknown>;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export interface StreamChunk {
|
|
80
|
+
id: string;
|
|
81
|
+
object: string;
|
|
82
|
+
created: number;
|
|
83
|
+
model: string;
|
|
84
|
+
choices: Array<{
|
|
85
|
+
index: number;
|
|
86
|
+
delta: StreamDelta;
|
|
87
|
+
finish_reason: string | null;
|
|
88
|
+
}>;
|
|
89
|
+
}
|
|
90
|
+
export type StreamCallback = (event: {
|
|
91
|
+
type: 'token' | 'tool_start' | 'tool_done' | 'tool_calls' | 'done' | 'error';
|
|
92
|
+
content?: string;
|
|
93
|
+
toolName?: string;
|
|
94
|
+
toolCalls?: ToolCall[];
|
|
95
|
+
error?: string;
|
|
96
|
+
}) => void;
|
|
97
|
+
/**
|
|
98
|
+
* Truncate a tool result to prevent bloating the conversation payload.
|
|
99
|
+
*/
|
|
100
|
+
export declare function truncateToolResult(result: string, maxLen?: number): string;
|
|
101
|
+
/**
|
|
102
|
+
* Send a non-streaming chat completion request.
|
|
103
|
+
* Retries up to 3 times on server-side gateway errors with exponential backoff.
|
|
104
|
+
*/
|
|
105
|
+
export declare function chatCompletion(request: ChatCompletionRequest): Promise<ChatCompletionResponse>;
|
|
106
|
+
/**
|
|
107
|
+
* Send a streaming chat completion request.
|
|
108
|
+
* Returns accumulated content and any tool calls.
|
|
109
|
+
*/
|
|
110
|
+
export declare function chatCompletionStream(request: ChatCompletionRequest, onEvent?: StreamCallback): Promise<{
|
|
111
|
+
content: string;
|
|
112
|
+
toolCalls: ToolCall[];
|
|
113
|
+
finishReason: string;
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* Run a full agent loop: send messages, execute tool calls, repeat until done.
|
|
117
|
+
*/
|
|
118
|
+
export declare function agentLoop(systemPrompt: string, userMessage: string, tools: ToolDefinition[], toolExecutor: (name: string, args: Record<string, unknown>) => Promise<string>, options?: {
|
|
119
|
+
maxSteps?: number;
|
|
120
|
+
temperature?: number;
|
|
121
|
+
onEvent?: StreamCallback;
|
|
122
|
+
onStep?: (step: number, maxSteps: number, action: string) => void;
|
|
123
|
+
}): Promise<string>;
|
|
124
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/ai/agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,mBAAmB,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE;YACT,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC,CAAC;IACH,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,WAAW,CAAC;QACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAK,IAAI,CAAC;AAQX;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAsB,GAAG,MAAM,CAGvF;AA+DD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAsDpG;AAID;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAkE3E;AAID;;GAEG;AACH,wBAAsB,SAAS,CAC7B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,cAAc,EAAE,EACvB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAC9E,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9D,GACL,OAAO,CAAC,MAAM,CAAC,CAkGjB"}
|