Skip to content

Commit 5c9abdb

Browse files
committed
Ready for V2
1 parent a1aff3b commit 5c9abdb

File tree

9 files changed

+1192
-289
lines changed

9 files changed

+1192
-289
lines changed

src/index.ts

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
cancel,
1212
} from "@clack/prompts";
1313
import { detectStrapiProject } from "./utils/detection";
14-
import { runDockerizeWizard } from "./wizard";
14+
import { runWizard } from "./wizard";
1515
import { generatePluginCommand } from "./utils/plugin-generator";
1616
import { runPluginTests } from "./utils/plugin-tester";
1717
import { discoverPlugins, listDatabasePlugins } from "./plugins";
@@ -50,36 +50,8 @@ async function main() {
5050
}
5151
}
5252

53-
// Main dockerize flow
54-
intro("🐳 Strapi Dockerize v2");
55-
56-
const project = await detectStrapiProject();
57-
58-
if (!project.isStrapi) {
59-
outro("❌ This doesn't appear to be a Strapi project.");
60-
process.exit(1);
61-
}
62-
63-
// Show project details in a nice note
64-
const projectInfo = [
65-
`📦 Project: ${project.name}`,
66-
`🚀 Strapi Version: ${project.version || "unknown"}`,
67-
`📋 Package Manager: ${project.packageManager.toUpperCase()}`,
68-
`🔧 Language: ${
69-
project.type === "typescript" ? "TypeScript" : "JavaScript"
70-
}`,
71-
];
72-
73-
note(projectInfo.join("\n"), "✅ Project detected");
74-
75-
await runDockerizeWizard(project);
76-
77-
outro("🎉 Docker setup complete!");
78-
79-
note(
80-
"💙 Thanks for using Strapi Dockerize!\n\n⭐ If this tool helped you, please star it on GitHub:\n https://github.com/strapi-community/strapi-tool-dockerize\n\n🐛 Found an issue? Report it:\n https://github.com/strapi-community/strapi-tool-dockerize/issues",
81-
"Support the project"
82-
);
53+
// Main dockerize flow - now simplified since runWizard handles everything
54+
await runWizard();
8355
}
8456

