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,458 @@
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.createDockerFiles = createDockerFiles;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function createDockerFiles(config) {
10
+ const { targetDir, backends, frontends } = config;
11
+ await createDockerfileBase(targetDir, backends, frontends);
12
+ await createDockerComposeLocal(targetDir);
13
+ await createDockerComposeDev(targetDir, backends, frontends);
14
+ await createDockerComposeProd(targetDir, backends, frontends);
15
+ await createDockerIgnore(targetDir);
16
+ }
17
+ async function createDockerfileBase(targetDir, backends, frontends) {
18
+ const backendTargets = backends
19
+ .map((name) => `# ============================================
20
+ # ${name.toUpperCase()} Production
21
+ # ============================================
22
+ FROM build-base AS ${name}-production
23
+ WORKDIR /app/apps/backend/${name}
24
+
25
+ ENV NODE_OPTIONS="--max-old-space-size=4096"
26
+
27
+ RUN --mount=type=cache,id=nest,target=/app/node_modules/.cache \\
28
+ echo "📦 Building ${name}..." && \\
29
+ pnpm prisma generate && \\
30
+ pnpm run build
31
+
32
+ ENV NODE_OPTIONS="--max-old-space-size=2048"
33
+
34
+ EXPOSE 3000
35
+
36
+ CMD ["sh", "-c", "pnpm prisma generate && until pnpm prisma migrate deploy; do echo 'Waiting for DB...'; sleep 2; done && pnpm run start:prod"]
37
+
38
+ # ============================================
39
+ # ${name.toUpperCase()} Development
40
+ # ============================================
41
+ FROM shared-libs AS ${name}-development
42
+ WORKDIR /app/apps/backend/${name}
43
+ ENV NODE_ENV=development
44
+
45
+ EXPOSE 3000
46
+ CMD ["sh", "-c", "pnpm prisma generate && until pnpm prisma migrate deploy; do echo 'Waiting for DB...'; sleep 2; done && pnpm run dev"]`)
47
+ .join('\n\n');
48
+ const frontendTargets = frontends
49
+ .map((name, index) => `# ============================================
50
+ # ${name.toUpperCase()} Production
51
+ # ============================================
52
+ FROM build-base AS ${name}-production
53
+ WORKDIR /app/apps/frontend/${name}
54
+
55
+ ENV NODE_OPTIONS="--max-old-space-size=4096"
56
+
57
+ RUN --mount=type=cache,id=next,target=/app/node_modules/.cache \\
58
+ echo "🌐 Building ${name}..." && \\
59
+ NEXT_TELEMETRY_DISABLED=1 pnpm next build
60
+
61
+ ENV NODE_OPTIONS="--max-old-space-size=2048"
62
+
63
+ EXPOSE ${3000 + index}
64
+ CMD ["pnpm", "run", "start"]`)
65
+ .join('\n\n');
66
+ const dockerfile = `# syntax=docker/dockerfile:1
67
+
68
+ # ============================================
69
+ # Global Build Arguments
70
+ # ============================================
71
+ ARG NODE_VERSION=20
72
+ ARG DATABASE_URL
73
+
74
+ # ============================================
75
+ # Base Stage – Node + pnpm + Workspace setup
76
+ # ============================================
77
+ FROM node:\${NODE_VERSION}-alpine AS base
78
+
79
+ # Install pnpm
80
+ RUN corepack enable && corepack prepare pnpm@latest --activate
81
+
82
+ # Essentials
83
+ RUN apk add --no-cache curl bash postgresql-client
84
+
85
+ WORKDIR /app
86
+
87
+ # Workspace files
88
+ COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
89
+ COPY turbo.json tsconfig.json ./
90
+ COPY packages/ packages/
91
+
92
+ # App-level package.json
93
+ ${backends.map((name) => `COPY apps/backend/${name}/package.json apps/backend/${name}/`).join('\n')}
94
+ ${frontends.map((name) => `COPY apps/frontend/${name}/package.json apps/frontend/${name}/`).join('\n')}
95
+
96
+ # ============================================
97
+ # Dependencies Stage
98
+ # ============================================
99
+ FROM base AS dependencies
100
+
101
+ RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \\
102
+ pnpm install --frozen-lockfile
103
+
104
+ # ============================================
105
+ # Shared Libraries + Prisma Clients
106
+ # ============================================
107
+ FROM dependencies AS shared-libs
108
+
109
+ ARG DATABASE_URL
110
+ ENV DATABASE_URL=\${DATABASE_URL}
111
+
112
+ # Prisma schema
113
+ COPY packages/database/prisma/ packages/database/prisma/
114
+
115
+ # Generate Prisma client
116
+ RUN echo "🧩 Generating Prisma client..." && \\
117
+ cd packages/database && pnpm prisma generate
118
+
119
+ # Build shared packages
120
+ RUN --mount=type=cache,id=turbo,target=/app/node_modules/.cache \\
121
+ pnpm turbo run build --filter="@repo/shared-*"
122
+
123
+ # ============================================
124
+ # Common Build Base
125
+ # ============================================
126
+ FROM shared-libs AS build-base
127
+
128
+ # Source
129
+ COPY apps/ apps/
130
+
131
+ ENV NODE_ENV=production
132
+ ENV NEXT_TELEMETRY_DISABLED=1
133
+
134
+ ${backendTargets}
135
+
136
+ ${frontendTargets}
137
+ `;
138
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'Dockerfile'), dockerfile);
139
+ }
140
+ async function createDockerComposeLocal(targetDir) {
141
+ const dockerComposeLocal = `version: '3.8'
142
+
143
+ services:
144
+ # PostgreSQL Database
145
+ postgres:
146
+ image: postgres:15-alpine
147
+ container_name: \${PROJECT_NAME:-app}-postgres
148
+ restart: unless-stopped
149
+ environment:
150
+ POSTGRES_USER: \${DATABASE_USER:-postgres}
151
+ POSTGRES_PASSWORD: \${DATABASE_PASSWORD:-postgres}
152
+ POSTGRES_DB: \${DATABASE_NAME:-app_db}
153
+ ports:
154
+ - '\${DATABASE_PORT:-5432}:5432'
155
+ volumes:
156
+ - postgres_data:/var/lib/postgresql/data
157
+ healthcheck:
158
+ test: ['CMD-SHELL', 'pg_isready -U \${DATABASE_USER:-postgres}']
159
+ interval: 10s
160
+ timeout: 5s
161
+ retries: 5
162
+ networks:
163
+ - app-network
164
+
165
+ # Redis Cache
166
+ redis:
167
+ image: redis:7-alpine
168
+ container_name: \${PROJECT_NAME:-app}-redis
169
+ restart: unless-stopped
170
+ ports:
171
+ - '\${REDIS_PORT:-6379}:6379'
172
+ volumes:
173
+ - redis_data:/data
174
+ healthcheck:
175
+ test: ['CMD', 'redis-cli', 'ping']
176
+ interval: 10s
177
+ timeout: 5s
178
+ retries: 5
179
+ networks:
180
+ - app-network
181
+
182
+ networks:
183
+ app-network:
184
+ driver: bridge
185
+
186
+ volumes:
187
+ postgres_data:
188
+ name: \${PROJECT_NAME:-app}-postgres-data
189
+ redis_data:
190
+ name: \${PROJECT_NAME:-app}-redis-data
191
+ `;
192
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'docker-compose.local.yml'), dockerComposeLocal);
193
+ }
194
+ async function createDockerComposeDev(targetDir, backends, frontends) {
195
+ const backendServices = backends
196
+ .map((name, index) => ` # ${name} Backend
197
+ ${name}:
198
+ build:
199
+ context: .
200
+ dockerfile: Dockerfile
201
+ target: ${name}-development
202
+ container_name: \${PROJECT_NAME:-app}-${name}
203
+ restart: unless-stopped
204
+ env_file: .env
205
+ environment:
206
+ NODE_ENV: development
207
+ DATABASE_URL: postgresql://\${DATABASE_USER:-postgres}:\${DATABASE_PASSWORD:-postgres}@postgres:5432/\${DATABASE_NAME:-app_db}
208
+ REDIS_URL: redis://redis:6379
209
+ volumes:
210
+ - ./apps/backend/${name}:/app/apps/backend/${name}
211
+ - ./packages:/app/packages
212
+ - /app/node_modules
213
+ - /app/apps/backend/${name}/node_modules
214
+ depends_on:
215
+ postgres:
216
+ condition: service_healthy
217
+ redis:
218
+ condition: service_healthy
219
+ ports:
220
+ - '\${${name.toUpperCase()}_PORT:-${4000 + index}}:3000'
221
+ networks:
222
+ - app-network`)
223
+ .join('\n\n');
224
+ const frontendServices = frontends
225
+ .map((name, index) => ` # ${name} Frontend
226
+ ${name}:
227
+ build:
228
+ context: .
229
+ dockerfile: Dockerfile
230
+ target: ${name}-production
231
+ container_name: \${PROJECT_NAME:-app}-${name}
232
+ restart: unless-stopped
233
+ env_file: .env
234
+ environment:
235
+ NODE_ENV: development
236
+ NEXT_PUBLIC_API_URL: \${NEXT_PUBLIC_API_URL:-http://localhost:4000}
237
+ volumes:
238
+ - ./apps/frontend/${name}:/app/apps/frontend/${name}
239
+ - ./packages:/app/packages
240
+ - /app/node_modules
241
+ - /app/apps/frontend/${name}/node_modules
242
+ - /app/apps/frontend/${name}/.next
243
+ ports:
244
+ - '\${${name.toUpperCase()}_PORT:-${3000 + index}}:${3000 + index}'
245
+ networks:
246
+ - app-network`)
247
+ .join('\n\n');
248
+ const dockerComposeDev = `version: '3.8'
249
+
250
+ services:
251
+ # PostgreSQL Database
252
+ postgres:
253
+ image: postgres:15-alpine
254
+ container_name: \${PROJECT_NAME:-app}-postgres-dev
255
+ restart: unless-stopped
256
+ environment:
257
+ POSTGRES_USER: \${DATABASE_USER:-postgres}
258
+ POSTGRES_PASSWORD: \${DATABASE_PASSWORD:-postgres}
259
+ POSTGRES_DB: \${DATABASE_NAME:-app_db}
260
+ ports:
261
+ - '\${DATABASE_PORT:-5432}:5432'
262
+ volumes:
263
+ - postgres_dev_data:/var/lib/postgresql/data
264
+ healthcheck:
265
+ test: ['CMD-SHELL', 'pg_isready -U \${DATABASE_USER:-postgres}']
266
+ interval: 10s
267
+ timeout: 5s
268
+ retries: 5
269
+ networks:
270
+ - app-network
271
+
272
+ # Redis Cache
273
+ redis:
274
+ image: redis:7-alpine
275
+ container_name: \${PROJECT_NAME:-app}-redis-dev
276
+ restart: unless-stopped
277
+ ports:
278
+ - '\${REDIS_PORT:-6379}:6379'
279
+ healthcheck:
280
+ test: ['CMD', 'redis-cli', 'ping']
281
+ interval: 10s
282
+ timeout: 5s
283
+ retries: 5
284
+ networks:
285
+ - app-network
286
+
287
+ ${backendServices}
288
+
289
+ ${frontendServices}
290
+
291
+ networks:
292
+ app-network:
293
+ driver: bridge
294
+
295
+ volumes:
296
+ postgres_dev_data:
297
+ name: \${PROJECT_NAME:-app}-postgres-dev-data
298
+ redis_dev_data:
299
+ name: \${PROJECT_NAME:-app}-redis-dev-data
300
+ `;
301
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'docker-compose.dev.yml'), dockerComposeDev);
302
+ }
303
+ async function createDockerComposeProd(targetDir, backends, frontends) {
304
+ const backendServices = backends
305
+ .map((name, index) => ` # ${name} Backend
306
+ ${name}:
307
+ image: ghcr.io/\${GITHUB_REPOSITORY:-your-org/your-repo}/${name}:\${RELEASE_TAG:-latest}
308
+ container_name: \${PROJECT_NAME:-app}-${name}
309
+ restart: unless-stopped
310
+ env_file: .env
311
+ environment:
312
+ NODE_ENV: production
313
+ DATABASE_URL: postgresql://\${DATABASE_USER:-postgres}:\${DATABASE_PASSWORD:-postgres}@postgres:5432/\${DATABASE_NAME:-app_db}
314
+ REDIS_URL: redis://redis:6379
315
+ PORT: 3000
316
+ depends_on:
317
+ postgres:
318
+ condition: service_healthy
319
+ redis:
320
+ condition: service_healthy
321
+ ports:
322
+ - '\${${name.toUpperCase()}_PORT:-${4000 + index}}:3000'
323
+ healthcheck:
324
+ test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:3000/health || exit 1']
325
+ interval: 15s
326
+ timeout: 5s
327
+ retries: 10
328
+ start_period: 90s
329
+ networks:
330
+ - app-network`)
331
+ .join('\n\n');
332
+ const frontendServices = frontends
333
+ .map((name, index) => ` # ${name} Frontend
334
+ ${name}:
335
+ image: ghcr.io/\${GITHUB_REPOSITORY:-your-org/your-repo}/${name}:\${RELEASE_TAG:-latest}
336
+ container_name: \${PROJECT_NAME:-app}-${name}
337
+ restart: unless-stopped
338
+ env_file: .env
339
+ environment:
340
+ NODE_ENV: production
341
+ HOST: 0.0.0.0
342
+ PORT: ${3000 + index}
343
+ NEXT_PUBLIC_API_URL: \${NEXT_PUBLIC_API_URL:-http://localhost:4000}
344
+ ports:
345
+ - '\${${name.toUpperCase()}_PORT:-${3000 + index}}:${3000 + index}'
346
+ healthcheck:
347
+ test: ['CMD-SHELL', 'wget -qO- http://127.0.0.1:${3000 + index}/ || exit 1']
348
+ interval: 20s
349
+ timeout: 5s
350
+ retries: 6
351
+ start_period: 60s
352
+ networks:
353
+ - app-network`)
354
+ .join('\n\n');
355
+ const dockerComposeProd = `name: \${PROJECT_NAME:-app}-deploy
356
+
357
+ services:
358
+ # PostgreSQL Database
359
+ postgres:
360
+ image: postgres:15-alpine
361
+ restart: unless-stopped
362
+ env_file: .env
363
+ environment:
364
+ POSTGRES_USER: \${DATABASE_USER:-postgres}
365
+ POSTGRES_PASSWORD: \${DATABASE_PASSWORD:-postgres}
366
+ POSTGRES_DB: \${DATABASE_NAME:-app_db}
367
+ volumes:
368
+ - postgres_data:/var/lib/postgresql/data
369
+ healthcheck:
370
+ test: ['CMD-SHELL', 'pg_isready -U \${DATABASE_USER:-postgres} -d \${DATABASE_NAME:-app_db}']
371
+ interval: 10s
372
+ timeout: 5s
373
+ retries: 5
374
+ networks:
375
+ - app-network
376
+
377
+ # Redis Cache
378
+ redis:
379
+ image: redis:7-alpine
380
+ restart: unless-stopped
381
+ healthcheck:
382
+ test: ['CMD', 'redis-cli', 'ping']
383
+ interval: 10s
384
+ timeout: 5s
385
+ retries: 5
386
+ networks:
387
+ - app-network
388
+
389
+ ${backendServices}
390
+
391
+ ${frontendServices}
392
+
393
+ networks:
394
+ app-network:
395
+ driver: bridge
396
+
397
+ volumes:
398
+ postgres_data:
399
+ external: true
400
+ name: \${PROJECT_NAME:-app}-postgres-prod-data
401
+ redis_data:
402
+ name: \${PROJECT_NAME:-app}-redis-prod-data
403
+ `;
404
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, 'docker-compose.prod.yml'), dockerComposeProd);
405
+ }
406
+ async function createDockerIgnore(targetDir) {
407
+ const dockerignore = `# Dependencies
408
+ node_modules
409
+ npm-debug.log*
410
+ yarn-debug.log*
411
+ yarn-error.log*
412
+ pnpm-debug.log*
413
+
414
+ # Build outputs
415
+ dist
416
+ .next
417
+ out
418
+ build
419
+ *.tsbuildinfo
420
+
421
+ # Testing
422
+ coverage
423
+ .nyc_output
424
+
425
+ # Environment
426
+ .env
427
+ .env.*
428
+ !.env.example
429
+
430
+ # Misc
431
+ .DS_Store
432
+ *.pem
433
+ .vscode
434
+ .idea
435
+
436
+ # Git
437
+ .git
438
+ .gitignore
439
+
440
+ # Docker
441
+ Dockerfile*
442
+ docker-compose*.yml
443
+ .dockerignore
444
+
445
+ # Documentation
446
+ *.md
447
+ !README.md
448
+
449
+ # CI/CD
450
+ .github
451
+ .gitlab-ci.yml
452
+
453
+ # Turborepo
454
+ .turbo
455
+ `;
456
+ await fs_extra_1.default.writeFile(path_1.default.join(targetDir, '.dockerignore'), dockerignore);
457
+ }
458
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/templates/docker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ProjectConfig } from '../scaffold';
2
+ export declare function createDocumentation(config: ProjectConfig): Promise<void>;
3
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/templates/docs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9E"}
@@ -0,0 +1,71 @@
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.createDocumentation = createDocumentation;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = __importDefault(require("path"));
9
+ async function createDocumentation(config) {
10
+ const { targetDir, backends, frontends } = config;
11
+ const docsDir = path_1.default.join(targetDir, 'docs');
12
+ await fs_extra_1.default.ensureDir(docsDir);
13
+ await createEnvGuide(docsDir, backends, frontends);
14
+ }
15
+ async function createEnvGuide(docsDir, backends, frontends) {
16
+ const content = `# Environment Variables
17
+
18
+ ## Required
19
+
20
+ \`\`\`bash
21
+ # Database
22
+ DATABASE_URL="postgresql://postgres:postgres@localhost:5432/app_db"
23
+
24
+ # Redis
25
+ REDIS_URL="redis://localhost:6379"
26
+ \`\`\`
27
+
28
+ ## Optional
29
+
30
+ \`\`\`bash
31
+ # JWT
32
+ JWT_SECRET="your-secret-key"
33
+ JWT_EXPIRES_IN="7d"
34
+
35
+ # CORS
36
+ CORS_ORIGINS="http://localhost:3000"
37
+
38
+ # Email (for CI/CD notifications)
39
+ SMTP_SERVER=smtp.gmail.com
40
+ SMTP_PORT=587
41
+ SMTP_USERNAME=your-email@gmail.com
42
+ SMTP_PASSWORD=your-app-password
43
+ \`\`\`
44
+
45
+ ## Docker
46
+
47
+ \`\`\`bash
48
+ NODE_VERSION=20
49
+ REGISTRY=ghcr.io
50
+ IMAGE_TAG=latest
51
+ \`\`\`
52
+
53
+ ## GitHub Actions Secrets
54
+
55
+ | Secret | Description |
56
+ |--------|-------------|
57
+ | \`SSH_HOST\` | Server IP/domain |
58
+ | \`SSH_USER\` | SSH username |
59
+ | \`SSH_KEY\` | Private SSH key |
60
+ | \`DEPLOY_PATH\` | Deployment directory |
61
+
62
+ ## Service Ports
63
+
64
+ | Service | Port |
65
+ |---------|------|
66
+ ${backends.map((name, i) => `| ${name} | ${4000 + i} |`).join('\n')}
67
+ ${frontends.map((name, i) => `| ${name} | ${3000 + i} |`).join('\n')}
68
+ `;
69
+ await fs_extra_1.default.writeFile(path_1.default.join(docsDir, 'ENVIRONMENT.md'), content);
70
+ }
71
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/templates/docs.ts"],"names":[],"mappings":";;;;;AAIA,kDAOC;AAXD,wDAA0B;AAC1B,gDAAwB;AAGjB,KAAK,UAAU,mBAAmB,CAAC,MAAqB;IAC7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAClD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE7C,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE5B,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAe,EACf,QAAkB,EAClB,SAAmB;IAEnB,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDhB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACjE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACnE,CAAC;IAEA,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createFrontendApp(targetDir: string, appName: string): Promise<void>;
2
+ //# sourceMappingURL=frontend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.d.ts","sourceRoot":"","sources":["../../src/templates/frontend.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA6cf"}