@solidxai/solidctl 0.1.50-beta.8 → 0.1.51-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/commands/build.command.d.ts +3 -0
- package/dist/commands/build.command.js +39 -36
- package/dist/commands/build.command.js.map +1 -1
- package/dist/commands/seed.command.d.ts +1 -0
- package/dist/commands/seed.command.js +21 -18
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/commands/setup/helpers.d.ts +54 -0
- package/dist/commands/setup/helpers.js +210 -0
- package/dist/commands/setup/helpers.js.map +1 -0
- package/dist/commands/setup/setup-questions.d.ts +55 -0
- package/dist/commands/setup/setup-questions.js +60 -0
- package/dist/commands/setup/setup-questions.js.map +1 -0
- package/dist/commands/setup/setup.command.d.ts +19 -0
- package/dist/commands/setup/setup.command.js +342 -0
- package/dist/commands/setup/setup.command.js.map +1 -0
- package/dist/commands/start.command.d.ts +62 -0
- package/dist/commands/start.command.js +12 -8
- package/dist/commands/start.command.js.map +1 -1
- package/dist/helper.js +7 -1
- package/dist/helper.js.map +1 -1
- package/dist/main.js +2 -0
- package/dist/main.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -82,6 +82,36 @@ solidctl create-app [options]
|
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
85
|
+
### `setup`
|
|
86
|
+
|
|
87
|
+
Sets up an **already-bootstrapped** SolidX project you've just cloned — the counterpart to `create-app` for a project that already exists. Infers what it can from the repo (project name, UI port), prompts only for the database connection, then installs, configures, builds, seeds, and starts the project.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
solidctl setup [options]
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
| Flag | Description |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `--no-start` | Skip starting the dev servers after setup |
|
|
96
|
+
| `--no-interactive` | Skip all prompts and use defaults (or provided flags) |
|
|
97
|
+
| `--verbose` | Show detailed logs during installation |
|
|
98
|
+
| `--skip-install` | Skip `npm install` for `solid-api` and `solid-ui` |
|
|
99
|
+
| `--skip-build` | Skip the build step |
|
|
100
|
+
| `--skip-seed` | Skip the seed step |
|
|
101
|
+
| `--force-env` | Regenerate `.env` files even if they already exist |
|
|
102
|
+
| `--db-client <client>` | `PostgreSQL`, `MySQL`, or `MSSQL` |
|
|
103
|
+
| `--db-host <host>` | Database host |
|
|
104
|
+
| `--db-port <port>` | Database port |
|
|
105
|
+
| `--db-name <name>` | Database name |
|
|
106
|
+
| `--db-username <username>` | Database username |
|
|
107
|
+
| `--db-password <password>` | Database password |
|
|
108
|
+
|
|
109
|
+
If `solid-api/.env` already exists, it's left untouched (pass `--force-env` to regenerate). If a `solid-api/.env.example` exists, its non-secret values are carried over and only the gaps (and the database password) are prompted for. Otherwise, only the database connection is prompted for — other project-specific settings (RabbitMQ, OAuth, SMTP, Redis, etc., if the project uses them) aren't known ahead of time and need to be added manually afterward.
|
|
110
|
+
|
|
111
|
+
> Requires both `solid-api/package.json` and `solid-ui/package.json` to define a `solidx:dev` script. If either is missing (a project that predates that script), setup fails fast and tells you the exact line to add.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
85
115
|
### `build`
|
|
86
116
|
|
|
87
117
|
Builds the NestJS API and sets up the local `solid` CLI shim so subsequent `solidctl` commands that proxy into the API (like `seed`, `generate`, and `test`) work correctly. Run this after project creation and after any changes to `solid-api`.
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runBuild = runBuild;
|
|
6
7
|
exports.registerBuildCommand = registerBuildCommand;
|
|
7
8
|
const child_process_1 = require("child_process");
|
|
8
9
|
const fs_1 = __importDefault(require("fs"));
|
|
@@ -101,6 +102,43 @@ function ensureGlobalSolid(shimFiles, shimDir) {
|
|
|
101
102
|
}
|
|
102
103
|
return { linked: false, location: shimDir, viaPath: false };
|
|
103
104
|
}
|
|
105
|
+
function runBuild(projectRoot, options = {}) {
|
|
106
|
+
if (options.uiOnly) {
|
|
107
|
+
const solidUiDir = path_1.default.join(projectRoot, 'solid-ui');
|
|
108
|
+
if (!fs_1.default.existsSync(solidUiDir)) {
|
|
109
|
+
throw new Error(`Required folder not found: ${solidUiDir}`);
|
|
110
|
+
}
|
|
111
|
+
console.log('▶ Building solid-ui');
|
|
112
|
+
exec('npm run build', solidUiDir);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
console.log('▶ Building solid-api');
|
|
116
|
+
exec('npm run build', `${projectRoot}/solid-api`);
|
|
117
|
+
console.log('▶ Ensuring CLI files are executable');
|
|
118
|
+
const mainCli = path_1.default.join(projectRoot, 'solid-api', 'dist', 'main-cli.js');
|
|
119
|
+
chmodIfExists(mainCli);
|
|
120
|
+
console.log('▶ Updating solid CLI shim');
|
|
121
|
+
const shimFiles = ensureSolidShim(mainCli);
|
|
122
|
+
console.log('▶ Linking solid CLI for global use');
|
|
123
|
+
const linkResult = ensureGlobalSolid(shimFiles, shimFiles.solidctlBinDir);
|
|
124
|
+
if (!linkResult.linked) {
|
|
125
|
+
console.warn(`⚠️ Add ${shimFiles.solidctlBinDir} to PATH to use "solid" globally.`);
|
|
126
|
+
}
|
|
127
|
+
console.log('▶ Adding local bin to PATH');
|
|
128
|
+
process.env.PATH = `${shimFiles.solidctlBinDir}${path_1.default.delimiter}${process.env.PATH || ''}`;
|
|
129
|
+
console.log('▶ Verifying solid CLI availability');
|
|
130
|
+
const solidCommand = process.platform === 'win32' ? 'solid.cmd' : 'solid';
|
|
131
|
+
const result = (0, child_process_1.spawnSync)(solidCommand, ['--help'], {
|
|
132
|
+
stdio: 'ignore',
|
|
133
|
+
env: process.env,
|
|
134
|
+
shell: process.platform === 'win32' ? true : false,
|
|
135
|
+
});
|
|
136
|
+
if (result.error) {
|
|
137
|
+
console.error('❌ solid CLI not found');
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
console.log('✔ solid CLI ready');
|
|
141
|
+
}
|
|
104
142
|
function registerBuildCommand(program) {
|
|
105
143
|
program
|
|
106
144
|
.command('build')
|
|
@@ -108,42 +146,7 @@ function registerBuildCommand(program) {
|
|
|
108
146
|
.option('--ui-only', 'Build only solid-ui and skip solid-api build')
|
|
109
147
|
.action((options) => {
|
|
110
148
|
(0, helper_1.validateProjectRoot)();
|
|
111
|
-
|
|
112
|
-
if (options.uiOnly) {
|
|
113
|
-
const solidUiDir = path_1.default.join(projectRoot, 'solid-ui');
|
|
114
|
-
if (!fs_1.default.existsSync(solidUiDir)) {
|
|
115
|
-
throw new Error(`Required folder not found: ${solidUiDir}`);
|
|
116
|
-
}
|
|
117
|
-
console.log('▶ Building solid-ui');
|
|
118
|
-
exec('npm run build', solidUiDir);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
console.log('▶ Building solid-api');
|
|
122
|
-
exec('npm run build', `${projectRoot}/solid-api`);
|
|
123
|
-
console.log('▶ Ensuring CLI files are executable');
|
|
124
|
-
const mainCli = path_1.default.join(projectRoot, 'solid-api', 'dist', 'main-cli.js');
|
|
125
|
-
chmodIfExists(mainCli);
|
|
126
|
-
console.log('▶ Updating solid CLI shim');
|
|
127
|
-
const shimFiles = ensureSolidShim(mainCli);
|
|
128
|
-
console.log('▶ Linking solid CLI for global use');
|
|
129
|
-
const linkResult = ensureGlobalSolid(shimFiles, shimFiles.solidctlBinDir);
|
|
130
|
-
if (!linkResult.linked) {
|
|
131
|
-
console.warn(`⚠️ Add ${shimFiles.solidctlBinDir} to PATH to use "solid" globally.`);
|
|
132
|
-
}
|
|
133
|
-
console.log('▶ Adding local bin to PATH');
|
|
134
|
-
process.env.PATH = `${shimFiles.solidctlBinDir}${path_1.default.delimiter}${process.env.PATH || ''}`;
|
|
135
|
-
console.log('▶ Verifying solid CLI availability');
|
|
136
|
-
const solidCommand = process.platform === 'win32' ? 'solid.cmd' : 'solid';
|
|
137
|
-
const result = (0, child_process_1.spawnSync)(solidCommand, ['--help'], {
|
|
138
|
-
stdio: 'ignore',
|
|
139
|
-
env: process.env,
|
|
140
|
-
shell: process.platform === 'win32' ? true : false,
|
|
141
|
-
});
|
|
142
|
-
if (result.error) {
|
|
143
|
-
console.error('❌ solid CLI not found');
|
|
144
|
-
process.exit(1);
|
|
145
|
-
}
|
|
146
|
-
console.log('✔ solid CLI ready');
|
|
149
|
+
runBuild(process.cwd(), options);
|
|
147
150
|
});
|
|
148
151
|
}
|
|
149
152
|
//# sourceMappingURL=build.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.command.js","sourceRoot":"","sources":["../../src/commands/build.command.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"build.command.js","sourceRoot":"","sources":["../../src/commands/build.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSeed = runSeed;
|
|
3
4
|
exports.registerSeedCommand = registerSeedCommand;
|
|
4
5
|
const child_process_1 = require("child_process");
|
|
5
6
|
const helper_1 = require("../helper");
|
|
7
|
+
function runSeed(projectRoot, passthroughArgs = []) {
|
|
8
|
+
const solidApiDir = `${projectRoot}/solid-api`;
|
|
9
|
+
const args = ['seed', ...passthroughArgs];
|
|
10
|
+
const solidCommand = process.platform === 'win32' ? 'solid.cmd' : 'solid';
|
|
11
|
+
const result = (0, child_process_1.spawnSync)(solidCommand, args, {
|
|
12
|
+
cwd: solidApiDir,
|
|
13
|
+
stdio: 'inherit',
|
|
14
|
+
env: (0, helper_1.getSolidCommandEnv)(),
|
|
15
|
+
shell: process.platform === 'win32' ? true : false,
|
|
16
|
+
});
|
|
17
|
+
if (result.error) {
|
|
18
|
+
console.error('❌ Failed to run solid seed:', result.error.message);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
if (result.status !== 0) {
|
|
22
|
+
console.error('❌ solid seed exited with code', result.status);
|
|
23
|
+
process.exit(result.status ?? 1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
6
26
|
function registerSeedCommand(program) {
|
|
7
27
|
program
|
|
8
28
|
.command('seed')
|
|
@@ -12,27 +32,10 @@ function registerSeedCommand(program) {
|
|
|
12
32
|
.allowExcessArguments(true)
|
|
13
33
|
.action((_options, command) => {
|
|
14
34
|
(0, helper_1.validateProjectRoot)();
|
|
15
|
-
const projectRoot = process.cwd();
|
|
16
|
-
const solidApiDir = `${projectRoot}/solid-api`;
|
|
17
35
|
const rawArgs = command.parent ? command.parent.rawArgs : process.argv;
|
|
18
36
|
const seedIndex = rawArgs.lastIndexOf('seed');
|
|
19
37
|
const passthroughArgs = seedIndex >= 0 ? rawArgs.slice(seedIndex + 1) : [];
|
|
20
|
-
|
|
21
|
-
const solidCommand = process.platform === 'win32' ? 'solid.cmd' : 'solid';
|
|
22
|
-
const result = (0, child_process_1.spawnSync)(solidCommand, args, {
|
|
23
|
-
cwd: solidApiDir,
|
|
24
|
-
stdio: 'inherit',
|
|
25
|
-
env: (0, helper_1.getSolidCommandEnv)(),
|
|
26
|
-
shell: process.platform === 'win32' ? true : false,
|
|
27
|
-
});
|
|
28
|
-
if (result.error) {
|
|
29
|
-
console.error('❌ Failed to run solid seed:', result.error.message);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
if (result.status !== 0) {
|
|
33
|
-
console.error('❌ solid seed exited with code', result.status);
|
|
34
|
-
process.exit(result.status ?? 1);
|
|
35
|
-
}
|
|
38
|
+
runSeed(process.cwd(), passthroughArgs);
|
|
36
39
|
});
|
|
37
40
|
}
|
|
38
41
|
//# sourceMappingURL=seed.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.command.js","sourceRoot":"","sources":["../../src/commands/seed.command.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"seed.command.js","sourceRoot":"","sources":["../../src/commands/seed.command.ts"],"names":[],"mappings":";;AAUA,0BAqBC;AAED,kDAgBC;AAhDD,iDAA0C;AAC1C,sCAAoE;AAQpE,SAAgB,OAAO,CAAC,WAAmB,EAAE,kBAA4B,EAAE;IACzE,MAAM,WAAW,GAAG,GAAG,WAAW,YAAY,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,YAAY,EAAE,IAAI,EAAE;QAC3C,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,IAAA,2BAAkB,GAAE;QACzB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;KACnD,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0DAA0D,CAAC;SACvE,UAAU,CAAC,KAAK,CAAC;SACjB,kBAAkB,CAAC,IAAI,CAAC;SACxB,oBAAoB,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC5B,IAAA,4BAAmB,GAAE,CAAC;QAEtB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACvE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3E,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SetupAnswers } from '../create-app/setup-questions';
|
|
2
|
+
import { SetupProjectAnswers } from './setup-questions';
|
|
3
|
+
export interface MinimalPackageJson {
|
|
4
|
+
name?: string;
|
|
5
|
+
scripts?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function inferProjectName(apiPackageJson: MinimalPackageJson | undefined, cwd: string): string;
|
|
8
|
+
export declare function inferUiPort(uiPackageJson: MinimalPackageJson | undefined): string;
|
|
9
|
+
export declare function parseEnvFile(content: string): Record<string, string>;
|
|
10
|
+
export declare function isSecretKey(key: string): boolean;
|
|
11
|
+
export declare const GENERATED_SECRET_KEYS: Set<string>;
|
|
12
|
+
export declare function isGeneratedSecretKey(key: string): boolean;
|
|
13
|
+
export declare const DB_ENV_KEYS: {
|
|
14
|
+
readonly host: "DEFAULT_DATABASE_HOST";
|
|
15
|
+
readonly port: "DEFAULT_DATABASE_PORT";
|
|
16
|
+
readonly name: "DEFAULT_DATABASE_NAME";
|
|
17
|
+
readonly username: "DEFAULT_DATABASE_USER";
|
|
18
|
+
readonly password: "DEFAULT_DATABASE_PASSWORD";
|
|
19
|
+
};
|
|
20
|
+
export type DbField = keyof typeof DB_ENV_KEYS | 'client';
|
|
21
|
+
export declare function toDbTypeEnvValue(client: string): 'postgres' | 'mysql' | 'mssql';
|
|
22
|
+
export declare function fromDbTypeEnvValue(raw: string | undefined): string | null;
|
|
23
|
+
export declare function defaultDbPortForClient(client: string): string;
|
|
24
|
+
export declare function buildDatabaseUrl(answers: SetupProjectAnswers): string;
|
|
25
|
+
export interface EnvExamplePlan {
|
|
26
|
+
parsed: Record<string, string>;
|
|
27
|
+
promptDbFields: DbField[];
|
|
28
|
+
otherBlankKeys: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare function planEnvFromExample(exampleContent: string): EnvExamplePlan;
|
|
31
|
+
export type EnvPlan = {
|
|
32
|
+
action: 'skip-existing';
|
|
33
|
+
} | {
|
|
34
|
+
action: 'from-example';
|
|
35
|
+
promptDbFields: DbField[];
|
|
36
|
+
otherBlankKeys: string[];
|
|
37
|
+
parsed: Record<string, string>;
|
|
38
|
+
} | {
|
|
39
|
+
action: 'prompt-full';
|
|
40
|
+
};
|
|
41
|
+
export declare function planEnvWrite(opts: {
|
|
42
|
+
envExists: boolean;
|
|
43
|
+
exampleContent: string | null;
|
|
44
|
+
forceEnv: boolean;
|
|
45
|
+
}): EnvPlan;
|
|
46
|
+
export declare function resolveAnswersFromExample(parsed: Record<string, string>, prompted: Partial<SetupProjectAnswers>): SetupProjectAnswers;
|
|
47
|
+
export declare function toCreateAppAnswers(answers: SetupProjectAnswers, inferred: {
|
|
48
|
+
projectName: string;
|
|
49
|
+
apiPort: string;
|
|
50
|
+
uiPort: string;
|
|
51
|
+
}): SetupAnswers;
|
|
52
|
+
export declare function properAppNameFor(projectName: string): string;
|
|
53
|
+
export declare function generateJwtSecret(): string;
|
|
54
|
+
export declare function buildEnvFromExample(exampleContent: string, overrides: Record<string, string>): string;
|
|
@@ -0,0 +1,210 @@
|
|
|
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.DB_ENV_KEYS = exports.GENERATED_SECRET_KEYS = void 0;
|
|
7
|
+
exports.inferProjectName = inferProjectName;
|
|
8
|
+
exports.inferUiPort = inferUiPort;
|
|
9
|
+
exports.parseEnvFile = parseEnvFile;
|
|
10
|
+
exports.isSecretKey = isSecretKey;
|
|
11
|
+
exports.isGeneratedSecretKey = isGeneratedSecretKey;
|
|
12
|
+
exports.toDbTypeEnvValue = toDbTypeEnvValue;
|
|
13
|
+
exports.fromDbTypeEnvValue = fromDbTypeEnvValue;
|
|
14
|
+
exports.defaultDbPortForClient = defaultDbPortForClient;
|
|
15
|
+
exports.buildDatabaseUrl = buildDatabaseUrl;
|
|
16
|
+
exports.planEnvFromExample = planEnvFromExample;
|
|
17
|
+
exports.planEnvWrite = planEnvWrite;
|
|
18
|
+
exports.resolveAnswersFromExample = resolveAnswersFromExample;
|
|
19
|
+
exports.toCreateAppAnswers = toCreateAppAnswers;
|
|
20
|
+
exports.properAppNameFor = properAppNameFor;
|
|
21
|
+
exports.generateJwtSecret = generateJwtSecret;
|
|
22
|
+
exports.buildEnvFromExample = buildEnvFromExample;
|
|
23
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
24
|
+
const lodash_1 = require("lodash");
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
const setup_questions_1 = require("./setup-questions");
|
|
27
|
+
function inferProjectName(apiPackageJson, cwd) {
|
|
28
|
+
const scopedMatch = /^@([^/]+)\//.exec(apiPackageJson?.name ?? '');
|
|
29
|
+
if (scopedMatch) {
|
|
30
|
+
return scopedMatch[1];
|
|
31
|
+
}
|
|
32
|
+
return (0, lodash_1.kebabCase)(path_1.default.basename(cwd));
|
|
33
|
+
}
|
|
34
|
+
function inferUiPort(uiPackageJson) {
|
|
35
|
+
const devScript = uiPackageJson?.scripts?.dev ?? '';
|
|
36
|
+
const match = /(?:^|\s)--port\s+(\d{1,5})(?:\s|$)/.exec(devScript);
|
|
37
|
+
return match ? match[1] : '5173';
|
|
38
|
+
}
|
|
39
|
+
function parseEnvFile(content) {
|
|
40
|
+
const result = {};
|
|
41
|
+
for (const rawLine of content.split(/\r?\n/)) {
|
|
42
|
+
const line = rawLine.trim();
|
|
43
|
+
if (!line || line.startsWith('#')) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const eqIndex = line.indexOf('=');
|
|
47
|
+
if (eqIndex < 0) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const key = line.slice(0, eqIndex).trim();
|
|
51
|
+
const value = line
|
|
52
|
+
.slice(eqIndex + 1)
|
|
53
|
+
.trim()
|
|
54
|
+
.replace(/^['"]|['"]$/g, '');
|
|
55
|
+
if (key) {
|
|
56
|
+
result[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
function isSecretKey(key) {
|
|
62
|
+
return /(_PASSWORD|_SECRET)$/i.test(key);
|
|
63
|
+
}
|
|
64
|
+
exports.GENERATED_SECRET_KEYS = new Set([
|
|
65
|
+
'IAM_JWT_SECRET',
|
|
66
|
+
'NEXTAUTH_SECRET',
|
|
67
|
+
]);
|
|
68
|
+
function isGeneratedSecretKey(key) {
|
|
69
|
+
return exports.GENERATED_SECRET_KEYS.has(key);
|
|
70
|
+
}
|
|
71
|
+
exports.DB_ENV_KEYS = {
|
|
72
|
+
host: 'DEFAULT_DATABASE_HOST',
|
|
73
|
+
port: 'DEFAULT_DATABASE_PORT',
|
|
74
|
+
name: 'DEFAULT_DATABASE_NAME',
|
|
75
|
+
username: 'DEFAULT_DATABASE_USER',
|
|
76
|
+
password: 'DEFAULT_DATABASE_PASSWORD',
|
|
77
|
+
};
|
|
78
|
+
function toDbTypeEnvValue(client) {
|
|
79
|
+
if (client === 'MySQL')
|
|
80
|
+
return 'mysql';
|
|
81
|
+
if (client === 'MSSQL')
|
|
82
|
+
return 'mssql';
|
|
83
|
+
return 'postgres';
|
|
84
|
+
}
|
|
85
|
+
function fromDbTypeEnvValue(raw) {
|
|
86
|
+
switch ((raw ?? '').trim().toLowerCase()) {
|
|
87
|
+
case 'mysql':
|
|
88
|
+
return 'MySQL';
|
|
89
|
+
case 'mssql':
|
|
90
|
+
return 'MSSQL';
|
|
91
|
+
case 'postgres':
|
|
92
|
+
case 'postgresql':
|
|
93
|
+
return 'PostgreSQL';
|
|
94
|
+
default:
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function defaultDbPortForClient(client) {
|
|
99
|
+
if (client === 'MySQL')
|
|
100
|
+
return setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabasePortMysql;
|
|
101
|
+
if (client === 'MSSQL')
|
|
102
|
+
return setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabasePortMssql;
|
|
103
|
+
return setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabasePortPostgres;
|
|
104
|
+
}
|
|
105
|
+
function buildDatabaseUrl(answers) {
|
|
106
|
+
const dbType = toDbTypeEnvValue(answers.solidApiDatabaseClient);
|
|
107
|
+
const { solidApiDatabaseHost: host, solidApiDatabasePort: port, solidApiDatabaseUsername: user, solidApiDatabasePassword: password, solidApiDatabaseName: name, } = answers;
|
|
108
|
+
const encodedPassword = password ? `:${encodeURIComponent(password)}` : '';
|
|
109
|
+
if (dbType === 'mssql') {
|
|
110
|
+
return `mssql+pyodbc://${user}${encodedPassword}@${host}:${port}/${name}?driver=ODBC+Driver+18+for+SQL+Server&TrustServerCertificate=yes&Encrypt=no`;
|
|
111
|
+
}
|
|
112
|
+
if (dbType === 'mysql') {
|
|
113
|
+
return `mysql+pymysql://${user}${encodedPassword}@${host}:${port}/${name}`;
|
|
114
|
+
}
|
|
115
|
+
return `postgresql://${user}${encodedPassword}@${host}:${port}/${name}`;
|
|
116
|
+
}
|
|
117
|
+
function planEnvFromExample(exampleContent) {
|
|
118
|
+
const parsed = parseEnvFile(exampleContent);
|
|
119
|
+
const dbEnvKeySet = new Set(Object.values(exports.DB_ENV_KEYS));
|
|
120
|
+
const promptDbFields = [];
|
|
121
|
+
if (fromDbTypeEnvValue(parsed.SOLID_CORE_DB_TYPE) === null) {
|
|
122
|
+
promptDbFields.push('client');
|
|
123
|
+
}
|
|
124
|
+
for (const [field, envKey] of Object.entries(exports.DB_ENV_KEYS)) {
|
|
125
|
+
const value = parsed[envKey];
|
|
126
|
+
const isBlank = value === undefined || value === '';
|
|
127
|
+
if (isBlank || isSecretKey(envKey)) {
|
|
128
|
+
promptDbFields.push(field);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const otherBlankKeys = Object.entries(parsed)
|
|
132
|
+
.filter(([key, value]) => value === '' && !isGeneratedSecretKey(key) && !dbEnvKeySet.has(key))
|
|
133
|
+
.map(([key]) => key);
|
|
134
|
+
return { parsed, promptDbFields, otherBlankKeys };
|
|
135
|
+
}
|
|
136
|
+
function planEnvWrite(opts) {
|
|
137
|
+
if (opts.envExists && !opts.forceEnv) {
|
|
138
|
+
return { action: 'skip-existing' };
|
|
139
|
+
}
|
|
140
|
+
if (opts.exampleContent !== null) {
|
|
141
|
+
const { parsed, promptDbFields, otherBlankKeys } = planEnvFromExample(opts.exampleContent);
|
|
142
|
+
return { action: 'from-example', promptDbFields, otherBlankKeys, parsed };
|
|
143
|
+
}
|
|
144
|
+
return { action: 'prompt-full' };
|
|
145
|
+
}
|
|
146
|
+
function resolveAnswersFromExample(parsed, prompted) {
|
|
147
|
+
const client = prompted.solidApiDatabaseClient ??
|
|
148
|
+
fromDbTypeEnvValue(parsed.SOLID_CORE_DB_TYPE) ??
|
|
149
|
+
setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabaseClient;
|
|
150
|
+
return {
|
|
151
|
+
solidApiDatabaseClient: client,
|
|
152
|
+
solidApiDatabaseHost: prompted.solidApiDatabaseHost ??
|
|
153
|
+
parsed[exports.DB_ENV_KEYS.host] ??
|
|
154
|
+
setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabaseHost,
|
|
155
|
+
solidApiDatabasePort: prompted.solidApiDatabasePort ??
|
|
156
|
+
parsed[exports.DB_ENV_KEYS.port] ??
|
|
157
|
+
defaultDbPortForClient(client),
|
|
158
|
+
solidApiDatabaseName: prompted.solidApiDatabaseName ??
|
|
159
|
+
parsed[exports.DB_ENV_KEYS.name] ??
|
|
160
|
+
setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabaseName,
|
|
161
|
+
solidApiDatabaseUsername: prompted.solidApiDatabaseUsername ??
|
|
162
|
+
parsed[exports.DB_ENV_KEYS.username] ??
|
|
163
|
+
setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabaseUsername,
|
|
164
|
+
solidApiDatabasePassword: prompted.solidApiDatabasePassword ??
|
|
165
|
+
parsed[exports.DB_ENV_KEYS.password] ??
|
|
166
|
+
setup_questions_1.SETUP_DB_DEFAULTS.solidApiDatabasePassword,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function toCreateAppAnswers(answers, inferred) {
|
|
170
|
+
return {
|
|
171
|
+
projectName: inferred.projectName,
|
|
172
|
+
solidxVersion: 'stable',
|
|
173
|
+
solidApiPort: inferred.apiPort,
|
|
174
|
+
solidApiDatabaseClient: answers.solidApiDatabaseClient,
|
|
175
|
+
solidApiDatabaseHost: answers.solidApiDatabaseHost,
|
|
176
|
+
solidApiDatabasePort: answers.solidApiDatabasePort,
|
|
177
|
+
solidApiDatabaseName: answers.solidApiDatabaseName,
|
|
178
|
+
solidApiDatabaseUsername: answers.solidApiDatabaseUsername,
|
|
179
|
+
solidApiDatabasePassword: answers.solidApiDatabasePassword,
|
|
180
|
+
solidApiDatabaseSynchronize: 'Yes',
|
|
181
|
+
databaseExists: 'Yes',
|
|
182
|
+
solidUiPort: inferred.uiPort,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function properAppNameFor(projectName) {
|
|
186
|
+
return (0, lodash_1.startCase)(projectName);
|
|
187
|
+
}
|
|
188
|
+
function generateJwtSecret() {
|
|
189
|
+
return crypto_1.default.randomBytes(64).toString('hex');
|
|
190
|
+
}
|
|
191
|
+
function buildEnvFromExample(exampleContent, overrides) {
|
|
192
|
+
const parsed = parseEnvFile(exampleContent);
|
|
193
|
+
let content = exampleContent;
|
|
194
|
+
const setInline = (key, value) => {
|
|
195
|
+
const pattern = new RegExp(`^${key}=.*$`, 'm');
|
|
196
|
+
content = pattern.test(content)
|
|
197
|
+
? content.replace(pattern, `${key}=${value}`)
|
|
198
|
+
: `${content}${content.endsWith('\n') ? '' : '\n'}${key}=${value}\n`;
|
|
199
|
+
};
|
|
200
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
201
|
+
if (isGeneratedSecretKey(key) && value === '' && !(key in overrides)) {
|
|
202
|
+
setInline(key, generateJwtSecret());
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
206
|
+
setInline(key, value);
|
|
207
|
+
}
|
|
208
|
+
return content;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/commands/setup/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface SetupProjectAnswers {
|
|
2
|
+
solidApiDatabaseClient: string;
|
|
3
|
+
solidApiDatabaseHost: string;
|
|
4
|
+
solidApiDatabasePort: string;
|
|
5
|
+
solidApiDatabaseName: string;
|
|
6
|
+
solidApiDatabaseUsername: string;
|
|
7
|
+
solidApiDatabasePassword: string;
|
|
8
|
+
}
|
|
9
|
+
export declare const SETUP_DB_DEFAULTS: {
|
|
10
|
+
readonly solidApiDatabaseClient: "PostgreSQL";
|
|
11
|
+
readonly solidApiDatabaseHost: "localhost";
|
|
12
|
+
readonly solidApiDatabasePortPostgres: "5432";
|
|
13
|
+
readonly solidApiDatabasePortMssql: "1433";
|
|
14
|
+
readonly solidApiDatabasePortMysql: "3306";
|
|
15
|
+
readonly solidApiDatabaseName: "solidx_app_db";
|
|
16
|
+
readonly solidApiDatabaseUsername: "solidx_app_user";
|
|
17
|
+
readonly solidApiDatabasePassword: "strongpassword";
|
|
18
|
+
};
|
|
19
|
+
export declare const setupDbQuestions: ({
|
|
20
|
+
type: string;
|
|
21
|
+
name: string;
|
|
22
|
+
message: string;
|
|
23
|
+
choices: ("PostgreSQL" | "MySQL" | "MSSQL")[];
|
|
24
|
+
default: "PostgreSQL";
|
|
25
|
+
} | {
|
|
26
|
+
type: string;
|
|
27
|
+
name: string;
|
|
28
|
+
message: string;
|
|
29
|
+
default: "localhost";
|
|
30
|
+
choices?: undefined;
|
|
31
|
+
} | {
|
|
32
|
+
type: string;
|
|
33
|
+
name: string;
|
|
34
|
+
message: string;
|
|
35
|
+
default: (answers: SetupProjectAnswers) => "5432" | "1433" | "3306";
|
|
36
|
+
choices?: undefined;
|
|
37
|
+
} | {
|
|
38
|
+
type: string;
|
|
39
|
+
name: string;
|
|
40
|
+
message: string;
|
|
41
|
+
default: "solidx_app_db";
|
|
42
|
+
choices?: undefined;
|
|
43
|
+
} | {
|
|
44
|
+
type: string;
|
|
45
|
+
name: string;
|
|
46
|
+
message: string;
|
|
47
|
+
default: "solidx_app_user";
|
|
48
|
+
choices?: undefined;
|
|
49
|
+
} | {
|
|
50
|
+
type: string;
|
|
51
|
+
name: string;
|
|
52
|
+
message: string;
|
|
53
|
+
default: "strongpassword";
|
|
54
|
+
choices?: undefined;
|
|
55
|
+
})[];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setupDbQuestions = exports.SETUP_DB_DEFAULTS = void 0;
|
|
4
|
+
const setup_questions_1 = require("../create-app/setup-questions");
|
|
5
|
+
exports.SETUP_DB_DEFAULTS = {
|
|
6
|
+
solidApiDatabaseClient: 'PostgreSQL',
|
|
7
|
+
solidApiDatabaseHost: 'localhost',
|
|
8
|
+
solidApiDatabasePortPostgres: '5432',
|
|
9
|
+
solidApiDatabasePortMssql: '1433',
|
|
10
|
+
solidApiDatabasePortMysql: '3306',
|
|
11
|
+
solidApiDatabaseName: 'solidx_app_db',
|
|
12
|
+
solidApiDatabaseUsername: 'solidx_app_user',
|
|
13
|
+
solidApiDatabasePassword: 'strongpassword',
|
|
14
|
+
};
|
|
15
|
+
exports.setupDbQuestions = [
|
|
16
|
+
{
|
|
17
|
+
type: 'list',
|
|
18
|
+
name: 'solidApiDatabaseClient',
|
|
19
|
+
message: 'Select your database?',
|
|
20
|
+
choices: [...setup_questions_1.DATABASE_CLIENTS],
|
|
21
|
+
default: exports.SETUP_DB_DEFAULTS.solidApiDatabaseClient,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: 'input',
|
|
25
|
+
name: 'solidApiDatabaseHost',
|
|
26
|
+
message: 'Enter your database host',
|
|
27
|
+
default: exports.SETUP_DB_DEFAULTS.solidApiDatabaseHost,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: 'input',
|
|
31
|
+
name: 'solidApiDatabasePort',
|
|
32
|
+
message: 'Enter your database port',
|
|
33
|
+
default: (answers) => {
|
|
34
|
+
if (answers.solidApiDatabaseClient === 'PostgreSQL')
|
|
35
|
+
return exports.SETUP_DB_DEFAULTS.solidApiDatabasePortPostgres;
|
|
36
|
+
if (answers.solidApiDatabaseClient === 'MySQL')
|
|
37
|
+
return exports.SETUP_DB_DEFAULTS.solidApiDatabasePortMysql;
|
|
38
|
+
return exports.SETUP_DB_DEFAULTS.solidApiDatabasePortMssql;
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: 'input',
|
|
43
|
+
name: 'solidApiDatabaseName',
|
|
44
|
+
message: 'Enter your database name',
|
|
45
|
+
default: exports.SETUP_DB_DEFAULTS.solidApiDatabaseName,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
type: 'input',
|
|
49
|
+
name: 'solidApiDatabaseUsername',
|
|
50
|
+
message: 'Enter your database username',
|
|
51
|
+
default: exports.SETUP_DB_DEFAULTS.solidApiDatabaseUsername,
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'password',
|
|
55
|
+
name: 'solidApiDatabasePassword',
|
|
56
|
+
message: 'Enter your database password',
|
|
57
|
+
default: exports.SETUP_DB_DEFAULTS.solidApiDatabasePassword,
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
//# sourceMappingURL=setup-questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-questions.js","sourceRoot":"","sources":["../../../src/commands/setup/setup-questions.ts"],"names":[],"mappings":";;;AAAA,mEAAiE;AAYpD,QAAA,iBAAiB,GAAG;IAC/B,sBAAsB,EAAE,YAAY;IACpC,oBAAoB,EAAE,WAAW;IACjC,4BAA4B,EAAE,MAAM;IACpC,yBAAyB,EAAE,MAAM;IACjC,yBAAyB,EAAE,MAAM;IACjC,oBAAoB,EAAE,eAAe;IACrC,wBAAwB,EAAE,iBAAiB;IAC3C,wBAAwB,EAAE,gBAAgB;CAClC,CAAC;AAOE,QAAA,gBAAgB,GAAG;IAC9B;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,CAAC,GAAG,kCAAgB,CAAC;QAC9B,OAAO,EAAE,yBAAiB,CAAC,sBAAsB;KAClD;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,yBAAiB,CAAC,oBAAoB;KAChD;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,CAAC,OAA4B,EAAE,EAAE;YACxC,IAAI,OAAO,CAAC,sBAAsB,KAAK,YAAY;gBACjD,OAAO,yBAAiB,CAAC,4BAA4B,CAAC;YACxD,IAAI,OAAO,CAAC,sBAAsB,KAAK,OAAO;gBAC5C,OAAO,yBAAiB,CAAC,yBAAyB,CAAC;YACrD,OAAO,yBAAiB,CAAC,yBAAyB,CAAC;QACrD,CAAC;KACF;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,0BAA0B;QACnC,OAAO,EAAE,yBAAiB,CAAC,oBAAoB;KAChD;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,yBAAiB,CAAC,wBAAwB;KACpD;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,8BAA8B;QACvC,OAAO,EAAE,yBAAiB,CAAC,wBAAwB;KACpD;CACF,CAAC"}
|