@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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +59 -8
  3. 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
- return neededDockerServices(layers).filter((name) => layers.docker.services[name]);
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
- return { enabled: true, services: enableDockerServices(needed) };
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 selected = flags.dockerServices.filter((name) => needed.includes(name));
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 = neededTools.length === 0 ? "none" : dockerOn.length > 0 ? dockerOn.join("+") : "local";
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getstrata/starter",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "Interactive create-strata wizard. Choose each layer; one database engine.",
5
5
  "type": "module",
6
6
  "license": "MIT",