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.
- package/.eslintignore +3 -0
- package/AGENTS.md +172 -0
- package/CHANGELOG.md +184 -0
- package/LICENSE +21 -0
- package/README.md +279 -0
- package/bun.lock +125 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +255 -0
- package/dist/cli.js.map +1 -0
- package/dist/generators/backends/elysia.d.ts +3 -0
- package/dist/generators/backends/elysia.d.ts.map +1 -0
- package/dist/generators/backends/elysia.js +135 -0
- package/dist/generators/backends/elysia.js.map +1 -0
- package/dist/generators/backends/fastapi.d.ts +3 -0
- package/dist/generators/backends/fastapi.d.ts.map +1 -0
- package/dist/generators/backends/fastapi.js +158 -0
- package/dist/generators/backends/fastapi.js.map +1 -0
- package/dist/generators/frontends/astro.d.ts +3 -0
- package/dist/generators/frontends/astro.d.ts.map +1 -0
- package/dist/generators/frontends/astro.js +303 -0
- package/dist/generators/frontends/astro.js.map +1 -0
- package/dist/generators/frontends/nextjs.d.ts +3 -0
- package/dist/generators/frontends/nextjs.d.ts.map +1 -0
- package/dist/generators/frontends/nextjs.js +274 -0
- package/dist/generators/frontends/nextjs.js.map +1 -0
- package/dist/generators/frontends/svelte.d.ts +3 -0
- package/dist/generators/frontends/svelte.d.ts.map +1 -0
- package/dist/generators/frontends/svelte.js +324 -0
- package/dist/generators/frontends/svelte.js.map +1 -0
- package/dist/generators/monorepo.d.ts +3 -0
- package/dist/generators/monorepo.d.ts.map +1 -0
- package/dist/generators/monorepo.js +320 -0
- package/dist/generators/monorepo.js.map +1 -0
- package/dist/generators/single.d.ts +3 -0
- package/dist/generators/single.d.ts.map +1 -0
- package/dist/generators/single.js +229 -0
- package/dist/generators/single.js.map +1 -0
- package/dist/utils/helpers.d.ts +38 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +109 -0
- package/dist/utils/helpers.js.map +1 -0
- package/package.json +46 -0
- package/src/cli.ts +500 -0
- package/src/generators/backends/elysia.ts +45 -0
- package/src/generators/backends/fastapi.ts +71 -0
- package/src/generators/frontends/astro.ts +37 -0
- package/src/generators/frontends/nextjs.ts +37 -0
- package/src/generators/frontends/svelte.ts +38 -0
- package/src/generators/monorepo.ts +529 -0
- package/src/generators/single.ts +465 -0
- package/src/templates/backend/elysia/README.md +15 -0
- package/src/templates/backend/elysia/package.json +26 -0
- package/src/templates/backend/elysia/src/api/user_api.ts +0 -0
- package/src/templates/backend/elysia/src/db.ts +17 -0
- package/src/templates/backend/elysia/src/index.ts +68 -0
- package/src/templates/backend/elysia/src/service/user_service.ts +0 -0
- package/src/templates/backend/elysia/src/sql/user_sql.ts +0 -0
- package/src/templates/backend/elysia/src/types/user_type.ts +0 -0
- package/src/templates/backend/elysia/tsconfig.json +103 -0
- package/src/templates/backend/fastapi/.pylintrc +2 -0
- package/src/templates/backend/fastapi/README.md +33 -0
- package/src/templates/backend/fastapi/pyproject.toml +9 -0
- package/src/templates/backend/fastapi/pyproject_prettier.toml +20 -0
- package/src/templates/backend/fastapi/requirements.txt +15 -0
- package/src/templates/backend/fastapi/setup.sh +23 -0
- package/src/templates/backend/fastapi/src/api/user_api.py +0 -0
- package/src/templates/backend/fastapi/src/db.py +31 -0
- package/src/templates/backend/fastapi/src/main.py +53 -0
- package/src/templates/backend/fastapi/src/service/user_service.py +0 -0
- package/src/templates/backend/fastapi/src/sql/user_sql.py +0 -0
- package/src/templates/backend/fastapi/src/types/user_type.py +0 -0
- package/src/templates/frontend/astro/README.md +46 -0
- package/src/templates/frontend/astro/astro.config.mjs +5 -0
- package/src/templates/frontend/astro/package.json +28 -0
- package/src/templates/frontend/astro/public/favicon.ico +0 -0
- package/src/templates/frontend/astro/public/favicon.svg +9 -0
- package/src/templates/frontend/astro/src/assets/astro.svg +1 -0
- package/src/templates/frontend/astro/src/assets/background.svg +1 -0
- package/src/templates/frontend/astro/src/components/Welcome.astro +5 -0
- package/src/templates/frontend/astro/src/layouts/Layout.astro +23 -0
- package/src/templates/frontend/astro/src/pages/index.astro +8 -0
- package/src/templates/frontend/astro/tsconfig.json +5 -0
- package/src/templates/frontend/nextjs/README.md +36 -0
- package/src/templates/frontend/nextjs/app/favicon.ico +0 -0
- package/src/templates/frontend/nextjs/app/globals.css +26 -0
- package/src/templates/frontend/nextjs/app/layout.tsx +34 -0
- package/src/templates/frontend/nextjs/app/page.tsx +16 -0
- package/src/templates/frontend/nextjs/eslint.config.mjs +18 -0
- package/src/templates/frontend/nextjs/next.config.ts +7 -0
- package/src/templates/frontend/nextjs/package.json +28 -0
- package/src/templates/frontend/nextjs/postcss.config.mjs +7 -0
- package/src/templates/frontend/nextjs/public/file.svg +1 -0
- package/src/templates/frontend/nextjs/public/globe.svg +1 -0
- package/src/templates/frontend/nextjs/public/next.svg +1 -0
- package/src/templates/frontend/nextjs/public/vercel.svg +1 -0
- package/src/templates/frontend/nextjs/public/window.svg +1 -0
- package/src/templates/frontend/nextjs/tsconfig.json +34 -0
- package/src/templates/frontend/svelte/.prettierignore +9 -0
- package/src/templates/frontend/svelte/.prettierrc +19 -0
- package/src/templates/frontend/svelte/README.md +42 -0
- package/src/templates/frontend/svelte/eslint.config.js +39 -0
- package/src/templates/frontend/svelte/package.json +39 -0
- package/src/templates/frontend/svelte/src/app.d.ts +13 -0
- package/src/templates/frontend/svelte/src/app.html +11 -0
- package/src/templates/frontend/svelte/src/lib/assets/favicon.svg +1 -0
- package/src/templates/frontend/svelte/src/lib/index.ts +1 -0
- package/src/templates/frontend/svelte/src/routes/+layout.svelte +9 -0
- package/src/templates/frontend/svelte/src/routes/+page.svelte +2 -0
- package/src/templates/frontend/svelte/src/routes/layout.css +2 -0
- package/src/templates/frontend/svelte/static/robots.txt +3 -0
- package/src/templates/frontend/svelte/svelte.config.js +13 -0
- package/src/templates/frontend/svelte/tsconfig.json +20 -0
- package/src/templates/frontend/svelte/vite.config.ts +5 -0
- package/src/utils/helpers.ts +198 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
|
|
2
|
+
export async function generateFastAPIBackend(projectPath, config) {
|
|
3
|
+
const srcPath = `${projectPath}/src`;
|
|
4
|
+
await createDirectory(srcPath);
|
|
5
|
+
await generateIndexFile(srcPath, config);
|
|
6
|
+
await generateRequirementsTxt(projectPath, config);
|
|
7
|
+
await generatePyProject(projectPath, config);
|
|
8
|
+
await generateReadme(projectPath, config);
|
|
9
|
+
if (config.backend.eslint) {
|
|
10
|
+
await generatePylintrc(projectPath);
|
|
11
|
+
}
|
|
12
|
+
if (config.backend.prettier) {
|
|
13
|
+
await generatePyprojectToml(projectPath, config);
|
|
14
|
+
}
|
|
15
|
+
logSuccess(`FastAPI backend generated`);
|
|
16
|
+
}
|
|
17
|
+
async function generateIndexFile(srcPath, config) {
|
|
18
|
+
const content = `from fastapi import FastAPI
|
|
19
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
20
|
+
from datetime import datetime
|
|
21
|
+
|
|
22
|
+
app = FastAPI(
|
|
23
|
+
title="${config.projectType === "monorepo" ? "Backend API" : config.projectName}",
|
|
24
|
+
description="Generated by Phos",
|
|
25
|
+
version="0.1.0"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
app.add_middleware(
|
|
29
|
+
CORSMiddleware,
|
|
30
|
+
allow_origins=["*"],
|
|
31
|
+
allow_credentials=True,
|
|
32
|
+
allow_methods=["*"],
|
|
33
|
+
allow_headers=["*"],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
@app.get("/")
|
|
37
|
+
async def root():
|
|
38
|
+
return {"message": "Hello from Phos! 🚀"}
|
|
39
|
+
|
|
40
|
+
@app.get("/api/hello")
|
|
41
|
+
async def hello():
|
|
42
|
+
return {
|
|
43
|
+
"message": "Hello from API!",
|
|
44
|
+
"timestamp": datetime.now().isoformat()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
import uvicorn
|
|
49
|
+
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
50
|
+
`;
|
|
51
|
+
await writeFile(`${srcPath}/main.py`, content);
|
|
52
|
+
}
|
|
53
|
+
async function generateRequirementsTxt(projectPath, config) {
|
|
54
|
+
const requirements = [
|
|
55
|
+
"fastapi>=0.104.0",
|
|
56
|
+
"uvicorn[standard]>=0.24.0",
|
|
57
|
+
"pydantic>=2.0.0",
|
|
58
|
+
"python-multipart>=0.0.6",
|
|
59
|
+
];
|
|
60
|
+
if (config.backend.eslint) {
|
|
61
|
+
requirements.push("pylint>=3.0.0");
|
|
62
|
+
}
|
|
63
|
+
if (config.backend.prettier) {
|
|
64
|
+
requirements.push("black>=23.0.0");
|
|
65
|
+
}
|
|
66
|
+
await writeFile(`${projectPath}/requirements.txt`, requirements.join("\n"));
|
|
67
|
+
}
|
|
68
|
+
async function generatePyProject(projectPath, config) {
|
|
69
|
+
const content = `[build-system]
|
|
70
|
+
requires = ["hatchling"]
|
|
71
|
+
build-backend = "hatchling.build"
|
|
72
|
+
|
|
73
|
+
[project]
|
|
74
|
+
name = "${config.projectType === "monorepo" ? "backend" : config.projectName}"
|
|
75
|
+
version = "0.1.0"
|
|
76
|
+
description = "Generated by Phos"
|
|
77
|
+
requires-python = ">=3.10"
|
|
78
|
+
dependencies = [
|
|
79
|
+
"fastapi>=0.104.0",
|
|
80
|
+
"uvicorn[standard]>=0.24.0",
|
|
81
|
+
"pydantic>=2.0.0",
|
|
82
|
+
"python-multipart>=0.0.6",
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
[tool.hatch.build.targets.wheel]
|
|
86
|
+
packages = ["src"]
|
|
87
|
+
`;
|
|
88
|
+
await writeFile(`${projectPath}/pyproject.toml`, content);
|
|
89
|
+
}
|
|
90
|
+
async function generateReadme(projectPath, config) {
|
|
91
|
+
const content = `# FastAPI Backend
|
|
92
|
+
|
|
93
|
+
Generated by [Phos](https://github.com/yourusername/phos).
|
|
94
|
+
|
|
95
|
+
## Getting Started
|
|
96
|
+
|
|
97
|
+
\`\`\`bash
|
|
98
|
+
# Install dependencies
|
|
99
|
+
pip install -r requirements.txt
|
|
100
|
+
|
|
101
|
+
# Run development server
|
|
102
|
+
uvicorn src.main:app --reload --port 8000
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
## API Documentation
|
|
106
|
+
|
|
107
|
+
Once the server is running, visit:
|
|
108
|
+
- Swagger UI: http://localhost:8000/docs
|
|
109
|
+
- ReDoc: http://localhost:8000/redoc
|
|
110
|
+
|
|
111
|
+
## Available Scripts
|
|
112
|
+
|
|
113
|
+
- \`uvicorn src.main:app --reload\` - Start development server
|
|
114
|
+
- \`uvicorn src.main:app\` - Start production server
|
|
115
|
+
${config.backend.eslint ? "- \`pylint src\` - Run linter\n" : ""}${config.backend.prettier ? "- \`black src\` - Format code\n" : ""}
|
|
116
|
+
|
|
117
|
+
## Tech Stack
|
|
118
|
+
|
|
119
|
+
- Framework: FastAPI
|
|
120
|
+
- Python: 3.10+
|
|
121
|
+
- ESLint: ${config.backend.eslint ? "Yes" : "No"}
|
|
122
|
+
- Prettier (Black): ${config.backend.prettier ? "Yes" : "No"}
|
|
123
|
+
`;
|
|
124
|
+
await writeFile(`${projectPath}/README.md`, content);
|
|
125
|
+
}
|
|
126
|
+
async function generatePylintrc(projectPath) {
|
|
127
|
+
const content = `[MASTER]
|
|
128
|
+
disable=C0114,C0115,C0116,W0611
|
|
129
|
+
`;
|
|
130
|
+
await writeFile(`${projectPath}/.pylintrc`, content);
|
|
131
|
+
}
|
|
132
|
+
async function generatePyprojectToml(projectPath, config) {
|
|
133
|
+
if (!config.backend.prettier)
|
|
134
|
+
return;
|
|
135
|
+
const content = `[tool.black]
|
|
136
|
+
line-length = 88
|
|
137
|
+
target-version = ['py310']
|
|
138
|
+
include = '\\.pyi?$'
|
|
139
|
+
extend-exclude = '''
|
|
140
|
+
/(
|
|
141
|
+
# directories
|
|
142
|
+
\\.eggs
|
|
143
|
+
| \\.git
|
|
144
|
+
| \\.hg
|
|
145
|
+
| \\.mypy_cache
|
|
146
|
+
| \\.tox
|
|
147
|
+
| \\.venv
|
|
148
|
+
| build
|
|
149
|
+
| dist
|
|
150
|
+
)/
|
|
151
|
+
'''
|
|
152
|
+
|
|
153
|
+
[tool.isort]
|
|
154
|
+
profile = "black"
|
|
155
|
+
`;
|
|
156
|
+
await writeFile(`${projectPath}/pyproject.toml`, content);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=fastapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastapi.js","sourceRoot":"","sources":["../../../src/generators/backends/fastapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../../../src/generators/frontends/astro.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAElG,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
|
|
2
|
+
export async function generateAstroFrontend(projectPath, config) {
|
|
3
|
+
const srcPath = `${projectPath}/src`;
|
|
4
|
+
await createDirectory(srcPath);
|
|
5
|
+
await createDirectory(`${srcPath}/pages`);
|
|
6
|
+
await createDirectory(`${srcPath}/components`);
|
|
7
|
+
await createDirectory(`${srcPath}/layouts`);
|
|
8
|
+
await generateIndexPage(srcPath, config);
|
|
9
|
+
await generateLayout(srcPath, config);
|
|
10
|
+
await generateComponent(srcPath, config);
|
|
11
|
+
await generateAstroConfig(projectPath, config);
|
|
12
|
+
await generateTsConfig(projectPath, config);
|
|
13
|
+
await generateViteConfig(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(`Astro frontend generated`);
|
|
36
|
+
}
|
|
37
|
+
async function generateIndexPage(srcPath, config) {
|
|
38
|
+
const content = `---
|
|
39
|
+
import Layout from '../layouts/Layout.astro';
|
|
40
|
+
import Card from '../components/Card.astro';
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
<Layout title="Welcome to ${config.projectName}">
|
|
44
|
+
<main>
|
|
45
|
+
<h1>Welcome to ${config.projectName}</h1>
|
|
46
|
+
<p>This project was generated by Phos 🚀</p>
|
|
47
|
+
<Card title="Getting Started" description="Edit src/pages/index.astro to get started" />
|
|
48
|
+
</main>
|
|
49
|
+
</Layout>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
main {
|
|
53
|
+
padding: 2rem;
|
|
54
|
+
max-width: 800px;
|
|
55
|
+
margin: 0 auto;
|
|
56
|
+
}
|
|
57
|
+
h1 {
|
|
58
|
+
font-size: 2.5rem;
|
|
59
|
+
margin-bottom: 1rem;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
62
|
+
`;
|
|
63
|
+
await writeFile(`${srcPath}/pages/index.astro`, content);
|
|
64
|
+
}
|
|
65
|
+
async function generateLayout(srcPath, config) {
|
|
66
|
+
const content = `---
|
|
67
|
+
interface Props {
|
|
68
|
+
title: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const { title } = Astro.props;
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
<html lang="en">
|
|
75
|
+
<head>
|
|
76
|
+
<meta charset="utf-8" />
|
|
77
|
+
<meta name="viewport" content="width=device-width" />
|
|
78
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
79
|
+
<meta name="generator" content={Astro.generator} />
|
|
80
|
+
<title>{title}</title>
|
|
81
|
+
</head>
|
|
82
|
+
<body>
|
|
83
|
+
<slot />
|
|
84
|
+
</body>
|
|
85
|
+
</html>
|
|
86
|
+
|
|
87
|
+
<style is:global>
|
|
88
|
+
* {
|
|
89
|
+
box-sizing: border-box;
|
|
90
|
+
margin: 0;
|
|
91
|
+
padding: 0;
|
|
92
|
+
}
|
|
93
|
+
body {
|
|
94
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
95
|
+
line-height: 1.5;
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
`;
|
|
99
|
+
await writeFile(`${srcPath}/layouts/Layout.astro`, content);
|
|
100
|
+
}
|
|
101
|
+
async function generateComponent(srcPath, config) {
|
|
102
|
+
const content = `---
|
|
103
|
+
interface Props {
|
|
104
|
+
title: string;
|
|
105
|
+
description: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const { title, description } = Astro.props;
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
<div class="card">
|
|
112
|
+
<h2>{title}</h2>
|
|
113
|
+
<p>{description}</p>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<style>
|
|
117
|
+
.card {
|
|
118
|
+
border: 1px solid #ccc;
|
|
119
|
+
border-radius: 8px;
|
|
120
|
+
padding: 1.5rem;
|
|
121
|
+
margin-top: 2rem;
|
|
122
|
+
background: white;
|
|
123
|
+
}
|
|
124
|
+
.card h2 {
|
|
125
|
+
margin-bottom: 0.5rem;
|
|
126
|
+
}
|
|
127
|
+
</style>
|
|
128
|
+
`;
|
|
129
|
+
await writeFile(`${srcPath}/components/Card.astro`, content);
|
|
130
|
+
}
|
|
131
|
+
async function generateAstroConfig(projectPath, config) {
|
|
132
|
+
const content = `import { defineConfig } from 'astro/config';
|
|
133
|
+
|
|
134
|
+
export default defineConfig({
|
|
135
|
+
${config.frontend.typescript ? "" : "// "}typescript: {
|
|
136
|
+
strict: true,
|
|
137
|
+
${config.frontend.typescript ? "" : "}"}
|
|
138
|
+
${config.frontend.cssFramework === "tailwind" ? "integrations: [tailwind()],\n " : ""}
|
|
139
|
+
${config.frontend.testing === "vitest" || config.frontend.testing === "both" ? 'vite: {\n test: {\n include: ["./src/**/*.{test,spec}.{js,jsx,ts,tsx}"],\n },\n },\n ' : ""}
|
|
140
|
+
});
|
|
141
|
+
`;
|
|
142
|
+
await writeFile(`${projectPath}/astro.config.mjs`, content);
|
|
143
|
+
}
|
|
144
|
+
async function generateTsConfig(projectPath, config) {
|
|
145
|
+
if (!config.frontend.typescript)
|
|
146
|
+
return;
|
|
147
|
+
const content = JSON.stringify({
|
|
148
|
+
extends: "astro/tsconfigs/strict",
|
|
149
|
+
compilerOptions: {
|
|
150
|
+
jsx: "react-jsx",
|
|
151
|
+
jsxImportSource: "react",
|
|
152
|
+
},
|
|
153
|
+
}, null, 2);
|
|
154
|
+
await writeFile(`${projectPath}/tsconfig.json`, content);
|
|
155
|
+
}
|
|
156
|
+
async function generateViteConfig(projectPath, config) {
|
|
157
|
+
const content = `import { defineConfig } from 'vite';
|
|
158
|
+
|
|
159
|
+
export default defineConfig({
|
|
160
|
+
${config.frontend.testing === "vitest" || config.frontend.testing === "both" ? 'test: {\n globals: true,\n environment: "jsdom",\n },\n' : ""}
|
|
161
|
+
});
|
|
162
|
+
`;
|
|
163
|
+
await writeFile(`${projectPath}/vite.config.ts`, content);
|
|
164
|
+
}
|
|
165
|
+
async function generateTailwindConfig(projectPath, config) {
|
|
166
|
+
const content = `/** @type {import('tailwindcss').Config} */
|
|
167
|
+
export default {
|
|
168
|
+
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
|
|
169
|
+
theme: {
|
|
170
|
+
extend: {},
|
|
171
|
+
},
|
|
172
|
+
plugins: [],
|
|
173
|
+
};
|
|
174
|
+
`;
|
|
175
|
+
await writeFile(`${projectPath}/tailwind.config.mjs`, content);
|
|
176
|
+
}
|
|
177
|
+
async function generatePostCSSConfig(projectPath, config) {
|
|
178
|
+
const content = `export default {
|
|
179
|
+
plugins: {
|
|
180
|
+
tailwindcss: {},
|
|
181
|
+
autoprefixer: {},
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
`;
|
|
185
|
+
await writeFile(`${projectPath}/postcss.config.cjs`, content);
|
|
186
|
+
}
|
|
187
|
+
async function generateGlobalStyles(srcPath, config) {
|
|
188
|
+
const content = `@tailwind base;
|
|
189
|
+
@tailwind components;
|
|
190
|
+
@tailwind utilities;
|
|
191
|
+
`;
|
|
192
|
+
await writeFile(`${srcPath}/styles/global.css`, content);
|
|
193
|
+
}
|
|
194
|
+
async function generateShadcnUtils(srcPath, config) {
|
|
195
|
+
await createDirectory(`${srcPath}/lib`);
|
|
196
|
+
const content = `import { type ClassValue, clsx } from "clsx"
|
|
197
|
+
import { twMerge } from "tailwind-merge"
|
|
198
|
+
|
|
199
|
+
export function cn(...inputs: ClassValue[]) {
|
|
200
|
+
return twMerge(clsx(inputs))
|
|
201
|
+
}
|
|
202
|
+
`;
|
|
203
|
+
await writeFile(`${srcPath}/lib/utils.ts`, content);
|
|
204
|
+
}
|
|
205
|
+
async function generateVitestConfig(projectPath, config) {
|
|
206
|
+
const content = `import { defineConfig } from 'vitest/config';
|
|
207
|
+
import astro from '@astrojs/vitest';
|
|
208
|
+
|
|
209
|
+
export default defineConfig({
|
|
210
|
+
plugins: [astro()],
|
|
211
|
+
test: {
|
|
212
|
+
include: ['src/**/*.{test,spec}.{js,jsx,ts,tsx}'],
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
`;
|
|
216
|
+
await writeFile(`${projectPath}/vitest.config.ts`, content);
|
|
217
|
+
}
|
|
218
|
+
async function generatePlaywrightConfig(projectPath, config) {
|
|
219
|
+
const content = `import { defineConfig, devices } from '@playwright/test';
|
|
220
|
+
|
|
221
|
+
export default defineConfig({
|
|
222
|
+
testDir: './e2e',
|
|
223
|
+
fullyParallel: true,
|
|
224
|
+
forbidOnly: !!process.env.CI,
|
|
225
|
+
retries: process.env.CI ? 2 : 0,
|
|
226
|
+
workers: process.env.CI ? 1 : undefined,
|
|
227
|
+
reporter: 'html',
|
|
228
|
+
use: {
|
|
229
|
+
baseURL: 'http://localhost:4321',
|
|
230
|
+
trace: 'on-first-retry',
|
|
231
|
+
},
|
|
232
|
+
projects: [
|
|
233
|
+
{
|
|
234
|
+
name: 'chromium',
|
|
235
|
+
use: { ...devices['Desktop Chrome'] },
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
webServer: {
|
|
239
|
+
command: 'npm run preview',
|
|
240
|
+
url: 'http://localhost:4321',
|
|
241
|
+
reuseExistingServer: !process.env.CI,
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
`;
|
|
245
|
+
await writeFile(`${projectPath}/playwright.config.ts`, content);
|
|
246
|
+
}
|
|
247
|
+
async function generateEslintConfig(projectPath, config) {
|
|
248
|
+
if (!config.frontend.eslint)
|
|
249
|
+
return;
|
|
250
|
+
const content = `import astroEslint from 'astro-eslint-parser';
|
|
251
|
+
import eslintPluginAstro from 'eslint-plugin-astro';
|
|
252
|
+
|
|
253
|
+
export default [
|
|
254
|
+
{
|
|
255
|
+
files: ['*.astro'],
|
|
256
|
+
languageOptions: {
|
|
257
|
+
parser: astroEslint,
|
|
258
|
+
parserOptions: {
|
|
259
|
+
parser: '@typescript-eslint/parser',
|
|
260
|
+
extraFileExtensions: ['.astro'],
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
rules: {
|
|
264
|
+
'astro/no-set-html-directive': 'error',
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
ignores: ['dist', 'node_modules', '.astro'],
|
|
269
|
+
},
|
|
270
|
+
];
|
|
271
|
+
`;
|
|
272
|
+
await writeFile(`${projectPath}/eslint.config.js`, content);
|
|
273
|
+
}
|
|
274
|
+
async function generatePrettierConfig(projectPath, config) {
|
|
275
|
+
if (!config.frontend.prettier)
|
|
276
|
+
return;
|
|
277
|
+
const content = JSON.stringify({
|
|
278
|
+
semi: false,
|
|
279
|
+
singleQuote: true,
|
|
280
|
+
tabWidth: 2,
|
|
281
|
+
trailingComma: "es5",
|
|
282
|
+
printWidth: 80,
|
|
283
|
+
plugins: ["prettier-plugin-astro"],
|
|
284
|
+
overrides: [
|
|
285
|
+
{
|
|
286
|
+
files: "*.astro",
|
|
287
|
+
options: {
|
|
288
|
+
parser: "astro",
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
}, null, 2);
|
|
293
|
+
await writeFile(`${projectPath}/.prettierrc`, content);
|
|
294
|
+
}
|
|
295
|
+
async function generateGitIgnore(projectPath) {
|
|
296
|
+
const content = `node_modules/
|
|
297
|
+
dist/
|
|
298
|
+
.astro/
|
|
299
|
+
.env
|
|
300
|
+
`;
|
|
301
|
+
await writeFile(`${projectPath}/.gitignore`, content);
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=astro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro.js","sourceRoot":"","sources":["../../../src/generators/frontends/astro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../../src/generators/frontends/nextjs.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,CAuCf"}
|