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.
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +3 -1
- package/dist/builders/index.js.map +1 -1
- package/dist/builders/nextjs-builder.d.ts +12 -0
- package/dist/builders/nextjs-builder.d.ts.map +1 -0
- package/dist/builders/nextjs-builder.js +618 -0
- package/dist/builders/nextjs-builder.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/builders/index.ts +3 -1
- package/src/builders/nextjs-builder.ts +687 -0
- package/src/index.ts +1 -0
|
@@ -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;
|
|
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"}
|
package/dist/builders/index.js
CHANGED
|
@@ -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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"}
|