forgestack-os-cli 0.2.1 → 0.3.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.
- package/README.md +78 -0
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.js +55 -60
- package/dist/commands/create.js.map +1 -1
- package/dist/generators/api.js +42 -38
- package/dist/generators/api.js.map +1 -1
- package/dist/generators/auth.js +171 -356
- package/dist/generators/auth.js.map +1 -1
- package/dist/generators/backend.js +146 -129
- package/dist/generators/backend.js.map +1 -1
- package/dist/generators/common.js +50 -15
- package/dist/generators/common.js.map +1 -1
- package/dist/generators/database.js +18 -24
- package/dist/generators/database.js.map +1 -1
- package/dist/generators/docker.js +17 -21
- package/dist/generators/docker.js.map +1 -1
- package/dist/generators/frontend.js +164 -157
- package/dist/generators/frontend.js.map +1 -1
- package/dist/generators/index.js +69 -34
- package/dist/generators/index.js.map +1 -1
- package/dist/index.js +13 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.js +1 -2
- package/dist/utils/logger.js +9 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/prompts.d.ts +15 -1
- package/dist/utils/prompts.js +111 -33
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/security.d.ts +4 -0
- package/dist/utils/security.js +8 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/validators.js +7 -9
- package/dist/utils/validators.js.map +1 -1
- package/package.json +36 -14
package/dist/generators/index.js
CHANGED
|
@@ -1,55 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const common_1 = require("./common");
|
|
16
|
-
async function generateProject(config, targetDir) {
|
|
17
|
-
const spinner = logger_1.logger.spinner('Creating project structure...');
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { logger } from '../utils/logger';
|
|
4
|
+
import { generateFrontend } from './frontend';
|
|
5
|
+
import { generateBackend } from './backend';
|
|
6
|
+
import { generateDatabase } from './database';
|
|
7
|
+
import { generateAuth } from './auth';
|
|
8
|
+
import { generateDocker } from './docker';
|
|
9
|
+
import { generateCommon } from './common';
|
|
10
|
+
import { generateTRPC, generateGraphQL } from './api';
|
|
11
|
+
import { generateRandomSecret } from '../utils/security';
|
|
12
|
+
import execa from 'execa';
|
|
13
|
+
export async function generateProject(config, targetDir) {
|
|
14
|
+
const spinner = logger.spinner('Creating project structure...');
|
|
18
15
|
try {
|
|
16
|
+
// Generate JWT secret if needed
|
|
17
|
+
if (config.auth === 'jwt' || config.apiStyle === 'trpc') {
|
|
18
|
+
config.jwtSecret = generateRandomSecret();
|
|
19
|
+
}
|
|
19
20
|
// Create project directory
|
|
20
|
-
await
|
|
21
|
+
await fs.ensureDir(targetDir);
|
|
21
22
|
// Create subdirectories
|
|
22
|
-
const frontendDir =
|
|
23
|
-
const backendDir =
|
|
24
|
-
await
|
|
25
|
-
await
|
|
23
|
+
const frontendDir = path.join(targetDir, 'frontend');
|
|
24
|
+
const backendDir = path.join(targetDir, 'backend');
|
|
25
|
+
await fs.ensureDir(frontendDir);
|
|
26
|
+
await fs.ensureDir(backendDir);
|
|
26
27
|
spinner.succeed('Project structure created');
|
|
27
28
|
// Generate common files (root package.json, README, .gitignore, etc.)
|
|
28
|
-
const commonSpinner =
|
|
29
|
-
await
|
|
29
|
+
const commonSpinner = logger.spinner('Generating common files...');
|
|
30
|
+
await generateCommon(config, targetDir);
|
|
30
31
|
commonSpinner.succeed('Common files generated');
|
|
31
32
|
// Generate frontend
|
|
32
|
-
const frontendSpinner =
|
|
33
|
-
await
|
|
33
|
+
const frontendSpinner = logger.spinner(`Generating ${config.frontend} frontend...`);
|
|
34
|
+
await generateFrontend(config, frontendDir);
|
|
34
35
|
frontendSpinner.succeed('Frontend generated');
|
|
35
36
|
// Generate backend
|
|
36
|
-
const backendSpinner =
|
|
37
|
-
await
|
|
37
|
+
const backendSpinner = logger.spinner(`Generating ${config.backend} backend...`);
|
|
38
|
+
await generateBackend(config, backendDir);
|
|
38
39
|
backendSpinner.succeed('Backend generated');
|
|
39
40
|
// Generate database setup
|
|
40
|
-
const dbSpinner =
|
|
41
|
-
await
|
|
41
|
+
const dbSpinner = logger.spinner(`Setting up ${config.database} database...`);
|
|
42
|
+
await generateDatabase(config, backendDir);
|
|
42
43
|
dbSpinner.succeed('Database setup complete');
|
|
43
44
|
// Generate auth integration
|
|
44
|
-
const authSpinner =
|
|
45
|
-
await
|
|
45
|
+
const authSpinner = logger.spinner(`Integrating ${config.auth} authentication...`);
|
|
46
|
+
await generateAuth(config, frontendDir, backendDir);
|
|
46
47
|
authSpinner.succeed('Authentication integrated');
|
|
48
|
+
// Generate API Style (tRPC/GraphQL)
|
|
49
|
+
if (config.apiStyle === 'trpc') {
|
|
50
|
+
const trpcSpinner = logger.spinner('Integrating tRPC...');
|
|
51
|
+
await generateTRPC(config, backendDir, frontendDir);
|
|
52
|
+
trpcSpinner.succeed('tRPC integrated');
|
|
53
|
+
}
|
|
54
|
+
else if (config.apiStyle === 'graphql') {
|
|
55
|
+
const gqlSpinner = logger.spinner('Integrating GraphQL...');
|
|
56
|
+
await generateGraphQL(config, backendDir);
|
|
57
|
+
gqlSpinner.succeed('GraphQL integrated');
|
|
58
|
+
}
|
|
47
59
|
// Generate Docker configuration if requested
|
|
48
60
|
if (config.docker) {
|
|
49
|
-
const dockerSpinner =
|
|
50
|
-
await
|
|
61
|
+
const dockerSpinner = logger.spinner('Generating Docker configuration...');
|
|
62
|
+
await generateDocker(config, targetDir);
|
|
51
63
|
dockerSpinner.succeed('Docker configuration generated');
|
|
52
64
|
}
|
|
65
|
+
// Initialize Git
|
|
66
|
+
if (!config.skipGit) {
|
|
67
|
+
const gitSpinner = logger.spinner('Initializing Git repository...');
|
|
68
|
+
try {
|
|
69
|
+
await execa('git', ['init'], { cwd: targetDir });
|
|
70
|
+
gitSpinner.succeed('Git repository initialized');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
gitSpinner.warn('Failed to initialize Git repository');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Install dependencies
|
|
77
|
+
if (!config.skipInstall) {
|
|
78
|
+
const installSpinner = logger.spinner('Installing dependencies (this may take a few minutes)...');
|
|
79
|
+
try {
|
|
80
|
+
// Using npm install at root (for workspaces)
|
|
81
|
+
await execa('npm', ['install'], { cwd: targetDir });
|
|
82
|
+
installSpinner.succeed('Dependencies installed');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
installSpinner.warn('Failed to install dependencies. You may need to run "npm install" manually.');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
53
88
|
}
|
|
54
89
|
catch (error) {
|
|
55
90
|
spinner.fail('Failed to generate project');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generators/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { createCommand } from './commands/create';
|
|
5
|
+
const pkgRequire = createRequire(import.meta.url);
|
|
6
|
+
const { version: CLI_VERSION } = pkgRequire('../package.json');
|
|
7
|
+
const program = new Command();
|
|
7
8
|
program
|
|
8
9
|
.name('forgestack')
|
|
9
10
|
.description('ForgeStack OS - One platform. Any stack. Production-ready.')
|
|
10
|
-
.version(
|
|
11
|
+
.version(CLI_VERSION);
|
|
11
12
|
program
|
|
12
13
|
.command('create <project-name>')
|
|
13
14
|
.description('Create a new full-stack SaaS application')
|
|
14
|
-
.action(
|
|
15
|
+
.action(createCommand)
|
|
15
16
|
.option('--frontend <framework>', 'Frontend framework')
|
|
16
17
|
.option('--backend <framework>', 'Backend framework')
|
|
17
18
|
.option('--auth <provider>', 'Auth provider')
|
|
18
19
|
.option('--database <db>', 'Database')
|
|
19
20
|
.option('--api <style>', 'API style')
|
|
21
|
+
.option('--preset <name>', 'Use a predefined stack preset')
|
|
22
|
+
.option('--stack <json>', 'Provide full stack config as JSON')
|
|
20
23
|
.option('--docker', 'Include Docker configuration')
|
|
21
24
|
.option('--no-docker', 'Skip Docker configuration')
|
|
22
|
-
.option('--multi-tenant', 'Enable multi-tenancy')
|
|
25
|
+
.option('--multi-tenant', 'Enable multi-tenancy')
|
|
26
|
+
.option('--skip-install', 'Skip dependency installation')
|
|
27
|
+
.option('--skip-git', 'Skip Git initialization');
|
|
23
28
|
program.parse();
|
|
24
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAwB,CAAC;AAEtF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,aAAa,CAAC;KACrB,MAAM,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;KACtD,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;KACpC,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;KAC7D,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;AAErD,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.js
CHANGED
package/dist/utils/logger.js
CHANGED
|
@@ -1,29 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logger = void 0;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const ora_1 = __importDefault(require("ora"));
|
|
9
|
-
exports.logger = {
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export const logger = {
|
|
10
4
|
info: (message) => {
|
|
11
|
-
console.log(
|
|
5
|
+
console.log(chalk.blue('ℹ'), message);
|
|
12
6
|
},
|
|
13
7
|
success: (message) => {
|
|
14
|
-
console.log(
|
|
8
|
+
console.log(chalk.green('✔'), message);
|
|
15
9
|
},
|
|
16
10
|
error: (message) => {
|
|
17
|
-
console.log(
|
|
11
|
+
console.log(chalk.red('✖'), message);
|
|
18
12
|
},
|
|
19
13
|
warning: (message) => {
|
|
20
|
-
console.log(
|
|
14
|
+
console.log(chalk.yellow('⚠'), message);
|
|
21
15
|
},
|
|
22
16
|
title: (message) => {
|
|
23
|
-
console.log(
|
|
17
|
+
console.log(chalk.bold.cyan(`\n${message}\n`));
|
|
24
18
|
},
|
|
25
19
|
spinner: (text) => {
|
|
26
|
-
return (
|
|
20
|
+
return ora({
|
|
27
21
|
text,
|
|
28
22
|
color: 'cyan',
|
|
29
23
|
}).start();
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAY,MAAM,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC,IAAY,EAAO,EAAE;QAC3B,OAAO,GAAG,CAAC;YACP,IAAI;YACJ,KAAK,EAAE,MAAM;SAChB,CAAC,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACJ,CAAC"}
|
package/dist/utils/prompts.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
1
|
import { StackConfig } from '../types';
|
|
2
|
-
|
|
2
|
+
type CLIOptions = {
|
|
3
|
+
frontend?: string;
|
|
4
|
+
backend?: string;
|
|
5
|
+
auth?: string;
|
|
6
|
+
database?: string;
|
|
7
|
+
api?: string;
|
|
8
|
+
preset?: string;
|
|
9
|
+
stack?: string;
|
|
10
|
+
docker?: boolean;
|
|
11
|
+
multiTenant?: boolean;
|
|
12
|
+
skipInstall?: boolean;
|
|
13
|
+
skipGit?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function promptForStack(projectName: string, options?: CLIOptions): Promise<StackConfig>;
|
|
16
|
+
export {};
|
package/dist/utils/prompts.js
CHANGED
|
@@ -1,10 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const PRESETS = {
|
|
6
|
+
'next-nest-clerk-pg': {
|
|
7
|
+
frontend: 'nextjs',
|
|
8
|
+
backend: 'nestjs',
|
|
9
|
+
auth: 'clerk',
|
|
10
|
+
database: 'postgresql',
|
|
11
|
+
apiStyle: 'rest',
|
|
12
|
+
docker: true,
|
|
13
|
+
multiTenant: true,
|
|
14
|
+
},
|
|
15
|
+
'react-express-jwt-mongo': {
|
|
16
|
+
frontend: 'react-vite',
|
|
17
|
+
backend: 'express',
|
|
18
|
+
auth: 'jwt',
|
|
19
|
+
database: 'mongodb',
|
|
20
|
+
apiStyle: 'graphql',
|
|
21
|
+
docker: true,
|
|
22
|
+
multiTenant: false,
|
|
23
|
+
},
|
|
24
|
+
'next-fastify-supabase-trpc': {
|
|
25
|
+
frontend: 'nextjs',
|
|
26
|
+
backend: 'fastify',
|
|
27
|
+
auth: 'supabase',
|
|
28
|
+
database: 'supabase-db',
|
|
29
|
+
apiStyle: 'trpc',
|
|
30
|
+
docker: true,
|
|
31
|
+
multiTenant: true,
|
|
32
|
+
},
|
|
4
33
|
};
|
|
5
|
-
|
|
6
|
-
exports.promptForStack = promptForStack;
|
|
7
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
34
|
+
const LAST_CONFIG_PATH = path.join(os.homedir(), '.forgestack', 'config.json');
|
|
8
35
|
/**
|
|
9
36
|
* Normalizes input strings for consistency (e.g., 'Next.js 14' -> 'nextjs')
|
|
10
37
|
*/
|
|
@@ -61,24 +88,73 @@ function normalizeInput(category, value) {
|
|
|
61
88
|
};
|
|
62
89
|
return mappings[category][v] || v;
|
|
63
90
|
}
|
|
64
|
-
async function
|
|
91
|
+
async function loadLastConfig() {
|
|
92
|
+
try {
|
|
93
|
+
const raw = await fs.readJSON(LAST_CONFIG_PATH);
|
|
94
|
+
return raw.lastStack || {};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function saveLastConfig(config) {
|
|
101
|
+
try {
|
|
102
|
+
await fs.ensureDir(path.dirname(LAST_CONFIG_PATH));
|
|
103
|
+
await fs.writeJSON(LAST_CONFIG_PATH, { lastStack: config }, { spaces: 2 });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// non-blocking persistence
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function parseApiStyle(api) {
|
|
110
|
+
if (api === 'trpc')
|
|
111
|
+
return 'trpc';
|
|
112
|
+
if (api === 'graphql')
|
|
113
|
+
return 'graphql';
|
|
114
|
+
return 'rest';
|
|
115
|
+
}
|
|
116
|
+
function buildConfigFromOptions(projectName, options, last) {
|
|
117
|
+
let base = {};
|
|
118
|
+
if (options.preset) {
|
|
119
|
+
const preset = PRESETS[options.preset];
|
|
120
|
+
if (!preset) {
|
|
121
|
+
throw new Error(`Unknown preset "${options.preset}". Available: ${Object.keys(PRESETS).join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
base = { ...preset };
|
|
124
|
+
}
|
|
125
|
+
if (options.stack) {
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(options.stack);
|
|
128
|
+
base = { ...base, ...parsed };
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new Error('Failed to parse --stack JSON. Ensure it is valid JSON.');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const merged = {
|
|
135
|
+
projectName,
|
|
136
|
+
frontend: normalizeInput('frontend', options.frontend || base.frontend || last.frontend || 'react-vite'),
|
|
137
|
+
backend: normalizeInput('backend', options.backend || base.backend || last.backend || 'express'),
|
|
138
|
+
auth: normalizeInput('auth', options.auth || base.auth || last.auth || 'jwt'),
|
|
139
|
+
database: normalizeInput('database', options.database || base.database || last.database || 'postgresql'),
|
|
140
|
+
apiStyle: parseApiStyle(options.api || base.apiStyle || last.apiStyle),
|
|
141
|
+
docker: options.docker !== undefined ? Boolean(options.docker) : (base.docker ?? last.docker ?? true),
|
|
142
|
+
multiTenant: options.multiTenant !== undefined ? Boolean(options.multiTenant) : (base.multiTenant ?? last.multiTenant ?? false),
|
|
143
|
+
skipInstall: Boolean(options.skipInstall),
|
|
144
|
+
skipGit: Boolean(options.skipGit),
|
|
145
|
+
};
|
|
146
|
+
return merged;
|
|
147
|
+
}
|
|
148
|
+
export async function promptForStack(projectName, options = {}) {
|
|
65
149
|
console.log('\n');
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
auth: normalizeInput('auth', options.auth || 'jwt'),
|
|
73
|
-
database: normalizeInput('database', options.database || 'postgresql'),
|
|
74
|
-
apiStyle: options.api // 'api' option maps to 'apiStyle' in config
|
|
75
|
-
? (options.api === 'trpc' ? 'trpc' : options.api === 'graphql' ? 'graphql' : 'rest')
|
|
76
|
-
: 'rest',
|
|
77
|
-
docker: options.docker !== false, // Default to true unless --no-docker
|
|
78
|
-
multiTenant: !!options.multiTenant,
|
|
79
|
-
};
|
|
150
|
+
const lastConfig = await loadLastConfig();
|
|
151
|
+
// Non-interactive: use flags, preset, or stack JSON
|
|
152
|
+
if (options.frontend || options.backend || options.auth || options.database || options.preset || options.stack) {
|
|
153
|
+
const config = buildConfigFromOptions(projectName, options, lastConfig);
|
|
154
|
+
await saveLastConfig(config);
|
|
155
|
+
return config;
|
|
80
156
|
}
|
|
81
|
-
const answers = await
|
|
157
|
+
const answers = await inquirer.prompt([
|
|
82
158
|
{
|
|
83
159
|
type: 'list',
|
|
84
160
|
name: 'frontend',
|
|
@@ -86,10 +162,10 @@ async function promptForStack(projectName, options = {}) {
|
|
|
86
162
|
choices: [
|
|
87
163
|
{ name: 'React + Vite (Recommended)', value: 'react-vite' },
|
|
88
164
|
{ name: 'Next.js 14 (App Router)', value: 'nextjs' },
|
|
89
|
-
{ name: 'Vue + Vite', value: 'vue-vite' },
|
|
90
|
-
{ name: 'SvelteKit', value: 'sveltekit' },
|
|
165
|
+
{ name: 'Vue + Vite', value: 'vue-vite', disabled: 'Coming in Phase 5' },
|
|
166
|
+
{ name: 'SvelteKit', value: 'sveltekit', disabled: 'Coming in Phase 5' },
|
|
91
167
|
],
|
|
92
|
-
default: 'react-vite',
|
|
168
|
+
default: lastConfig.frontend || 'react-vite',
|
|
93
169
|
},
|
|
94
170
|
{
|
|
95
171
|
type: 'list',
|
|
@@ -100,9 +176,9 @@ async function promptForStack(projectName, options = {}) {
|
|
|
100
176
|
{ name: 'Node.js + Fastify', value: 'fastify' },
|
|
101
177
|
{ name: 'NestJS', value: 'nestjs' },
|
|
102
178
|
{ name: 'Bun + Elysia', value: 'bun-elysia' },
|
|
103
|
-
{ name: 'Go + Fiber (Experimental)', value: 'go-fiber' },
|
|
179
|
+
{ name: 'Go + Fiber (Experimental)', value: 'go-fiber', disabled: 'Coming in Phase 6' },
|
|
104
180
|
],
|
|
105
|
-
default: 'express',
|
|
181
|
+
default: lastConfig.backend || 'express',
|
|
106
182
|
},
|
|
107
183
|
{
|
|
108
184
|
type: 'list',
|
|
@@ -115,7 +191,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
115
191
|
{ name: 'Auth.js (NextAuth)', value: 'authjs' },
|
|
116
192
|
{ name: 'Firebase Auth', value: 'firebase' },
|
|
117
193
|
],
|
|
118
|
-
default: 'jwt',
|
|
194
|
+
default: lastConfig.auth || 'jwt',
|
|
119
195
|
},
|
|
120
196
|
{
|
|
121
197
|
type: 'list',
|
|
@@ -128,7 +204,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
128
204
|
{ name: 'SQLite (Local)', value: 'sqlite' },
|
|
129
205
|
{ name: 'Supabase DB', value: 'supabase-db' },
|
|
130
206
|
],
|
|
131
|
-
default: 'postgresql',
|
|
207
|
+
default: lastConfig.database || 'postgresql',
|
|
132
208
|
},
|
|
133
209
|
{
|
|
134
210
|
type: 'list',
|
|
@@ -139,24 +215,26 @@ async function promptForStack(projectName, options = {}) {
|
|
|
139
215
|
{ name: 'GraphQL', value: 'graphql' },
|
|
140
216
|
{ name: 'tRPC (Type-safe)', value: 'trpc' },
|
|
141
217
|
],
|
|
142
|
-
default: 'rest',
|
|
218
|
+
default: lastConfig.apiStyle || 'rest',
|
|
143
219
|
},
|
|
144
220
|
{
|
|
145
221
|
type: 'confirm',
|
|
146
222
|
name: 'docker',
|
|
147
223
|
message: 'Include Docker configuration?',
|
|
148
|
-
default: true,
|
|
224
|
+
default: lastConfig.docker ?? true,
|
|
149
225
|
},
|
|
150
226
|
{
|
|
151
227
|
type: 'confirm',
|
|
152
228
|
name: 'multiTenant',
|
|
153
229
|
message: 'Enable multi-tenancy support?',
|
|
154
|
-
default: false,
|
|
230
|
+
default: lastConfig.multiTenant ?? false,
|
|
155
231
|
},
|
|
156
232
|
]);
|
|
157
|
-
|
|
233
|
+
const config = {
|
|
158
234
|
projectName,
|
|
159
235
|
...answers,
|
|
160
236
|
};
|
|
237
|
+
await saveLastConfig(config);
|
|
238
|
+
return config;
|
|
161
239
|
}
|
|
162
240
|
//# sourceMappingURL=prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE;IACnD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/utils/validators.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateStackConfig = validateStackConfig;
|
|
7
|
-
const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
|
|
8
|
-
function validateStackConfig(config) {
|
|
1
|
+
import validateNpmPackageName from 'validate-npm-package-name';
|
|
2
|
+
export function validateStackConfig(config) {
|
|
9
3
|
const errors = [];
|
|
10
4
|
const warnings = [];
|
|
11
5
|
// Validate project name
|
|
12
|
-
const nameValidation = (
|
|
6
|
+
const nameValidation = validateNpmPackageName(config.projectName);
|
|
13
7
|
if (!nameValidation.validForNewPackages) {
|
|
14
8
|
errors.push(`Invalid project name: ${nameValidation.errors?.join(', ')}`);
|
|
15
9
|
}
|
|
10
|
+
// Next.js pairs best with NestJS for SSR/edge features
|
|
11
|
+
if (config.frontend === 'nextjs' && config.backend === 'express') {
|
|
12
|
+
errors.push('Next.js works best with NestJS backend');
|
|
13
|
+
}
|
|
16
14
|
// tRPC requires TypeScript backend
|
|
17
15
|
if (config.apiStyle === 'trpc') {
|
|
18
16
|
if (config.backend === 'go-fiber') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AACA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wBAAwB;IACxB,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC/F,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACX,CAAC;AACN,CAAC"}
|