builder-proj-mcp 1.0.5 → 1.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAY7C,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAWrB;IAEF,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM3D,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;CAG1C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAa7C,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAYrB;IAEF,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM3D,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;CAG1C"}
@@ -8,6 +8,7 @@ import { ViteBuilder } from './vite-builder.js';
8
8
  import { ExpressBuilder } from './express-builder.js';
9
9
  import { FastifyBuilder } from './fastify-builder.js';
10
10
  import { NestJSBuilder } from './nestjs-builder.js';
11
+ import { NextJSBuilder } from './nextjs-builder.js';
11
12
  export class BuilderFactory {
12
13
  static builders = [
13
14
  new SpringBootBuilder(),
@@ -19,7 +20,8 @@ export class BuilderFactory {
19
20
  new ViteBuilder(),
20
21
  new ExpressBuilder(),
21
22
  new FastifyBuilder(),
22
- new NestJSBuilder()
23
+ new NestJSBuilder(),
24
+ new NextJSBuilder()
23
25
  ];
24
26
  static getBuilder(framework) {
25
27
  return this.builders.find(builder => builder.supportedFrameworks.includes(framework.toLowerCase())) || null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,GAAqB;QAC1C,IAAI,iBAAiB,EAAE;QACvB,IAAI,YAAY,EAAE;QAClB,IAAI,UAAU,EAAE;QAChB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,WAAW,EAAE;QACjB,IAAI,cAAc,EAAE;QACpB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;KACpB,CAAC;IAEF,MAAM,CAAC,UAAU,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAClC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAC9D,IAAI,IAAI,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,sBAAsB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,GAAqB;QAC1C,IAAI,iBAAiB,EAAE;QACvB,IAAI,YAAY,EAAE;QAClB,IAAI,UAAU,EAAE;QAChB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,YAAY,EAAE;QAClB,IAAI,WAAW,EAAE;QACjB,IAAI,cAAc,EAAE;QACpB,IAAI,cAAc,EAAE;QACpB,IAAI,aAAa,EAAE;QACnB,IAAI,aAAa,EAAE;KACpB,CAAC;IAEF,MAAM,CAAC,UAAU,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAClC,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAC9D,IAAI,IAAI,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,sBAAsB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACvE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ProjectBuilder, ProjectConfig, BuilderResult } from '../types.js';
2
+ export declare class NextJSBuilder implements ProjectBuilder {
3
+ supportedFrameworks: string[];
4
+ build(config: ProjectConfig): Promise<BuilderResult>;
5
+ private createNextJSProject;
6
+ private createAppRouterSourceFiles;
7
+ private createPagesRouterSourceFiles;
8
+ private createTailwindConfig;
9
+ private createGitignore;
10
+ private createNextEnvFile;
11
+ }
12
+ //# sourceMappingURL=nextjs-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-builder.d.ts","sourceRoot":"","sources":["../../src/builders/nextjs-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAI5F,qBAAa,aAAc,YAAW,cAAc;IAClD,mBAAmB,WAAgD;IAE7D,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;YA4B5C,mBAAmB;YAqInB,0BAA0B;YAmO1B,4BAA4B;YAsN5B,oBAAoB;YA6BpB,eAAe;YAuCf,iBAAiB;CAShC"}
@@ -0,0 +1,618 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ export class NextJSBuilder {
4
+ supportedFrameworks = ['next', 'nextjs', 'next-app', 'next-pages'];
5
+ async build(config) {
6
+ const { projectName, framework, options = {}, outputPath } = config;
7
+ const basePath = outputPath || process.cwd();
8
+ const projectPath = path.resolve(basePath, projectName);
9
+ try {
10
+ await fs.mkdir(projectPath, { recursive: true });
11
+ const frontendOptions = options;
12
+ const useTypeScript = frontendOptions.typescript !== false;
13
+ const useAppRouter = framework === 'next' || framework === 'nextjs' || framework === 'next-app';
14
+ await this.createNextJSProject(projectPath, projectName, useTypeScript, useAppRouter, frontendOptions);
15
+ return {
16
+ success: true,
17
+ message: `Next.js project '${projectName}' created successfully`,
18
+ files: ['package.json', 'next.config.js', 'src/app/page.tsx', 'src/app/layout.tsx']
19
+ };
20
+ }
21
+ catch (error) {
22
+ return {
23
+ success: false,
24
+ message: 'Failed to create Next.js project',
25
+ error: error instanceof Error ? error.message : String(error)
26
+ };
27
+ }
28
+ }
29
+ async createNextJSProject(projectPath, projectName, useTypeScript, useAppRouter, options) {
30
+ const ext = useTypeScript ? '.ts' : '.js';
31
+ const tsExt = useTypeScript ? '.ts' : '.js';
32
+ const tsxExt = useTypeScript ? '.tsx' : '.jsx';
33
+ const { tailwind = false, stateManagement = 'none', router = true, eslint = true, prettier = true, testing = false } = options;
34
+ const packageJson = {
35
+ name: projectName,
36
+ version: '0.1.0',
37
+ private: true,
38
+ scripts: {
39
+ dev: 'next dev',
40
+ build: 'next build',
41
+ start: 'next start',
42
+ lint: 'next lint'
43
+ },
44
+ dependencies: {
45
+ 'next': '^14.0.4',
46
+ 'react': '^18.2.0',
47
+ 'react-dom': '^18.2.0'
48
+ },
49
+ devDependencies: {
50
+ '@types/node': '^20.10.5',
51
+ '@types/react': '^18.2.45',
52
+ '@types/react-dom': '^18.2.18',
53
+ 'typescript': '^5.3.3'
54
+ }
55
+ };
56
+ if (useAppRouter) {
57
+ packageJson.dependencies['next'] = '^14.0.4';
58
+ }
59
+ else {
60
+ packageJson.dependencies['next'] = '^14.0.4';
61
+ }
62
+ if (stateManagement === 'zustand') {
63
+ packageJson.dependencies['zustand'] = '^4.4.7';
64
+ }
65
+ if (stateManagement === 'redux') {
66
+ packageJson.dependencies['@reduxjs/toolkit'] = '^2.0.1';
67
+ packageJson.dependencies['react-redux'] = '^9.0.4';
68
+ }
69
+ if (tailwind) {
70
+ packageJson.devDependencies['tailwindcss'] = '^3.3.6';
71
+ packageJson.devDependencies['postcss'] = '^8.4.32';
72
+ packageJson.devDependencies['autoprefixer'] = '^10.4.16';
73
+ }
74
+ if (eslint) {
75
+ packageJson.devDependencies['eslint'] = '^8.56.0';
76
+ packageJson.devDependencies['eslint-config-next'] = '^14.0.4';
77
+ }
78
+ if (prettier) {
79
+ packageJson.devDependencies['prettier'] = '^3.1.1';
80
+ packageJson.devDependencies['prettier-plugin-tailwindcss'] = '^0.5.7';
81
+ }
82
+ if (testing) {
83
+ packageJson.devDependencies['@testing-library/react'] = '^14.1.2';
84
+ packageJson.devDependencies['@testing-library/jest-dom'] = '^6.1.5';
85
+ packageJson.devDependencies['jest'] = '^29.7.0';
86
+ packageJson.devDependencies['jest-environment-jsdom'] = '^29.7.0';
87
+ }
88
+ await fs.writeFile(path.join(projectPath, 'package.json'), JSON.stringify(packageJson, null, 2));
89
+ const nextConfig = `/** @type {import('next').NextConfig} */
90
+ const nextConfig = {
91
+ reactStrictMode: true,
92
+ images: {
93
+ unoptimized: true,
94
+ },
95
+ }
96
+
97
+ module.exports = nextConfig
98
+ `;
99
+ await fs.writeFile(path.join(projectPath, `next.config.${ext}`), nextConfig);
100
+ const tsconfig = `{
101
+ "compilerOptions": {
102
+ "lib": ["dom", "dom.iterable", "esnext"],
103
+ "allowJs": true,
104
+ "skipLibCheck": true,
105
+ "strict": true,
106
+ "noEmit": true,
107
+ "esModuleInterop": true,
108
+ "module": "esnext",
109
+ "moduleResolution": "bundler",
110
+ "resolveJsonModule": true,
111
+ "isolatedModules": true,
112
+ "jsx": "preserve",
113
+ "incremental": true,
114
+ "plugins": [
115
+ {
116
+ "name": "next"
117
+ }
118
+ ],
119
+ "paths": {
120
+ "@/*": ["./src/*"]
121
+ }
122
+ },
123
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
124
+ "exclude": ["node_modules"]
125
+ }
126
+ `;
127
+ if (useTypeScript) {
128
+ await fs.writeFile(path.join(projectPath, 'tsconfig.json'), tsconfig);
129
+ }
130
+ if (tailwind) {
131
+ await this.createTailwindConfig(projectPath, useTypeScript);
132
+ }
133
+ if (useAppRouter) {
134
+ await this.createAppRouterSourceFiles(projectPath, useTypeScript, tsxExt, tsExt, options);
135
+ }
136
+ else {
137
+ await this.createPagesRouterSourceFiles(projectPath, useTypeScript, tsxExt, tsExt, options);
138
+ }
139
+ await this.createGitignore(projectPath);
140
+ await this.createNextEnvFile(projectPath);
141
+ }
142
+ async createAppRouterSourceFiles(projectPath, useTypeScript, tsxExt, tsExt, options) {
143
+ const srcPath = path.join(projectPath, 'src');
144
+ const appPath = path.join(srcPath, 'app');
145
+ await fs.mkdir(appPath, { recursive: true });
146
+ const { tailwind = false, stateManagement = 'none', router = true } = options;
147
+ const layoutContent = `'use client'
148
+
149
+ import { useState } from 'react'
150
+ import Link from 'next/link'
151
+ import './globals.${tailwind ? 'css' : 'css'}'
152
+
153
+ export default function RootLayout({
154
+ children,
155
+ }: {
156
+ children: React.ReactNode
157
+ }) {
158
+ return (
159
+ <html lang="en">
160
+ <body>
161
+ <nav>
162
+ <Link href="/">Home</Link>
163
+ {router && (
164
+ <>
165
+ | <Link href="/about">About</Link>
166
+ | <Link href="/posts">Posts</Link>
167
+ </>
168
+ )}
169
+ </nav>
170
+ <main>{children}</main>
171
+ </body>
172
+ </html>
173
+ )
174
+ }
175
+ `;
176
+ await fs.writeFile(path.join(appPath, `layout.tsx`), layoutContent);
177
+ const pageContent = `import { useState } from 'react'
178
+ ${stateManagement !== 'none' ? "import { useCounterStore } from '@/store/counter'" : ''}
179
+
180
+ export default function Home() {
181
+ ${stateManagement !== 'none' ? "const count = useCounterStore((state) => state.count)" : 'const [count, setCount] = useState(0)'}
182
+
183
+ return (
184
+ <div>
185
+ <h1>Next.js App Router</h1>
186
+ <p>Count: ${stateManagement !== 'none' ? '{count}' : '{count}'}</p>
187
+ <button onClick={() => ${stateManagement !== 'none' ? 'useCounterStore.getState().increment()' : 'setCount(c => c + 1)'}}>
188
+ Increment
189
+ </button>
190
+ </div>
191
+ )
192
+ }
193
+ `;
194
+ await fs.writeFile(path.join(appPath, `page.tsx`), pageContent);
195
+ const globalsCss = tailwind ? `@tailwind base;
196
+ @tailwind components;
197
+ @tailwind utilities;
198
+
199
+ :root {
200
+ --foreground-rgb: 0, 0, 0;
201
+ --background-start-rgb: 214, 219, 220;
202
+ --background-end-rgb: 255, 255, 255;
203
+ }
204
+
205
+ @media (prefers-color-scheme: dark) {
206
+ :root {
207
+ --foreground-rgb: 255, 255, 255;
208
+ --background-start-rgb: 0, 0, 0;
209
+ --background-end-rgb: 0, 0, 0;
210
+ }
211
+ }
212
+
213
+ body {
214
+ color: rgb(var(--foreground-rgb));
215
+ background: linear-gradient(
216
+ to bottom,
217
+ transparent,
218
+ rgb(var(--background-end-rgb))
219
+ )
220
+ rgb(var(--background-start-rgb));
221
+ }
222
+ ` : `:root {
223
+ --foreground-rgb: 0, 0, 0;
224
+ --background-start-rgb: 214, 219, 220;
225
+ --background-end-rgb: 255, 255, 255;
226
+ }
227
+
228
+ @media (prefers-color-scheme: dark) {
229
+ :root {
230
+ --foreground-rgb: 255, 255, 255;
231
+ --background-start-rgb: 0, 0, 0;
232
+ --background-end-rgb: 0, 0, 0;
233
+ }
234
+ }
235
+
236
+ body {
237
+ color: rgb(var(--foreground-rgb));
238
+ background: linear-gradient(
239
+ to bottom,
240
+ transparent,
241
+ rgb(var(--background-end-rgb))
242
+ )
243
+ rgb(var(--background-start-rgb));
244
+ }
245
+ `;
246
+ await fs.writeFile(path.join(appPath, `globals.css`), globalsCss);
247
+ if (router) {
248
+ const aboutPagePath = path.join(appPath, 'about');
249
+ await fs.mkdir(aboutPagePath, { recursive: true });
250
+ const aboutPageContent = `import Link from 'next/link'
251
+
252
+ export default function AboutPage() {
253
+ return (
254
+ <div>
255
+ <h1>About Page</h1>
256
+ <Link href="/">Back to Home</Link>
257
+ </div>
258
+ )
259
+ }
260
+ `;
261
+ await fs.writeFile(path.join(aboutPagePath, `page.tsx`), aboutPageContent);
262
+ const postsPath = path.join(appPath, 'posts');
263
+ await fs.mkdir(postsPath, { recursive: true });
264
+ const postsPageContent = `import Link from 'next/link'
265
+
266
+ export default function PostsPage() {
267
+ return (
268
+ <div>
269
+ <h1>Posts</h1>
270
+ <p>Post list coming soon...</p>
271
+ <Link href="/">Back to Home</Link>
272
+ </div>
273
+ )
274
+ }
275
+ `;
276
+ await fs.writeFile(path.join(postsPath, `page.tsx`), postsPageContent);
277
+ }
278
+ if (stateManagement !== 'none') {
279
+ const storePath = path.join(srcPath, 'store');
280
+ await fs.mkdir(storePath, { recursive: true });
281
+ if (stateManagement === 'zustand') {
282
+ const zustandContent = `import { create } from 'zustand'
283
+
284
+ interface CounterState {
285
+ count: number
286
+ increment: () => void
287
+ decrement: () => void
288
+ reset: () => void
289
+ }
290
+
291
+ export const useCounterStore = create<CounterState>((set) => ({
292
+ count: 0,
293
+ increment: () => set((state) => ({ count: state.count + 1 })),
294
+ decrement: () => set((state) => ({ count: state.count - 1 })),
295
+ reset: () => set({ count: 0 }),
296
+ }))
297
+ `;
298
+ await fs.writeFile(path.join(storePath, `counter.${tsExt}`), zustandContent);
299
+ }
300
+ if (stateManagement === 'redux') {
301
+ const storePath2 = path.join(storePath, 'redux');
302
+ await fs.mkdir(storePath2, { recursive: true });
303
+ const counterSliceContent = `import { createSlice, PayloadAction } from '@reduxjs/toolkit'
304
+
305
+ interface CounterState {
306
+ value: number
307
+ }
308
+
309
+ const initialState: CounterState = {
310
+ value: 0,
311
+ }
312
+
313
+ export const counterSlice = createSlice({
314
+ name: 'counter',
315
+ initialState,
316
+ reducers: {
317
+ increment: (state) => {
318
+ state.value += 1
319
+ },
320
+ decrement: (state) => {
321
+ state.value -= 1
322
+ },
323
+ incrementByAmount: (state, action: PayloadAction<number>) => {
324
+ state.value += action.payload
325
+ },
326
+ },
327
+ })
328
+
329
+ export const { increment, decrement, incrementByAmount } = counterSlice.actions
330
+ export default counterSlice.reducer
331
+ `;
332
+ await fs.writeFile(path.join(storePath2, `counterSlice.${tsExt}`), counterSliceContent);
333
+ const storeContent = `import { configureStore } from '@reduxjs/toolkit'
334
+ import counterReducer from './counterSlice'
335
+
336
+ export const store = configureStore({
337
+ reducer: {
338
+ counter: counterReducer,
339
+ },
340
+ })
341
+
342
+ export type RootState = ReturnType<typeof store.getState>
343
+ export type AppDispatch = typeof store.dispatch
344
+ `;
345
+ await fs.writeFile(path.join(storePath2, `store.${tsExt}`), storeContent);
346
+ }
347
+ }
348
+ }
349
+ async createPagesRouterSourceFiles(projectPath, useTypeScript, tsxExt, tsExt, options) {
350
+ const srcPath = path.join(projectPath, 'src');
351
+ const pagesPath = path.join(srcPath, 'pages');
352
+ const publicPath = path.join(projectPath, 'public');
353
+ await fs.mkdir(pagesPath, { recursive: true });
354
+ await fs.mkdir(publicPath, { recursive: true });
355
+ const { tailwind = false, stateManagement = 'none', router = true } = options;
356
+ const indexContent = `import { useState } from 'react'
357
+ import Link from 'next/link'
358
+ import Head from 'next/head'
359
+ ${stateManagement !== 'none' ? "import { useCounterStore } from '@/store/counter'" : ''}
360
+
361
+ export default function Home() {
362
+ ${stateManagement !== 'none' ? "const count = useCounterStore((state) => state.count)" : 'const [count, setCount] = useState(0)'}
363
+
364
+ return (
365
+ <>
366
+ <Head>
367
+ <title>Home - Next.js</title>
368
+ <meta name="description" content="Generated by create next app" />
369
+ <link rel="icon" href="/favicon.ico" />
370
+ </Head>
371
+
372
+ <nav>
373
+ <Link href="/">Home</Link>
374
+ {router && (
375
+ <>
376
+ | <Link href="/about">About</Link>
377
+ | <Link href="/posts">Posts</Link>
378
+ </>
379
+ )}
380
+ </nav>
381
+
382
+ <main>
383
+ <h1>Next.js Pages Router</h1>
384
+ <p>Count: {count}</p>
385
+ <button onClick={() => ${stateManagement !== 'none' ? 'useCounterStore.getState().increment()' : 'setCount(c => c + 1)'}}>
386
+ Increment
387
+ </button>
388
+ </main>
389
+ </>
390
+ )
391
+ }
392
+ `;
393
+ await fs.writeFile(path.join(pagesPath, `_app.tsx`), `import '@/styles/globals.${tailwind ? 'css' : 'css'}'
394
+ import type { AppProps } from 'next/app'
395
+ import Link from 'next/link'
396
+
397
+ export default function App({ Component, pageProps }: AppProps) {
398
+ return (
399
+ <nav>
400
+ <Link href="/">Home</Link>
401
+ </nav>
402
+ )
403
+ }
404
+ `);
405
+ await fs.writeFile(path.join(pagesPath, `index.tsx`), indexContent);
406
+ const globalsContent = tailwind ? `@tailwind base;
407
+ @tailwind components;
408
+ @tailwind utilities;
409
+
410
+ body {
411
+ margin: 0;
412
+ padding: 20px;
413
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
414
+ }
415
+ ` : `body {
416
+ margin: 0;
417
+ padding: 20px;
418
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
419
+ }
420
+ `;
421
+ const stylesPath = path.join(srcPath, 'styles');
422
+ await fs.mkdir(stylesPath, { recursive: true });
423
+ await fs.writeFile(path.join(stylesPath, `globals.${tailwind ? 'css' : 'css'}`), globalsContent);
424
+ if (router) {
425
+ const aboutPageContent = `import Link from 'next/link'
426
+ import Head from 'next/head'
427
+
428
+ export default function About() {
429
+ return (
430
+ <>
431
+ <Head>
432
+ <title>About</title>
433
+ </Head>
434
+ <h1>About Page</h1>
435
+ <Link href="/">Back to Home</Link>
436
+ </>
437
+ )
438
+ }
439
+ `;
440
+ await fs.writeFile(path.join(pagesPath, `about.tsx`), aboutPageContent);
441
+ const postsPageContent = `import Link from 'next/link'
442
+ import Head from 'next/head'
443
+
444
+ export default function Posts() {
445
+ return (
446
+ <>
447
+ <Head>
448
+ <title>Posts</title>
449
+ </Head>
450
+ <h1>Posts</h1>
451
+ <p>Post list coming soon...</p>
452
+ <Link href="/">Back to Home</Link>
453
+ </>
454
+ )
455
+ }
456
+ `;
457
+ await fs.writeFile(path.join(pagesPath, `posts.tsx`), postsPageContent);
458
+ }
459
+ const publicIndexHtml = `<!DOCTYPE html>
460
+ <html lang="en">
461
+ <head>
462
+ <meta charset="UTF-8">
463
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
464
+ <title>Next.js App</title>
465
+ </head>
466
+ <body>
467
+ <div id="root"></div>
468
+ </body>
469
+ </html>
470
+ `;
471
+ await fs.writeFile(path.join(publicPath, 'index.html'), publicIndexHtml);
472
+ if (stateManagement !== 'none') {
473
+ const storePath = path.join(srcPath, 'store');
474
+ await fs.mkdir(storePath, { recursive: true });
475
+ if (stateManagement === 'zustand') {
476
+ const zustandContent = `import { create } from 'zustand'
477
+
478
+ interface CounterState {
479
+ count: number
480
+ increment: () => void
481
+ decrement: () => void
482
+ reset: () => void
483
+ }
484
+
485
+ export const useCounterStore = create<CounterState>((set) => ({
486
+ count: 0,
487
+ increment: () => set((state) => ({ count: state.count + 1 })),
488
+ decrement: () => set((state) => ({ count: state.count - 1 })),
489
+ reset: () => set({ count: 0 }),
490
+ }))
491
+ `;
492
+ await fs.writeFile(path.join(storePath, `counter.${tsExt}`), zustandContent);
493
+ }
494
+ if (stateManagement === 'redux') {
495
+ const storePath2 = path.join(storePath, 'redux');
496
+ await fs.mkdir(storePath2, { recursive: true });
497
+ const counterSliceContent = `import { createSlice, PayloadAction } from '@reduxjs/toolkit'
498
+
499
+ interface CounterState {
500
+ value: number
501
+ }
502
+
503
+ const initialState: CounterState = {
504
+ value: 0,
505
+ }
506
+
507
+ export const counterSlice = createSlice({
508
+ name: 'counter',
509
+ initialState,
510
+ reducers: {
511
+ increment: (state) => {
512
+ state.value += 1
513
+ },
514
+ decrement: (state) => {
515
+ state.value -= 1
516
+ },
517
+ incrementByAmount: (state, action: PayloadAction<number>) => {
518
+ state.value += action.payload
519
+ },
520
+ },
521
+ })
522
+
523
+ export const { increment, decrement, incrementByAmount } = counterSlice.actions
524
+ export default counterSlice.reducer
525
+ `;
526
+ await fs.writeFile(path.join(storePath2, `counterSlice.${tsExt}`), counterSliceContent);
527
+ const storeContent = `import { configureStore } from '@reduxjs/toolkit'
528
+ import counterReducer from './counterSlice'
529
+
530
+ export const store = configureStore({
531
+ reducer: {
532
+ counter: counterReducer,
533
+ },
534
+ })
535
+
536
+ export type RootState = ReturnType<typeof store.getState>
537
+ export type AppDispatch = typeof store.dispatch
538
+ `;
539
+ await fs.writeFile(path.join(storePath2, `store.${tsExt}`), storeContent);
540
+ }
541
+ }
542
+ }
543
+ async createTailwindConfig(projectPath, useTypeScript) {
544
+ const ext = useTypeScript ? '.ts' : '.js';
545
+ const configContent = `import type { Config } from 'tailwindcss'
546
+
547
+ const config: Config = {
548
+ content: [
549
+ './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
550
+ './src/components/**/*.{js,ts,jsx,tsx,mdx}',
551
+ './src/app/**/*.{js,ts,jsx,tsx,mdx}',
552
+ ],
553
+ theme: {
554
+ extend: {},
555
+ },
556
+ plugins: [],
557
+ }
558
+ export default config
559
+ `;
560
+ await fs.writeFile(path.join(projectPath, `tailwind.config.${ext}`), configContent);
561
+ const postcssConfig = `module.exports = {
562
+ plugins: {
563
+ tailwindcss: {},
564
+ autoprefixer: {},
565
+ },
566
+ }
567
+ `;
568
+ await fs.writeFile(path.join(projectPath, 'postcss.config.js'), postcssConfig);
569
+ }
570
+ async createGitignore(projectPath) {
571
+ const content = `# Dependencies
572
+ /node_modules
573
+ /.pnp
574
+ .pnp.js
575
+ .yarn/install-state.gz
576
+
577
+ # Testing
578
+ /coverage
579
+
580
+ # Next.js
581
+ /.next/
582
+ /out/
583
+
584
+ # Production
585
+ /build
586
+
587
+ # Misc
588
+ .DS_Store
589
+ *.pem
590
+
591
+ # Debug
592
+ npm-debug.log*
593
+ yarn-debug.log*
594
+ yarn-error.log*
595
+
596
+ # Local env files
597
+ .env*.local
598
+
599
+ # Vercel
600
+ .vercel
601
+
602
+ # TypeScript
603
+ *.tsbuildinfo
604
+ next-env.d.ts
605
+ `;
606
+ await fs.writeFile(path.join(projectPath, '.gitignore'), content);
607
+ }
608
+ async createNextEnvFile(projectPath) {
609
+ const content = `/// <reference types="next" />
610
+ /// <reference types="next/image-types/global" />
611
+
612
+ // NOTE: This file should not be edited
613
+ // see https://nextjs.org/docs/basic-features/typescript for more information.
614
+ `;
615
+ await fs.writeFile(path.join(projectPath, 'next-env.d.ts'), content);
616
+ }
617
+ }
618
+ //# sourceMappingURL=nextjs-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs-builder.js","sourceRoot":"","sources":["../../src/builders/nextjs-builder.ts"],"names":[],"mappings":"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"}