popeye-cli 1.4.7 → 1.6.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 (214) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +264 -63
  3. package/dist/adapters/gemini.d.ts +1 -0
  4. package/dist/adapters/gemini.d.ts.map +1 -1
  5. package/dist/adapters/gemini.js +9 -4
  6. package/dist/adapters/gemini.js.map +1 -1
  7. package/dist/adapters/grok.d.ts +1 -0
  8. package/dist/adapters/grok.d.ts.map +1 -1
  9. package/dist/adapters/grok.js +9 -4
  10. package/dist/adapters/grok.js.map +1 -1
  11. package/dist/adapters/openai.d.ts +1 -1
  12. package/dist/adapters/openai.d.ts.map +1 -1
  13. package/dist/adapters/openai.js +35 -9
  14. package/dist/adapters/openai.js.map +1 -1
  15. package/dist/cli/commands/create.d.ts.map +1 -1
  16. package/dist/cli/commands/create.js +54 -4
  17. package/dist/cli/commands/create.js.map +1 -1
  18. package/dist/cli/interactive.d.ts +29 -0
  19. package/dist/cli/interactive.d.ts.map +1 -1
  20. package/dist/cli/interactive.js +132 -7
  21. package/dist/cli/interactive.js.map +1 -1
  22. package/dist/generators/all.d.ts +8 -2
  23. package/dist/generators/all.d.ts.map +1 -1
  24. package/dist/generators/all.js +37 -316
  25. package/dist/generators/all.js.map +1 -1
  26. package/dist/generators/doc-parser.d.ts +64 -0
  27. package/dist/generators/doc-parser.d.ts.map +1 -0
  28. package/dist/generators/doc-parser.js +407 -0
  29. package/dist/generators/doc-parser.js.map +1 -0
  30. package/dist/generators/frontend-design-analyzer.d.ts +30 -0
  31. package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
  32. package/dist/generators/frontend-design-analyzer.js +208 -0
  33. package/dist/generators/frontend-design-analyzer.js.map +1 -0
  34. package/dist/generators/shared-packages.d.ts +45 -0
  35. package/dist/generators/shared-packages.d.ts.map +1 -0
  36. package/dist/generators/shared-packages.js +456 -0
  37. package/dist/generators/shared-packages.js.map +1 -0
  38. package/dist/generators/templates/index.d.ts +8 -0
  39. package/dist/generators/templates/index.d.ts.map +1 -1
  40. package/dist/generators/templates/index.js +8 -0
  41. package/dist/generators/templates/index.js.map +1 -1
  42. package/dist/generators/templates/website-components.d.ts +33 -0
  43. package/dist/generators/templates/website-components.d.ts.map +1 -0
  44. package/dist/generators/templates/website-components.js +303 -0
  45. package/dist/generators/templates/website-components.js.map +1 -0
  46. package/dist/generators/templates/website-config.d.ts +55 -0
  47. package/dist/generators/templates/website-config.d.ts.map +1 -0
  48. package/dist/generators/templates/website-config.js +425 -0
  49. package/dist/generators/templates/website-config.js.map +1 -0
  50. package/dist/generators/templates/website-conversion.d.ts +27 -0
  51. package/dist/generators/templates/website-conversion.d.ts.map +1 -0
  52. package/dist/generators/templates/website-conversion.js +326 -0
  53. package/dist/generators/templates/website-conversion.js.map +1 -0
  54. package/dist/generators/templates/website-landing.d.ts +24 -0
  55. package/dist/generators/templates/website-landing.d.ts.map +1 -0
  56. package/dist/generators/templates/website-landing.js +276 -0
  57. package/dist/generators/templates/website-landing.js.map +1 -0
  58. package/dist/generators/templates/website-layout.d.ts +42 -0
  59. package/dist/generators/templates/website-layout.d.ts.map +1 -0
  60. package/dist/generators/templates/website-layout.js +408 -0
  61. package/dist/generators/templates/website-layout.js.map +1 -0
  62. package/dist/generators/templates/website-pricing.d.ts +11 -0
  63. package/dist/generators/templates/website-pricing.d.ts.map +1 -0
  64. package/dist/generators/templates/website-pricing.js +313 -0
  65. package/dist/generators/templates/website-pricing.js.map +1 -0
  66. package/dist/generators/templates/website-sections.d.ts +102 -0
  67. package/dist/generators/templates/website-sections.d.ts.map +1 -0
  68. package/dist/generators/templates/website-sections.js +444 -0
  69. package/dist/generators/templates/website-sections.js.map +1 -0
  70. package/dist/generators/templates/website-seo.d.ts +76 -0
  71. package/dist/generators/templates/website-seo.d.ts.map +1 -0
  72. package/dist/generators/templates/website-seo.js +326 -0
  73. package/dist/generators/templates/website-seo.js.map +1 -0
  74. package/dist/generators/templates/website.d.ts +10 -83
  75. package/dist/generators/templates/website.d.ts.map +1 -1
  76. package/dist/generators/templates/website.js +12 -875
  77. package/dist/generators/templates/website.js.map +1 -1
  78. package/dist/generators/website-content-scanner.d.ts +37 -0
  79. package/dist/generators/website-content-scanner.d.ts.map +1 -0
  80. package/dist/generators/website-content-scanner.js +165 -0
  81. package/dist/generators/website-content-scanner.js.map +1 -0
  82. package/dist/generators/website-context.d.ts +119 -0
  83. package/dist/generators/website-context.d.ts.map +1 -0
  84. package/dist/generators/website-context.js +350 -0
  85. package/dist/generators/website-context.js.map +1 -0
  86. package/dist/generators/website-debug.d.ts +68 -0
  87. package/dist/generators/website-debug.d.ts.map +1 -0
  88. package/dist/generators/website-debug.js +93 -0
  89. package/dist/generators/website-debug.js.map +1 -0
  90. package/dist/generators/website.d.ts +5 -0
  91. package/dist/generators/website.d.ts.map +1 -1
  92. package/dist/generators/website.js +136 -11
  93. package/dist/generators/website.js.map +1 -1
  94. package/dist/generators/workspace-root.d.ts +27 -0
  95. package/dist/generators/workspace-root.d.ts.map +1 -0
  96. package/dist/generators/workspace-root.js +100 -0
  97. package/dist/generators/workspace-root.js.map +1 -0
  98. package/dist/state/index.d.ts +35 -0
  99. package/dist/state/index.d.ts.map +1 -1
  100. package/dist/state/index.js +40 -0
  101. package/dist/state/index.js.map +1 -1
  102. package/dist/types/consensus.d.ts +3 -0
  103. package/dist/types/consensus.d.ts.map +1 -1
  104. package/dist/types/consensus.js +1 -0
  105. package/dist/types/consensus.js.map +1 -1
  106. package/dist/types/website-strategy.d.ts +263 -0
  107. package/dist/types/website-strategy.d.ts.map +1 -0
  108. package/dist/types/website-strategy.js +105 -0
  109. package/dist/types/website-strategy.js.map +1 -0
  110. package/dist/types/workflow.d.ts +21 -0
  111. package/dist/types/workflow.d.ts.map +1 -1
  112. package/dist/types/workflow.js +8 -0
  113. package/dist/types/workflow.js.map +1 -1
  114. package/dist/upgrade/handlers.d.ts +15 -0
  115. package/dist/upgrade/handlers.d.ts.map +1 -1
  116. package/dist/upgrade/handlers.js +52 -0
  117. package/dist/upgrade/handlers.js.map +1 -1
  118. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  119. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  120. package/dist/workflow/auto-fix-bundler.js +320 -0
  121. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  122. package/dist/workflow/auto-fix.d.ts.map +1 -1
  123. package/dist/workflow/auto-fix.js +10 -3
  124. package/dist/workflow/auto-fix.js.map +1 -1
  125. package/dist/workflow/consensus.d.ts.map +1 -1
  126. package/dist/workflow/consensus.js +2 -0
  127. package/dist/workflow/consensus.js.map +1 -1
  128. package/dist/workflow/execution-mode.d.ts.map +1 -1
  129. package/dist/workflow/execution-mode.js +18 -0
  130. package/dist/workflow/execution-mode.js.map +1 -1
  131. package/dist/workflow/index.d.ts +4 -0
  132. package/dist/workflow/index.d.ts.map +1 -1
  133. package/dist/workflow/index.js +37 -0
  134. package/dist/workflow/index.js.map +1 -1
  135. package/dist/workflow/overview.d.ts +89 -0
  136. package/dist/workflow/overview.d.ts.map +1 -0
  137. package/dist/workflow/overview.js +358 -0
  138. package/dist/workflow/overview.js.map +1 -0
  139. package/dist/workflow/plan-mode.d.ts +6 -4
  140. package/dist/workflow/plan-mode.d.ts.map +1 -1
  141. package/dist/workflow/plan-mode.js +148 -6
  142. package/dist/workflow/plan-mode.js.map +1 -1
  143. package/dist/workflow/website-strategy.d.ts +79 -0
  144. package/dist/workflow/website-strategy.d.ts.map +1 -0
  145. package/dist/workflow/website-strategy.js +310 -0
  146. package/dist/workflow/website-strategy.js.map +1 -0
  147. package/dist/workflow/website-updater.d.ts +17 -0
  148. package/dist/workflow/website-updater.d.ts.map +1 -0
  149. package/dist/workflow/website-updater.js +116 -0
  150. package/dist/workflow/website-updater.js.map +1 -0
  151. package/dist/workflow/workflow-logger.d.ts +1 -1
  152. package/dist/workflow/workflow-logger.d.ts.map +1 -1
  153. package/dist/workflow/workflow-logger.js.map +1 -1
  154. package/package.json +1 -1
  155. package/src/adapters/gemini.ts +10 -4
  156. package/src/adapters/grok.ts +10 -4
  157. package/src/adapters/openai.ts +38 -6
  158. package/src/cli/commands/create.ts +58 -4
  159. package/src/cli/interactive.ts +143 -7
  160. package/src/generators/all.ts +49 -332
  161. package/src/generators/doc-parser.ts +449 -0
  162. package/src/generators/frontend-design-analyzer.ts +261 -0
  163. package/src/generators/shared-packages.ts +500 -0
  164. package/src/generators/templates/index.ts +8 -0
  165. package/src/generators/templates/website-components.ts +330 -0
  166. package/src/generators/templates/website-config.ts +444 -0
  167. package/src/generators/templates/website-conversion.ts +341 -0
  168. package/src/generators/templates/website-landing.ts +331 -0
  169. package/src/generators/templates/website-layout.ts +443 -0
  170. package/src/generators/templates/website-pricing.ts +330 -0
  171. package/src/generators/templates/website-sections.ts +541 -0
  172. package/src/generators/templates/website-seo.ts +370 -0
  173. package/src/generators/templates/website.ts +38 -905
  174. package/src/generators/website-content-scanner.ts +208 -0
  175. package/src/generators/website-context.ts +493 -0
  176. package/src/generators/website-debug.ts +130 -0
  177. package/src/generators/website.ts +178 -20
  178. package/src/generators/workspace-root.ts +113 -0
  179. package/src/state/index.ts +56 -0
  180. package/src/types/consensus.ts +3 -0
  181. package/src/types/website-strategy.ts +243 -0
  182. package/src/types/workflow.ts +21 -0
  183. package/src/upgrade/handlers.ts +65 -0
  184. package/src/workflow/auto-fix-bundler.ts +392 -0
  185. package/src/workflow/auto-fix.ts +11 -3
  186. package/src/workflow/consensus.ts +2 -0
  187. package/src/workflow/execution-mode.ts +21 -0
  188. package/src/workflow/index.ts +37 -0
  189. package/src/workflow/overview.ts +475 -0
  190. package/src/workflow/plan-mode.ts +193 -8
  191. package/src/workflow/website-strategy.ts +379 -0
  192. package/src/workflow/website-updater.ts +142 -0
  193. package/src/workflow/workflow-logger.ts +1 -0
  194. package/tests/adapters/persona-switching.test.ts +63 -0
  195. package/tests/cli/project-naming.test.ts +136 -0
  196. package/tests/generators/doc-parser.test.ts +121 -0
  197. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  198. package/tests/generators/quality-gate.test.ts +183 -0
  199. package/tests/generators/shared-packages.test.ts +83 -0
  200. package/tests/generators/website-components.test.ts +159 -0
  201. package/tests/generators/website-config.test.ts +84 -0
  202. package/tests/generators/website-content-scanner.test.ts +181 -0
  203. package/tests/generators/website-context.test.ts +331 -0
  204. package/tests/generators/website-debug.test.ts +77 -0
  205. package/tests/generators/website-landing.test.ts +188 -0
  206. package/tests/generators/website-pricing.test.ts +98 -0
  207. package/tests/generators/website-sections.test.ts +245 -0
  208. package/tests/generators/website-seo-quality.test.ts +246 -0
  209. package/tests/generators/workspace-root.test.ts +105 -0
  210. package/tests/upgrade/handlers.test.ts +162 -0
  211. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  212. package/tests/workflow/overview.test.ts +392 -0
  213. package/tests/workflow/plan-mode.test.ts +111 -1
  214. package/tests/workflow/website-strategy.test.ts +246 -0
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Website configuration templates (non-content)
3
+ * Package configs, build tools, Docker, vitest, and env declarations
4
+ */
5
+ /**
6
+ * Generate Next.js package.json
7
+ */
8
+ export function generateWebsitePackageJson(projectName) {
9
+ return `{
10
+ "name": "${projectName}-website",
11
+ "version": "1.0.0",
12
+ "private": true,
13
+ "scripts": {
14
+ "dev": "next dev -p 3001",
15
+ "build": "next build",
16
+ "start": "next start -p 3001",
17
+ "lint": "next lint",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "typecheck": "tsc --noEmit"
21
+ },
22
+ "dependencies": {
23
+ "next": "^14.1.0",
24
+ "react": "^18.2.0",
25
+ "react-dom": "^18.2.0",
26
+ "lucide-react": "^0.312.0",
27
+ "clsx": "^2.1.0",
28
+ "tailwind-merge": "^2.2.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^20.11.0",
32
+ "@types/react": "^18.2.0",
33
+ "@types/react-dom": "^18.2.0",
34
+ "autoprefixer": "^10.4.17",
35
+ "postcss": "^8.4.33",
36
+ "tailwindcss": "^3.4.1",
37
+ "typescript": "^5.3.3",
38
+ "@testing-library/react": "^14.1.2",
39
+ "@vitejs/plugin-react": "^4.2.1",
40
+ "vitest": "^1.2.0",
41
+ "jsdom": "^24.0.0"
42
+ }
43
+ }
44
+ `;
45
+ }
46
+ /**
47
+ * Generate Next.js config
48
+ */
49
+ export function generateNextConfig() {
50
+ return `/** @type {import('next').NextConfig} */
51
+ const nextConfig = {
52
+ // Enable React Strict Mode for better development
53
+ reactStrictMode: true,
54
+
55
+ // Image optimization
56
+ images: {
57
+ domains: [],
58
+ formats: ['image/avif', 'image/webp'],
59
+ },
60
+
61
+ // Disable x-powered-by header
62
+ poweredByHeader: false,
63
+
64
+ // Trailing slash config
65
+ trailingSlash: false,
66
+
67
+ // Headers for security
68
+ async headers() {
69
+ return [
70
+ {
71
+ source: '/:path*',
72
+ headers: [
73
+ {
74
+ key: 'X-DNS-Prefetch-Control',
75
+ value: 'on',
76
+ },
77
+ {
78
+ key: 'X-Content-Type-Options',
79
+ value: 'nosniff',
80
+ },
81
+ ],
82
+ },
83
+ ];
84
+ },
85
+ };
86
+
87
+ module.exports = nextConfig;
88
+ `;
89
+ }
90
+ /**
91
+ * Generate website tsconfig.json
92
+ */
93
+ export function generateWebsiteTsconfig() {
94
+ return `{
95
+ "compilerOptions": {
96
+ "target": "ES2017",
97
+ "lib": ["dom", "dom.iterable", "esnext"],
98
+ "allowJs": true,
99
+ "skipLibCheck": true,
100
+ "strict": true,
101
+ "noEmit": true,
102
+ "esModuleInterop": true,
103
+ "module": "esnext",
104
+ "moduleResolution": "bundler",
105
+ "resolveJsonModule": true,
106
+ "isolatedModules": true,
107
+ "jsx": "preserve",
108
+ "incremental": true,
109
+ "plugins": [
110
+ {
111
+ "name": "next"
112
+ }
113
+ ],
114
+ "paths": {
115
+ "@/*": ["./src/*"]
116
+ }
117
+ },
118
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
119
+ "exclude": ["node_modules"]
120
+ }
121
+ `;
122
+ }
123
+ /**
124
+ * Generate Tailwind config for website
125
+ *
126
+ * @param options - Optional configuration for brand colors and workspace mode
127
+ * @returns Tailwind config source code
128
+ */
129
+ export function generateWebsiteTailwindConfig(options) {
130
+ const colorScale = options?.primaryColor
131
+ ? generateInlineColorScale(options.primaryColor)
132
+ : defaultColorScale();
133
+ const presetImport = options?.workspaceMode && options?.projectName
134
+ ? `import designPreset from '@${options.projectName}/design-tokens/tailwind';\n`
135
+ : '';
136
+ const presetsBlock = options?.workspaceMode && options?.projectName
137
+ ? ` presets: [designPreset],\n`
138
+ : '';
139
+ return `import type { Config } from 'tailwindcss';
140
+ ${presetImport}
141
+ const config: Config = {
142
+ ${presetsBlock} content: [
143
+ './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
144
+ './src/components/**/*.{js,ts,jsx,tsx,mdx}',
145
+ './src/app/**/*.{js,ts,jsx,tsx,mdx}',
146
+ ],
147
+ theme: {
148
+ extend: {
149
+ colors: {
150
+ primary: {
151
+ ${colorScale}
152
+ },
153
+ background: 'hsl(var(--background))',
154
+ foreground: 'hsl(var(--foreground))',
155
+ muted: {
156
+ DEFAULT: 'hsl(var(--muted))',
157
+ foreground: 'hsl(var(--muted-foreground))',
158
+ },
159
+ accent: {
160
+ DEFAULT: 'hsl(var(--accent))',
161
+ foreground: 'hsl(var(--accent-foreground))',
162
+ },
163
+ card: {
164
+ DEFAULT: 'hsl(var(--card))',
165
+ foreground: 'hsl(var(--card-foreground))',
166
+ },
167
+ border: 'hsl(var(--border))',
168
+ ring: 'hsl(var(--ring))',
169
+ },
170
+ fontFamily: {
171
+ sans: ['var(--font-inter)', 'system-ui', 'sans-serif'],
172
+ },
173
+ borderColor: {
174
+ DEFAULT: 'hsl(var(--border))',
175
+ },
176
+ borderRadius: {
177
+ lg: 'var(--radius)',
178
+ md: 'calc(var(--radius) - 2px)',
179
+ sm: 'calc(var(--radius) - 4px)',
180
+ },
181
+ keyframes: {
182
+ fadeIn: {
183
+ '0%': { opacity: '0' },
184
+ '100%': { opacity: '1' },
185
+ },
186
+ slideUp: {
187
+ '0%': { opacity: '0', transform: 'translateY(20px)' },
188
+ '100%': { opacity: '1', transform: 'translateY(0)' },
189
+ },
190
+ },
191
+ animation: {
192
+ fadeIn: 'fadeIn 0.5s ease-out',
193
+ slideUp: 'slideUp 0.5s ease-out',
194
+ },
195
+ },
196
+ },
197
+ plugins: [],
198
+ };
199
+
200
+ export default config;
201
+ `;
202
+ }
203
+ /**
204
+ * Generate inline color scale entries from a hex color
205
+ */
206
+ function generateInlineColorScale(hex) {
207
+ const rgb = hexToRgb(hex);
208
+ if (!rgb)
209
+ return defaultColorScale();
210
+ const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
211
+ const stops = [
212
+ { key: '50', lightness: 0.95 },
213
+ { key: '100', lightness: 0.90 },
214
+ { key: '200', lightness: 0.80 },
215
+ { key: '300', lightness: 0.68 },
216
+ { key: '400', lightness: 0.56 },
217
+ { key: '500', lightness: 0.48 },
218
+ { key: '600', lightness: 0.40 },
219
+ { key: '700', lightness: 0.32 },
220
+ { key: '800', lightness: 0.24 },
221
+ { key: '900', lightness: 0.15 },
222
+ ];
223
+ return stops
224
+ .map(stop => ` ${stop.key}: '${hslToHex(hsl.h, hsl.s, stop.lightness)}',`)
225
+ .join('\n');
226
+ }
227
+ function defaultColorScale() {
228
+ return ` 50: '#f0f9ff',
229
+ 100: '#e0f2fe',
230
+ 200: '#bae6fd',
231
+ 300: '#7dd3fc',
232
+ 400: '#38bdf8',
233
+ 500: '#0ea5e9',
234
+ 600: '#0284c7',
235
+ 700: '#0369a1',
236
+ 800: '#075985',
237
+ 900: '#0c4a6e',`;
238
+ }
239
+ // --- Color conversion helpers (inline to avoid circular deps) ---
240
+ function hexToRgb(hex) {
241
+ const cleaned = hex.replace(/^#/, '');
242
+ if (cleaned.length !== 6)
243
+ return null;
244
+ const r = parseInt(cleaned.substring(0, 2), 16);
245
+ const g = parseInt(cleaned.substring(2, 4), 16);
246
+ const b = parseInt(cleaned.substring(4, 6), 16);
247
+ if (isNaN(r) || isNaN(g) || isNaN(b))
248
+ return null;
249
+ return { r, g, b };
250
+ }
251
+ function rgbToHsl(r, g, b) {
252
+ const rn = r / 255;
253
+ const gn = g / 255;
254
+ const bn = b / 255;
255
+ const max = Math.max(rn, gn, bn);
256
+ const min = Math.min(rn, gn, bn);
257
+ const l = (max + min) / 2;
258
+ let h = 0;
259
+ let s = 0;
260
+ if (max !== min) {
261
+ const d = max - min;
262
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
263
+ if (max === rn)
264
+ h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;
265
+ else if (max === gn)
266
+ h = ((bn - rn) / d + 2) / 6;
267
+ else
268
+ h = ((rn - gn) / d + 4) / 6;
269
+ }
270
+ return { h, s, l };
271
+ }
272
+ function hslToHex(h, s, l) {
273
+ const hue2rgb = (p, q, t) => {
274
+ let tn = t;
275
+ if (tn < 0)
276
+ tn += 1;
277
+ if (tn > 1)
278
+ tn -= 1;
279
+ if (tn < 1 / 6)
280
+ return p + (q - p) * 6 * tn;
281
+ if (tn < 1 / 2)
282
+ return q;
283
+ if (tn < 2 / 3)
284
+ return p + (q - p) * (2 / 3 - tn) * 6;
285
+ return p;
286
+ };
287
+ let r, g, b;
288
+ if (s === 0) {
289
+ r = g = b = l;
290
+ }
291
+ else {
292
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
293
+ const p = 2 * l - q;
294
+ r = hue2rgb(p, q, h + 1 / 3);
295
+ g = hue2rgb(p, q, h);
296
+ b = hue2rgb(p, q, h - 1 / 3);
297
+ }
298
+ const toHex = (n) => {
299
+ const val = Math.round(n * 255).toString(16);
300
+ return val.length === 1 ? '0' + val : val;
301
+ };
302
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
303
+ }
304
+ /**
305
+ * Generate PostCSS config for website
306
+ */
307
+ export function generateWebsitePostcssConfig() {
308
+ return `module.exports = {
309
+ plugins: {
310
+ tailwindcss: {},
311
+ autoprefixer: {},
312
+ },
313
+ };
314
+ `;
315
+ }
316
+ /**
317
+ * Generate website Dockerfile
318
+ */
319
+ export function generateWebsiteDockerfile() {
320
+ return `# Build stage
321
+ FROM node:20-alpine AS builder
322
+
323
+ WORKDIR /app
324
+
325
+ # Copy package files
326
+ COPY package*.json ./
327
+
328
+ # Install dependencies
329
+ RUN npm ci
330
+
331
+ # Copy source
332
+ COPY . .
333
+
334
+ # Build
335
+ RUN npm run build
336
+
337
+ # Production stage
338
+ FROM node:20-alpine AS runner
339
+
340
+ WORKDIR /app
341
+
342
+ ENV NODE_ENV=production
343
+ ENV NEXT_TELEMETRY_DISABLED=1
344
+
345
+ # Create non-root user
346
+ RUN addgroup --system --gid 1001 nodejs
347
+ RUN adduser --system --uid 1001 nextjs
348
+
349
+ # Copy built assets
350
+ COPY --from=builder /app/public ./public
351
+ COPY --from=builder /app/.next/standalone ./
352
+ COPY --from=builder /app/.next/static ./.next/static
353
+
354
+ USER nextjs
355
+
356
+ EXPOSE 3000
357
+
358
+ ENV PORT=3000
359
+ ENV HOSTNAME="0.0.0.0"
360
+
361
+ CMD ["node", "server.js"]
362
+ `;
363
+ }
364
+ /**
365
+ * Generate vitest config for website
366
+ */
367
+ export function generateWebsiteVitestConfig() {
368
+ return `import { defineConfig } from 'vitest/config';
369
+ import react from '@vitejs/plugin-react';
370
+ import path from 'path';
371
+
372
+ export default defineConfig({
373
+ plugins: [react()],
374
+ test: {
375
+ environment: 'jsdom',
376
+ include: ['**/*.test.{ts,tsx}'],
377
+ globals: true,
378
+ setupFiles: ['./tests/setup.ts'],
379
+ },
380
+ resolve: {
381
+ alias: {
382
+ '@': path.resolve(__dirname, './src'),
383
+ },
384
+ },
385
+ });
386
+ `;
387
+ }
388
+ /**
389
+ * Generate vitest setup for website
390
+ */
391
+ export function generateWebsiteVitestSetup() {
392
+ return `import '@testing-library/jest-dom';
393
+
394
+ // Mock next/navigation
395
+ vi.mock('next/navigation', () => ({
396
+ useRouter: () => ({
397
+ push: vi.fn(),
398
+ replace: vi.fn(),
399
+ prefetch: vi.fn(),
400
+ }),
401
+ useSearchParams: () => new URLSearchParams(),
402
+ usePathname: () => '/',
403
+ }));
404
+
405
+ // Mock next/image
406
+ vi.mock('next/image', () => ({
407
+ default: (props: Record<string, unknown>) => {
408
+ // eslint-disable-next-line @next/next/no-img-element, jsx-a11y/alt-text
409
+ return <img {...props} />;
410
+ },
411
+ }));
412
+ `;
413
+ }
414
+ /**
415
+ * Generate Next.js environment declaration
416
+ */
417
+ export function generateWebsiteNextEnv() {
418
+ return `/// <reference types="next" />
419
+ /// <reference types="next/image-types/global" />
420
+
421
+ // NOTE: This file should not be edited
422
+ // see https://nextjs.org/docs/basic-features/typescript for more information.
423
+ `;
424
+ }
425
+ //# sourceMappingURL=website-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-config.js","sourceRoot":"","sources":["../../../src/generators/templates/website-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Lead capture and conversion templates
3
+ * Generates API route handlers for lead capture and contact form components
4
+ */
5
+ import type { WebsiteStrategyDocument } from '../../types/website-strategy.js';
6
+ /**
7
+ * Generate lead capture API route handler
8
+ *
9
+ * @param provider - Lead capture provider type
10
+ * @returns API route source code (src/app/api/lead/route.ts)
11
+ */
12
+ export declare function generateLeadCaptureRoute(provider?: 'none' | 'webhook' | 'resend' | 'postmark'): string;
13
+ /**
14
+ * Generate contact form component
15
+ *
16
+ * @param strategy - Optional strategy for CTA text
17
+ * @returns ContactForm component source code
18
+ */
19
+ export declare function generateContactForm(strategy?: WebsiteStrategyDocument): string;
20
+ /**
21
+ * Generate .env.example entries for lead capture provider
22
+ *
23
+ * @param provider - Lead capture provider type
24
+ * @returns Environment variable example lines
25
+ */
26
+ export declare function generateLeadCaptureEnvExample(provider: 'none' | 'webhook' | 'resend' | 'postmark'): string;
27
+ //# sourceMappingURL=website-conversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-conversion.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/website-conversion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAa/E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,GAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAsB,GAC/D,MAAM,CAoLR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,uBAAuB,GACjC,MAAM,CAuGR;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GACnD,MAAM,CAWR"}