phos 1.0.0 → 1.0.1

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 (82) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +67 -42
  3. package/dist/cli.js +351 -171
  4. package/dist/cli.js.map +1 -1
  5. package/dist/generators/backends/elysia.d.ts +1 -1
  6. package/dist/generators/backends/elysia.d.ts.map +1 -1
  7. package/dist/generators/backends/elysia.js +22 -127
  8. package/dist/generators/backends/elysia.js.map +1 -1
  9. package/dist/generators/backends/fastapi.d.ts +1 -1
  10. package/dist/generators/backends/fastapi.d.ts.map +1 -1
  11. package/dist/generators/backends/fastapi.js +40 -148
  12. package/dist/generators/backends/fastapi.js.map +1 -1
  13. package/dist/generators/frontends/astro.d.ts +1 -1
  14. package/dist/generators/frontends/astro.d.ts.map +1 -1
  15. package/dist/generators/frontends/astro.js +17 -295
  16. package/dist/generators/frontends/astro.js.map +1 -1
  17. package/dist/generators/frontends/nextjs.d.ts +1 -1
  18. package/dist/generators/frontends/nextjs.d.ts.map +1 -1
  19. package/dist/generators/frontends/nextjs.js +17 -266
  20. package/dist/generators/frontends/nextjs.js.map +1 -1
  21. package/dist/generators/frontends/svelte.d.ts +1 -1
  22. package/dist/generators/frontends/svelte.d.ts.map +1 -1
  23. package/dist/generators/frontends/svelte.js +18 -316
  24. package/dist/generators/frontends/svelte.js.map +1 -1
  25. package/dist/generators/monorepo.d.ts +1 -1
  26. package/dist/generators/monorepo.d.ts.map +1 -1
  27. package/dist/generators/monorepo.js +369 -202
  28. package/dist/generators/monorepo.js.map +1 -1
  29. package/dist/generators/single.d.ts +1 -1
  30. package/dist/generators/single.d.ts.map +1 -1
  31. package/dist/generators/single.js +335 -134
  32. package/dist/generators/single.js.map +1 -1
  33. package/dist/templates/backend/elysia/src/api/user_api.d.ts +1 -0
  34. package/dist/templates/backend/elysia/src/api/user_api.d.ts.map +1 -0
  35. package/dist/templates/backend/elysia/src/api/user_api.js +2 -0
  36. package/dist/templates/backend/elysia/src/api/user_api.js.map +1 -0
  37. package/dist/templates/backend/elysia/src/db.d.ts +3 -0
  38. package/dist/templates/backend/elysia/src/db.d.ts.map +1 -0
  39. package/dist/templates/backend/elysia/src/db.js +13 -0
  40. package/dist/templates/backend/elysia/src/db.js.map +1 -0
  41. package/dist/templates/backend/elysia/src/index.d.ts +4 -0
  42. package/dist/templates/backend/elysia/src/index.d.ts.map +1 -0
  43. package/dist/templates/backend/elysia/src/index.js +55 -0
  44. package/dist/templates/backend/elysia/src/index.js.map +1 -0
  45. package/dist/templates/backend/elysia/src/service/user_service.d.ts +1 -0
  46. package/dist/templates/backend/elysia/src/service/user_service.d.ts.map +1 -0
  47. package/dist/templates/backend/elysia/src/service/user_service.js +2 -0
  48. package/dist/templates/backend/elysia/src/service/user_service.js.map +1 -0
  49. package/dist/templates/backend/elysia/src/sql/user_sql.d.ts +1 -0
  50. package/dist/templates/backend/elysia/src/sql/user_sql.d.ts.map +1 -0
  51. package/dist/templates/backend/elysia/src/sql/user_sql.js +2 -0
  52. package/dist/templates/backend/elysia/src/sql/user_sql.js.map +1 -0
  53. package/dist/templates/backend/elysia/src/types/user_type.d.ts +1 -0
  54. package/dist/templates/backend/elysia/src/types/user_type.d.ts.map +1 -0
  55. package/dist/templates/backend/elysia/src/types/user_type.js +2 -0
  56. package/dist/templates/backend/elysia/src/types/user_type.js.map +1 -0
  57. package/dist/templates/frontend/nextjs/app/layout.d.ts +7 -0
  58. package/dist/templates/frontend/nextjs/app/layout.d.ts.map +1 -0
  59. package/dist/templates/frontend/nextjs/app/layout.js +22 -0
  60. package/dist/templates/frontend/nextjs/app/layout.js.map +1 -0
  61. package/dist/templates/frontend/nextjs/app/page.d.ts +2 -0
  62. package/dist/templates/frontend/nextjs/app/page.d.ts.map +1 -0
  63. package/dist/templates/frontend/nextjs/app/page.js +15 -0
  64. package/dist/templates/frontend/nextjs/app/page.js.map +1 -0
  65. package/dist/templates/frontend/nextjs/next.config.d.ts +4 -0
  66. package/dist/templates/frontend/nextjs/next.config.d.ts.map +1 -0
  67. package/dist/templates/frontend/nextjs/next.config.js +5 -0
  68. package/dist/templates/frontend/nextjs/next.config.js.map +1 -0
  69. package/dist/templates/frontend/svelte/src/lib/index.d.ts +1 -0
  70. package/dist/templates/frontend/svelte/src/lib/index.d.ts.map +1 -0
  71. package/dist/templates/frontend/svelte/src/lib/index.js +3 -0
  72. package/dist/templates/frontend/svelte/src/lib/index.js.map +1 -0
  73. package/dist/templates/frontend/svelte/vite.config.d.ts +3 -0
  74. package/dist/templates/frontend/svelte/vite.config.d.ts.map +1 -0
  75. package/dist/templates/frontend/svelte/vite.config.js +5 -0
  76. package/dist/templates/frontend/svelte/vite.config.js.map +1 -0
  77. package/dist/utils/helpers.d.ts +10 -10
  78. package/dist/utils/helpers.d.ts.map +1 -1
  79. package/dist/utils/helpers.js +77 -34
  80. package/dist/utils/helpers.js.map +1 -1
  81. package/package.json +3 -2
  82. package/tsconfig.json +1 -1