8557
async function testPluginsCommand() {

src/plugins/databases/mariadb/questions.ts

Lines changed: 90 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,70 @@
1-
import { text, select, password } from "@clack/prompts";
1+
import { text, select, password, note } from "@clack/prompts";
2+
3+
export async function questions(defaults?: {
4+
databaseName?: string;
5+
databaseUser?: string;
6+
databasePassword?: string;
7+
databaseHost?: string;
8+
databasePort?: number;
9+
}) {
10+
// Generate secure random defaults if not provided
11+
const randomDefaults = {
12+
databaseName: defaults?.databaseName || generateRandomName("db"),
13+
databaseUser: defaults?.databaseUser || generateRandomName("user"),
14+
databasePassword: defaults?.databasePassword || generateSecurePassword(),
15+
databaseHost: defaults?.databaseHost || "localhost",
16+
databasePort: defaults?.databasePort || 3306,
17+
};
218

3-
export async function questions() {
419
const dbName = await text({
520
message: "Database name (press Enter for default):",
6-
placeholder: "strapi",
7-
defaultValue: "strapi",
21+
placeholder: randomDefaults.databaseName,
822
validate: (value) => {
9-
const val = value || "strapi";
23+
const val =
24+
(typeof value === "string" ? value.trim() : "") ||
25+
randomDefaults.databaseName;
1026
if (!/^[a-zA-Z0-9_-]+$/.test(val)) {
1127
return "Database name can only contain letters, numbers, underscores and hyphens";
1228
}
1329
},
1430
});
1531

32+
const finalDbName =
33+
(typeof dbName === "string" ? dbName.trim() : "") ||
34+
randomDefaults.databaseName;
35+
1636
const dbUser = await text({
1737
message: "Database user (press Enter for default):",
18-
placeholder: "strapi",
19-
defaultValue: "strapi",
38+
placeholder: randomDefaults.databaseUser,
2039
validate: (value) => {
21-
const val = value || "strapi";
40+
const val =
41+
(typeof value === "string" ? value.trim() : "") ||
42+
randomDefaults.databaseUser;
2243
if (!/^[a-zA-Z0-9_-]+$/.test(val)) {
2344
return "Username can only contain letters, numbers, underscores and hyphens";
2445
}
2546
},
2647
});
2748

49+
const finalDbUser =
50+
(typeof dbUser === "string" ? dbUser.trim() : "") ||
51+
randomDefaults.databaseUser;
52+
53+
// Show what defaults were used if user left fields blank
54+
const dbNameEmpty = !dbName || (typeof dbName === "string" && !dbName.trim());
55+
const dbUserEmpty = !dbUser || (typeof dbUser === "string" && !dbUser.trim());
56+
57+
if (dbNameEmpty || dbUserEmpty) {
58+
const usedDefaults = [];
59+
if (dbNameEmpty) usedDefaults.push(`Database: ${finalDbName}`);
60+
if (dbUserEmpty) usedDefaults.push(`User: ${finalDbUser}`);
61+
62+
note(
63+
`Generated secure defaults:\n${usedDefaults.join("\n")}`,
64+
"Auto-generated Values"
65+
);
66+
}
67+
2868
const passwordType = await select({
2969
message: "How would you like to set the database password?",
3070
options: [
@@ -48,16 +88,17 @@ export async function questions() {
4888
},
4989
})) as string;
5090
} else {
51-
dbPassword = generateSecurePassword();
52-
console.log(`🔐 Generated password: ${dbPassword}`);
91+
dbPassword = randomDefaults.databasePassword;
92+
console.log(`🔐 Using secure password: ${dbPassword.substring(0, 4)}...`);
5393
}
5494

5595
const dbPort = await text({
5696
message: "Database port (press Enter for default):",
57-
placeholder: "3306",
58-
defaultValue: "3306",
97+
placeholder: String(randomDefaults.databasePort),
5998
validate: (value) => {
60-
const val = value || "3306";
99+
const val =
100+
(typeof value === "string" ? value.trim() : "") ||
101+
String(randomDefaults.databasePort);
61102
const port = parseInt(val);
62103
if (isNaN(port)) return "Port must be a number";
63104
if (port < 1024 || port > 65535)
@@ -66,14 +107,46 @@ export async function questions() {
66107
});
67108

68109
return {
69-
name: dbName || "strapi",
70-
user: dbUser || "strapi",
110+
name: finalDbName,
111+
user: finalDbUser,
71112
password: dbPassword,
72-
port: parseInt((dbPort as string) || "3306"),
73-
host: "localhost",
113+
port: parseInt(
114+
(typeof dbPort === "string" ? dbPort.trim() : "") ||
115+
String(randomDefaults.databasePort)
116+
),
117+
host: randomDefaults.databaseHost,
74118
};
75119
}
76120

121+
function generateRandomName(prefix: string): string {
122+
const adjectives = [
123+
"swift",
124+
"bright",
125+
"cosmic",
126+
"noble",
127+
"mystic",
128+
"lunar",
129+
"solar",
130+
"crystal",
131+
];
132+
const nouns = [
133+
"falcon",
134+
"phoenix",
135+
"dragon",
136+
"tiger",
137+
"eagle",
138+
"wolf",
139+
"bear",
140+
"lion",
141+
];
142+
143+
const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];
144+
const noun = nouns[Math.floor(Math.random() * nouns.length)];
145+
const number = Math.floor(Math.random() * 100);
146+
147+
return `${prefix}_${adjective}_${noun}_${number}`;
148+
}
149+
77150
function generateSecurePassword(): string {
78151
const chars =
79152
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";

src/plugins/databases/mysql/questions.ts

Lines changed: 90 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,70 @@
1-
import { text, select, password } from "@clack/prompts";
1+
import { text, select, password, note } from "@clack/prompts";
2+
3+
export async function questions(defaults?: {
4+
databaseName?: string;
5+
databaseUser?: string;
6+
databasePassword?: string;
7+
databaseHost?: string;
8+
databasePort?: number;
9+
}) {
10+
// Generate secure random defaults if not provided
11+
const randomDefaults = {
12+
databaseName: defaults?.databaseName || generateRandomName("db"),
13+
databaseUser: defaults?.databaseUser || generateRandomName("user"),
14+
databasePassword: defaults?.databasePassword || generateSecurePassword(),
15+
databaseHost: defaults?.databaseHost || "localhost",
16+
databasePort: defaults?.databasePort || 3306,
17+
};
218

3-
export async function questions() {
419
const dbName = await text({
520
message: "Database name (press Enter for default):",
6-
placeholder: "strapi",
7-
defaultValue: "strapi",
21+
placeholder: randomDefaults.databaseName,
822
validate: (value) => {
9-
const val = value || "strapi";
23+
const val =
24+
(typeof value === "string" ? value.trim() : "") ||
25+
randomDefaults.databaseName;
1026
if (!/^[a-zA-Z0-9_-]+$/.test(val)) {
1127
return "Database name can only contain letters, numbers, underscores and hyphens";
1228
}
1329
},
1430
});
1531

32+
const finalDbName =
33+
(typeof dbName === "string" ? dbName.trim() : "") ||
34+
randomDefaults.databaseName;
35+
1636
const dbUser = await text({
1737
message: "Database user (press Enter for default):",
18-
placeholder: "strapi",
19-
defaultValue: "strapi",
38+
placeholder: randomDefaults.databaseUser,
2039
validate: (value) => {
21-
const val = value || "strapi";
40+
const val =
41+
(typeof value === "string" ? value.trim() : "") ||
42+
randomDefaults.databaseUser;
2243
if (!/^[a-zA-Z0-9_-]+$/.test(val)) {
2344
return "Username can only contain letters, numbers, underscores and hyphens";
2445
}
2546
},
2647
});
2748

49+
const finalDbUser =
50+
(typeof dbUser === "string" ? dbUser.trim() : "") ||
51+
randomDefaults.databaseUser;
52+
53+
// Show what defaults were used if user left fields blank
54+
const dbNameEmpty = !dbName || (typeof dbName === "string" && !dbName.trim());
55+
const dbUserEmpty = !dbUser || (typeof dbUser === "string" && !dbUser.trim());
56+
57+
if (dbNameEmpty || dbUserEmpty) {
58+
const usedDefaults = [];
59+
if (dbNameEmpty) usedDefaults.push(`Database: ${finalDbName}`);
60+
if (dbUserEmpty) usedDefaults.push(`User: ${finalDbUser}`);
61+
62+
note(
63+
`Generated secure defaults:\n${usedDefaults.join("\n")}`,
64+
"Auto-generated Values"
65+
);
66+
}
67+
2868
const passwordType = await select({
2969
message: "How would you like to set the database password?",
3070
options: [
@@ -48,16 +88,17 @@ export async function questions() {
4888
},
4989
})) as string;
5090
} else {
51-
dbPassword = generateSecurePassword();
52-
console.log(`🔐 Generated password: ${dbPassword}`);
91+
dbPassword = randomDefaults.databasePassword;
92+
console.log(`🔐 Using secure password: ${dbPassword.substring(0, 4)}...`);
5393
}
5494

5595
const dbPort = await text({
5696
message: "Database port (press Enter for default):",
57-
placeholder: "3306",
58-
defaultValue: "3306",
97+
placeholder: String(randomDefaults.databasePort),
5998
validate: (value) => {
60-
const val = value || "3306";
99+
const val =
100+
(typeof value === "string" ? value.trim() : "") ||
101+
String(randomDefaults.databasePort);
61102
const port = parseInt(val);
62103
if (isNaN(port)) return "Port must be a number";
63104
if (port < 1024 || port > 65535)
@@ -66,14 +107,46 @@ export async function questions() {
66107
});
67108

68109
return {
69-
name: dbName || "strapi",
70-
user: dbUser || "strapi",
110+
name: finalDbName,
111+
user: finalDbUser,
71112
password: dbPassword,
72-
port: parseInt((dbPort as string) || "3306"),
73-
host: "localhost",
113+
port: parseInt(
114+
(typeof dbPort === "string" ? dbPort.trim() : "") ||
115+
String(randomDefaults.databasePort)
116+
),
117+
host: randomDefaults.databaseHost,
74118
};
75119
}
76120

121+
function generateRandomName(prefix: string): string {
122+
const adjectives = [
123+
"swift",
124+
"bright",
125+
"cosmic",
126+
"noble",
127+
"mystic",
128+
"lunar",
129+
"solar",
130+
"crystal",
131+
];
132+
const nouns = [
133+
"falcon",
134+
"phoenix",
135+
"dragon",
136+
"tiger",
137+
"eagle",
138+
"wolf",
139+
"bear",
140+
"lion",
141+
];
142+
143+
const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];
144+
const noun = nouns[Math.floor(Math.random() * nouns.length)];
145+
const number = Math.floor(Math.random() * 100);
146+
147+
return `${prefix}_${adjective}_${noun}_${number}`;
148+
}
149+
77150
function generateSecurePassword(): string {
78151
const chars =
79152
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";

0 commit comments

Comments
 (0)