@geekmidas/cli 0.43.0 → 0.44.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 +221 -0
- package/dist/index.cjs +6 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +6 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/build/__tests__/bundler.spec.ts +3 -3
- package/src/dev/__tests__/entry-integration.spec.ts +7 -6
- package/src/dev/index.ts +5 -1
- package/src/docker/__tests__/templates.spec.ts +123 -0
- package/src/init/__tests__/generators.spec.ts +3 -2
- package/src/init/__tests__/init.spec.ts +2 -1
- package/src/init/templates/minimal.ts +2 -0
package/README.md
CHANGED
|
@@ -1109,6 +1109,227 @@ const logger = createTelescopeLogger(telescope, new ConsoleLogger());
|
|
|
1109
1109
|
|
|
1110
1110
|
See the [@geekmidas/telescope documentation](../telescope/README.md) for more details.
|
|
1111
1111
|
|
|
1112
|
+
## Workspace Configuration
|
|
1113
|
+
|
|
1114
|
+
For fullstack monorepo projects with multiple apps, use `defineWorkspace` instead of `defineConfig`:
|
|
1115
|
+
|
|
1116
|
+
```typescript
|
|
1117
|
+
// gkm.config.ts (at workspace root)
|
|
1118
|
+
import { defineWorkspace } from '@geekmidas/cli/config';
|
|
1119
|
+
|
|
1120
|
+
export default defineWorkspace({
|
|
1121
|
+
name: 'my-project',
|
|
1122
|
+
apps: {
|
|
1123
|
+
api: {
|
|
1124
|
+
type: 'backend',
|
|
1125
|
+
path: 'apps/api',
|
|
1126
|
+
port: 3000,
|
|
1127
|
+
routes: './src/endpoints/**/*.ts',
|
|
1128
|
+
envParser: './src/config/env#envParser',
|
|
1129
|
+
logger: './src/config/logger#logger',
|
|
1130
|
+
telescope: {
|
|
1131
|
+
enabled: true,
|
|
1132
|
+
path: '/__telescope',
|
|
1133
|
+
},
|
|
1134
|
+
openapi: {
|
|
1135
|
+
enabled: true,
|
|
1136
|
+
},
|
|
1137
|
+
},
|
|
1138
|
+
auth: {
|
|
1139
|
+
type: 'backend',
|
|
1140
|
+
path: 'apps/auth',
|
|
1141
|
+
port: 3002,
|
|
1142
|
+
entry: './src/index.ts', // Entry-based app (no routes)
|
|
1143
|
+
envParser: './src/config/env#envParser',
|
|
1144
|
+
logger: './src/config/logger#logger',
|
|
1145
|
+
},
|
|
1146
|
+
web: {
|
|
1147
|
+
type: 'frontend',
|
|
1148
|
+
framework: 'nextjs',
|
|
1149
|
+
path: 'apps/web',
|
|
1150
|
+
port: 3001,
|
|
1151
|
+
dependencies: ['api', 'auth'],
|
|
1152
|
+
client: {
|
|
1153
|
+
output: './src/api',
|
|
1154
|
+
},
|
|
1155
|
+
},
|
|
1156
|
+
},
|
|
1157
|
+
shared: {
|
|
1158
|
+
packages: ['packages/*'],
|
|
1159
|
+
models: {
|
|
1160
|
+
path: 'packages/models',
|
|
1161
|
+
schema: 'zod',
|
|
1162
|
+
},
|
|
1163
|
+
},
|
|
1164
|
+
services: {
|
|
1165
|
+
db: true,
|
|
1166
|
+
cache: true,
|
|
1167
|
+
mail: true,
|
|
1168
|
+
},
|
|
1169
|
+
deploy: {
|
|
1170
|
+
default: 'dokploy',
|
|
1171
|
+
},
|
|
1172
|
+
});
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
### App Types
|
|
1176
|
+
|
|
1177
|
+
#### Routes-Based Backend Apps
|
|
1178
|
+
|
|
1179
|
+
Standard API apps using endpoint discovery:
|
|
1180
|
+
|
|
1181
|
+
```typescript
|
|
1182
|
+
api: {
|
|
1183
|
+
type: 'backend',
|
|
1184
|
+
path: 'apps/api',
|
|
1185
|
+
port: 3000,
|
|
1186
|
+
routes: './src/endpoints/**/*.ts', // Glob pattern for endpoints
|
|
1187
|
+
envParser: './src/config/env#envParser',
|
|
1188
|
+
logger: './src/config/logger#logger',
|
|
1189
|
+
}
|
|
1190
|
+
```
|
|
1191
|
+
|
|
1192
|
+
These apps use `gkm build --provider server` internally to generate a Hono server from discovered endpoints.
|
|
1193
|
+
|
|
1194
|
+
#### Entry-Based Backend Apps
|
|
1195
|
+
|
|
1196
|
+
Apps with a custom entry point (like authentication services using better-auth):
|
|
1197
|
+
|
|
1198
|
+
```typescript
|
|
1199
|
+
auth: {
|
|
1200
|
+
type: 'backend',
|
|
1201
|
+
path: 'apps/auth',
|
|
1202
|
+
port: 3002,
|
|
1203
|
+
entry: './src/index.ts', // Direct entry point
|
|
1204
|
+
envParser: './src/config/env#envParser',
|
|
1205
|
+
logger: './src/config/logger#logger',
|
|
1206
|
+
}
|
|
1207
|
+
```
|
|
1208
|
+
|
|
1209
|
+
Entry-based apps are bundled directly with esbuild into a standalone file. All dependencies are bundled, producing a single `index.mjs` file that runs without `node_modules`.
|
|
1210
|
+
|
|
1211
|
+
Example entry point for an auth service:
|
|
1212
|
+
|
|
1213
|
+
```typescript
|
|
1214
|
+
// apps/auth/src/index.ts
|
|
1215
|
+
import { Hono } from 'hono';
|
|
1216
|
+
import { serve } from '@hono/node-server';
|
|
1217
|
+
import { auth } from './auth.js';
|
|
1218
|
+
|
|
1219
|
+
const app = new Hono();
|
|
1220
|
+
|
|
1221
|
+
app.get('/health', (c) => c.json({ status: 'ok' }));
|
|
1222
|
+
app.on(['POST', 'GET'], '/api/auth/*', (c) => auth.handler(c.req.raw));
|
|
1223
|
+
|
|
1224
|
+
serve({ fetch: app.fetch, port: 3002 });
|
|
1225
|
+
```
|
|
1226
|
+
|
|
1227
|
+
#### Frontend Apps
|
|
1228
|
+
|
|
1229
|
+
Next.js or other frontend frameworks:
|
|
1230
|
+
|
|
1231
|
+
```typescript
|
|
1232
|
+
web: {
|
|
1233
|
+
type: 'frontend',
|
|
1234
|
+
framework: 'nextjs',
|
|
1235
|
+
path: 'apps/web',
|
|
1236
|
+
port: 3001,
|
|
1237
|
+
dependencies: ['api', 'auth'], // Apps this depends on
|
|
1238
|
+
client: {
|
|
1239
|
+
output: './src/api', // Where to generate API client
|
|
1240
|
+
},
|
|
1241
|
+
}
|
|
1242
|
+
```
|
|
1243
|
+
|
|
1244
|
+
### Workspace Docker Generation
|
|
1245
|
+
|
|
1246
|
+
When running `gkm docker` in a workspace, the CLI generates optimized Dockerfiles for each app:
|
|
1247
|
+
|
|
1248
|
+
```bash
|
|
1249
|
+
gkm docker
|
|
1250
|
+
```
|
|
1251
|
+
|
|
1252
|
+
**Generated files:**
|
|
1253
|
+
- `.gkm/docker/Dockerfile.api` - Routes-based backend (uses `gkm build`)
|
|
1254
|
+
- `.gkm/docker/Dockerfile.auth` - Entry-based backend (uses esbuild bundling)
|
|
1255
|
+
- `.gkm/docker/Dockerfile.web` - Next.js standalone output
|
|
1256
|
+
- `.gkm/docker/docker-compose.yml` - Full stack with all apps and services
|
|
1257
|
+
- `.dockerignore` - Optimized ignore patterns
|
|
1258
|
+
|
|
1259
|
+
**Dockerfile types by app:**
|
|
1260
|
+
|
|
1261
|
+
| App Type | Build Method | Output |
|
|
1262
|
+
|----------|--------------|--------|
|
|
1263
|
+
| `routes` backend | `gkm build --provider server` | `.gkm/server/dist/server.mjs` |
|
|
1264
|
+
| `entry` backend | `esbuild --bundle --packages=bundle` | `dist/index.mjs` |
|
|
1265
|
+
| `nextjs` frontend | `next build` (standalone) | `.next/standalone` |
|
|
1266
|
+
|
|
1267
|
+
**Entry-based bundling:**
|
|
1268
|
+
|
|
1269
|
+
Entry-based apps use esbuild with full dependency bundling:
|
|
1270
|
+
|
|
1271
|
+
```bash
|
|
1272
|
+
npx esbuild ./src/index.ts \
|
|
1273
|
+
--bundle \
|
|
1274
|
+
--platform=node \
|
|
1275
|
+
--target=node22 \
|
|
1276
|
+
--format=esm \
|
|
1277
|
+
--outfile=dist/index.mjs \
|
|
1278
|
+
--packages=bundle \
|
|
1279
|
+
--banner:js='import { createRequire } from "module"; const require = createRequire(import.meta.url);'
|
|
1280
|
+
```
|
|
1281
|
+
|
|
1282
|
+
The `--packages=bundle` flag bundles all dependencies (unlike tsdown's default behavior). The banner adds CommonJS compatibility for packages that use `require()` internally.
|
|
1283
|
+
|
|
1284
|
+
### Workspace Interface
|
|
1285
|
+
|
|
1286
|
+
```typescript
|
|
1287
|
+
interface WorkspaceConfig {
|
|
1288
|
+
name: string;
|
|
1289
|
+
apps: Record<string, AppConfig>;
|
|
1290
|
+
shared?: {
|
|
1291
|
+
packages?: string[];
|
|
1292
|
+
models?: {
|
|
1293
|
+
path: string;
|
|
1294
|
+
schema: 'zod' | 'valibot';
|
|
1295
|
+
};
|
|
1296
|
+
};
|
|
1297
|
+
services?: {
|
|
1298
|
+
db?: boolean;
|
|
1299
|
+
cache?: boolean;
|
|
1300
|
+
mail?: boolean;
|
|
1301
|
+
};
|
|
1302
|
+
deploy?: {
|
|
1303
|
+
default?: 'dokploy' | 'docker';
|
|
1304
|
+
};
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
interface BackendAppConfig {
|
|
1308
|
+
type: 'backend';
|
|
1309
|
+
path: string;
|
|
1310
|
+
port: number;
|
|
1311
|
+
routes?: string; // Glob pattern for routes-based apps
|
|
1312
|
+
entry?: string; // Entry file for entry-based apps
|
|
1313
|
+
envParser: string;
|
|
1314
|
+
logger: string;
|
|
1315
|
+
telescope?: TelescopeConfig;
|
|
1316
|
+
openapi?: { enabled: boolean };
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
interface FrontendAppConfig {
|
|
1320
|
+
type: 'frontend';
|
|
1321
|
+
framework: 'nextjs';
|
|
1322
|
+
path: string;
|
|
1323
|
+
port: number;
|
|
1324
|
+
dependencies?: string[]; // Other apps this depends on
|
|
1325
|
+
client?: {
|
|
1326
|
+
output: string; // Where to generate typed API client
|
|
1327
|
+
};
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
type AppConfig = BackendAppConfig | FrontendAppConfig;
|
|
1331
|
+
```
|
|
1332
|
+
|
|
1112
1333
|
## Providers
|
|
1113
1334
|
|
|
1114
1335
|
### AWS API Gateway v1
|
package/dist/index.cjs
CHANGED
|
@@ -29,7 +29,7 @@ const node_module = require_chunk.__toESM(require("node:module"));
|
|
|
29
29
|
|
|
30
30
|
//#region package.json
|
|
31
31
|
var name = "@geekmidas/cli";
|
|
32
|
-
var version = "0.
|
|
32
|
+
var version = "0.44.0";
|
|
33
33
|
var description = "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs";
|
|
34
34
|
var private$1 = false;
|
|
35
35
|
var type = "module";
|
|
@@ -1625,7 +1625,8 @@ async function prepareEntryCredentials(options) {
|
|
|
1625
1625
|
credentials.PORT = String(resolvedPort);
|
|
1626
1626
|
const secretsDir = (0, node_path.join)(secretsRoot, ".gkm");
|
|
1627
1627
|
await (0, node_fs_promises.mkdir)(secretsDir, { recursive: true });
|
|
1628
|
-
const
|
|
1628
|
+
const secretsFileName = appName ? `dev-secrets-${appName}.json` : "dev-secrets.json";
|
|
1629
|
+
const secretsJsonPath = (0, node_path.join)(secretsDir, secretsFileName);
|
|
1629
1630
|
await (0, node_fs_promises.writeFile)(secretsJsonPath, JSON.stringify(credentials, null, 2));
|
|
1630
1631
|
return {
|
|
1631
1632
|
credentials,
|
|
@@ -6563,12 +6564,14 @@ const minimalTemplate = {
|
|
|
6563
6564
|
"@geekmidas/schema": GEEKMIDAS_VERSIONS["@geekmidas/schema"],
|
|
6564
6565
|
"@hono/node-server": "~1.14.1",
|
|
6565
6566
|
hono: "~4.8.2",
|
|
6566
|
-
pino: "~9.6.0"
|
|
6567
|
+
pino: "~9.6.0",
|
|
6568
|
+
zod: "~4.1.0"
|
|
6567
6569
|
},
|
|
6568
6570
|
devDependencies: {
|
|
6569
6571
|
"@biomejs/biome": "~2.3.0",
|
|
6570
6572
|
"@geekmidas/cli": GEEKMIDAS_VERSIONS["@geekmidas/cli"],
|
|
6571
6573
|
"@types/node": "~22.0.0",
|
|
6574
|
+
esbuild: "~0.27.0",
|
|
6572
6575
|
tsx: "~4.20.0",
|
|
6573
6576
|
turbo: "~2.3.0",
|
|
6574
6577
|
typescript: "~5.8.2",
|