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.
Files changed (243) hide show
  1. package/README.md +514 -0
  2. package/bin/cli.js +2 -0
  3. package/dist/ai/agent.d.ts +124 -0
  4. package/dist/ai/agent.d.ts.map +1 -0
  5. package/dist/ai/agent.js +289 -0
  6. package/dist/ai/agent.js.map +1 -0
  7. package/dist/ai/index.d.ts +10 -0
  8. package/dist/ai/index.d.ts.map +1 -0
  9. package/dist/ai/index.js +10 -0
  10. package/dist/ai/index.js.map +1 -0
  11. package/dist/ai/prompts.d.ts +35 -0
  12. package/dist/ai/prompts.d.ts.map +1 -0
  13. package/dist/ai/prompts.js +166 -0
  14. package/dist/ai/prompts.js.map +1 -0
  15. package/dist/ai/refinement-loop.d.ts +29 -0
  16. package/dist/ai/refinement-loop.d.ts.map +1 -0
  17. package/dist/ai/refinement-loop.js +180 -0
  18. package/dist/ai/refinement-loop.js.map +1 -0
  19. package/dist/ai/tools.d.ts +17 -0
  20. package/dist/ai/tools.d.ts.map +1 -0
  21. package/dist/ai/tools.js +353 -0
  22. package/dist/ai/tools.js.map +1 -0
  23. package/dist/ai/visual-compare.d.ts +43 -0
  24. package/dist/ai/visual-compare.d.ts.map +1 -0
  25. package/dist/ai/visual-compare.js +176 -0
  26. package/dist/ai/visual-compare.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +179 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/converter.d.ts +10 -0
  32. package/dist/converter.d.ts.map +1 -0
  33. package/dist/converter.js +836 -0
  34. package/dist/converter.js.map +1 -0
  35. package/dist/deconverter.d.ts +19 -0
  36. package/dist/deconverter.d.ts.map +1 -0
  37. package/dist/deconverter.js +188 -0
  38. package/dist/deconverter.js.map +1 -0
  39. package/dist/frameworks/angular-adapter.d.ts +27 -0
  40. package/dist/frameworks/angular-adapter.d.ts.map +1 -0
  41. package/dist/frameworks/angular-adapter.js +617 -0
  42. package/dist/frameworks/angular-adapter.js.map +1 -0
  43. package/dist/frameworks/index.d.ts +10 -0
  44. package/dist/frameworks/index.d.ts.map +1 -0
  45. package/dist/frameworks/index.js +21 -0
  46. package/dist/frameworks/index.js.map +1 -0
  47. package/dist/frameworks/nextjs-adapter.d.ts +22 -0
  48. package/dist/frameworks/nextjs-adapter.d.ts.map +1 -0
  49. package/dist/frameworks/nextjs-adapter.js +392 -0
  50. package/dist/frameworks/nextjs-adapter.js.map +1 -0
  51. package/dist/frameworks/react-adapter.d.ts +21 -0
  52. package/dist/frameworks/react-adapter.d.ts.map +1 -0
  53. package/dist/frameworks/react-adapter.js +71 -0
  54. package/dist/frameworks/react-adapter.js.map +1 -0
  55. package/dist/frameworks/svelte-adapter.d.ts +27 -0
  56. package/dist/frameworks/svelte-adapter.d.ts.map +1 -0
  57. package/dist/frameworks/svelte-adapter.js +519 -0
  58. package/dist/frameworks/svelte-adapter.js.map +1 -0
  59. package/dist/frameworks/types.d.ts +78 -0
  60. package/dist/frameworks/types.d.ts.map +1 -0
  61. package/dist/frameworks/types.js +2 -0
  62. package/dist/frameworks/types.js.map +1 -0
  63. package/dist/frameworks/vue-adapter.d.ts +34 -0
  64. package/dist/frameworks/vue-adapter.d.ts.map +1 -0
  65. package/dist/frameworks/vue-adapter.js +632 -0
  66. package/dist/frameworks/vue-adapter.js.map +1 -0
  67. package/dist/generators/accessibility-generator.d.ts +43 -0
  68. package/dist/generators/accessibility-generator.d.ts.map +1 -0
  69. package/dist/generators/accessibility-generator.js +507 -0
  70. package/dist/generators/accessibility-generator.js.map +1 -0
  71. package/dist/generators/asset-handler.d.ts +14 -0
  72. package/dist/generators/asset-handler.d.ts.map +1 -0
  73. package/dist/generators/asset-handler.js +79 -0
  74. package/dist/generators/asset-handler.js.map +1 -0
  75. package/dist/generators/build-verifier.d.ts +8 -0
  76. package/dist/generators/build-verifier.d.ts.map +1 -0
  77. package/dist/generators/build-verifier.js +64 -0
  78. package/dist/generators/build-verifier.js.map +1 -0
  79. package/dist/generators/component-extractor.d.ts +25 -0
  80. package/dist/generators/component-extractor.d.ts.map +1 -0
  81. package/dist/generators/component-extractor.js +146 -0
  82. package/dist/generators/component-extractor.js.map +1 -0
  83. package/dist/generators/component-generator.d.ts +12 -0
  84. package/dist/generators/component-generator.d.ts.map +1 -0
  85. package/dist/generators/component-generator.js +724 -0
  86. package/dist/generators/component-generator.js.map +1 -0
  87. package/dist/generators/deploy-generator.d.ts +9 -0
  88. package/dist/generators/deploy-generator.d.ts.map +1 -0
  89. package/dist/generators/deploy-generator.js +409 -0
  90. package/dist/generators/deploy-generator.js.map +1 -0
  91. package/dist/generators/error-boundary.d.ts +5 -0
  92. package/dist/generators/error-boundary.d.ts.map +1 -0
  93. package/dist/generators/error-boundary.js +59 -0
  94. package/dist/generators/error-boundary.js.map +1 -0
  95. package/dist/generators/form-generator.d.ts +42 -0
  96. package/dist/generators/form-generator.d.ts.map +1 -0
  97. package/dist/generators/form-generator.js +662 -0
  98. package/dist/generators/form-generator.js.map +1 -0
  99. package/dist/generators/hooks-generator.d.ts +40 -0
  100. package/dist/generators/hooks-generator.d.ts.map +1 -0
  101. package/dist/generators/hooks-generator.js +297 -0
  102. package/dist/generators/hooks-generator.js.map +1 -0
  103. package/dist/generators/html-generator.d.ts +27 -0
  104. package/dist/generators/html-generator.d.ts.map +1 -0
  105. package/dist/generators/html-generator.js +772 -0
  106. package/dist/generators/html-generator.js.map +1 -0
  107. package/dist/generators/jquery-converter.d.ts +41 -0
  108. package/dist/generators/jquery-converter.d.ts.map +1 -0
  109. package/dist/generators/jquery-converter.js +594 -0
  110. package/dist/generators/jquery-converter.js.map +1 -0
  111. package/dist/generators/pattern-implementer.d.ts +26 -0
  112. package/dist/generators/pattern-implementer.d.ts.map +1 -0
  113. package/dist/generators/pattern-implementer.js +336 -0
  114. package/dist/generators/pattern-implementer.js.map +1 -0
  115. package/dist/generators/performance-generator.d.ts +51 -0
  116. package/dist/generators/performance-generator.d.ts.map +1 -0
  117. package/dist/generators/performance-generator.js +428 -0
  118. package/dist/generators/performance-generator.js.map +1 -0
  119. package/dist/generators/router-generator.d.ts +21 -0
  120. package/dist/generators/router-generator.d.ts.map +1 -0
  121. package/dist/generators/router-generator.js +178 -0
  122. package/dist/generators/router-generator.js.map +1 -0
  123. package/dist/generators/scaffolder.d.ts +28 -0
  124. package/dist/generators/scaffolder.d.ts.map +1 -0
  125. package/dist/generators/scaffolder.js +266 -0
  126. package/dist/generators/scaffolder.js.map +1 -0
  127. package/dist/generators/seo-generator.d.ts +29 -0
  128. package/dist/generators/seo-generator.d.ts.map +1 -0
  129. package/dist/generators/seo-generator.js +223 -0
  130. package/dist/generators/seo-generator.js.map +1 -0
  131. package/dist/generators/test-generator.d.ts +19 -0
  132. package/dist/generators/test-generator.d.ts.map +1 -0
  133. package/dist/generators/test-generator.js +398 -0
  134. package/dist/generators/test-generator.js.map +1 -0
  135. package/dist/generators/type-generator.d.ts +33 -0
  136. package/dist/generators/type-generator.d.ts.map +1 -0
  137. package/dist/generators/type-generator.js +663 -0
  138. package/dist/generators/type-generator.js.map +1 -0
  139. package/dist/index.d.ts +23 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +12 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/parsers/css-processor.d.ts +23 -0
  144. package/dist/parsers/css-processor.d.ts.map +1 -0
  145. package/dist/parsers/css-processor.js +129 -0
  146. package/dist/parsers/css-processor.js.map +1 -0
  147. package/dist/parsers/framework-parser.d.ts +48 -0
  148. package/dist/parsers/framework-parser.d.ts.map +1 -0
  149. package/dist/parsers/framework-parser.js +770 -0
  150. package/dist/parsers/framework-parser.js.map +1 -0
  151. package/dist/parsers/html-parser.d.ts +12 -0
  152. package/dist/parsers/html-parser.d.ts.map +1 -0
  153. package/dist/parsers/html-parser.js +444 -0
  154. package/dist/parsers/html-parser.js.map +1 -0
  155. package/dist/parsers/js-analyzer.d.ts +199 -0
  156. package/dist/parsers/js-analyzer.d.ts.map +1 -0
  157. package/dist/parsers/js-analyzer.js +680 -0
  158. package/dist/parsers/js-analyzer.js.map +1 -0
  159. package/dist/parsers/js-resolver.d.ts +8 -0
  160. package/dist/parsers/js-resolver.d.ts.map +1 -0
  161. package/dist/parsers/js-resolver.js +45 -0
  162. package/dist/parsers/js-resolver.js.map +1 -0
  163. package/dist/parsers/tailwind-detector.d.ts +23 -0
  164. package/dist/parsers/tailwind-detector.d.ts.map +1 -0
  165. package/dist/parsers/tailwind-detector.js +104 -0
  166. package/dist/parsers/tailwind-detector.js.map +1 -0
  167. package/dist/tests/advanced-features.test.d.ts +2 -0
  168. package/dist/tests/advanced-features.test.d.ts.map +1 -0
  169. package/dist/tests/advanced-features.test.js +235 -0
  170. package/dist/tests/advanced-features.test.js.map +1 -0
  171. package/dist/tests/css-modules.test.d.ts +2 -0
  172. package/dist/tests/css-modules.test.d.ts.map +1 -0
  173. package/dist/tests/css-modules.test.js +61 -0
  174. package/dist/tests/css-modules.test.js.map +1 -0
  175. package/dist/tests/css-processor.test.d.ts +2 -0
  176. package/dist/tests/css-processor.test.d.ts.map +1 -0
  177. package/dist/tests/css-processor.test.js +48 -0
  178. package/dist/tests/css-processor.test.js.map +1 -0
  179. package/dist/tests/html-parser.test.d.ts +2 -0
  180. package/dist/tests/html-parser.test.d.ts.map +1 -0
  181. package/dist/tests/html-parser.test.js +78 -0
  182. package/dist/tests/html-parser.test.js.map +1 -0
  183. package/dist/tests/integration.test.d.ts +2 -0
  184. package/dist/tests/integration.test.d.ts.map +1 -0
  185. package/dist/tests/integration.test.js +65 -0
  186. package/dist/tests/integration.test.js.map +1 -0
  187. package/dist/tests/js-analyzer.test.d.ts +2 -0
  188. package/dist/tests/js-analyzer.test.d.ts.map +1 -0
  189. package/dist/tests/js-analyzer.test.js +58 -0
  190. package/dist/tests/js-analyzer.test.js.map +1 -0
  191. package/dist/tests/naming.test.d.ts +2 -0
  192. package/dist/tests/naming.test.d.ts.map +1 -0
  193. package/dist/tests/naming.test.js +43 -0
  194. package/dist/tests/naming.test.js.map +1 -0
  195. package/dist/tests/router-generator.test.d.ts +2 -0
  196. package/dist/tests/router-generator.test.d.ts.map +1 -0
  197. package/dist/tests/router-generator.test.js +60 -0
  198. package/dist/tests/router-generator.test.js.map +1 -0
  199. package/dist/tui/chat.d.ts +13 -0
  200. package/dist/tui/chat.d.ts.map +1 -0
  201. package/dist/tui/chat.js +499 -0
  202. package/dist/tui/chat.js.map +1 -0
  203. package/dist/tui/design-guide.d.ts +41 -0
  204. package/dist/tui/design-guide.d.ts.map +1 -0
  205. package/dist/tui/design-guide.js +184 -0
  206. package/dist/tui/design-guide.js.map +1 -0
  207. package/dist/tui/input.d.ts +30 -0
  208. package/dist/tui/input.d.ts.map +1 -0
  209. package/dist/tui/input.js +239 -0
  210. package/dist/tui/input.js.map +1 -0
  211. package/dist/tui/renderer.d.ts +48 -0
  212. package/dist/tui/renderer.d.ts.map +1 -0
  213. package/dist/tui/renderer.js +212 -0
  214. package/dist/tui/renderer.js.map +1 -0
  215. package/dist/tui/tools.d.ts +14 -0
  216. package/dist/tui/tools.d.ts.map +1 -0
  217. package/dist/tui/tools.js +1370 -0
  218. package/dist/tui/tools.js.map +1 -0
  219. package/dist/types.d.ts +93 -0
  220. package/dist/types.d.ts.map +1 -0
  221. package/dist/types.js +2 -0
  222. package/dist/types.js.map +1 -0
  223. package/dist/utils/config.d.ts +20 -0
  224. package/dist/utils/config.d.ts.map +1 -0
  225. package/dist/utils/config.js +33 -0
  226. package/dist/utils/config.js.map +1 -0
  227. package/dist/utils/formatter.d.ts +5 -0
  228. package/dist/utils/formatter.d.ts.map +1 -0
  229. package/dist/utils/formatter.js +68 -0
  230. package/dist/utils/formatter.js.map +1 -0
  231. package/dist/utils/logger.d.ts +8 -0
  232. package/dist/utils/logger.d.ts.map +1 -0
  233. package/dist/utils/logger.js +19 -0
  234. package/dist/utils/logger.js.map +1 -0
  235. package/dist/utils/naming.d.ts +17 -0
  236. package/dist/utils/naming.d.ts.map +1 -0
  237. package/dist/utils/naming.js +48 -0
  238. package/dist/utils/naming.js.map +1 -0
  239. package/dist/utils/report.d.ts +56 -0
  240. package/dist/utils/report.d.ts.map +1 -0
  241. package/dist/utils/report.js +339 -0
  242. package/dist/utils/report.js.map +1 -0
  243. package/package.json +61 -0
