create-turbo-mono 1.0.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 (54) hide show
  1. package/.claude/settings.local.json +14 -0
  2. package/README.md +182 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +118 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/scaffold.d.ts +8 -0
  8. package/dist/scaffold.d.ts.map +1 -0
  9. package/dist/scaffold.js +42 -0
  10. package/dist/scaffold.js.map +1 -0
  11. package/dist/templates/backend.d.ts +2 -0
  12. package/dist/templates/backend.d.ts.map +1 -0
  13. package/dist/templates/backend.js +424 -0
  14. package/dist/templates/backend.js.map +1 -0
  15. package/dist/templates/cicd.d.ts +3 -0
  16. package/dist/templates/cicd.d.ts.map +1 -0
  17. package/dist/templates/cicd.js +307 -0
  18. package/dist/templates/cicd.js.map +1 -0
  19. package/dist/templates/docker.d.ts +3 -0
  20. package/dist/templates/docker.d.ts.map +1 -0
  21. package/dist/templates/docker.js +458 -0
  22. package/dist/templates/docker.js.map +1 -0
  23. package/dist/templates/docs.d.ts +3 -0
  24. package/dist/templates/docs.d.ts.map +1 -0
  25. package/dist/templates/docs.js +71 -0
  26. package/dist/templates/docs.js.map +1 -0
  27. package/dist/templates/frontend.d.ts +2 -0
  28. package/dist/templates/frontend.d.ts.map +1 -0
  29. package/dist/templates/frontend.js +441 -0
  30. package/dist/templates/frontend.js.map +1 -0
  31. package/dist/templates/root.d.ts +3 -0
  32. package/dist/templates/root.d.ts.map +1 -0
  33. package/dist/templates/root.js +210 -0
  34. package/dist/templates/root.js.map +1 -0
  35. package/dist/templates/shared.d.ts +2 -0
  36. package/dist/templates/shared.d.ts.map +1 -0
  37. package/dist/templates/shared.js +696 -0
  38. package/dist/templates/shared.js.map +1 -0
  39. package/dist/utils.d.ts +5 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +34 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +40 -0
  44. package/src/index.ts +138 -0
  45. package/src/scaffold.ts +51 -0
  46. package/src/templates/backend.ts +460 -0
  47. package/src/templates/cicd.ts +334 -0
  48. package/src/templates/docker.ts +503 -0
  49. package/src/templates/docs.ts +74 -0
  50. package/src/templates/frontend.ts +469 -0
  51. package/src/templates/root.ts +216 -0
  52. package/src/templates/shared.ts +820 -0
  53. package/src/utils.ts +31 -0
  54. package/tsconfig.json +20 -0
