scaffy-tool 0.2.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 (45) hide show
  1. package/README.md +21 -26
  2. package/cli.js +18 -41
  3. package/core/detector.js +5 -31
  4. package/core/executor.js +5 -27
  5. package/core/interviewer.js +15 -19
  6. package/core/plugin-validator.js +1 -1
  7. package/core/registry.js +47 -28
  8. package/core/utils.js +2 -19
  9. package/package.json +11 -11
  10. package/registry/go/gin/plugin.json +23 -0
  11. package/registry/go/gin/v1/questions.js +19 -0
  12. package/registry/go/gin/v1/scaffold.js +196 -0
  13. package/registry/index.json +4 -4
  14. package/registry/javascript/expressjs/plugin.json +44 -0
  15. package/registry/javascript/expressjs/v4/questions.js +43 -0
  16. package/registry/javascript/expressjs/v4/scaffold.js +236 -0
  17. package/registry/javascript/nestjs/plugin.json +2 -2
  18. package/registry/javascript/nestjs/v10/questions.js +6 -4
  19. package/registry/javascript/nestjs/v10/scaffold.js +1 -1
  20. package/registry/javascript/nestjs/v11/questions.js +61 -0
  21. package/registry/javascript/nestjs/v11/scaffold.js +94 -0
  22. package/registry/javascript/nextjs/plugin.json +44 -0
  23. package/registry/javascript/nextjs/v14/questions.js +44 -0
  24. package/registry/javascript/nextjs/v14/scaffold.js +57 -0
  25. package/registry/javascript/vuejs/v3/questions.js +5 -3
  26. package/registry/javascript/vuejs/v3/scaffold.js +3 -10
  27. package/registry/php/laravel/plugin.json +2 -2
  28. package/registry/php/laravel/v11/questions.js +3 -3
  29. package/registry/php/laravel/v11/scaffold.js +1 -1
  30. package/registry/php/laravel/v12/questions.js +45 -0
  31. package/registry/php/laravel/v12/scaffold.js +46 -0
  32. package/registry/php/laravel/v13/questions.js +28 -0
  33. package/registry/php/laravel/v13/scaffold.js +46 -0
  34. package/registry/php/laravel/v13/test/.gitkeep +0 -0
  35. package/registry/php/laravel/v13/test/questions.test.js +48 -0
  36. package/registry/php/laravel/v13/test/scaffold.test.js +105 -0
  37. package/registry/php/symfony/plugin.json +35 -0
  38. package/registry/php/symfony/v7/questions.js +19 -0
  39. package/registry/php/symfony/v7/scaffold.js +74 -0
  40. package/registry/python/django/plugin.json +35 -0
  41. package/registry/python/django/v5/questions.js +24 -0
  42. package/registry/python/django/v5/scaffold.js +107 -0
  43. package/registry/python/fastapi/plugin.json +35 -0
  44. package/registry/python/fastapi/v1/questions.js +25 -0
  45. package/registry/python/fastapi/v1/scaffold.js +180 -0
