@getstrata/starter 0.1.11 → 0.1.12
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 +1 -1
- package/dist/cli.js +59 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ bunx create-strata html --frontend server-htmx --database postgres --auth cookie
|
|
|
12
12
|
|
|
13
13
|
Layer flags: `--frontend`, `--database`, `--auth`, `--tenancy`, `--cache`, `--queue`, `--mail`, `--spa-prefix`, plus extras (`--mfa`, `--scim`, `--metrics`, ...).
|
|
14
14
|
|
|
15
|
-
Pick **one** database engine. Docker Compose is optional and only includes services for the tools you selected (`--docker`, `--no-docker`, `--docker-services=postgres,redis`).
|
|
15
|
+
Pick **one** database engine. Docker Compose is optional and only includes services for the tools you selected (`--docker`, `--no-docker`, `--docker-services=postgres,redis`). `--docker` with Postgres or MySQL also writes Adminer.
|
|
16
16
|
|
|
17
17
|
## What you get
|
|
18
18
|
|
package/dist/cli.js
CHANGED
|
@@ -84,12 +84,13 @@ var TENANCY_DRIVERS = ["none", "column", "rls"];
|
|
|
84
84
|
var CACHE_DRIVERS = ["array", "redis"];
|
|
85
85
|
var QUEUE_DRIVERS = ["sync", "redis"];
|
|
86
86
|
var MAIL_DRIVERS = ["log", "smtp"];
|
|
87
|
-
var DOCKER_SERVICE_NAMES = ["postgres", "mysql", "redis", "mailpit"];
|
|
87
|
+
var DOCKER_SERVICE_NAMES = ["postgres", "mysql", "redis", "mailpit", "adminer"];
|
|
88
88
|
var DOCKER_SERVICE_LABELS = {
|
|
89
89
|
postgres: "Postgres",
|
|
90
90
|
mysql: "MySQL",
|
|
91
91
|
redis: "Redis",
|
|
92
|
-
mailpit: "SMTP (Mailpit)"
|
|
92
|
+
mailpit: "SMTP (Mailpit)",
|
|
93
|
+
adminer: "Adminer (database UI)"
|
|
93
94
|
};
|
|
94
95
|
function authUsesCookie(auth) {
|
|
95
96
|
return auth === "cookie" || auth.startsWith("cookie-");
|
|
@@ -122,7 +123,13 @@ function needsRedis(layers) {
|
|
|
122
123
|
return layers.cache === "redis" || layers.queue === "redis";
|
|
123
124
|
}
|
|
124
125
|
function emptyDockerServices() {
|
|
125
|
-
return { postgres: false, mysql: false, redis: false, mailpit: false };
|
|
126
|
+
return { postgres: false, mysql: false, redis: false, mailpit: false, adminer: false };
|
|
127
|
+
}
|
|
128
|
+
function dockerDatabaseService(database) {
|
|
129
|
+
if (database === "postgres" || database === "mysql") {
|
|
130
|
+
return database;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
126
133
|
}
|
|
127
134
|
function enableDockerServices(names) {
|
|
128
135
|
const services = emptyDockerServices();
|
|
@@ -151,7 +158,12 @@ function selectedDockerServices(layers) {
|
|
|
151
158
|
if (!layers.docker.enabled) {
|
|
152
159
|
return [];
|
|
153
160
|
}
|
|
154
|
-
|
|
161
|
+
const selected = neededDockerServices(layers).filter((name) => layers.docker.services[name]);
|
|
162
|
+
const databaseService = dockerDatabaseService(layers.database);
|
|
163
|
+
if (databaseService && selected.includes(databaseService) && layers.docker.services.adminer) {
|
|
164
|
+
selected.push("adminer");
|
|
165
|
+
}
|
|
166
|
+
return selected;
|
|
155
167
|
}
|
|
156
168
|
function reconcileDocker(layers) {
|
|
157
169
|
const selected = selectedDockerServices(layers);
|
|
@@ -168,7 +180,11 @@ function dockerLayerForNeeded(layers, enabled) {
|
|
|
168
180
|
if (!enabled || needed.length === 0) {
|
|
169
181
|
return { enabled: false, services: emptyDockerServices() };
|
|
170
182
|
}
|
|
171
|
-
|
|
183
|
+
const names = [...needed];
|
|
184
|
+
if (dockerDatabaseService(layers.database)) {
|
|
185
|
+
names.push("adminer");
|
|
186
|
+
}
|
|
187
|
+
return { enabled: true, services: enableDockerServices(names) };
|
|
172
188
|
}
|
|
173
189
|
|
|
174
190
|
// src/presets.ts
|
|
@@ -252,7 +268,7 @@ Options:
|
|
|
252
268
|
--extras Interactive extras list (MFA, email verification, SCIM, metrics)
|
|
253
269
|
--docker Write Docker Compose for every selected tool that needs a service
|
|
254
270
|
--no-docker Skip docker-compose.yml; use installs already on this machine
|
|
255
|
-
--docker-services Subset: postgres, mysql, redis, mailpit (comma-separated)
|
|
271
|
+
--docker-services Subset: postgres, mysql, redis, mailpit, adminer (comma-separated)
|
|
256
272
|
--force Replace an existing directory
|
|
257
273
|
--yes, --no-interactive
|
|
258
274
|
-h, --help
|
|
@@ -446,7 +462,13 @@ function applyDockerFlags(layers, flags) {
|
|
|
446
462
|
};
|
|
447
463
|
}
|
|
448
464
|
if (flags.dockerServices) {
|
|
449
|
-
const
|
|
465
|
+
const databaseService = dockerDatabaseService(layers.database);
|
|
466
|
+
const selected = flags.dockerServices.filter((name) => {
|
|
467
|
+
if (needed.includes(name)) {
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
return name === "adminer" && databaseService !== null && flags.dockerServices?.includes(databaseService) === true;
|
|
471
|
+
});
|
|
450
472
|
return {
|
|
451
473
|
...layers,
|
|
452
474
|
docker: {
|
|
@@ -1025,7 +1047,14 @@ async function promptDockerLayer(prompter, layers) {
|
|
|
1025
1047
|
for (const name of needed) {
|
|
1026
1048
|
services[name] = await prompter.confirm(`Docker Compose for ${DOCKER_SERVICE_LABELS[name]}?`, true);
|
|
1027
1049
|
}
|
|
1050
|
+
const databaseService = dockerDatabaseService(layers.database);
|
|
1051
|
+
if (databaseService && services[databaseService]) {
|
|
1052
|
+
services.adminer = await prompter.confirm(`Docker Compose for ${DOCKER_SERVICE_LABELS.adminer}?`, true);
|
|
1053
|
+
}
|
|
1028
1054
|
const selected = needed.filter((name) => services[name]);
|
|
1055
|
+
if (services.adminer) {
|
|
1056
|
+
selected.push("adminer");
|
|
1057
|
+
}
|
|
1029
1058
|
return {
|
|
1030
1059
|
enabled: selected.length > 0,
|
|
1031
1060
|
services
|
|
@@ -2327,6 +2356,17 @@ function renderDockerCompose(projectName, layers) {
|
|
|
2327
2356
|
volumes:
|
|
2328
2357
|
- mysqldata:/var/lib/mysql`);
|
|
2329
2358
|
}
|
|
2359
|
+
if (selectedSet.has("adminer")) {
|
|
2360
|
+
const server = selectedSet.has("mysql") ? "mysql" : "postgres";
|
|
2361
|
+
services.push(` adminer:
|
|
2362
|
+
image: adminer:5.4.2
|
|
2363
|
+
environment:
|
|
2364
|
+
ADMINER_DEFAULT_SERVER: ${server}
|
|
2365
|
+
depends_on:
|
|
2366
|
+
- ${server}
|
|
2367
|
+
ports:
|
|
2368
|
+
- "8080:8080"`);
|
|
2369
|
+
}
|
|
2330
2370
|
if (selectedSet.has("redis")) {
|
|
2331
2371
|
services.push(` redis:
|
|
2332
2372
|
image: redis:7-alpine
|
|
@@ -2447,6 +2487,14 @@ function renderSupportingToolsReadme(layers) {
|
|
|
2447
2487
|
if (dockerOn.length > 0) {
|
|
2448
2488
|
const names = dockerOn.map((name) => DOCKER_SERVICE_LABELS[name]).join(", ");
|
|
2449
2489
|
lines.push(`Docker Compose includes ${names}.`, "", "```bash", "docker compose up -d", "```", "");
|
|
2490
|
+
if (dockerSet.has("adminer")) {
|
|
2491
|
+
const mysql = layers.database === "mysql";
|
|
2492
|
+
const system = mysql ? "MySQL" : "PostgreSQL";
|
|
2493
|
+
const server = mysql ? "mysql" : "postgres";
|
|
2494
|
+
const username = mysql ? "root" : "postgres";
|
|
2495
|
+
const password = mysql ? "root" : "postgres";
|
|
2496
|
+
lines.push(`Adminer: http://localhost:8080 (${system}, server \`${server}\`, username \`${username}\`, password \`${password}\`).`, "");
|
|
2497
|
+
}
|
|
2450
2498
|
}
|
|
2451
2499
|
if (localOn.length > 0) {
|
|
2452
2500
|
const names = localOn.map((name) => DOCKER_SERVICE_LABELS[name]).join(", ");
|
|
@@ -3825,7 +3873,7 @@ function printNextSteps(projectName, layers, compose) {
|
|
|
3825
3873
|
const dockerOn = selectedDockerServices(layers);
|
|
3826
3874
|
const neededTools = neededDockerServices(layers);
|
|
3827
3875
|
const localOn = neededTools.filter((name) => !dockerOn.includes(name));
|
|
3828
|
-
const dockerSummary =
|
|
3876
|
+
const dockerSummary = dockerOn.length > 0 ? dockerOn.join("+") : neededTools.length === 0 ? "none" : "local";
|
|
3829
3877
|
console.log(`
|
|
3830
3878
|
Created Strata app in ${projectName}/
|
|
3831
3879
|
`);
|
|
@@ -3837,6 +3885,9 @@ Next steps:`);
|
|
|
3837
3885
|
if (compose) {
|
|
3838
3886
|
console.log(" docker compose up -d");
|
|
3839
3887
|
}
|
|
3888
|
+
if (dockerOn.includes("adminer")) {
|
|
3889
|
+
console.log(" Adminer: http://localhost:8080");
|
|
3890
|
+
}
|
|
3840
3891
|
if (localOn.length > 0) {
|
|
3841
3892
|
console.log(` Point env at local ${localOn.join(", ")} (see README).`);
|
|
3842
3893
|
}
|