phos 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 (116) hide show
  1. package/.eslintignore +3 -0
  2. package/AGENTS.md +172 -0
  3. package/CHANGELOG.md +184 -0
  4. package/LICENSE +21 -0
  5. package/README.md +279 -0
  6. package/bun.lock +125 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +255 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/generators/backends/elysia.d.ts +3 -0
  12. package/dist/generators/backends/elysia.d.ts.map +1 -0
  13. package/dist/generators/backends/elysia.js +135 -0
  14. package/dist/generators/backends/elysia.js.map +1 -0
  15. package/dist/generators/backends/fastapi.d.ts +3 -0
  16. package/dist/generators/backends/fastapi.d.ts.map +1 -0
  17. package/dist/generators/backends/fastapi.js +158 -0
  18. package/dist/generators/backends/fastapi.js.map +1 -0
  19. package/dist/generators/frontends/astro.d.ts +3 -0
  20. package/dist/generators/frontends/astro.d.ts.map +1 -0
  21. package/dist/generators/frontends/astro.js +303 -0
  22. package/dist/generators/frontends/astro.js.map +1 -0
  23. package/dist/generators/frontends/nextjs.d.ts +3 -0
  24. package/dist/generators/frontends/nextjs.d.ts.map +1 -0
  25. package/dist/generators/frontends/nextjs.js +274 -0
  26. package/dist/generators/frontends/nextjs.js.map +1 -0
  27. package/dist/generators/frontends/svelte.d.ts +3 -0
  28. package/dist/generators/frontends/svelte.d.ts.map +1 -0
  29. package/dist/generators/frontends/svelte.js +324 -0
  30. package/dist/generators/frontends/svelte.js.map +1 -0
  31. package/dist/generators/monorepo.d.ts +3 -0
  32. package/dist/generators/monorepo.d.ts.map +1 -0
  33. package/dist/generators/monorepo.js +320 -0
  34. package/dist/generators/monorepo.js.map +1 -0
  35. package/dist/generators/single.d.ts +3 -0
  36. package/dist/generators/single.d.ts.map +1 -0
  37. package/dist/generators/single.js +229 -0
  38. package/dist/generators/single.js.map +1 -0
  39. package/dist/utils/helpers.d.ts +38 -0
  40. package/dist/utils/helpers.d.ts.map +1 -0
  41. package/dist/utils/helpers.js +109 -0
  42. package/dist/utils/helpers.js.map +1 -0
  43. package/package.json +46 -0
  44. package/src/cli.ts +500 -0
  45. package/src/generators/backends/elysia.ts +45 -0
  46. package/src/generators/backends/fastapi.ts +71 -0
  47. package/src/generators/frontends/astro.ts +37 -0
  48. package/src/generators/frontends/nextjs.ts +37 -0
  49. package/src/generators/frontends/svelte.ts +38 -0
  50. package/src/generators/monorepo.ts +529 -0
  51. package/src/generators/single.ts +465 -0
  52. package/src/templates/backend/elysia/README.md +15 -0
  53. package/src/templates/backend/elysia/package.json +26 -0
  54. package/src/templates/backend/elysia/src/api/user_api.ts +0 -0
  55. package/src/templates/backend/elysia/src/db.ts +17 -0
  56. package/src/templates/backend/elysia/src/index.ts +68 -0
  57. package/src/templates/backend/elysia/src/service/user_service.ts +0 -0
  58. package/src/templates/backend/elysia/src/sql/user_sql.ts +0 -0
  59. package/src/templates/backend/elysia/src/types/user_type.ts +0 -0
  60. package/src/templates/backend/elysia/tsconfig.json +103 -0
  61. package/src/templates/backend/fastapi/.pylintrc +2 -0
  62. package/src/templates/backend/fastapi/README.md +33 -0
  63. package/src/templates/backend/fastapi/pyproject.toml +9 -0
  64. package/src/templates/backend/fastapi/pyproject_prettier.toml +20 -0
  65. package/src/templates/backend/fastapi/requirements.txt +15 -0
  66. package/src/templates/backend/fastapi/setup.sh +23 -0
  67. package/src/templates/backend/fastapi/src/api/user_api.py +0 -0
  68. package/src/templates/backend/fastapi/src/db.py +31 -0
  69. package/src/templates/backend/fastapi/src/main.py +53 -0
  70. package/src/templates/backend/fastapi/src/service/user_service.py +0 -0
  71. package/src/templates/backend/fastapi/src/sql/user_sql.py +0 -0
  72. package/src/templates/backend/fastapi/src/types/user_type.py +0 -0
  73. package/src/templates/frontend/astro/README.md +46 -0
  74. package/src/templates/frontend/astro/astro.config.mjs +5 -0
  75. package/src/templates/frontend/astro/package.json +28 -0
  76. package/src/templates/frontend/astro/public/favicon.ico +0 -0
  77. package/src/templates/frontend/astro/public/favicon.svg +9 -0
  78. package/src/templates/frontend/astro/src/assets/astro.svg +1 -0
  79. package/src/templates/frontend/astro/src/assets/background.svg +1 -0
  80. package/src/templates/frontend/astro/src/components/Welcome.astro +5 -0
  81. package/src/templates/frontend/astro/src/layouts/Layout.astro +23 -0
  82. package/src/templates/frontend/astro/src/pages/index.astro +8 -0
  83. package/src/templates/frontend/astro/tsconfig.json +5 -0
  84. package/src/templates/frontend/nextjs/README.md +36 -0
  85. package/src/templates/frontend/nextjs/app/favicon.ico +0 -0
  86. package/src/templates/frontend/nextjs/app/globals.css +26 -0
  87. package/src/templates/frontend/nextjs/app/layout.tsx +34 -0
  88. package/src/templates/frontend/nextjs/app/page.tsx +16 -0
  89. package/src/templates/frontend/nextjs/eslint.config.mjs +18 -0
  90. package/src/templates/frontend/nextjs/next.config.ts +7 -0
  91. package/src/templates/frontend/nextjs/package.json +28 -0
  92. package/src/templates/frontend/nextjs/postcss.config.mjs +7 -0
  93. package/src/templates/frontend/nextjs/public/file.svg +1 -0
  94. package/src/templates/frontend/nextjs/public/globe.svg +1 -0
  95. package/src/templates/frontend/nextjs/public/next.svg +1 -0
  96. package/src/templates/frontend/nextjs/public/vercel.svg +1 -0
  97. package/src/templates/frontend/nextjs/public/window.svg +1 -0
  98. package/src/templates/frontend/nextjs/tsconfig.json +34 -0
  99. package/src/templates/frontend/svelte/.prettierignore +9 -0
  100. package/src/templates/frontend/svelte/.prettierrc +19 -0
  101. package/src/templates/frontend/svelte/README.md +42 -0
  102. package/src/templates/frontend/svelte/eslint.config.js +39 -0
  103. package/src/templates/frontend/svelte/package.json +39 -0
  104. package/src/templates/frontend/svelte/src/app.d.ts +13 -0
  105. package/src/templates/frontend/svelte/src/app.html +11 -0
  106. package/src/templates/frontend/svelte/src/lib/assets/favicon.svg +1 -0
  107. package/src/templates/frontend/svelte/src/lib/index.ts +1 -0
  108. package/src/templates/frontend/svelte/src/routes/+layout.svelte +9 -0
  109. package/src/templates/frontend/svelte/src/routes/+page.svelte +2 -0
  110. package/src/templates/frontend/svelte/src/routes/layout.css +2 -0
  111. package/src/templates/frontend/svelte/static/robots.txt +3 -0
  112. package/src/templates/frontend/svelte/svelte.config.js +13 -0
  113. package/src/templates/frontend/svelte/tsconfig.json +20 -0
  114. package/src/templates/frontend/svelte/vite.config.ts +5 -0
  115. package/src/utils/helpers.ts +198 -0
  116. package/tsconfig.json +24 -0