@@ -0,0 +1,45 @@
1
+ export default [
2
+ {
3
+ type: 'input',
4
+ name: 'projectName',
5
+ message: 'Project name?',
6
+ default: 'my-laravel-app',
7
+ validate: value => {
8
+ if (!value || !value.trim()) {
9
+ return 'Project name is required';
10
+ }
11
+ if (!/^[a-z0-9_-]+$/.test(value)) {
12
+ return 'Project name can only contain lowercase letters, numbers, underscores, and hyphens';
13
+ }
14
+ return true;
15
+ },
16
+ },
17
+ {
18
+ type: 'select',
19
+ name: 'starterKit',
20
+ message: 'Starter kit?',
21
+ choices: [
22
+ { name: 'None', value: 'none' },
23
+ { name: 'Breeze', value: 'breeze' },
24
+ { name: 'Jetstream', value: 'jetstream' },
25
+ ],
26
+ default: 'none',
27
+ },
28
+ {
29
+ type: 'select',
30
+ name: 'database',
31
+ message: 'Database?',
32
+ choices: [
33
+ { name: 'SQLite', value: 'sqlite' },
34
+ { name: 'MySQL', value: 'mysql' },
35
+ { name: 'PostgreSQL', value: 'pgsql' },
36
+ ],
37
+ default: 'sqlite',
38
+ },
39
+ {
40
+ type: 'confirm',
41
+ name: 'docker',
42
+ message: 'Include Docker config (Laravel Sail)?',
43
+ default: false,
44
+ },
45
+ ];
@@ -0,0 +1,46 @@
1
+ export default async (answers, utils) => {
2
+ const { projectName, starterKit, database, docker } = answers;
3
+
4
+ utils.title('Creating Laravel v12 Project');
5
+
6
+ utils.step(1, 'Running Laravel installer');
7
+ await utils.run(
8
+ `composer create-project laravel/laravel:^12.0 ${projectName}`
9
+ );
10
+
11
+ if (starterKit === 'breeze') {
12
+ utils.step(2, 'Installing Laravel Breeze');
13
+ await utils.runInProject(
14
+ projectName,
15
+ 'composer require laravel/breeze --dev'
16
+ );
17
+ await utils.runInProject(projectName, 'php artisan breeze:install');
18
+ }
19
+
20
+ if (starterKit === 'jetstream') {
21
+ utils.step(2, 'Installing Laravel Jetstream');
22
+ await utils.runInProject(projectName, 'composer require laravel/jetstream');
23
+ await utils.runInProject(
24
+ projectName,
25
+ 'php artisan jetstream:install livewire'
26
+ );
27
+ }
28
+
29
+ utils.step(3, 'Configuring database');
30
+ await utils.setEnv(projectName, {
31
+ DB_CONNECTION: database,
32
+ DB_DATABASE:
33
+ database === 'sqlite' ? 'database/database.sqlite' : projectName,
34
+ });
35
+
36
+ if (docker) {
37
+ utils.step(4, 'Installing Laravel Sail');
38
+ await utils.runInProject(
39
+ projectName,
40
+ 'composer require laravel/sail --dev'
41
+ );
42
+ await utils.runInProject(projectName, 'php artisan sail:install');
43
+ }
44
+
45
+ utils.success(`Laravel v12 project "${projectName}" created successfully!`);
46
+ };
@@ -0,0 +1,28 @@
1
+ export default [
2
+ {
3
+ type: 'select',
4
+ name: 'starterKit',
5
+ message: 'Starter kit?',
6
+ choices: [
7
+ { name: 'None', value: 'none' },
8
+ { name: 'Breeze', value: 'breeze' },
9
+ { name: 'Jetstream', value: 'jetstream' },
10
+ ],
11
+ },
12
+ {
13
+ type: 'select',
14
+ name: 'database',
15
+ message: 'Database?',
16
+ choices: [
17
+ { name: 'SQLite', value: 'sqlite' },
18
+ { name: 'MySQL', value: 'mysql' },
19
+ { name: 'PostgreSQL', value: 'pgsql' },
20
+ ],
21
+ },
22
+ {
23
+ type: 'confirm',
24
+ name: 'docker',
25
+ message: 'Include Docker config (Laravel Sail)?',
26
+ default: false,
27
+ },
28
+ ];
@@ -0,0 +1,46 @@
1
+ export default async (answers, utils) => {
2
+ const { projectName, starterKit, database, docker } = answers;
3
+
4
+ utils.title('Creating Laravel v13 Project');
5
+
6
+ utils.step(1, 'Running Laravel installer');
7
+ await utils.run(
8
+ `composer create-project laravel/laravel:^13.0 ${projectName}`
9
+ );
10
+
11
+ if (starterKit === 'breeze') {
12
+ utils.step(2, 'Installing Laravel Breeze');
13
+ await utils.runInProject(
14
+ projectName,
15
+ 'composer require laravel/breeze --dev'
16
+ );
17
+ await utils.runInProject(projectName, 'php artisan breeze:install');
18
+ }
19
+
20
+ if (starterKit === 'jetstream') {
21
+ utils.step(2, 'Installing Laravel Jetstream');
22
+ await utils.runInProject(projectName, 'composer require laravel/jetstream');
23
+ await utils.runInProject(
24
+ projectName,
25
+ 'php artisan jetstream:install livewire'
26
+ );
27
+ }
28
+
29
+ utils.step(3, 'Configuring database');
30
+ await utils.setEnv(projectName, {
31
+ DB_CONNECTION: database,
32
+ DB_DATABASE:
33
+ database === 'sqlite' ? 'database/database.sqlite' : projectName,
34
+ });
35
+
36
+ if (docker) {
37
+ utils.step(4, 'Installing Laravel Sail');
38
+ await utils.runInProject(
39
+ projectName,
40
+ 'composer require laravel/sail --dev'
41
+ );
42
+ await utils.runInProject(projectName, 'php artisan sail:install');
43
+ }
44
+
45
+ utils.success(`Laravel v13 project "${projectName}" created successfully!`);
46
+ };
File without changes
@@ -0,0 +1,48 @@
1
+ import questions from '../questions.js';
2
+
3
+ describe('Laravel v13 questions plugin', () => {
4
+ test('returns expected question set', () => {
5
+ expect(Array.isArray(questions)).toBe(true);
6
+
7
+ const projectNameQuestion = questions.find(q => q.name === 'projectName');
8
+ expect(projectNameQuestion).toBeDefined();
9
+ expect(projectNameQuestion.default).toBe('my-laravel-app');
10
+
11
+ const starterKitQuestion = questions.find(q => q.name === 'starterKit');
12
+ expect(starterKitQuestion).toBeDefined();
13
+ expect(Array.isArray(starterKitQuestion.choices)).toBe(true);
14
+ expect(starterKitQuestion.choices.length).toBe(3);
15
+ expect(starterKitQuestion.default).toBe('none');
16
+
17
+ const databaseQuestion = questions.find(q => q.name === 'database');
18
+ expect(databaseQuestion).toBeDefined();
19
+ expect(Array.isArray(databaseQuestion.choices)).toBe(true);
20
+ expect(databaseQuestion.default).toBe('sqlite');
21
+
22
+ const dockerQuestion = questions.find(q => q.name === 'docker');
23
+ expect(dockerQuestion).toBeDefined();
24
+ expect(dockerQuestion.type).toBe('confirm');
25
+ expect(dockerQuestion.default).toBe(false);
26
+ });
27
+
28
+ test('project name validator rejects empty input', () => {
29
+ const projectNameQuestion = questions.find(q => q.name === 'projectName');
30
+ expect(projectNameQuestion.validate(' ')).toBe(
31
+ 'Project name is required'
32
+ );
33
+ });
34
+
35
+ test('project name validator rejects invalid characters', () => {
36
+ const projectNameQuestion = questions.find(q => q.name === 'projectName');
37
+ const result = projectNameQuestion.validate('MyProject');
38
+ expect(typeof result).toBe('string');
39
+ expect(result).toContain('lowercase');
40
+ });
41
+
42
+ test('project name validator accepts valid names', () => {
43
+ const projectNameQuestion = questions.find(q => q.name === 'projectName');
44
+ expect(projectNameQuestion.validate('my-laravel-app')).toBe(true);
45
+ expect(projectNameQuestion.validate('my_laravel_app')).toBe(true);
46
+ expect(projectNameQuestion.validate('mylaravelapp123')).toBe(true);
47
+ });
48
+ });
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect, jest, beforeEach } from '@jest/globals';
2
+
3
+ describe('Laravel v13 scaffold', () => {
4
+ let scaffold;
5
+ let mockUtils;
6
+
7
+ beforeEach(async () => {
8
+ const mod = await import('../scaffold.js');
9
+ scaffold = mod.default;
10
+
11
+ mockUtils = {
12
+ run: jest.fn().mockResolvedValue(),
13
+ runInProject: jest.fn().mockResolvedValue(),
14
+ setEnv: jest.fn(),
15
+ createFile: jest.fn(),
16
+ appendToFile: jest.fn(),
17
+ log: jest.fn(),
18
+ success: jest.fn(),
19
+ warn: jest.fn(),
20
+ error: jest.fn(),
21
+ title: jest.fn(),
22
+ step: jest.fn(),
23
+ divider: jest.fn(),
24
+ };
25
+ });
26
+
27
+ it('runs the laravel v13 installer', async () => {
28
+ await scaffold(
29
+ {
30
+ projectName: 'my-app',
31
+ starterKit: 'none',
32
+ database: 'sqlite',
33
+ docker: false,
34
+ },
35
+ mockUtils
36
+ );
37
+ expect(mockUtils.run).toHaveBeenCalledWith(
38
+ expect.stringContaining('laravel/laravel:^13.0 my-app')
39
+ );
40
+ });
41
+
42
+ it('installs breeze when selected', async () => {
43
+ await scaffold(
44
+ {
45
+ projectName: 'my-app',
46
+ starterKit: 'breeze',
47
+ database: 'sqlite',
48
+ docker: false,
49
+ },
50
+ mockUtils
51
+ );
52
+ expect(mockUtils.runInProject).toHaveBeenCalledWith(
53
+ 'my-app',
54
+ expect.stringContaining('breeze')
55
+ );
56
+ });
57
+
58
+ it('installs jetstream when selected', async () => {
59
+ await scaffold(
60
+ {
61
+ projectName: 'my-app',
62
+ starterKit: 'jetstream',
63
+ database: 'sqlite',
64
+ docker: false,
65
+ },
66
+ mockUtils
67
+ );
68
+ expect(mockUtils.runInProject).toHaveBeenCalledWith(
69
+ 'my-app',
70
+ expect.stringContaining('jetstream')
71
+ );
72
+ });
73
+
74
+ it('sets database env vars', async () => {
75
+ await scaffold(
76
+ {
77
+ projectName: 'my-app',
78
+ starterKit: 'none',
79
+ database: 'mysql',
80
+ docker: false,
81
+ },
82
+ mockUtils
83
+ );
84
+ expect(mockUtils.setEnv).toHaveBeenCalledWith(
85
+ 'my-app',
86
+ expect.objectContaining({ DB_CONNECTION: 'mysql' })
87
+ );
88
+ });
89
+
90
+ it('installs sail when docker is true', async () => {
91
+ await scaffold(
92
+ {
93
+ projectName: 'my-app',
94
+ starterKit: 'none',
95
+ database: 'sqlite',
96
+ docker: true,
97
+ },
98
+ mockUtils
99
+ );
100
+ expect(mockUtils.runInProject).toHaveBeenCalledWith(
101
+ 'my-app',
102
+ expect.stringContaining('sail')
103
+ );
104
+ });
105
+ });
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "Symfony",
3
+ "alias": ["symfony"],
4
+ "language": "php",
5
+ "latest": "v7",
6
+ "versions": ["v7"],
7
+ "description": "High-performance PHP framework for web applications and APIs",
8
+ "requires": [
9
+ {
10
+ "tool": "php",
11
+ "checkCommand": "php --version",
12
+ "parseVersion": "PHP ([0-9]+\\.[0-9]+\\.[0-9]+)",
13
+ "minVersion": "8.2.0",
14
+ "installGuide": {
15
+ "mac": "brew install php",
16
+ "linux": "sudo apt install php8.2",
17
+ "windows": "https://windows.php.net",
18
+ "docs": "https://php.net"
19
+ }
20
+ },
21
+ {
22
+ "tool": "composer",
23
+ "checkCommand": "composer --version",
24
+ "parseVersion": "Composer version ([0-9]+\\.[0-9]+\\.[0-9]+)",
25
+ "minVersion": "2.0.0",
26
+ "installGuide": {
27
+ "mac": "brew install composer",
28
+ "linux": "sudo apt install composer",
29
+ "windows": "https://getcomposer.org/download",
30
+ "docs": "https://getcomposer.org"
31
+ }
32
+ }
33
+ ],
34
+ "maintainer": "community"
35
+ }
@@ -0,0 +1,19 @@
1
+ export default [
2
+ {
3
+ type: 'select',
4
+ name: 'database',
5
+ message: 'Database?',
6
+ choices: [
7
+ { name: 'MySQL', value: 'mysql' },
8
+ { name: 'PostgreSQL', value: 'postgresql' },
9
+ { name: 'SQLite', value: 'sqlite' },
10
+ { name: 'None', value: 'none' },
11
+ ],
12
+ },
13
+ {
14
+ type: 'confirm',
15
+ name: 'docker',
16
+ message: 'Include Docker config?',
17
+ default: false,
18
+ },
19
+ ];
@@ -0,0 +1,74 @@
1
+ export default async (answers, utils) => {
2
+ const { projectName, projectType, database, docker } = answers;
3
+
4
+ utils.title('Creating Symfony v7 Project');
5
+
6
+ // ─── Step 1: Install ───────────────────────────────────
7
+ utils.step(1, 'Running Symfony installer');
8
+
9
+ await utils.run(
10
+ `composer create-project symfony/skeleton:"7.*" ${projectName}`
11
+ );
12
+
13
+ // ─── Step 2: Database ──────────────────────────────────
14
+ if (database !== 'none') {
15
+ utils.step(2, 'Configuring database');
16
+ await utils.runInProject(projectName, 'composer require symfony/orm-pack');
17
+ await utils.runInProject(
18
+ projectName,
19
+ 'composer require --dev symfony/maker-bundle'
20
+ );
21
+
22
+ const dsnMap = {
23
+ mysql: `mysql://root:password@127.0.0.1:3306/${projectName}?serverVersion=8.0`,
24
+ postgresql: `postgresql://root:password@127.0.0.1:5432/${projectName}?serverVersion=15`,
25
+ sqlite: `sqlite:///%kernel.project_dir%/var/data.db`,
26
+ };
27
+
28
+ await utils.setEnv(projectName, {
29
+ DATABASE_URL: dsnMap[database],
30
+ });
31
+ }
32
+
33
+ // ─── Step 3: Docker ────────────────────────────────────
34
+ if (docker) {
35
+ utils.step(3, 'Creating Docker config');
36
+
37
+ const dockerCompose = `version: '3.8'
38
+ services:
39
+ php:
40
+ image: php:8.2-fpm
41
+ volumes:
42
+ - .:/var/www/html
43
+ ports:
44
+ - "9000:9000"
45
+ ${
46
+ database === 'mysql'
47
+ ? ` db:
48
+ image: mysql:8.0
49
+ environment:
50
+ MYSQL_ROOT_PASSWORD: password
51
+ MYSQL_DATABASE: ${projectName}
52
+ ports:
53
+ - "3306:3306"`
54
+ : ''
55
+ }
56
+ ${
57
+ database === 'postgresql'
58
+ ? ` db:
59
+ image: postgres:15
60
+ environment:
61
+ POSTGRES_PASSWORD: password
62
+ POSTGRES_DB: ${projectName}
63
+ ports:
64
+ - "5432:5432"`
65
+ : ''
66
+ }
67
+ `;
68
+ await utils.createFile(`${projectName}/docker-compose.yml`, dockerCompose);
69
+ }
70
+
71
+ utils.success(`Symfony v7 project "${projectName}" created successfully!`);
72
+ utils.log(` cd ${projectName}`);
73
+ utils.log(` symfony server:start`);
74
+ };
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "Django",
3
+ "alias": ["django"],
4
+ "language": "python",
5
+ "latest": "v5",
6
+ "versions": ["v5"],
7
+ "description": "High-level Python web framework for rapid development",
8
+ "requires": [
9
+ {
10
+ "tool": "python",
11
+ "checkCommand": "python3 --version",
12
+ "parseVersion": "Python ([0-9]+\\.[0-9]+\\.[0-9]+)",
13
+ "minVersion": "3.10.0",
14
+ "installGuide": {
15
+ "mac": "brew install python",
16
+ "linux": "sudo apt install python3",
17
+ "windows": "https://python.org/downloads",
18
+ "docs": "https://python.org"
19
+ }
20
+ },
21
+ {
22
+ "tool": "pip",
23
+ "checkCommand": "pip3 --version",
24
+ "parseVersion": "pip ([0-9]+\\.[0-9]+)",
25
+ "minVersion": "22.0.0",
26
+ "installGuide": {
27
+ "mac": "brew install python",
28
+ "linux": "sudo apt install python3-pip",
29
+ "windows": "https://pip.pypa.io/en/stable/installation",
30
+ "docs": "https://pip.pypa.io"
31
+ }
32
+ }
33
+ ],
34
+ "maintainer": "community"
35
+ }
@@ -0,0 +1,24 @@
1
+ export default [
2
+ {
3
+ type: 'select',
4
+ name: 'database',
5
+ message: 'Database?',
6
+ choices: [
7
+ { name: 'SQLite — default, no setup needed', value: 'sqlite' },
8
+ { name: 'PostgreSQL', value: 'postgresql' },
9
+ { name: 'MySQL', value: 'mysql' },
10
+ ],
11
+ },
12
+ {
13
+ type: 'confirm',
14
+ name: 'restFramework',
15
+ message: 'Include Django REST Framework?',
16
+ default: false,
17
+ },
18
+ {
19
+ type: 'confirm',
20
+ name: 'docker',
21
+ message: 'Include Docker config?',
22
+ default: false,
23
+ },
24
+ ];
@@ -0,0 +1,107 @@
1
+ export default async (answers, utils) => {
2
+ const { projectName, database, restFramework, docker } = answers;
3
+
4
+ utils.title('Creating Django v5 Project');
5
+
6
+ // ─── Step 1: Install Django ────────────────────────────
7
+ utils.step(1, 'Installing Django');
8
+ await utils.run('pip3 install "django>=5.0,<6.0"');
9
+
10
+ // ─── Step 2: Create Project ────────────────────────────
11
+ utils.step(2, 'Creating Django project');
12
+ await utils.run(`django-admin startproject ${projectName}`);
13
+
14
+ // ─── Step 3: Database ──────────────────────────────────
15
+ if (database === 'postgresql') {
16
+ utils.step(3, 'Installing PostgreSQL driver');
17
+ await utils.runInProject(projectName, 'pip3 install psycopg2-binary');
18
+ }
19
+
20
+ if (database === 'mysql') {
21
+ utils.step(3, 'Installing MySQL driver');
22
+ await utils.runInProject(projectName, 'pip3 install mysqlclient');
23
+ }
24
+
25
+ // ─── Step 4: REST Framework ────────────────────────────
26
+ if (restFramework) {
27
+ utils.step(4, 'Installing Django REST Framework');
28
+ await utils.runInProject(projectName, 'pip3 install djangorestframework');
29
+
30
+ const settingsPath = `${projectName}/${projectName}/settings.py`;
31
+ await utils.appendToFile(
32
+ settingsPath,
33
+ `\n# Django REST Framework\nINSTALLED_APPS += ['rest_framework']\n`
34
+ );
35
+ }
36
+
37
+ // ─── Step 5: requirements.txt ──────────────────────────
38
+ utils.step(5, 'Generating requirements.txt');
39
+
40
+ const requirements = [`django>=5.0,<6.0`];
41
+ if (database === 'postgresql') requirements.push('psycopg2-binary');
42
+ if (database === 'mysql') requirements.push('mysqlclient');
43
+ if (restFramework) requirements.push('djangorestframework');
44
+
45
+ await utils.createFile(
46
+ `${projectName}/requirements.txt`,
47
+ requirements.join('\n') + '\n'
48
+ );
49
+
50
+ // ─── Step 6: Docker ────────────────────────────────────
51
+ if (docker) {
52
+ utils.step(6, 'Creating Docker config');
53
+
54
+ const dockerfile = `FROM python:3.12-slim
55
+
56
+ WORKDIR /app
57
+
58
+ COPY requirements.txt .
59
+ RUN pip install --no-cache-dir -r requirements.txt
60
+
61
+ COPY . .
62
+
63
+ EXPOSE 8000
64
+ CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
65
+ `;
66
+
67
+ const dockerCompose = `version: '3.8'
68
+ services:
69
+ web:
70
+ build: .
71
+ ports:
72
+ - "8000:8000"
73
+ volumes:
74
+ - .:/app
75
+ ${
76
+ database === 'postgresql'
77
+ ? ` db:
78
+ image: postgres:15
79
+ environment:
80
+ POSTGRES_PASSWORD: password
81
+ POSTGRES_DB: ${projectName}
82
+ ports:
83
+ - "5432:5432"`
84
+ : ''
85
+ }
86
+ ${
87
+ database === 'mysql'
88
+ ? ` db:
89
+ image: mysql:8.0
90
+ environment:
91
+ MYSQL_ROOT_PASSWORD: password
92
+ MYSQL_DATABASE: ${projectName}
93
+ ports:
94
+ - "3306:3306"`
95
+ : ''
96
+ }
97
+ `;
98
+
99
+ await utils.createFile(`${projectName}/Dockerfile`, dockerfile);
100
+ await utils.createFile(`${projectName}/docker-compose.yml`, dockerCompose);
101
+ }
102
+
103
+ utils.success(`Django v5 project "${projectName}" created successfully!`);
104
+ utils.log(` cd ${projectName}`);
105
+ utils.log(` python manage.py migrate`);
106
+ utils.log(` python manage.py runserver`);
107
+ };
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "FastAPI",
3
+ "alias": ["fastapi"],
4
+ "language": "python",
5
+ "latest": "v1",
6
+ "versions": ["v1"],
7
+ "description": "Modern, fast Python web framework for building APIs",
8
+ "requires": [
9
+ {
10
+ "tool": "python",
11
+ "checkCommand": "python3 --version",
12
+ "parseVersion": "Python ([0-9]+\\.[0-9]+\\.[0-9]+)",
13
+ "minVersion": "3.10.0",
14
+ "installGuide": {
15
+ "mac": "brew install python",
16
+ "linux": "sudo apt install python3",
17
+ "windows": "https://python.org/downloads",
18
+ "docs": "https://python.org"
19
+ }
20
+ },
21
+ {
22
+ "tool": "pip",
23
+ "checkCommand": "pip3 --version",
24
+ "parseVersion": "pip ([0-9]+\\.[0-9]+)",
25
+ "minVersion": "22.0.0",
26
+ "installGuide": {
27
+ "mac": "brew install python",
28
+ "linux": "sudo apt install python3-pip",
29
+ "windows": "https://pip.pypa.io/en/stable/installation",
30
+ "docs": "https://pip.pypa.io"
31
+ }
32
+ }
33
+ ],
34
+ "maintainer": "community"
35
+ }
@@ -0,0 +1,25 @@
1
+ export default [
2
+ {
3
+ type: 'select',
4
+ name: 'database',
5
+ message: 'Database?',
6
+ choices: [
7
+ { name: 'None', value: 'none' },
8
+ { name: 'PostgreSQL — SQLAlchemy + Alembic', value: 'postgresql' },
9
+ { name: 'MySQL — SQLAlchemy + Alembic', value: 'mysql' },
10
+ { name: 'SQLite — SQLAlchemy + Alembic', value: 'sqlite' },
11
+ ],
12
+ },
13
+ {
14
+ type: 'confirm',
15
+ name: 'async',
16
+ message: 'Use async database drivers?',
17
+ default: true,
18
+ },
19
+ {
20
+ type: 'confirm',
21
+ name: 'docker',
22
+ message: 'Include Docker config?',
23
+ default: false,
24
+ },
25
+ ];