@@ -0,0 +1,28 @@
1
+ export interface ScaffoldOptions {
2
+ /** Original page title */
3
+ title?: string;
4
+ /** Meta tags from original HTML */
5
+ meta?: Record<string, string>;
6
+ /** External CDN stylesheets to preserve */
7
+ externalStyles?: string[];
8
+ /** External CDN scripts to preserve */
9
+ externalScripts?: string[];
10
+ /** Preconnect link tags (for font loading optimization) */
11
+ preconnectLinks?: string[];
12
+ /** JSON-LD structured data */
13
+ structuredData?: string[];
14
+ /** Favicon links */
15
+ favicons?: Array<{
16
+ rel: string;
17
+ href: string;
18
+ type?: string;
19
+ sizes?: string;
20
+ }>;
21
+ /** Web app manifest link */
22
+ manifest?: string | null;
23
+ }
24
+ /**
25
+ * Scaffold a complete Vite + React + TypeScript project structure.
26
+ */
27
+ export declare function scaffoldProject(outputDir: string, projectName: string, useRouter?: boolean, useTailwind?: boolean, options?: ScaffoldOptions): Promise<void>;
28
+ //# sourceMappingURL=scaffolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../src/generators/scaffolder.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,8BAA8B;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,OAAe,EAC1B,WAAW,GAAE,OAAe,EAC5B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,266 @@
1
+ import { mkdir, writeFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ /**
4
+ * Scaffold a complete Vite + React + TypeScript project structure.
5
+ */
6
+ export async function scaffoldProject(outputDir, projectName, useRouter = false, useTailwind = false, options = {}) {
7
+ // Create directory structure
8
+ const dirs = [
9
+ outputDir,
10
+ join(outputDir, 'src'),
11
+ join(outputDir, 'src', 'components'),
12
+ join(outputDir, 'src', 'assets'),
13
+ join(outputDir, 'src', 'styles'),
14
+ join(outputDir, 'public'),
15
+ ];
16
+ for (const dir of dirs) {
17
+ await mkdir(dir, { recursive: true });
18
+ }
19
+ // Write config files
20
+ await Promise.all([
21
+ writeFile(join(outputDir, 'package.json'), generatePackageJson(projectName, useRouter, useTailwind)),
22
+ writeFile(join(outputDir, 'tsconfig.json'), generateTsConfig()),
23
+ writeFile(join(outputDir, 'tsconfig.node.json'), generateTsConfigNode()),
24
+ writeFile(join(outputDir, 'vite.config.ts'), generateViteConfig()),
25
+ writeFile(join(outputDir, 'index.html'), generateIndexHtml(options.title || projectName, options)),
26
+ writeFile(join(outputDir, 'src', 'main.tsx'), generateMain()),
27
+ writeFile(join(outputDir, 'src', 'App.tsx'), generateAppPlaceholder()),
28
+ writeFile(join(outputDir, 'src', 'vite-env.d.ts'), generateViteEnvDts()),
29
+ writeFile(join(outputDir, '.gitignore'), generateGitignore()),
30
+ writeFile(join(outputDir, '.env.example'), generateEnvExample()),
31
+ ]);
32
+ }
33
+ function generatePackageJson(name, useRouter = false, useTailwind = false) {
34
+ const deps = {
35
+ react: '^19.0.0',
36
+ 'react-dom': '^19.0.0',
37
+ };
38
+ if (useRouter) {
39
+ deps['react-router-dom'] = '^7.0.0';
40
+ }
41
+ return JSON.stringify({
42
+ name: name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
43
+ private: true,
44
+ version: '0.0.0',
45
+ type: 'module',
46
+ scripts: {
47
+ dev: 'vite',
48
+ build: 'tsc -b && vite build',
49
+ lint: 'eslint .',
50
+ preview: 'vite preview',
51
+ },
52
+ dependencies: deps,
53
+ devDependencies: {
54
+ '@types/react': '^19.0.0',
55
+ '@types/react-dom': '^19.0.0',
56
+ '@vitejs/plugin-react': '^4.3.0',
57
+ typescript: '^5.7.0',
58
+ vite: '^6.0.0',
59
+ ...(useTailwind ? {
60
+ tailwindcss: '^4.0.0',
61
+ '@tailwindcss/postcss': '^4.0.0',
62
+ postcss: '^8.4.0',
63
+ } : {}),
64
+ },
65
+ }, null, 2);
66
+ }
67
+ function generateTsConfig() {
68
+ return JSON.stringify({
69
+ compilerOptions: {
70
+ tsBuildInfoFile: './node_modules/.tmp/tsconfig.app.tsbuildinfo',
71
+ target: 'ES2020',
72
+ useDefineForClassFields: true,
73
+ lib: ['ES2020', 'DOM', 'DOM.Iterable'],
74
+ module: 'ESNext',
75
+ skipLibCheck: true,
76
+ moduleResolution: 'bundler',
77
+ allowImportingTsExtensions: true,
78
+ isolatedModules: true,
79
+ moduleDetection: 'force',
80
+ noEmit: true,
81
+ jsx: 'react-jsx',
82
+ strict: true,
83
+ noUnusedLocals: false,
84
+ noUnusedParameters: false,
85
+ noFallthroughCasesInSwitch: true,
86
+ noUncheckedSideEffectImports: true,
87
+ },
88
+ include: ['src'],
89
+ }, null, 2);
90
+ }
91
+ function generateTsConfigNode() {
92
+ return JSON.stringify({
93
+ compilerOptions: {
94
+ tsBuildInfoFile: './node_modules/.tmp/tsconfig.node.tsbuildinfo',
95
+ target: 'ES2022',
96
+ lib: ['ES2023'],
97
+ module: 'ESNext',
98
+ skipLibCheck: true,
99
+ moduleResolution: 'bundler',
100
+ allowImportingTsExtensions: true,
101
+ isolatedModules: true,
102
+ moduleDetection: 'force',
103
+ noEmit: true,
104
+ strict: true,
105
+ noUnusedLocals: true,
106
+ noUnusedParameters: true,
107
+ noFallthroughCasesInSwitch: true,
108
+ noUncheckedSideEffectImports: true,
109
+ },
110
+ include: ['vite.config.ts'],
111
+ }, null, 2);
112
+ }
113
+ function generateViteConfig() {
114
+ return `import { defineConfig } from 'vite'
115
+ import react from '@vitejs/plugin-react'
116
+
117
+ // https://vite.dev/config/
118
+ export default defineConfig({
119
+ plugins: [react()],
120
+ })
121
+ `;
122
+ }
123
+ function generateIndexHtml(title, options = {}) {
124
+ const lines = [];
125
+ lines.push('<!doctype html>');
126
+ lines.push('<html lang="en">');
127
+ lines.push(' <head>');
128
+ lines.push(' <meta charset="UTF-8" />');
129
+ lines.push(' <meta name="viewport" content="width=device-width, initial-scale=1.0" />');
130
+ // Meta tags from original HTML
131
+ if (options.meta) {
132
+ for (const [key, value] of Object.entries(options.meta)) {
133
+ if (key === 'viewport' || key === 'charset')
134
+ continue; // Already added
135
+ if (key.startsWith('http-equiv:')) {
136
+ const equiv = key.replace('http-equiv:', '');
137
+ lines.push(` <meta http-equiv="${equiv}" content="${escapeHtml(value)}" />`);
138
+ }
139
+ else if (key.startsWith('og:') || key.startsWith('twitter:') || key.startsWith('article:')) {
140
+ lines.push(` <meta property="${key}" content="${escapeHtml(value)}" />`);
141
+ }
142
+ else {
143
+ lines.push(` <meta name="${key}" content="${escapeHtml(value)}" />`);
144
+ }
145
+ }
146
+ }
147
+ lines.push(` <title>${escapeHtml(title)}</title>`);
148
+ // Favicons
149
+ if (options.favicons?.length) {
150
+ for (const fav of options.favicons) {
151
+ let tag = ` <link rel="${fav.rel}" href="${fav.href}"`;
152
+ if (fav.type)
153
+ tag += ` type="${fav.type}"`;
154
+ if (fav.sizes)
155
+ tag += ` sizes="${fav.sizes}"`;
156
+ tag += ' />';
157
+ lines.push(tag);
158
+ }
159
+ }
160
+ // Web app manifest
161
+ if (options.manifest) {
162
+ lines.push(` <link rel="manifest" href="${options.manifest}" />`);
163
+ }
164
+ // Preconnect hints (for font loading optimization)
165
+ if (options.preconnectLinks?.length) {
166
+ for (const tag of options.preconnectLinks) {
167
+ lines.push(` ${tag}`);
168
+ }
169
+ }
170
+ // External CDN stylesheets (Google Fonts, icon fonts, etc.)
171
+ if (options.externalStyles?.length) {
172
+ for (const href of options.externalStyles) {
173
+ lines.push(` <link rel="stylesheet" href="${href}" />`);
174
+ }
175
+ }
176
+ // External CDN scripts (placed in head with async/defer)
177
+ if (options.externalScripts?.length) {
178
+ for (const src of options.externalScripts) {
179
+ lines.push(` <script src="${src}" defer><\/script>`);
180
+ }
181
+ }
182
+ lines.push(' </head>');
183
+ lines.push(' <body>');
184
+ lines.push(' <div id="root"></div>');
185
+ lines.push(' <script type="module" src="/src/main.tsx"></script>');
186
+ // Structured data (JSON-LD)
187
+ if (options.structuredData?.length) {
188
+ for (const data of options.structuredData) {
189
+ lines.push(` <script type="application/ld+json">${data}<\/script>`);
190
+ }
191
+ }
192
+ lines.push(' </body>');
193
+ lines.push('</html>');
194
+ return lines.join('\n') + '\n';
195
+ }
196
+ function generateMain() {
197
+ return `import { StrictMode } from 'react'
198
+ import { createRoot } from 'react-dom/client'
199
+ import App from './App.tsx'
200
+
201
+ createRoot(document.getElementById('root')!).render(
202
+ <StrictMode>
203
+ <App />
204
+ </StrictMode>,
205
+ )
206
+ `;
207
+ }
208
+ function generateAppPlaceholder() {
209
+ return `function App() {
210
+ return (
211
+ <div>
212
+ <h1>Converted App</h1>
213
+ </div>
214
+ )
215
+ }
216
+
217
+ export default App
218
+ `;
219
+ }
220
+ function generateViteEnvDts() {
221
+ return `/// <reference types="vite/client" />
222
+ `;
223
+ }
224
+ function generateGitignore() {
225
+ return `# Logs
226
+ logs
227
+ *.log
228
+ npm-debug.log*
229
+
230
+ # Dependencies
231
+ node_modules/
232
+
233
+ # Build
234
+ dist/
235
+ dist-ssr/
236
+ *.local
237
+
238
+ # Environment
239
+ .env
240
+ .env.local
241
+ .env.*.local
242
+
243
+ # Editor
244
+ .vscode/*
245
+ !.vscode/extensions.json
246
+ .idea
247
+ .DS_Store
248
+ *.suo
249
+ *.ntvs*
250
+ *.njsproj
251
+ *.sln
252
+ *.sw?
253
+ `;
254
+ }
255
+ function generateEnvExample() {
256
+ return `# Environment variables
257
+ # Copy this to .env and fill in values
258
+
259
+ # VITE_API_URL=https://api.example.com
260
+ # VITE_PUBLIC_KEY=your-public-key
261
+ `;
262
+ }
263
+ function escapeHtml(str) {
264
+ return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
265
+ }
266
+ //# sourceMappingURL=scaffolder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/generators/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { RouteConfig } from './router-generator.js';
2
+ /**
3
+ * Generates an XML sitemap from the given routes.
4
+ * Priority and changefreq are derived from route depth.
5
+ */
6
+ export declare function generateSitemap(routes: RouteConfig[], baseUrl?: string): string;
7
+ /**
8
+ * Generates a robots.txt that allows all crawlers and links to the sitemap.
9
+ */
10
+ export declare function generateRobotsTxt(baseUrl?: string): string;
11
+ /**
12
+ * Generates a Web App Manifest (manifest.json / manifest.webmanifest).
13
+ */
14
+ export declare function generateManifest(title: string, description?: string): string;
15
+ /**
16
+ * Generates a React component that sets document.title and injects meta tags
17
+ * using a useEffect hook (React Helmet-style behaviour without the dependency).
18
+ */
19
+ export declare function generateMetaComponent(meta: Record<string, string>): string;
20
+ /**
21
+ * Generates OpenGraph and Twitter Card meta tag markup as an HTML string.
22
+ */
23
+ export declare function generateOpenGraphTags(meta: Record<string, string>, title: string): string;
24
+ /**
25
+ * Takes existing <head> content as a string and ensures SEO-critical meta tags
26
+ * are present. Missing tags are appended; existing tags are not duplicated.
27
+ */
28
+ export declare function enhanceHeadMeta(headContent: string, meta: Record<string, string>): string;
29
+ //# sourceMappingURL=seo-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-generator.d.ts","sourceRoot":"","sources":["../../src/generators/seo-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA2B/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAwB5E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAqD1E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA4CzF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CA8BzF"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Generates an XML sitemap from the given routes.
3
+ * Priority and changefreq are derived from route depth.
4
+ */
5
+ export function generateSitemap(routes, baseUrl) {
6
+ const base = (baseUrl ?? 'https://example.com').replace(/\/+$/, '');
7
+ const today = new Date().toISOString().split('T')[0];
8
+ const urls = routes.map((route) => {
9
+ const depth = route.path === '/' ? 0 : route.path.replace(/^\//, '').split('/').length;
10
+ const priority = Math.max(0.1, 1.0 - depth * 0.2).toFixed(1);
11
+ const changefreq = depth === 0 ? 'daily' : depth === 1 ? 'weekly' : 'monthly';
12
+ const loc = `${base}${route.path === '/' ? '/' : route.path}`;
13
+ return [
14
+ ' <url>',
15
+ ` <loc>${escapeXml(loc)}</loc>`,
16
+ ` <lastmod>${today}</lastmod>`,
17
+ ` <changefreq>${changefreq}</changefreq>`,
18
+ ` <priority>${priority}</priority>`,
19
+ ' </url>',
20
+ ].join('\n');
21
+ });
22
+ return [
23
+ '<?xml version="1.0" encoding="UTF-8"?>',
24
+ '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">',
25
+ ...urls,
26
+ '</urlset>',
27
+ '',
28
+ ].join('\n');
29
+ }
30
+ /**
31
+ * Generates a robots.txt that allows all crawlers and links to the sitemap.
32
+ */
33
+ export function generateRobotsTxt(baseUrl) {
34
+ const base = (baseUrl ?? 'https://example.com').replace(/\/+$/, '');
35
+ return [
36
+ 'User-agent: *',
37
+ 'Allow: /',
38
+ '',
39
+ `Sitemap: ${base}/sitemap.xml`,
40
+ '',
41
+ ].join('\n');
42
+ }
43
+ /**
44
+ * Generates a Web App Manifest (manifest.json / manifest.webmanifest).
45
+ */
46
+ export function generateManifest(title, description) {
47
+ const manifest = {
48
+ name: title,
49
+ short_name: title.length > 12 ? title.slice(0, 12).trim() : title,
50
+ description: description ?? `${title} - Converted with CodeMeld`,
51
+ start_url: '/',
52
+ display: 'standalone',
53
+ background_color: '#ffffff',
54
+ theme_color: '#000000',
55
+ icons: [
56
+ {
57
+ src: '/icons/icon-192x192.png',
58
+ sizes: '192x192',
59
+ type: 'image/png',
60
+ },
61
+ {
62
+ src: '/icons/icon-512x512.png',
63
+ sizes: '512x512',
64
+ type: 'image/png',
65
+ },
66
+ ],
67
+ };
68
+ return JSON.stringify(manifest, null, 2) + '\n';
69
+ }
70
+ /**
71
+ * Generates a React component that sets document.title and injects meta tags
72
+ * using a useEffect hook (React Helmet-style behaviour without the dependency).
73
+ */
74
+ export function generateMetaComponent(meta) {
75
+ const lines = [];
76
+ lines.push("import { useEffect } from 'react';");
77
+ lines.push('');
78
+ lines.push('interface MetaProps {');
79
+ lines.push(' title?: string;');
80
+ lines.push(' meta?: Record<string, string>;');
81
+ lines.push('}');
82
+ lines.push('');
83
+ lines.push('export default function Meta({ title, meta }: MetaProps) {');
84
+ lines.push(' useEffect(() => {');
85
+ lines.push(' if (title) {');
86
+ lines.push(' document.title = title;');
87
+ lines.push(' }');
88
+ lines.push('');
89
+ lines.push(' if (!meta) return;');
90
+ lines.push('');
91
+ lines.push(' const tags: HTMLMetaElement[] = [];');
92
+ lines.push(' for (const [key, value] of Object.entries(meta)) {');
93
+ lines.push(" const el = document.createElement('meta');");
94
+ lines.push(" if (key.startsWith('og:') || key.startsWith('twitter:')) {");
95
+ lines.push(" el.setAttribute('property', key);");
96
+ lines.push(' } else {');
97
+ lines.push(" el.setAttribute('name', key);");
98
+ lines.push(' }');
99
+ lines.push(" el.setAttribute('content', value);");
100
+ lines.push(' document.head.appendChild(el);');
101
+ lines.push(' tags.push(el);');
102
+ lines.push(' }');
103
+ lines.push('');
104
+ lines.push(' return () => {');
105
+ lines.push(' tags.forEach((el) => el.remove());');
106
+ lines.push(' };');
107
+ lines.push(' }, [title, meta]);');
108
+ lines.push('');
109
+ lines.push(' return null;');
110
+ lines.push('}');
111
+ lines.push('');
112
+ // Build default props from the provided meta record
113
+ const metaEntries = Object.entries(meta);
114
+ const titleValue = meta['title'] ?? 'My App';
115
+ const exportLines = [];
116
+ exportLines.push('');
117
+ exportLines.push('// Pre-configured meta component with defaults');
118
+ exportLines.push('export function DefaultMeta() {');
119
+ exportLines.push(` return <Meta title="${escapeJsx(titleValue)}" meta={${formatMetaObject(metaEntries)}} />;`);
120
+ exportLines.push('}');
121
+ exportLines.push('');
122
+ return lines.join('\n') + exportLines.join('\n');
123
+ }
124
+ /**
125
+ * Generates OpenGraph and Twitter Card meta tag markup as an HTML string.
126
+ */
127
+ export function generateOpenGraphTags(meta, title) {
128
+ const tags = [];
129
+ const ogTitle = meta['og:title'] ?? title;
130
+ const ogDescription = meta['og:description'] ?? meta['description'] ?? '';
131
+ const ogImage = meta['og:image'] ?? '';
132
+ const ogUrl = meta['og:url'] ?? '';
133
+ const twitterCard = meta['twitter:card'] ?? 'summary_large_image';
134
+ tags.push(`<meta property="og:title" content="${escapeAttr(ogTitle)}" />`);
135
+ tags.push(`<meta property="og:type" content="website" />`);
136
+ if (ogDescription) {
137
+ tags.push(`<meta property="og:description" content="${escapeAttr(ogDescription)}" />`);
138
+ }
139
+ if (ogImage) {
140
+ tags.push(`<meta property="og:image" content="${escapeAttr(ogImage)}" />`);
141
+ }
142
+ if (ogUrl) {
143
+ tags.push(`<meta property="og:url" content="${escapeAttr(ogUrl)}" />`);
144
+ }
145
+ tags.push(`<meta name="twitter:card" content="${escapeAttr(twitterCard)}" />`);
146
+ tags.push(`<meta name="twitter:title" content="${escapeAttr(ogTitle)}" />`);
147
+ if (ogDescription) {
148
+ tags.push(`<meta name="twitter:description" content="${escapeAttr(ogDescription)}" />`);
149
+ }
150
+ if (ogImage) {
151
+ tags.push(`<meta name="twitter:image" content="${escapeAttr(ogImage)}" />`);
152
+ }
153
+ // Pass through any additional og: or twitter: keys not already handled
154
+ const handled = new Set([
155
+ 'og:title', 'og:description', 'og:image', 'og:url',
156
+ 'twitter:card', 'twitter:title', 'twitter:description', 'twitter:image',
157
+ 'description',
158
+ ]);
159
+ for (const [key, value] of Object.entries(meta)) {
160
+ if (!handled.has(key) && (key.startsWith('og:') || key.startsWith('twitter:'))) {
161
+ const attr = key.startsWith('og:') ? 'property' : 'name';
162
+ tags.push(`<meta ${attr}="${escapeAttr(key)}" content="${escapeAttr(value)}" />`);
163
+ }
164
+ }
165
+ return tags.join('\n');
166
+ }
167
+ /**
168
+ * Takes existing <head> content as a string and ensures SEO-critical meta tags
169
+ * are present. Missing tags are appended; existing tags are not duplicated.
170
+ */
171
+ export function enhanceHeadMeta(headContent, meta) {
172
+ let result = headContent;
173
+ // charset
174
+ if (!/meta\s[^>]*charset\s*=/i.test(result)) {
175
+ result = `<meta charset="UTF-8" />\n` + result;
176
+ }
177
+ // viewport
178
+ if (!/meta\s[^>]*name\s*=\s*["']viewport["']/i.test(result)) {
179
+ result += `\n<meta name="viewport" content="width=device-width, initial-scale=1.0" />`;
180
+ }
181
+ // description
182
+ if (!/meta\s[^>]*name\s*=\s*["']description["']/i.test(result)) {
183
+ const description = meta['description'] ?? '';
184
+ if (description) {
185
+ result += `\n<meta name="description" content="${escapeAttr(description)}" />`;
186
+ }
187
+ }
188
+ // canonical link
189
+ if (!/link\s[^>]*rel\s*=\s*["']canonical["']/i.test(result)) {
190
+ const canonical = meta['canonical'] ?? meta['og:url'] ?? '';
191
+ if (canonical) {
192
+ result += `\n<link rel="canonical" href="${escapeAttr(canonical)}" />`;
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ // ---------------------------------------------------------------------------
198
+ // Internal helpers
199
+ // ---------------------------------------------------------------------------
200
+ function escapeXml(str) {
201
+ return str
202
+ .replace(/&/g, '&amp;')
203
+ .replace(/</g, '&lt;')
204
+ .replace(/>/g, '&gt;')
205
+ .replace(/"/g, '&quot;')
206
+ .replace(/'/g, '&apos;');
207
+ }
208
+ function escapeAttr(str) {
209
+ return str.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
210
+ }
211
+ function escapeJsx(str) {
212
+ return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
213
+ }
214
+ function formatMetaObject(entries) {
215
+ if (entries.length === 0)
216
+ return '{}';
217
+ const inner = entries
218
+ .filter(([key]) => key !== 'title')
219
+ .map(([key, value]) => `'${key}': '${value.replace(/'/g, "\\'")}'`)
220
+ .join(', ');
221
+ return `{ ${inner} }`;
222
+ }
223
+ //# sourceMappingURL=seo-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-generator.js","sourceRoot":"","sources":["../../src/generators/seo-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ExtractedComponent } from '../types.js';
2
+ import type { AnalyzedJS } from '../parsers/js-analyzer.js';
3
+ /**
4
+ * Generate a vitest.config.ts file for the converted project.
5
+ */
6
+ export declare function generateVitestConfig(): string;
7
+ /**
8
+ * Generate the test setup file (src/test/setup.ts) with testing-library matchers.
9
+ */
10
+ export declare function generateTestSetup(): string;
11
+ /**
12
+ * Generate a test file for a specific component.
13
+ */
14
+ export declare function generateComponentTest(component: ExtractedComponent, analysis?: AnalyzedJS): string;
15
+ /**
16
+ * Return the devDependency packages needed for the test infrastructure.
17
+ */
18
+ export declare function generateTestPackageDeps(): Record<string, string>;
19
+ //# sourceMappingURL=test-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/generators/test-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAqB7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAoC1C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,CAAC,EAAE,UAAU,GACpB,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAShE"}