@@ -0,0 +1,274 @@
1
+ import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
2
+ export async function generateNextJSFrontend(projectPath, config) {
3
+ const srcPath = `${projectPath}/src`;
4
+ await createDirectory(srcPath);
5
+ await createDirectory(`${srcPath}/app`);
6
+ await createDirectory(`${srcPath}/components`);
7
+ await generatePage(srcPath, config);
8
+ await generateLayout(srcPath, config);
9
+ await generateComponent(srcPath, config);
10
+ await generateNextConfig(projectPath, config);
11
+ await generateTsConfig(projectPath, config);
12
+ await generateGitIgnore(projectPath);
13
+ if (config.frontend.cssFramework === "tailwind") {
14
+ await generateTailwindConfig(projectPath, config);
15
+ await generatePostCSSConfig(projectPath, config);
16
+ await generateGlobalStyles(srcPath, config);
17
+ }
18
+ if (config.frontend.uiComponents === "shadcn") {
19
+ await generateShadcnUtils(srcPath, config);
20
+ }
21
+ if (config.frontend.testing !== "none") {
22
+ await generateVitestConfig(projectPath, config);
23
+ if (config.frontend.testing === "playwright" || config.frontend.testing === "both") {
24
+ await generatePlaywrightConfig(projectPath, config);
25
+ }
26
+ }
27
+ if (config.frontend.eslint) {
28
+ await generateEslintConfig(projectPath, config);
29
+ }
30
+ if (config.frontend.prettier) {
31
+ await generatePrettierConfig(projectPath, config);
32
+ }
33
+ logSuccess(`Next.js frontend generated`);
34
+ }
35
+ async function generatePage(srcPath, config) {
36
+ const content = `${config.frontend.typescript ? "import Card from '@/components/Card';\n" : ""}export default function Home() {
37
+ return (
38
+ <main>
39
+ <h1>Welcome to ${config.projectName}</h1>
40
+ <p>This project was generated by Phos 🚀</p>
41
+ <Card title="Getting Started" description="Edit src/app/page.tsx to get started" />
42
+ </main>
43
+ );
44
+ }
45
+ `;
46
+ await writeFile(`${srcPath}/app/page.${config.frontend.typescript ? "tsx" : "jsx"}`, content);
47
+ }
48
+ async function generateLayout(srcPath, config) {
49
+ const content = `import './globals.css';
50
+
51
+ export const metadata = {
52
+ title: '${config.projectName}',
53
+ description: 'Generated by Phos',
54
+ };
55
+
56
+ export default function RootLayout({
57
+ children,
58
+ }: {
59
+ children: React.ReactNode;
60
+ }) {
61
+ return (
62
+ <html lang="en">
63
+ <body>{children}</body>
64
+ </html>
65
+ );
66
+ }
67
+ `;
68
+ await writeFile(`${srcPath}/app/layout.${config.frontend.typescript ? "tsx" : "jsx"}`, content);
69
+ }
70
+ async function generateComponent(srcPath, config) {
71
+ const type = config.frontend.typescript
72
+ ? `interface CardProps {
73
+ title: string;
74
+ description: string;
75
+ }
76
+
77
+ export default function Card({ title, description }: CardProps) {`
78
+ : `export default function Card({ title, description }) {`;
79
+ const content = `${type}
80
+ return (
81
+ <div className="card">
82
+ <h2>{title}</h2>
83
+ <p>{description}</p>
84
+ </div>
85
+ );
86
+ }
87
+ `;
88
+ await writeFile(`${srcPath}/components/Card.${config.frontend.typescript ? "tsx" : "jsx"}`, content);
89
+ }
90
+ async function generateNextConfig(projectPath, config) {
91
+ const content = `/** @type {import('next').NextConfig} */
92
+ const nextConfig = {};
93
+
94
+ export default nextConfig;
95
+ `;
96
+ await writeFile(`${projectPath}/next.config.${config.frontend.typescript ? "js" : "js"}`, content);
97
+ }
98
+ async function generateTsConfig(projectPath, config) {
99
+ if (!config.frontend.typescript)
100
+ return;
101
+ const content = JSON.stringify({
102
+ compilerOptions: {
103
+ target: "ES2017",
104
+ lib: ["dom", "dom.iterable", "esnext"],
105
+ allowJs: true,
106
+ skipLibCheck: true,
107
+ strict: true,
108
+ noEmit: true,
109
+ esModuleInterop: true,
110
+ module: "esnext",
111
+ moduleResolution: "bundler",
112
+ resolveJsonModule: true,
113
+ isolatedModules: true,
114
+ jsx: "preserve",
115
+ incremental: true,
116
+ plugins: [{ name: "next" }],
117
+ paths: {
118
+ "@/*": ["./src/*"],
119
+ },
120
+ },
121
+ include: ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
122
+ exclude: ["node_modules"],
123
+ }, null, 2);
124
+ await writeFile(`${projectPath}/tsconfig.json`, content);
125
+ }
126
+ async function generateTailwindConfig(projectPath, config) {
127
+ const content = `/** @type {import('tailwindcss').Config} */
128
+ module.exports = {
129
+ content: [
130
+ './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
131
+ './src/components/**/*.{js,ts,jsx,tsx,mdx}',
132
+ './src/app/**/*.{js,ts,jsx,tsx,mdx}',
133
+ ],
134
+ theme: {
135
+ extend: {},
136
+ },
137
+ plugins: [],
138
+ };
139
+ `;
140
+ await writeFile(`${projectPath}/tailwind.config.js`, content);
141
+ }
142
+ async function generatePostCSSConfig(projectPath, config) {
143
+ const content = `module.exports = {
144
+ plugins: {
145
+ tailwindcss: {},
146
+ autoprefixer: {},
147
+ },
148
+ };
149
+ `;
150
+ await writeFile(`${projectPath}/postcss.config.js`, content);
151
+ }
152
+ async function generateGlobalStyles(srcPath, config) {
153
+ const content = `@tailwind base;
154
+ @tailwind components;
155
+ @tailwind utilities;
156
+
157
+ * {
158
+ box-sizing: border-box;
159
+ }
160
+ body {
161
+ font-family: system-ui, -apple-system, sans-serif;
162
+ line-height: 1.5;
163
+ }
164
+
165
+ main {
166
+ padding: 2rem;
167
+ max-width: 800px;
168
+ margin: 0 auto;
169
+ }
170
+
171
+ h1 {
172
+ font-size: 2.5rem;
173
+ margin-bottom: 1rem;
174
+ }
175
+
176
+ .card {
177
+ border: 1px solid #ccc;
178
+ border-radius: 8px;
179
+ padding: 1.5rem;
180
+ margin-top: 2rem;
181
+ background: white;
182
+ }
183
+ `;
184
+ await writeFile(`${srcPath}/app/globals.css`, content);
185
+ }
186
+ async function generateShadcnUtils(srcPath, config) {
187
+ await createDirectory(`${srcPath}/lib`);
188
+ const content = `import { type ClassValue, clsx } from "clsx"
189
+ import { twMerge } from "tailwind-merge"
190
+
191
+ export function cn(...inputs: ClassValue[]) {
192
+ return twMerge(clsx(inputs))
193
+ }
194
+ `;
195
+ await writeFile(`${srcPath}/lib/utils.${config.frontend.typescript ? "ts" : "js"}`, content);
196
+ }
197
+ async function generateVitestConfig(projectPath, config) {
198
+ const content = `import { defineConfig } from 'vitest/config';
199
+ import react from '@vitejs/plugin-react';
200
+
201
+ export default defineConfig({
202
+ plugins: [react()],
203
+ test: {
204
+ include: ['src/**/*.{test,spec}.{js,jsx,ts,tsx}'],
205
+ environment: 'jsdom',
206
+ },
207
+ });
208
+ `;
209
+ await writeFile(`${projectPath}/vitest.config.ts`, content);
210
+ }
211
+ async function generatePlaywrightConfig(projectPath, config) {
212
+ const content = `import { defineConfig, devices } from '@playwright/test';
213
+
214
+ export default defineConfig({
215
+ testDir: './e2e',
216
+ fullyParallel: true,
217
+ forbidOnly: !!process.env.CI,
218
+ retries: process.env.CI ? 2 : 0,
219
+ workers: process.env.CI ? 1 : undefined,
220
+ reporter: 'html',
221
+ use: {
222
+ baseURL: 'http://localhost:3000',
223
+ trace: 'on-first-retry',
224
+ },
225
+ projects: [
226
+ {
227
+ name: 'chromium',
228
+ use: { ...devices['Desktop Chrome'] },
229
+ },
230
+ ],
231
+ webServer: {
232
+ command: 'npm run dev',
233
+ url: 'http://localhost:3000',
234
+ reuseExistingServer: !process.env.CI,
235
+ },
236
+ });
237
+ `;
238
+ await writeFile(`${projectPath}/playwright.config.ts`, content);
239
+ }
240
+ async function generateEslintConfig(projectPath, config) {
241
+ if (!config.frontend.eslint)
242
+ return;
243
+ const content = `module.exports = {
244
+ root: true,
245
+ extends: ['next/core-web-vitals', 'prettier'],
246
+ rules: {
247
+ '@typescript-eslint/no-unused-vars': 'warn',
248
+ },
249
+ };
250
+ `;
251
+ await writeFile(`${projectPath}/.eslintrc.json`, content);
252
+ }
253
+ async function generatePrettierConfig(projectPath, config) {
254
+ if (!config.frontend.prettier)
255
+ return;
256
+ const content = JSON.stringify({
257
+ semi: false,
258
+ singleQuote: true,
259
+ tabWidth: 2,
260
+ trailingComma: "es5",
261
+ printWidth: 80,
262
+ }, null, 2);
263
+ await writeFile(`${projectPath}/.prettierrc`, content);
264
+ }
265
+ async function generateGitIgnore(projectPath) {
266
+ const content = `node_modules/
267
+ .next/
268
+ .vercel/
269
+ .env
270
+ *.log
271
+ `;
272
+ await writeFile(`${projectPath}/.gitignore`, content);
273
+ }
274
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../../src/generators/frontends/nextjs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type GeneratorConfig } from "@/utils/helpers.js";
2
+ export declare function generateSvelteFrontend(projectPath: string, config: GeneratorConfig): Promise<void>;
3
+ //# sourceMappingURL=svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.d.ts","sourceRoot":"","sources":["../../../src/generators/frontends/svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElG,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,324 @@
1
+ import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
2
+ export async function generateSvelteFrontend(projectPath, config) {
3
+ const srcPath = `${projectPath}/src`;
4
+ await createDirectory(srcPath);
5
+ await createDirectory(`${srcPath}/routes`);
6
+ await createDirectory(`${srcPath}/lib`);
7
+ await generateAppHtml(projectPath, config);
8
+ await generateIndexPage(srcPath, config);
9
+ await generateLayout(srcPath, config);
10
+ await generateComponent(srcPath, config);
11
+ await generateSvelteConfig(projectPath, config);
12
+ await generateViteConfig(projectPath, config);
13
+ await generateTsConfig(projectPath, config);
14
+ await generateGitIgnore(projectPath);
15
+ if (config.frontend.cssFramework === "tailwind") {
16
+ await generateTailwindConfig(projectPath, config);
17
+ await generatePostCSSConfig(projectPath, config);
18
+ await generateGlobalStyles(srcPath, config);
19
+ }
20
+ if (config.frontend.uiComponents === "shadcn") {
21
+ await generateShadcnUtils(srcPath, config);
22
+ }
23
+ if (config.frontend.testing !== "none") {
24
+ await generateVitestConfig(projectPath, config);
25
+ if (config.frontend.testing === "playwright" || config.frontend.testing === "both") {
26
+ await generatePlaywrightConfig(projectPath, config);
27
+ }
28
+ }
29
+ if (config.frontend.eslint) {
30
+ await generateEslintConfig(projectPath, config);
31
+ }
32
+ if (config.frontend.prettier) {
33
+ await generatePrettierConfig(projectPath, config);
34
+ }
35
+ logSuccess(`Svelte frontend generated`);
36
+ }
37
+ async function generateAppHtml(projectPath, config) {
38
+ const content = `<!doctype html>
39
+ <html lang="en">
40
+ <head>
41
+ <meta charset="utf-8" />
42
+ <link rel="icon" href="%sveltekit.assets%/favicon.png" />
43
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
44
+ %sveltekit.head%
45
+ </head>
46
+ <body data-sveltekit-preload-data="hover">
47
+ <div style="display: contents">%sveltekit.body%</div>
48
+ </body>
49
+ </html>
50
+ `;
51
+ await writeFile(`${projectPath}/src/app.html`, content);
52
+ }
53
+ async function generateIndexPage(srcPath, config) {
54
+ const content = `<script>
55
+ import Card from '$lib/components/Card.svelte';
56
+ </script>
57
+
58
+ <svelte:head>
59
+ <title>Welcome to ${config.projectName}</title>
60
+ </svelte:head>
61
+
62
+ <main>
63
+ <h1>Welcome to ${config.projectName}</h1>
64
+ <p>This project was generated by Phos 🚀</p>
65
+ <Card title="Getting Started" description="Edit src/routes/+page.svelte to get started" />
66
+ </main>
67
+
68
+ <style>
69
+ main {
70
+ padding: 2rem;
71
+ max-width: 800px;
72
+ margin: 0 auto;
73
+ }
74
+ h1 {
75
+ font-size: 2.5rem;
76
+ margin-bottom: 1rem;
77
+ }
78
+ </style>
79
+ `;
80
+ await writeFile(`${srcPath}/routes/+page.svelte`, content);
81
+ }
82
+ async function generateLayout(srcPath, config) {
83
+ const content = `<script>
84
+ import '../app.css';
85
+ </script>
86
+
87
+ <slot />
88
+ `;
89
+ await writeFile(`${srcPath}/routes/+layout.svelte`, content);
90
+ }
91
+ async function generateComponent(srcPath, config) {
92
+ await createDirectory(`${srcPath}/lib/components`);
93
+ const content = `<script>
94
+ let { title, description } = $props();
95
+ </script>
96
+
97
+ <div class="card">
98
+ <h2>{title}</h2>
99
+ <p>{description}</p>
100
+ </div>
101
+
102
+ <style>
103
+ .card {
104
+ border: 1px solid #ccc;
105
+ border-radius: 8px;
106
+ padding: 1.5rem;
107
+ margin-top: 2rem;
108
+ background: white;
109
+ }
110
+ .card h2 {
111
+ margin-bottom: 0.5rem;
112
+ }
113
+ </style>
114
+ `;
115
+ await writeFile(`${srcPath}/lib/components/Card.svelte`, content);
116
+ }
117
+ async function generateSvelteConfig(projectPath, config) {
118
+ const content = `import adapter from '@sveltejs/adapter-auto';
119
+ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
120
+
121
+ /** @type {import('@sveltejs/kit').Config} */
122
+ const config = {
123
+ preprocess: vitePreprocess(),
124
+ kit: {
125
+ adapter: adapter(),
126
+ },
127
+ ${config.frontend.typescript ? "" : "// "}typescript: {
128
+ config(config) {
129
+ const { compilerOptions } = config;
130
+
131
+ compilerOptions.typescript = {
132
+ ...(compilerOptions.typescript ?? {}),
133
+ strict: true,
134
+ };
135
+
136
+ return config;
137
+ }
138
+ ${config.frontend.typescript ? "" : "}"}
139
+ };
140
+
141
+ export default config;
142
+ `;
143
+ await writeFile(`${projectPath}/svelte.config.js`, content);
144
+ }
145
+ async function generateViteConfig(projectPath, config) {
146
+ const content = `import { sveltekit } from '@sveltejs/kit/vite';
147
+ import { defineConfig } from 'vite';
148
+
149
+ export default defineConfig({
150
+ plugins: [sveltekit()],
151
+ ${config.frontend.testing === "vitest" || config.frontend.testing === "both" ? 'test: {\n globals: true,\n environment: "jsdom",\n },\n' : ""}
152
+ });
153
+ `;
154
+ await writeFile(`${projectPath}/vite.config.js`, content);
155
+ }
156
+ async function generateTsConfig(projectPath, config) {
157
+ if (!config.frontend.typescript)
158
+ return;
159
+ const content = JSON.stringify({
160
+ extends: "./.svelte-kit/tsconfig.json",
161
+ compilerOptions: {
162
+ allowJs: true,
163
+ checkJs: true,
164
+ esModuleInterop: true,
165
+ forceConsistentCasingInFileNames: true,
166
+ resolveJsonModule: true,
167
+ skipLibCheck: true,
168
+ sourceMap: true,
169
+ strict: true,
170
+ },
171
+ }, null, 2);
172
+ await writeFile(`${projectPath}/tsconfig.json`, content);
173
+ }
174
+ async function generateTailwindConfig(projectPath, config) {
175
+ const content = `/** @type {import('tailwindcss').Config} */
176
+ export default {
177
+ content: ['./src/**/*.{html,js,svelte,ts}'],
178
+ theme: {
179
+ extend: {},
180
+ },
181
+ plugins: [],
182
+ };
183
+ `;
184
+ await writeFile(`${projectPath}/tailwind.config.js`, content);
185
+ }
186
+ async function generatePostCSSConfig(projectPath, config) {
187
+ const content = `export default {
188
+ plugins: {
189
+ tailwindcss: {},
190
+ autoprefixer: {},
191
+ },
192
+ };
193
+ `;
194
+ await writeFile(`${projectPath}/postcss.config.cjs`, content);
195
+ }
196
+ async function generateGlobalStyles(srcPath, config) {
197
+ const content = `@tailwind base;
198
+ @tailwind components;
199
+ @tailwind utilities;
200
+
201
+ * {
202
+ box-sizing: border-box;
203
+ }
204
+ body {
205
+ font-family: system-ui, -apple-system, sans-serif;
206
+ line-height: 1.5;
207
+ }
208
+ `;
209
+ await writeFile(`${srcPath}/app.css`, content);
210
+ }
211
+ async function generateShadcnUtils(srcPath, config) {
212
+ const content = `import { type ClassValue, clsx } from "clsx"
213
+ import { twMerge } from "tailwind-merge"
214
+
215
+ export function cn(...inputs: ClassValue[]) {
216
+ return twMerge(clsx(inputs))
217
+ }
218
+ `;
219
+ await writeFile(`${srcPath}/lib/utils.ts`, content);
220
+ }
221
+ async function generateVitestConfig(projectPath, config) {
222
+ const content = `import { defineConfig } from 'vitest/config';
223
+ import { svelte } from '@sveltejs/vite-plugin-svelte';
224
+
225
+ export default defineConfig({
226
+ plugins: [svelte({ hot: !process.env.VITEST })],
227
+ test: {
228
+ include: ['src/**/*.{test,spec}.{js,ts}'],
229
+ environment: 'jsdom',
230
+ },
231
+ });
232
+ `;
233
+ await writeFile(`${projectPath}/vitest.config.js`, content);
234
+ }
235
+ async function generatePlaywrightConfig(projectPath, config) {
236
+ const content = `import { defineConfig, devices } from '@playwright/test';
237
+
238
+ export default defineConfig({
239
+ testDir: './tests/e2e',
240
+ fullyParallel: true,
241
+ forbidOnly: !!process.env.CI,
242
+ retries: process.env.CI ? 2 : 0,
243
+ workers: process.env.CI ? 1 : undefined,
244
+ reporter: 'html',
245
+ use: {
246
+ baseURL: 'http://localhost:4173',
247
+ trace: 'on-first-retry',
248
+ },
249
+ projects: [
250
+ {
251
+ name: 'chromium',
252
+ use: { ...devices['Desktop Chrome'] },
253
+ },
254
+ ],
255
+ webServer: {
256
+ command: 'npm run preview',
257
+ url: 'http://localhost:4173',
258
+ reuseExistingServer: !process.env.CI,
259
+ },
260
+ });
261
+ `;
262
+ await writeFile(`${projectPath}/playwright.config.ts`, content);
263
+ }
264
+ async function generateEslintConfig(projectPath, config) {
265
+ if (!config.frontend.eslint)
266
+ return;
267
+ const content = `export default {
268
+ root: true,
269
+ extends: ['eslint:recommended'],
270
+ parserOptions: {
271
+ sourceType: 'module',
272
+ ecmaVersion: 2020,
273
+ extraFileExtensions: ['.svelte'],
274
+ },
275
+ env: {
276
+ browser: true,
277
+ es2017: true,
278
+ node: true,
279
+ },
280
+ overrides: [
281
+ {
282
+ files: ['*.svelte'],
283
+ parser: 'svelte-eslint-parser',
284
+ parserOptions: {
285
+ parser: '@typescript-eslint/parser',
286
+ },
287
+ },
288
+ ],
289
+ };
290
+ `;
291
+ await writeFile(`${projectPath}/.eslintrc.cjs`, content);
292
+ }
293
+ async function generatePrettierConfig(projectPath, config) {
294
+ if (!config.frontend.prettier)
295
+ return;
296
+ const content = JSON.stringify({
297
+ semi: false,
298
+ singleQuote: true,
299
+ tabWidth: 2,
300
+ trailingComma: "es5",
301
+ printWidth: 80,
302
+ plugins: ["prettier-plugin-svelte"],
303
+ overrides: [
304
+ {
305
+ files: "*.svelte",
306
+ options: {
307
+ parser: "svelte",
308
+ },
309
+ },
310
+ ],
311
+ }, null, 2);
312
+ await writeFile(`${projectPath}/.prettierrc`, content);
313
+ }
314
+ async function generateGitIgnore(projectPath) {
315
+ const content = `node_modules/
316
+ .DS_Store
317
+ dist/
318
+ .svelte-kit/
319
+ .vercel/
320
+ .env
321
+ `;
322
+ await writeFile(`${projectPath}/.gitignore`, content);
323
+ }
324
+ //# sourceMappingURL=svelte.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.js","sourceRoot":"","sources":["../../../src/generators/frontends/svelte.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type GeneratorConfig } from '@/utils/helpers.js';
2
+ export declare function generateMonorepo(config: GeneratorConfig): Promise<void>;
3
+ //# sourceMappingURL=monorepo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../../src/generators/monorepo.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAO5B,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwE7E"}