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.
@@ -1,55 +1,90 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateProject = generateProject;
7
- const path_1 = __importDefault(require("path"));
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const logger_1 = require("../utils/logger");
10
- const frontend_1 = require("./frontend");
11
- const backend_1 = require("./backend");
12
- const database_1 = require("./database");
13
- const auth_1 = require("./auth");
14
- const docker_1 = require("./docker");
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 fs_extra_1.default.ensureDir(targetDir);
21
+ await fs.ensureDir(targetDir);
21
22
  // Create subdirectories
22
- const frontendDir = path_1.default.join(targetDir, 'frontend');
23
- const backendDir = path_1.default.join(targetDir, 'backend');
24
- await fs_extra_1.default.ensureDir(frontendDir);
25
- await fs_extra_1.default.ensureDir(backendDir);
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 = logger_1.logger.spinner('Generating common files...');
29
- await (0, common_1.generateCommon)(config, targetDir);
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 = logger_1.logger.spinner(`Generating ${config.frontend} frontend...`);
33
- await (0, frontend_1.generateFrontend)(config, frontendDir);
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 = logger_1.logger.spinner(`Generating ${config.backend} backend...`);
37
- await (0, backend_1.generateBackend)(config, backendDir);
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 = logger_1.logger.spinner(`Setting up ${config.database} database...`);
41
- await (0, database_1.generateDatabase)(config, backendDir);
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 = logger_1.logger.spinner(`Integrating ${config.auth} authentication...`);
45
- await (0, auth_1.generateAuth)(config, frontendDir, backendDir);
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 = logger_1.logger.spinner('Generating Docker configuration...');
50
- await (0, docker_1.generateDocker)(config, targetDir);
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":";;;;;AAWA,0CAoDC;AA/DD,gDAAwB;AACxB,wDAA0B;AAE1B,4CAAyC;AACzC,yCAA8C;AAC9C,uCAA4C;AAC5C,yCAA8C;AAC9C,iCAAsC;AACtC,qCAA0C;AAC1C,qCAA0C;AAEnC,KAAK,UAAU,eAAe,CAAC,MAAmB,EAAE,SAAiB;IACxE,MAAM,OAAO,GAAG,eAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAEhE,IAAI,CAAC;QACD,2BAA2B;QAC3B,MAAM,kBAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9B,wBAAwB;QACxB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,kBAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAE/B,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAE7C,sEAAsE;QACtE,MAAM,aAAa,GAAG,eAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACnE,MAAM,IAAA,uBAAc,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxC,aAAa,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAEhD,oBAAoB;QACpB,MAAM,eAAe,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QACpF,MAAM,IAAA,2BAAgB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC5C,eAAe,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE9C,mBAAmB;QACnB,MAAM,cAAc,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;QACjF,MAAM,IAAA,yBAAe,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAE5C,0BAA0B;QAC1B,MAAM,SAAS,GAAG,eAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,QAAQ,cAAc,CAAC,CAAC;QAC9E,MAAM,IAAA,2BAAgB,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE7C,4BAA4B;QAC5B,MAAM,WAAW,GAAG,eAAM,CAAC,OAAO,CAAC,eAAe,MAAM,CAAC,IAAI,oBAAoB,CAAC,CAAC;QACnF,MAAM,IAAA,mBAAY,EAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACpD,WAAW,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAEjD,6CAA6C;QAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,eAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YAC3E,MAAM,IAAA,uBAAc,EAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACxC,aAAa,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAC5D,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
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
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const commander_1 = require("commander");
5
- const create_1 = require("./commands/create");
6
- const program = new commander_1.Command();
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('0.1.0');
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(create_1.createCommand)
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":";;;AAEA,yCAAoC;AAEpC,8CAAkD;AAElD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO;KACF,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,sBAAa,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,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;AAEtD,OAAO,CAAC,KAAK,EAAE,CAAC"}
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
@@ -7,6 +7,9 @@ export interface StackConfig {
7
7
  apiStyle: 'rest' | 'graphql' | 'trpc';
8
8
  docker: boolean;
9
9
  multiTenant: boolean;
10
+ jwtSecret?: string;
11
+ skipInstall?: boolean;
12
+ skipGit?: boolean;
10
13
  }
11
14
  export interface ValidationResult {
12
15
  valid: boolean;
package/dist/types.js CHANGED
@@ -1,3 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
3
2
  //# sourceMappingURL=types.js.map
@@ -1,29 +1,23 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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(chalk_1.default.blue('ℹ'), message);
5
+ console.log(chalk.blue('ℹ'), message);
12
6
  },
13
7
  success: (message) => {
14
- console.log(chalk_1.default.green('✔'), message);
8
+ console.log(chalk.green('✔'), message);
15
9
  },
16
10
  error: (message) => {
17
- console.log(chalk_1.default.red('✖'), message);
11
+ console.log(chalk.red('✖'), message);
18
12
  },
19
13
  warning: (message) => {
20
- console.log(chalk_1.default.yellow('⚠'), message);
14
+ console.log(chalk.yellow('⚠'), message);
21
15
  },
22
16
  title: (message) => {
23
- console.log(chalk_1.default.bold.cyan(`\n${message}\n`));
17
+ console.log(chalk.bold.cyan(`\n${message}\n`));
24
18
  },
25
19
  spinner: (text) => {
26
- return (0, ora_1.default)({
20
+ return ora({
27
21
  text,
28
22
  color: 'cyan',
29
23
  }).start();
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,8CAA+B;AAElB,QAAA,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC,IAAY,EAAO,EAAE;QAC3B,OAAO,IAAA,aAAG,EAAC;YACP,IAAI;YACJ,KAAK,EAAE,MAAM;SAChB,CAAC,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACJ,CAAC"}
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"}
@@ -1,2 +1,16 @@
1
1
  import { StackConfig } from '../types';
2
- export declare function promptForStack(projectName: string, options?: any): Promise<StackConfig>;
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 {};
@@ -1,10 +1,37 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- Object.defineProperty(exports, "__esModule", { value: true });
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 promptForStack(projectName, options = {}) {
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
- // If flags are provided, normalize and return immediately for non-interactive mode
67
- if (options.frontend || options.backend || options.auth || options.database) {
68
- return {
69
- projectName,
70
- frontend: normalizeInput('frontend', options.frontend || 'react-vite'),
71
- backend: normalizeInput('backend', options.backend || 'express'),
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 inquirer_1.default.prompt([
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
- return {
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":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Generates a cryptographically secure random secret string.
3
+ */
4
+ export declare function generateRandomSecret(bytes?: number): string;
@@ -0,0 +1,8 @@
1
+ import crypto from 'crypto';
2
+ /**
3
+ * Generates a cryptographically secure random secret string.
4
+ */
5
+ export function generateRandomSecret(bytes = 32) {
6
+ return crypto.randomBytes(bytes).toString('hex');
7
+ }
8
+ //# sourceMappingURL=security.js.map
@@ -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"}
@@ -1,18 +1,16 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
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 = (0, validate_npm_package_name_1.default)(config.projectName);
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":";;;;;AAGA,kDA8CC;AAhDD,0FAA+D;AAE/D,SAAgB,mBAAmB,CAAC,MAAmB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wBAAwB;IACxB,MAAM,cAAc,GAAG,IAAA,mCAAsB,EAAC,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,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"}
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"}