@@ -0,0 +1,441 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createFrontendApp = createFrontendApp;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const utils_1 = require("../utils");
10
+ async function createFrontendApp(targetDir, appName) {
11
+ const kebabName = (0, utils_1.toKebabCase)(appName);
12
+ const pascalName = (0, utils_1.toPascalCase)(appName);
13
+ const appDir = path_1.default.join(targetDir, 'apps', 'frontend', kebabName);
14
+ // Create full Next.js structure (matching create-next-app with Page Router)
15
+ await fs_extra_1.default.ensureDir(path_1.default.join(appDir, 'pages'));
16
+ await fs_extra_1.default.ensureDir(path_1.default.join(appDir, 'pages', 'api'));
17
+ await fs_extra_1.default.ensureDir(path_1.default.join(appDir, 'public'));
18
+ await fs_extra_1.default.ensureDir(path_1.default.join(appDir, 'styles'));
19
+ // package.json
20
+ const packageJson = {
21
+ name: `@repo/${kebabName}`,
22
+ version: '0.1.0',
23
+ private: true,
24
+ scripts: {
25
+ dev: 'next dev',
26
+ build: 'next build',
27
+ start: 'next start',
28
+ lint: 'next lint',
29
+ 'type-check': 'tsc --noEmit',
30
+ clean: 'rm -rf .next',
31
+ },
32
+ dependencies: {
33
+ next: '14.0.4',
34
+ react: '^18',
35
+ 'react-dom': '^18',
36
+ '@repo/shared-frontend': 'workspace:*',
37
+ '@repo/shared-common': 'workspace:*',
38
+ },
39
+ devDependencies: {
40
+ typescript: '^5',
41
+ '@types/node': '^20',
42
+ '@types/react': '^18',
43
+ '@types/react-dom': '^18',
44
+ '@repo/tsconfig': 'workspace:*',
45
+ eslint: '^8',
46
+ 'eslint-config-next': '14.0.4',
47
+ },
48
+ };
49
+ await fs_extra_1.default.writeJson(path_1.default.join(appDir, 'package.json'), packageJson, {
50
+ spaces: 2,
51
+ });
52
+ // tsconfig.json
53
+ const tsConfig = {
54
+ compilerOptions: {
55
+ lib: ['dom', 'dom.iterable', 'esnext'],
56
+ allowJs: true,
57
+ skipLibCheck: true,
58
+ strict: true,
59
+ noEmit: true,
60
+ esModuleInterop: true,
61
+ module: 'esnext',
62
+ moduleResolution: 'bundler',
63
+ resolveJsonModule: true,
64
+ isolatedModules: true,
65
+ jsx: 'preserve',
66
+ incremental: true,
67
+ paths: {
68
+ '@/*': ['./*'],
69
+ },
70
+ },
71
+ include: ['next-env.d.ts', '**/*.ts', '**/*.tsx'],
72
+ exclude: ['node_modules'],
73
+ };
74
+ await fs_extra_1.default.writeJson(path_1.default.join(appDir, 'tsconfig.json'), tsConfig, {
75
+ spaces: 2,
76
+ });
77
+ // next.config.js
78
+ const nextConfig = `/** @type {import('next').NextConfig} */
79
+ const nextConfig = {
80
+ reactStrictMode: true,
81
+ transpilePackages: ['@repo/shared-frontend', '@repo/shared-common'],
82
+ }
83
+
84
+ module.exports = nextConfig
85
+ `;
86
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'next.config.js'), nextConfig);
87
+ // .eslintrc.json
88
+ const eslintConfig = {
89
+ extends: 'next/core-web-vitals',
90
+ };
91
+ await fs_extra_1.default.writeJson(path_1.default.join(appDir, '.eslintrc.json'), eslintConfig, {
92
+ spaces: 2,
93
+ });
94
+ // pages/_app.tsx
95
+ const appTsx = `import '@/styles/globals.css'
96
+ import type { AppProps } from 'next/app'
97
+
98
+ export default function App({ Component, pageProps }: AppProps) {
99
+ return <Component {...pageProps} />
100
+ }
101
+ `;
102
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'pages', '_app.tsx'), appTsx);
103
+ // pages/_document.tsx
104
+ const documentTsx = `import { Html, Head, Main, NextScript } from 'next/document'
105
+
106
+ export default function Document() {
107
+ return (
108
+ <Html lang="en">
109
+ <Head />
110
+ <body>
111
+ <Main />
112
+ <NextScript />
113
+ </body>
114
+ </Html>
115
+ )
116
+ }
117
+ `;
118
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'pages', '_document.tsx'), documentTsx);
119
+ // pages/index.tsx
120
+ const indexTsx = `import Head from 'next/head'
121
+ import Image from 'next/image'
122
+ import { Inter } from 'next/font/google'
123
+ import styles from '@/styles/Home.module.css'
124
+
125
+ const inter = Inter({ subsets: ['latin'] })
126
+
127
+ export default function Home() {
128
+ return (
129
+ <>
130
+ <Head>
131
+ <title>Create Next App</title>
132
+ <meta name="description" content="Generated by create next app" />
133
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
134
+ <link rel="icon" href="/favicon.ico" />
135
+ </Head>
136
+ <main className={\`\${styles.main} \${inter.className}\`}>
137
+ <div className={styles.description}>
138
+ <p>
139
+ Get started by editing&nbsp;
140
+ <code className={styles.code}>pages/index.tsx</code>
141
+ </p>
142
+ <div>
143
+ <a
144
+ href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
145
+ target="_blank"
146
+ rel="noopener noreferrer"
147
+ >
148
+ By{' '}
149
+ <Image
150
+ src="/vercel.svg"
151
+ alt="Vercel Logo"
152
+ className={styles.vercelLogo}
153
+ width={100}
154
+ height={24}
155
+ priority
156
+ />
157
+ </a>
158
+ </div>
159
+ </div>
160
+
161
+ <div className={styles.center}>
162
+ <Image
163
+ className={styles.logo}
164
+ src="/next.svg"
165
+ alt="Next.js Logo"
166
+ width={180}
167
+ height={37}
168
+ priority
169
+ />
170
+ </div>
171
+
172
+ <div className={styles.grid}>
173
+ <a
174
+ href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
175
+ className={styles.card}
176
+ target="_blank"
177
+ rel="noopener noreferrer"
178
+ >
179
+ <h2>
180
+ Docs <span>-&gt;</span>
181
+ </h2>
182
+ <p>
183
+ Find in-depth information about Next.js features and&nbsp;API.
184
+ </p>
185
+ </a>
186
+
187
+ <a
188
+ href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
189
+ className={styles.card}
190
+ target="_blank"
191
+ rel="noopener noreferrer"
192
+ >
193
+ <h2>
194
+ Learn <span>-&gt;</span>
195
+ </h2>
196
+ <p>
197
+ Learn about Next.js in an interactive course with&nbsp;quizzes!
198
+ </p>
199
+ </a>
200
+
201
+ <a
202
+ href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
203
+ className={styles.card}
204
+ target="_blank"
205
+ rel="noopener noreferrer"
206
+ >
207
+ <h2>
208
+ Templates <span>-&gt;</span>
209
+ </h2>
210
+ <p>
211
+ Discover and deploy boilerplate example Next.js&nbsp;projects.
212
+ </p>
213
+ </a>
214
+
215
+ <a
216
+ href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
217
+ className={styles.card}
218
+ target="_blank"
219
+ rel="noopener noreferrer"
220
+ >
221
+ <h2>
222
+ Deploy <span>-&gt;</span>
223
+ </h2>
224
+ <p>
225
+ Instantly deploy your Next.js site to a shareable URL with&nbsp;Vercel.
226
+ </p>
227
+ </a>
228
+ </div>
229
+ </main>
230
+ </>
231
+ )
232
+ }
233
+ `;
234
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'pages', 'index.tsx'), indexTsx);
235
+ // pages/api/hello.ts
236
+ const helloApiTs = `import type { NextApiRequest, NextApiResponse } from 'next'
237
+
238
+ type Data = {
239
+ name: string
240
+ }
241
+
242
+ export default function handler(
243
+ req: NextApiRequest,
244
+ res: NextApiResponse<Data>
245
+ ) {
246
+ res.status(200).json({ name: 'John Doe' })
247
+ }
248
+ `;
249
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'pages', 'api', 'hello.ts'), helloApiTs);
250
+ // styles/globals.css - Abbreviated for length
251
+ const globalsCss = `:root {
252
+ --max-width: 1100px;
253
+ --border-radius: 12px;
254
+ --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Code', 'Segoe UI Mono',
255
+ 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro',
256
+ 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace;
257
+
258
+ --foreground-rgb: 0, 0, 0;
259
+ --background-start-rgb: 214, 219, 220;
260
+ --background-end-rgb: 255, 255, 255;
261
+ }
262
+
263
+ * {
264
+ box-sizing: border-box;
265
+ padding: 0;
266
+ margin: 0;
267
+ }
268
+
269
+ html,
270
+ body {
271
+ max-width: 100vw;
272
+ overflow-x: hidden;
273
+ }
274
+
275
+ body {
276
+ color: rgb(var(--foreground-rgb));
277
+ background: linear-gradient(
278
+ to bottom,
279
+ transparent,
280
+ rgb(var(--background-end-rgb))
281
+ )
282
+ rgb(var(--background-start-rgb));
283
+ }
284
+
285
+ a {
286
+ color: inherit;
287
+ text-decoration: none;
288
+ }
289
+
290
+ @media (prefers-color-scheme: dark) {
291
+ html {
292
+ color-scheme: dark;
293
+ }
294
+ }
295
+ `;
296
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'styles', 'globals.css'), globalsCss);
297
+ // styles/Home.module.css - Abbreviated for length
298
+ const homeModuleCss = `.main {
299
+ display: flex;
300
+ flex-direction: column;
301
+ justify-content: space-between;
302
+ align-items: center;
303
+ padding: 6rem;
304
+ min-height: 100vh;
305
+ }
306
+
307
+ .description {
308
+ display: inherit;
309
+ justify-content: inherit;
310
+ align-items: inherit;
311
+ font-size: 0.85rem;
312
+ max-width: var(--max-width);
313
+ width: 100%;
314
+ z-index: 2;
315
+ font-family: var(--font-mono);
316
+ }
317
+
318
+ .code {
319
+ font-weight: 700;
320
+ font-family: var(--font-mono);
321
+ }
322
+
323
+ .grid {
324
+ display: grid;
325
+ grid-template-columns: repeat(4, minmax(25%, auto));
326
+ max-width: 100%;
327
+ width: var(--max-width);
328
+ }
329
+
330
+ .card {
331
+ padding: 1rem 1.2rem;
332
+ border-radius: var(--border-radius);
333
+ background: rgba(var(--card-rgb), 0);
334
+ border: 1px solid rgba(var(--card-border-rgb), 0);
335
+ transition: background 200ms, border 200ms;
336
+ }
337
+
338
+ .center {
339
+ display: flex;
340
+ justify-content: center;
341
+ align-items: center;
342
+ position: relative;
343
+ padding: 4rem 0;
344
+ }
345
+
346
+ @media (max-width: 700px) {
347
+ .grid {
348
+ grid-template-columns: 1fr;
349
+ margin-bottom: 120px;
350
+ max-width: 320px;
351
+ text-align: center;
352
+ }
353
+ }
354
+ `;
355
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'styles', 'Home.module.css'), homeModuleCss);
356
+ // public/next.svg
357
+ const nextSvg = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>`;
358
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'public', 'next.svg'), nextSvg);
359
+ // public/vercel.svg
360
+ const vercelSvg = `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 283 64"><path fill="black" d="M141 16c-11 0-19 7-19 18s9 18 20 18c7 0 13-3 16-7l-7-5c-2 3-6 4-9 4-5 0-9-3-10-7h28v-3c0-11-8-18-19-18zm-9 15c1-4 4-7 9-7s8 3 9 7h-18zm117-15c-11 0-19 7-19 18s9 18 20 18c6 0 12-3 16-7l-8-5c-2 3-5 4-8 4-5 0-9-3-11-7h28l1-3c0-11-8-18-19-18zm-10 15c2-4 5-7 10-7s8 3 9 7h-19zm-39 3c0 6 4 10 10 10 4 0 7-2 9-5l8 5c-3 5-9 8-17 8-11 0-19-7-19-18s8-18 19-18c8 0 14 3 17 8l-8 5c-2-3-5-5-9-5-6 0-10 4-10 10zm83-29v46h-9V5h9zM37 0l37 64H0L37 0zm92 5-27 48L74 5h10l18 30 17-30h10zm59 12v10l-3-1c-6 0-10 4-10 10v15h-9V17h9v9c0-5 6-9 13-9z"/></svg>`;
361
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'public', 'vercel.svg'), vercelSvg);
362
+ // .gitignore
363
+ const gitignore = `# dependencies
364
+ /node_modules
365
+ /.pnp
366
+ .pnp.js
367
+
368
+ # testing
369
+ /coverage
370
+
371
+ # next.js
372
+ /.next/
373
+ /out/
374
+
375
+ # production
376
+ /build
377
+
378
+ # misc
379
+ .DS_Store
380
+ *.pem
381
+
382
+ # debug
383
+ npm-debug.log*
384
+ yarn-debug.log*
385
+ yarn-error.log*
386
+
387
+ # local env files
388
+ .env*.local
389
+
390
+ # vercel
391
+ .vercel
392
+
393
+ # typescript
394
+ *.tsbuildinfo
395
+ next-env.d.ts
396
+ `;
397
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, '.gitignore'), gitignore);
398
+ // .env.local.example and .env.local
399
+ const envExample = `NEXT_PUBLIC_API_URL=http://localhost:3000
400
+ `;
401
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, '.env.local.example'), envExample);
402
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, '.env.local'), envExample);
403
+ // README.md
404
+ const readme = `This is a [Next.js](https://nextjs.org/) project bootstrapped with [\`create-next-app\`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
405
+
406
+ ## Getting Started
407
+
408
+ First, run the development server:
409
+
410
+ \`\`\`bash
411
+ pnpm dev
412
+ \`\`\`
413
+
414
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
415
+
416
+ You can start editing the page by modifying \`pages/index.tsx\`. The page auto-updates as you edit the file.
417
+
418
+ [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in \`pages/api/hello.ts\`.
419
+
420
+ The \`pages/api\` directory is mapped to \`/api/*\`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
421
+
422
+ This project uses [\`next/font\`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
423
+
424
+ ## Learn More
425
+
426
+ To learn more about Next.js, take a look at the following resources:
427
+
428
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
429
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
430
+
431
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
432
+
433
+ ## Deploy on Vercel
434
+
435
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
436
+
437
+ Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
438
+ `;
439
+ await fs_extra_1.default.writeFile(path_1.default.join(appDir, 'README.md'), readme);
440
+ }
441
+ //# sourceMappingURL=frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../src/templates/frontend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../scaffold';
2
+ export declare function createRootFiles(config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/templates/root.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmN1E"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createRootFiles = createRootFiles;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function createRootFiles(config) {
10
+ const { targetDir, projectName } = config;
11
+ // Root package.json
12
+ const rootPackageJson = {
13
+ name: projectName,
14
+ version: '1.0.0',
15
+ private: true,
16
+ scripts: {
17
+ dev: 'turbo run dev',
18
+ build: 'turbo run build',
19
+ 'type-check': 'turbo run type-check',
20
+ lint: 'turbo run lint',
21
+ clean: 'turbo run clean',
22
+ 'db:generate': 'turbo run db:generate',
23
+ 'db:migrate': 'cd packages/database && pnpm prisma migrate dev',
24
+ 'db:studio': 'cd packages/database && pnpm prisma studio',
25
+ },
26
+ devDependencies: {
27
+ turbo: '^1.11.2',
28
+ typescript: '^5.3.3',
29
+ },
30
+ packageManager: 'pnpm@8.15.0',
31
+ engines: {
32
+ node: '>=18.0.0',
33
+ pnpm: '>=8.0.0',
34
+ },
35
+ };
36
+ await fs_extra_1.default.writeJson(path_1.default.join(targetDir, 'package.json'), rootPackageJson, {
37
+ spaces: 2,
38
+ });
39
+ // pnpm-workspace.yaml
40
+ const workspaceYaml = `packages:
41
+ - 'apps/backend/*'
42
+ - 'apps/frontend/*'
43
+ - 'packages/*'
44
+ `;
45
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'pnpm-workspace.yaml'), workspaceYaml);
46
+ // turbo.json
47
+ const turboConfig = {
48
+ $schema: 'https://turbo.build/schema.json',
49
+ globalDependencies: ['**/.env.*local'],
50
+ pipeline: {
51
+ 'db:generate': {
52
+ cache: false,
53
+ },
54
+ build: {
55
+ dependsOn: ['^build', 'db:generate'],
56
+ outputs: ['dist/**', '.next/**', 'build/**'],
57
+ },
58
+ dev: {
59
+ cache: false,
60
+ persistent: true,
61
+ },
62
+ lint: {
63
+ dependsOn: ['^lint'],
64
+ },
65
+ 'type-check': {
66
+ dependsOn: ['^type-check'],
67
+ },
68
+ clean: {
69
+ cache: false,
70
+ },
71
+ },
72
+ };
73
+ await fs_extra_1.default.writeJson(path_1.default.join(targetDir, 'turbo.json'), turboConfig, {
74
+ spaces: 2,
75
+ });
76
+ // .gitignore
77
+ const gitignore = `# Dependencies
78
+ node_modules
79
+ .pnp
80
+ .pnp.js
81
+
82
+ # Testing
83
+ coverage
84
+
85
+ # Next.js
86
+ .next/
87
+ out/
88
+ build
89
+
90
+ # Production
91
+ dist
92
+
93
+ # Misc
94
+ .DS_Store
95
+ *.pem
96
+
97
+ # Debug
98
+ npm-debug.log*
99
+ yarn-debug.log*
100
+ yarn-error.log*
101
+ .pnpm-debug.log*
102
+
103
+ # Local env files
104
+ .env
105
+ .env*.local
106
+
107
+ # Turbo
108
+ .turbo
109
+
110
+ # IDEs
111
+ .idea
112
+ .vscode
113
+ *.swp
114
+ *.swo
115
+ *~
116
+
117
+ # Prisma
118
+ prisma/migrations
119
+ `;
120
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, '.gitignore'), gitignore);
121
+ // README.md
122
+ const readme = `# ${projectName}
123
+
124
+ A monorepo project with NestJS backends and Next.js frontends.
125
+
126
+ ## Getting Started
127
+
128
+ ### Prerequisites
129
+
130
+ - Node.js >= 18
131
+ - pnpm >= 8
132
+
133
+ ### Installation
134
+
135
+ \`\`\`bash
136
+ pnpm install
137
+ \`\`\`
138
+
139
+ ### Development
140
+
141
+ \`\`\`bash
142
+ # Start all apps in development mode
143
+ pnpm dev
144
+
145
+ # Build all apps
146
+ pnpm build
147
+
148
+ # Type checking
149
+ pnpm type-check
150
+
151
+ # Generate Prisma client
152
+ pnpm db:generate
153
+
154
+ # Run database migrations
155
+ pnpm db:migrate
156
+
157
+ # Open Prisma Studio
158
+ pnpm db:studio
159
+ \`\`\`
160
+
161
+ ## Project Structure
162
+
163
+ \`\`\`
164
+ ${projectName}/
165
+ ├── apps/
166
+ │ ├── backend/ # NestJS backend apps
167
+ │ └── frontend/ # Next.js frontend apps
168
+ ├── packages/
169
+ │ ├── database/ # Prisma schema and client
170
+ │ ├── shared-backend/ # Backend utilities and types
171
+ │ ├── shared-frontend/ # Frontend components and hooks
172
+ │ ├── shared-common/ # Universal utilities
173
+ │ └── tsconfig/ # Shared TypeScript configs
174
+ └── turbo.json # Turborepo configuration
175
+ \`\`\`
176
+
177
+ ## Packages
178
+
179
+ ### @repo/database
180
+ Prisma schema, migrations, and database client.
181
+
182
+ ### @repo/shared-backend
183
+ Shared backend utilities, middleware, and types.
184
+
185
+ ### @repo/shared-frontend
186
+ Shared frontend components, hooks, and utilities.
187
+
188
+ ### @repo/shared-common
189
+ Universal utilities that can be used by both frontend and backend.
190
+
191
+ ## Adding New Apps
192
+
193
+ ### Backend App
194
+ Create a new NestJS app in \`apps/backend/\` and add it to \`pnpm-workspace.yaml\`.
195
+
196
+ ### Frontend App
197
+ Create a new Next.js app in \`apps/frontend/\` and add it to \`pnpm-workspace.yaml\`.
198
+
199
+ ## License
200
+
201
+ MIT
202
+ `;
203
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'README.md'), readme);
204
+ // .npmrc
205
+ const npmrc = `auto-install-peers=true
206
+ strict-peer-dependencies=false
207
+ `;
208
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, '.npmrc'), npmrc);
209
+ }
210
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/templates/root.ts"],"names":[],"mappings":";;;;;AAIA,0CAmNC;AAvND,wDAA0B;AAC1B,gDAAwB;AAGjB,KAAK,UAAU,eAAe,CAAC,MAAqB;IACzD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE1C,oBAAoB;IACpB,MAAM,eAAe,GAAG;QACtB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,GAAG,EAAE,eAAe;YACpB,KAAK,EAAE,iBAAiB;YACxB,YAAY,EAAE,sBAAsB;YACpC,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,iBAAiB;YACxB,aAAa,EAAE,uBAAuB;YACtC,YAAY,EAAE,iDAAiD;YAC/D,WAAW,EAAE,4CAA4C;SAC1D;QACD,eAAe,EAAE;YACf,KAAK,EAAE,SAAS;YAChB,UAAU,EAAE,QAAQ;SACrB;QACD,cAAc,EAAE,aAAa;QAC7B,OAAO,EAAE;YACP,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,SAAS;SAChB;KACF,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,eAAe,EAAE;QACxE,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,aAAa,GAAG;;;;CAIvB,CAAC;IACA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,aAAa,CAAC,CAAC;IAE/E,aAAa;IACb,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,iCAAiC;QAC1C,kBAAkB,EAAE,CAAC,gBAAgB,CAAC;QACtC,QAAQ,EAAE;YACR,aAAa,EAAE;gBACb,KAAK,EAAE,KAAK;aACb;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;gBACpC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC;aAC7C;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,IAAI;aACjB;YACD,IAAI,EAAE;gBACJ,SAAS,EAAE,CAAC,OAAO,CAAC;aACrB;YACD,YAAY,EAAE;gBACZ,SAAS,EAAE,CAAC,aAAa,CAAC;aAC3B;YACD,KAAK,EAAE;gBACL,KAAK,EAAE,KAAK;aACb;SACF;KACF,CAAC;IAEF,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE;QAClE,MAAM,EAAE,CAAC;KACV,CAAC,CAAC;IAEH,aAAa;IACb,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CnB,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;IAElE,YAAY;IACZ,MAAM,MAAM,GAAG,KAAK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0C/B,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCZ,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;IAE9D,SAAS;IACT,MAAM,KAAK,GAAG;;CAEf,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createSharedPackages(targetDir: string): Promise<void>;
2
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"AAGA,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E"}