@@ -1,135 +1,30 @@
1
- import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
1
+ import { createDirectory, logSuccess, copyTemplate, capitalize, } from "../../utils/helpers.js";
2
+ import { resolve } from "path";
3
+ import fs from "fs-extra";
4
+ async function removeFileIfExists(filePath) {
5
+ try {
6
+ if (await fs.pathExists(filePath)) {
7
+ await fs.unlink(filePath);
8
+ }
9
+ }
10
+ catch (error) { }
11
+ }
2
12
  export async function generateElysiaBackend(projectPath, config) {
3
13
  const srcPath = `${projectPath}/src`;
4
14
  await createDirectory(srcPath);
5
- const indexExtension = config.backend.typescript ? "ts" : "js";
6
- const importType = config.backend.typescript ? "import" : "require";
7
- await generateIndexFile(srcPath, indexExtension, importType, config);
8
- await generatePackageJson(projectPath, config);
9
- await generateTsConfig(projectPath, config);
10
- await generateBunConfig(projectPath, config);
11
- if (config.backend.eslint) {
12
- await generateEslintConfig(projectPath, config);
13
- }
14
- if (config.backend.prettier) {
15
- await generatePrettierConfig(projectPath, config);
16
- }
17
- logSuccess(`Elysia backend generated`);
18
- }
19
- async function generateIndexFile(srcPath, extension, importType, config) {
20
- const typeAnnotations = config.backend.typescript ? ": string" : "";
21
- const returnType = config.backend.typescript ? ": Response" : "";
22
- const content = `import { Elysia } from 'elysia';
23
- import { cors } from '@elysiajs/cors';
24
-
25
- const app = new Elysia()
26
- .use(cors())
27
- .get('/', () => 'Hello from Phos! 🚀')
28
- .get('/api/hello', () => ({
29
- message: 'Hello from the API!',
30
- timestamp: new Date().toISOString(),
31
- }))
32
- .listen(3000);
33
-
34
- console.log(\`🦊 Elysia is running at http://\${app.server?.hostname}:\${app.server?.port}\`);
35
- `;
36
- await writeFile(`${srcPath}/index.${extension}`, content);
37
- }
38
- async function generatePackageJson(projectPath, config) {
39
- const dependencies = {
40
- elysia: "^1.0.0",
41
- "@elysiajs/cors": "^1.0.0",
15
+ const templatePath = resolve(process.cwd(), "src/templates/backend/elysia");
16
+ const backendName = `${capitalize(config.projectName)}_Backend`;
17
+ const templateData = {
18
+ ...config,
19
+ backendName,
42
20
  };
43
- const devDependencies = {};
44
- if (config.backend.eslint) {
45
- devDependencies["eslint"] = "^8.57.0";
46
- devDependencies["@typescript-eslint/parser"] = "^7.0.0";
47
- devDependencies["@typescript-eslint/eslint-plugin"] = "^7.0.0";
21
+ await copyTemplate(templatePath, projectPath, templateData);
22
+ if (!config.backend?.eslint) {
23
+ await removeFileIfExists(`${projectPath}/.eslintrc.js`);
48
24
  }
49
- if (config.backend.prettier) {
50
- devDependencies["prettier"] = "^3.2.0";
25
+ if (!config.backend?.prettier) {
26
+ await removeFileIfExists(`${projectPath}/.prettierrc`);
51
27
  }
52
- if (config.backend.typescript) {
53
- devDependencies["typescript"] = "^5.3.0";
54
- }
55
- const content = JSON.stringify({
56
- name: config.projectType === "monorepo" ? "backend" : config.projectName,
57
- version: "0.1.0",
58
- type: "module",
59
- scripts: {
60
- dev: "bun run src/index.ts",
61
- start: "bun run src/index.ts",
62
- ...(config.backend.eslint ? { lint: "eslint src --ext .ts" } : {}),
63
- ...(config.backend.prettier ? { format: 'prettier --write "src/**/*.ts"' } : {}),
64
- },
65
- dependencies,
66
- devDependencies,
67
- }, null, 2);
68
- await writeFile(`${projectPath}/package.json`, content);
69
- }
70
- async function generateTsConfig(projectPath, config) {
71
- if (!config.backend.typescript)
72
- return;
73
- const content = JSON.stringify({
74
- compilerOptions: {
75
- target: "ES2022",
76
- module: "ES2022",
77
- lib: ["ES2022"],
78
- moduleResolution: "bundler",
79
- strict: true,
80
- esModuleInterop: true,
81
- skipLibCheck: true,
82
- forceConsistentCasingInFileNames: true,
83
- resolveJsonModule: true,
84
- declaration: true,
85
- declarationMap: true,
86
- sourceMap: true,
87
- },
88
- include: ["src/**/*"],
89
- }, null, 2);
90
- await writeFile(`${projectPath}/tsconfig.json`, content);
91
- }
92
- async function generateBunConfig(projectPath, config) {
93
- const content = JSON.stringify({
94
- name: config.projectType === "monorepo" ? "backend" : config.projectName,
95
- scripts: {
96
- dev: "bun run src/index.ts",
97
- start: "bun run src/index.ts",
98
- },
99
- }, null, 2);
100
- await writeFile(`${projectPath}/bunfig.toml`, content);
101
- }
102
- async function generateEslintConfig(projectPath, config) {
103
- if (!config.backend.eslint)
104
- return;
105
- const content = `module.exports = {
106
- root: true,
107
- parser: '@typescript-eslint/parser',
108
- extends: [
109
- 'eslint:recommended',
110
- 'plugin:@typescript-eslint/recommended',
111
- ],
112
- env: {
113
- node: true,
114
- es2022: true,
115
- },
116
- parserOptions: {
117
- ecmaVersion: 'latest',
118
- sourceType: 'module',
119
- },
120
- };`;
121
- await writeFile(`${projectPath}/.eslintrc.js`, content);
122
- }
123
- async function generatePrettierConfig(projectPath, config) {
124
- if (!config.backend.prettier)
125
- return;
126
- const content = JSON.stringify({
127
- semi: false,
128
- singleQuote: true,
129
- tabWidth: 2,
130
- trailingComma: "es5",
131
- printWidth: 80,
132
- }, null, 2);
133
- await writeFile(`${projectPath}/.prettierrc`, content);
28
+ logSuccess(`Elysia backend generated`);
134
29
  }
135
30
  //# sourceMappingURL=elysia.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"elysia.js","sourceRoot":"","sources":["../../../src/generators/backends/elysia.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"elysia.js","sourceRoot":"","sources":["../../../src/generators/backends/elysia.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EAEZ,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,MAAuB;IAEvB,MAAM,OAAO,GAAG,GAAG,WAAW,MAAM,CAAC;IACrC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IAEhE,MAAM,YAAY,GAAG;QACnB,GAAG,MAAM;QACT,WAAW;KACZ,CAAC;IAEF,MAAM,YAAY,CAAC,YAAY,EAAE,WAAW,EAAE,YAAkD,CAAC,CAAC;IAElG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,kBAAkB,CAAC,GAAG,WAAW,eAAe,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC9B,MAAM,kBAAkB,CAAC,GAAG,WAAW,cAAc,CAAC,CAAC;IACzD,CAAC;IAED,UAAU,CAAC,0BAA0B,CAAC,CAAC;AACzC,CAAC"}
@@ -1,3 +1,3 @@
1
- import { type GeneratorConfig } from "@/utils/helpers.js";
1
+ import { type GeneratorConfig } from "../../utils/helpers.js";
2
2
  export declare function generateFastAPIBackend(projectPath: string, config: GeneratorConfig): Promise<void>;
3
3
  //# sourceMappingURL=fastapi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastapi.d.ts","sourceRoot":"","sources":["../../../src/generators/backends/fastapi.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,CAkBf"}
1
+ {"version":3,"file":"fastapi.d.ts","sourceRoot":"","sources":["../../../src/generators/backends/fastapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,eAAe,EAGrB,MAAM,oBAAoB,CAAC;AAiB5B,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -1,158 +1,50 @@
1
- import { createDirectory, writeFile, logSuccess } from "@/utils/helpers.js";
1
+ import { createDirectory, logSuccess, logInfo, copyTemplate, capitalize, getPackageManagerInstallCmd, getPackageManagerRunCmd, } from "../../utils/helpers.js";
2
+ import { resolve } from "path";
3
+ import fs from "fs-extra";
4
+ async function removeFileIfExists(filePath) {
5
+ try {
6
+ if (await fs.pathExists(filePath)) {
7
+ await fs.unlink(filePath);
8
+ }
9
+ }
10
+ catch (error) { }
11
+ }
12
+ async function copyAndRenameFile(srcPath, destPath) {
13
+ const content = await fs.readFile(srcPath, "utf-8");
14
+ await fs.writeFile(destPath, content, "utf-8");
15
+ }
2
16
  export async function generateFastAPIBackend(projectPath, config) {
3
17
  const srcPath = `${projectPath}/src`;
4
18
  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);
19
+ const templatePath = resolve(process.cwd(), "src/templates/backend/fastapi");
20
+ const backendName = `${capitalize(config.projectName)}_Backend`;
21
+ const templateData = {
22
+ ...config,
23
+ backendName,
24
+ };
25
+ await copyTemplate(templatePath, projectPath, templateData);
26
+ if (!config.backend?.eslint) {
27
+ await removeFileIfExists(`${projectPath}/.pylintrc`);
11
28
  }
12
- if (config.backend.prettier) {
13
- await generatePyprojectToml(projectPath, config);
29
+ if (config.backend?.prettier) {
30
+ await copyAndRenameFile(`${templatePath}/pyproject_prettier.toml`, `${projectPath}/pyproject.toml`);
14
31
  }
32
+ else {
33
+ await removeFileIfExists(`${projectPath}/pyproject_prettier.toml`);
34
+ }
35
+ const installCmd = getPackageManagerInstallCmd(config.backend?.packageManager || "pip");
36
+ const runCmd = getPackageManagerRunCmd(config.backend?.packageManager || "pip", "dev");
15
37
  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");
38
+ logInfo("");
39
+ logInfo(`📦 Next steps:`);
40
+ logInfo(` cd ${backendName}`);
41
+ if (config.backend?.packageManager === "venv") {
42
+ logInfo(` chmod +x setup.sh`);
43
+ logInfo(` ./setup.sh`);
62
44
  }
63
- if (config.backend.prettier) {
64
- requirements.push("black>=23.0.0");
45
+ else {
46
+ logInfo(` ${installCmd}`);
47
+ logInfo(` ${runCmd}`);
65
48
  }
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
49
  }
158
50
  //# sourceMappingURL=fastapi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastapi.js","sourceRoot":"","sources":["../../../src/generators/backends/fastapi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastapi.js","sourceRoot":"","sources":["../../../src/generators/backends/fastapi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,OAAO,EACP,YAAY,EACZ,UAAU,EAEV,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,QAAgB;IAChE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,MAAuB;IAEvB,MAAM,OAAO,GAAG,GAAG,WAAW,MAAM,CAAC;IACrC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,+BAA+B,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IAEhE,MAAM,YAAY,GAAG;QACnB,GAAG,MAAM;QACT,WAAW;KACZ,CAAC;IAEF,MAAM,YAAY,CAAC,YAAY,EAAE,WAAW,EAAE,YAAkD,CAAC,CAAC;IAElG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,MAAM,kBAAkB,CAAC,GAAG,WAAW,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC7B,MAAM,iBAAiB,CACrB,GAAG,YAAY,0BAA0B,EACzC,GAAG,WAAW,iBAAiB,CAChC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,CAAC,GAAG,WAAW,0BAA0B,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,IAAI,KAAK,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE,KAAK,CAAC,CAAC;IAEvF,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC1B,OAAO,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO,EAAE,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC/B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -1,3 +1,3 @@
1
- import { type GeneratorConfig } from "@/utils/helpers.js";
1
+ import { type GeneratorConfig } from "../../utils/helpers.js";
2
2
  export declare function generateAstroFrontend(projectPath: string, config: GeneratorConfig): Promise<void>;
3
3
  //# sourceMappingURL=astro.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../../../src/generators/frontends/astro.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAY5B,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAgBf"}