bonescript-compiler 0.2.1 → 0.3.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/LICENSE +21 -21
- package/dist/algorithm_catalog.js +166 -166
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +75 -543
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.js +34 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/compile.d.ts +5 -0
- package/dist/commands/compile.js +183 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/debug.d.ts +5 -0
- package/dist/commands/debug.js +59 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/diff.d.ts +5 -0
- package/dist/commands/diff.js +125 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/fmt.d.ts +5 -0
- package/dist/commands/fmt.js +49 -0
- package/dist/commands/fmt.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.js +69 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/ir.d.ts +5 -0
- package/dist/commands/ir.js +27 -0
- package/dist/commands/ir.js.map +1 -0
- package/dist/commands/lex.d.ts +5 -0
- package/dist/commands/lex.js +21 -0
- package/dist/commands/lex.js.map +1 -0
- package/dist/commands/parse.d.ts +5 -0
- package/dist/commands/parse.js +30 -0
- package/dist/commands/parse.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.js +61 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/verify_determinism.d.ts +5 -0
- package/dist/commands/verify_determinism.js +64 -0
- package/dist/commands/verify_determinism.js.map +1 -0
- package/dist/commands/watch.d.ts +5 -0
- package/dist/commands/watch.js +50 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/emit_auth.d.ts +6 -0
- package/dist/emit_auth.js +69 -0
- package/dist/emit_auth.js.map +1 -0
- package/dist/emit_capability.d.ts +13 -0
- package/dist/emit_capability.js +235 -125
- package/dist/emit_capability.js.map +1 -1
- package/dist/emit_database.d.ts +7 -0
- package/dist/emit_database.js +74 -0
- package/dist/emit_database.js.map +1 -0
- package/dist/emit_deploy.js +162 -162
- package/dist/emit_events.js +274 -274
- package/dist/emit_full.js +102 -95
- package/dist/emit_full.js.map +1 -1
- package/dist/emit_index.d.ts +6 -0
- package/dist/emit_index.js +157 -0
- package/dist/emit_index.js.map +1 -0
- package/dist/emit_maintenance.js +249 -249
- package/dist/emit_package.d.ts +7 -0
- package/dist/emit_package.js +70 -0
- package/dist/emit_package.js.map +1 -0
- package/dist/emit_router.d.ts +12 -0
- package/dist/emit_router.js +375 -0
- package/dist/emit_router.js.map +1 -0
- package/dist/emit_runtime.d.ts +17 -11
- package/dist/emit_runtime.js +29 -686
- package/dist/emit_runtime.js.map +1 -1
- package/dist/emit_sourcemap.js +66 -66
- package/dist/extension_manager.d.ts +2 -2
- package/dist/extension_manager.js +6 -3
- package/dist/extension_manager.js.map +1 -1
- package/dist/lowering.d.ts +5 -14
- package/dist/lowering.js +32 -417
- package/dist/lowering.js.map +1 -1
- package/dist/lowering_channels.d.ts +11 -0
- package/dist/lowering_channels.js +102 -0
- package/dist/lowering_channels.js.map +1 -0
- package/dist/lowering_entities.d.ts +11 -0
- package/dist/lowering_entities.js +222 -0
- package/dist/lowering_entities.js.map +1 -0
- package/dist/lowering_helpers.d.ts +13 -0
- package/dist/lowering_helpers.js +76 -0
- package/dist/lowering_helpers.js.map +1 -0
- package/dist/module_loader.d.ts +2 -2
- package/dist/module_loader.js +20 -23
- package/dist/module_loader.js.map +1 -1
- package/dist/scaffold.d.ts +2 -2
- package/dist/scaffold.js +316 -319
- package/dist/scaffold.js.map +1 -1
- package/package.json +62 -52
- package/src/algorithm_catalog.ts +345 -345
- package/src/ast.ts +334 -334
- package/src/cli.ts +98 -624
- package/src/commands/check.ts +33 -0
- package/src/commands/compile.ts +160 -0
- package/src/commands/debug.ts +33 -0
- package/src/commands/diff.ts +108 -0
- package/src/commands/fmt.ts +22 -0
- package/src/commands/init.ts +46 -0
- package/src/commands/ir.ts +23 -0
- package/src/commands/lex.ts +17 -0
- package/src/commands/parse.ts +24 -0
- package/src/commands/test.ts +36 -0
- package/src/commands/verify_determinism.ts +66 -0
- package/src/commands/watch.ts +25 -0
- package/src/emit_auth.ts +67 -0
- package/src/emit_batch.ts +140 -140
- package/src/emit_capability.ts +562 -436
- package/src/emit_composition.ts +196 -196
- package/src/emit_database.ts +75 -0
- package/src/emit_deploy.ts +190 -190
- package/src/emit_events.ts +307 -307
- package/src/emit_extras.ts +240 -240
- package/src/emit_full.ts +316 -309
- package/src/emit_index.ts +161 -0
- package/src/emit_maintenance.ts +459 -459
- package/src/emit_package.ts +69 -0
- package/src/emit_router.ts +395 -0
- package/src/emit_runtime.ts +17 -728
- package/src/emit_sourcemap.ts +140 -140
- package/src/emit_tests.ts +205 -205
- package/src/emit_websocket.ts +229 -229
- package/src/emitter.ts +566 -566
- package/src/extension_manager.ts +189 -187
- package/src/formatter.ts +297 -297
- package/src/index.ts +88 -88
- package/src/ir.ts +215 -215
- package/src/lexer.ts +630 -630
- package/src/lowering.ts +124 -556
- package/src/lowering_channels.ts +107 -0
- package/src/lowering_entities.ts +248 -0
- package/src/lowering_helpers.ts +75 -0
- package/src/module_loader.ts +112 -114
- package/src/optimizer.ts +196 -196
- package/src/parse_decls.ts +409 -409
- package/src/parse_decls2.ts +244 -244
- package/src/parse_expr.ts +197 -197
- package/src/parse_types.ts +54 -54
- package/src/parser.ts +1 -1
- package/src/parser_base.ts +57 -57
- package/src/parser_recovery.ts +153 -153
- package/src/scaffold.ts +372 -375
- package/src/solver.ts +330 -330
- package/src/typechecker.ts +591 -591
- package/src/types.ts +122 -122
- package/src/verifier.ts +348 -348
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Database Emitter
|
|
4
|
+
* Generates db.ts (connection pool) and migrate.ts (migration runner).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.emitMigration = exports.emitDbClient = void 0;
|
|
8
|
+
function toSnakeCase(s) {
|
|
9
|
+
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
function emitDbClient(system) {
|
|
12
|
+
const name = toSnakeCase(system.name);
|
|
13
|
+
return [
|
|
14
|
+
"// Generated by BoneScript compiler. DO NOT EDIT.",
|
|
15
|
+
`import { Pool, PoolClient } from "pg";`,
|
|
16
|
+
"",
|
|
17
|
+
"// Lazy pool — created on first use so DATABASE_URL is read after dotenv loads",
|
|
18
|
+
"let _pool: Pool | null = null;",
|
|
19
|
+
"function getPool(): Pool {",
|
|
20
|
+
" if (!_pool) {",
|
|
21
|
+
` _pool = new Pool({ connectionString: process.env.DATABASE_URL || "postgresql://localhost:5432/${name}", max: 20 });`,
|
|
22
|
+
` _pool.on("error", (err: Error) => console.error("[DB] Pool error (non-fatal):", err.message));`,
|
|
23
|
+
" }",
|
|
24
|
+
" return _pool;",
|
|
25
|
+
"}",
|
|
26
|
+
"export const pool = new Proxy({} as Pool, { get(_t: any, p: any) { return (getPool() as any)[p]; } });",
|
|
27
|
+
"",
|
|
28
|
+
"export async function query<T = any>(text: string, params?: any[]): Promise<T[]> {",
|
|
29
|
+
" try { const result = await pool.query(text, params); return result.rows as T[]; }",
|
|
30
|
+
" catch (e: any) { throw new Error(`DB query failed: ${e.message}`); }",
|
|
31
|
+
"}",
|
|
32
|
+
"export async function queryOne<T = any>(text: string, params?: any[]): Promise<T | null> {",
|
|
33
|
+
" try { const rows = await query<T>(text, params); return rows[0] || null; }",
|
|
34
|
+
" catch (e: any) { throw new Error(`DB query failed: ${e.message}`); }",
|
|
35
|
+
"}",
|
|
36
|
+
"export async function execute(text: string, params?: any[]): Promise<number> {",
|
|
37
|
+
" try { const result = await pool.query(text, params); return result.rowCount || 0; }",
|
|
38
|
+
" catch (e: any) { throw new Error(`DB execute failed: ${e.message}`); }",
|
|
39
|
+
"}",
|
|
40
|
+
"export async function transaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T> {",
|
|
41
|
+
" const client = await pool.connect();",
|
|
42
|
+
` try { await client.query("BEGIN"); const result = await fn(client); await client.query("COMMIT"); return result; }`,
|
|
43
|
+
` catch (e) { await client.query("ROLLBACK"); throw e; }`,
|
|
44
|
+
" finally { client.release(); }",
|
|
45
|
+
"}",
|
|
46
|
+
].join("\n");
|
|
47
|
+
}
|
|
48
|
+
exports.emitDbClient = emitDbClient;
|
|
49
|
+
function emitMigration(system, schemas) {
|
|
50
|
+
const lines = [];
|
|
51
|
+
lines.push(`// Generated by BoneScript compiler. DO NOT EDIT.`);
|
|
52
|
+
lines.push(`require("dotenv").config();`);
|
|
53
|
+
lines.push(`import { pool } from "./db";`);
|
|
54
|
+
lines.push(``);
|
|
55
|
+
lines.push(`async function migrate() {`);
|
|
56
|
+
lines.push(` console.log("Running migrations...");`);
|
|
57
|
+
lines.push(` const client = await pool.connect();`);
|
|
58
|
+
lines.push(` try {`);
|
|
59
|
+
for (const schema of schemas) {
|
|
60
|
+
const escaped = schema.replace(/`/g, "\\`").replace(/\$/g, "\\$");
|
|
61
|
+
lines.push(` await client.query(\`${escaped}\`);`);
|
|
62
|
+
}
|
|
63
|
+
lines.push(` console.log("Migrations complete.");`);
|
|
64
|
+
lines.push(` } finally {`);
|
|
65
|
+
lines.push(` client.release();`);
|
|
66
|
+
lines.push(` await pool.end();`);
|
|
67
|
+
lines.push(` }`);
|
|
68
|
+
lines.push(`}`);
|
|
69
|
+
lines.push(``);
|
|
70
|
+
lines.push(`migrate().catch(e => { console.error(e); process.exit(1); });`);
|
|
71
|
+
return lines.join("\n");
|
|
72
|
+
}
|
|
73
|
+
exports.emitMigration = emitMigration;
|
|
74
|
+
//# sourceMappingURL=emit_database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_database.js","sourceRoot":"","sources":["../src/emit_database.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,SAAgB,YAAY,CAAC,MAAmB;IAC9C,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO;QACL,mDAAmD;QACnD,wCAAwC;QACxC,EAAE;QACF,gFAAgF;QAChF,gCAAgC;QAChC,4BAA4B;QAC5B,iBAAiB;QACjB,qGAAqG,IAAI,gBAAgB;QACzH,oGAAoG;QACpG,KAAK;QACL,iBAAiB;QACjB,GAAG;QACH,wGAAwG;QACxG,EAAE;QACF,oFAAoF;QACpF,qFAAqF;QACrF,wEAAwE;QACxE,GAAG;QACH,4FAA4F;QAC5F,8EAA8E;QAC9E,wEAAwE;QACxE,GAAG;QACH,gFAAgF;QAChF,uFAAuF;QACvF,0EAA0E;QAC1E,GAAG;QACH,4FAA4F;QAC5F,wCAAwC;QACxC,sHAAsH;QACtH,0DAA0D;QAC1D,iCAAiC;QACjC,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AApCD,oCAoCC;AAED,SAAgB,aAAa,CAAC,MAAmB,EAAE,OAAiB;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,4BAA4B,OAAO,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAzBD,sCAyBC"}
|
package/dist/emit_deploy.js
CHANGED
|
@@ -9,182 +9,182 @@ function toSnakeCase(s) {
|
|
|
9
9
|
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
10
10
|
}
|
|
11
11
|
function emitDockerfile(system) {
|
|
12
|
-
return `# Generated by BoneScript compiler.
|
|
13
|
-
FROM node:20-alpine AS builder
|
|
14
|
-
WORKDIR /app
|
|
15
|
-
COPY package*.json ./
|
|
16
|
-
RUN npm ci --only=production
|
|
17
|
-
COPY . .
|
|
18
|
-
RUN npm run build
|
|
19
|
-
|
|
20
|
-
FROM node:20-alpine AS runtime
|
|
21
|
-
WORKDIR /app
|
|
22
|
-
ENV NODE_ENV=production
|
|
23
|
-
COPY --from=builder /app/dist ./dist
|
|
24
|
-
COPY --from=builder /app/node_modules ./node_modules
|
|
25
|
-
COPY --from=builder /app/package.json ./
|
|
26
|
-
|
|
27
|
-
# Health check
|
|
28
|
-
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=3 \\
|
|
29
|
-
CMD wget -qO- http://localhost:3000/health/live || exit 1
|
|
30
|
-
|
|
31
|
-
EXPOSE 3000
|
|
32
|
-
USER node
|
|
33
|
-
CMD ["node", "dist/index.js"]
|
|
12
|
+
return `# Generated by BoneScript compiler.
|
|
13
|
+
FROM node:20-alpine AS builder
|
|
14
|
+
WORKDIR /app
|
|
15
|
+
COPY package*.json ./
|
|
16
|
+
RUN npm ci --only=production
|
|
17
|
+
COPY . .
|
|
18
|
+
RUN npm run build
|
|
19
|
+
|
|
20
|
+
FROM node:20-alpine AS runtime
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
ENV NODE_ENV=production
|
|
23
|
+
COPY --from=builder /app/dist ./dist
|
|
24
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
25
|
+
COPY --from=builder /app/package.json ./
|
|
26
|
+
|
|
27
|
+
# Health check
|
|
28
|
+
HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=3 \\
|
|
29
|
+
CMD wget -qO- http://localhost:3000/health/live || exit 1
|
|
30
|
+
|
|
31
|
+
EXPOSE 3000
|
|
32
|
+
USER node
|
|
33
|
+
CMD ["node", "dist/index.js"]
|
|
34
34
|
`;
|
|
35
35
|
}
|
|
36
36
|
exports.emitDockerfile = emitDockerfile;
|
|
37
37
|
function emitDockerignore() {
|
|
38
|
-
return `node_modules
|
|
39
|
-
dist
|
|
40
|
-
.env
|
|
41
|
-
*.log
|
|
42
|
-
.git
|
|
43
|
-
*.bone
|
|
44
|
-
*.bone.map
|
|
38
|
+
return `node_modules
|
|
39
|
+
dist
|
|
40
|
+
.env
|
|
41
|
+
*.log
|
|
42
|
+
.git
|
|
43
|
+
*.bone
|
|
44
|
+
*.bone.map
|
|
45
45
|
`;
|
|
46
46
|
}
|
|
47
47
|
exports.emitDockerignore = emitDockerignore;
|
|
48
48
|
function emitK8sDeployment(system) {
|
|
49
49
|
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
50
|
-
return `# Generated by BoneScript compiler.
|
|
51
|
-
apiVersion: apps/v1
|
|
52
|
-
kind: Deployment
|
|
53
|
-
metadata:
|
|
54
|
-
name: ${name}
|
|
55
|
-
labels:
|
|
56
|
-
app: ${name}
|
|
57
|
-
version: "${system.version}"
|
|
58
|
-
spec:
|
|
59
|
-
replicas: 2
|
|
60
|
-
selector:
|
|
61
|
-
matchLabels:
|
|
62
|
-
app: ${name}
|
|
63
|
-
template:
|
|
64
|
-
metadata:
|
|
65
|
-
labels:
|
|
66
|
-
app: ${name}
|
|
67
|
-
spec:
|
|
68
|
-
containers:
|
|
69
|
-
- name: ${name}
|
|
70
|
-
image: ${name}:${system.version}
|
|
71
|
-
ports:
|
|
72
|
-
- containerPort: 3000
|
|
73
|
-
env:
|
|
74
|
-
- name: NODE_ENV
|
|
75
|
-
value: production
|
|
76
|
-
- name: PORT
|
|
77
|
-
value: "3000"
|
|
78
|
-
- name: DATABASE_URL
|
|
79
|
-
valueFrom:
|
|
80
|
-
secretKeyRef:
|
|
81
|
-
name: ${name}-secrets
|
|
82
|
-
key: database-url
|
|
83
|
-
- name: JWT_SECRET
|
|
84
|
-
valueFrom:
|
|
85
|
-
secretKeyRef:
|
|
86
|
-
name: ${name}-secrets
|
|
87
|
-
key: jwt-secret
|
|
88
|
-
- name: REDIS_URL
|
|
89
|
-
valueFrom:
|
|
90
|
-
secretKeyRef:
|
|
91
|
-
name: ${name}-secrets
|
|
92
|
-
key: redis-url
|
|
93
|
-
optional: true
|
|
94
|
-
livenessProbe:
|
|
95
|
-
httpGet:
|
|
96
|
-
path: /health/live
|
|
97
|
-
port: 3000
|
|
98
|
-
initialDelaySeconds: 10
|
|
99
|
-
periodSeconds: 10
|
|
100
|
-
readinessProbe:
|
|
101
|
-
httpGet:
|
|
102
|
-
path: /health/ready
|
|
103
|
-
port: 3000
|
|
104
|
-
initialDelaySeconds: 5
|
|
105
|
-
periodSeconds: 5
|
|
106
|
-
resources:
|
|
107
|
-
requests:
|
|
108
|
-
memory: "128Mi"
|
|
109
|
-
cpu: "100m"
|
|
110
|
-
limits:
|
|
111
|
-
memory: "512Mi"
|
|
112
|
-
cpu: "500m"
|
|
113
|
-
---
|
|
114
|
-
apiVersion: v1
|
|
115
|
-
kind: Service
|
|
116
|
-
metadata:
|
|
117
|
-
name: ${name}
|
|
118
|
-
spec:
|
|
119
|
-
selector:
|
|
120
|
-
app: ${name}
|
|
121
|
-
ports:
|
|
122
|
-
- port: 80
|
|
123
|
-
targetPort: 3000
|
|
124
|
-
type: ClusterIP
|
|
50
|
+
return `# Generated by BoneScript compiler.
|
|
51
|
+
apiVersion: apps/v1
|
|
52
|
+
kind: Deployment
|
|
53
|
+
metadata:
|
|
54
|
+
name: ${name}
|
|
55
|
+
labels:
|
|
56
|
+
app: ${name}
|
|
57
|
+
version: "${system.version}"
|
|
58
|
+
spec:
|
|
59
|
+
replicas: 2
|
|
60
|
+
selector:
|
|
61
|
+
matchLabels:
|
|
62
|
+
app: ${name}
|
|
63
|
+
template:
|
|
64
|
+
metadata:
|
|
65
|
+
labels:
|
|
66
|
+
app: ${name}
|
|
67
|
+
spec:
|
|
68
|
+
containers:
|
|
69
|
+
- name: ${name}
|
|
70
|
+
image: ${name}:${system.version}
|
|
71
|
+
ports:
|
|
72
|
+
- containerPort: 3000
|
|
73
|
+
env:
|
|
74
|
+
- name: NODE_ENV
|
|
75
|
+
value: production
|
|
76
|
+
- name: PORT
|
|
77
|
+
value: "3000"
|
|
78
|
+
- name: DATABASE_URL
|
|
79
|
+
valueFrom:
|
|
80
|
+
secretKeyRef:
|
|
81
|
+
name: ${name}-secrets
|
|
82
|
+
key: database-url
|
|
83
|
+
- name: JWT_SECRET
|
|
84
|
+
valueFrom:
|
|
85
|
+
secretKeyRef:
|
|
86
|
+
name: ${name}-secrets
|
|
87
|
+
key: jwt-secret
|
|
88
|
+
- name: REDIS_URL
|
|
89
|
+
valueFrom:
|
|
90
|
+
secretKeyRef:
|
|
91
|
+
name: ${name}-secrets
|
|
92
|
+
key: redis-url
|
|
93
|
+
optional: true
|
|
94
|
+
livenessProbe:
|
|
95
|
+
httpGet:
|
|
96
|
+
path: /health/live
|
|
97
|
+
port: 3000
|
|
98
|
+
initialDelaySeconds: 10
|
|
99
|
+
periodSeconds: 10
|
|
100
|
+
readinessProbe:
|
|
101
|
+
httpGet:
|
|
102
|
+
path: /health/ready
|
|
103
|
+
port: 3000
|
|
104
|
+
initialDelaySeconds: 5
|
|
105
|
+
periodSeconds: 5
|
|
106
|
+
resources:
|
|
107
|
+
requests:
|
|
108
|
+
memory: "128Mi"
|
|
109
|
+
cpu: "100m"
|
|
110
|
+
limits:
|
|
111
|
+
memory: "512Mi"
|
|
112
|
+
cpu: "500m"
|
|
113
|
+
---
|
|
114
|
+
apiVersion: v1
|
|
115
|
+
kind: Service
|
|
116
|
+
metadata:
|
|
117
|
+
name: ${name}
|
|
118
|
+
spec:
|
|
119
|
+
selector:
|
|
120
|
+
app: ${name}
|
|
121
|
+
ports:
|
|
122
|
+
- port: 80
|
|
123
|
+
targetPort: 3000
|
|
124
|
+
type: ClusterIP
|
|
125
125
|
`;
|
|
126
126
|
}
|
|
127
127
|
exports.emitK8sDeployment = emitK8sDeployment;
|
|
128
128
|
function emitGithubActions(system) {
|
|
129
129
|
const name = toSnakeCase(system.name).replace(/_/g, "-");
|
|
130
|
-
return `# Generated by BoneScript compiler.
|
|
131
|
-
name: CI/CD
|
|
132
|
-
|
|
133
|
-
on:
|
|
134
|
-
push:
|
|
135
|
-
branches: [main]
|
|
136
|
-
pull_request:
|
|
137
|
-
branches: [main]
|
|
138
|
-
|
|
139
|
-
jobs:
|
|
140
|
-
test:
|
|
141
|
-
runs-on: ubuntu-latest
|
|
142
|
-
services:
|
|
143
|
-
postgres:
|
|
144
|
-
image: postgres:16
|
|
145
|
-
env:
|
|
146
|
-
POSTGRES_DB: ${toSnakeCase(system.name)}_test
|
|
147
|
-
POSTGRES_USER: postgres
|
|
148
|
-
POSTGRES_PASSWORD: postgres
|
|
149
|
-
ports:
|
|
150
|
-
- 5432:5432
|
|
151
|
-
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
152
|
-
|
|
153
|
-
steps:
|
|
154
|
-
- uses: actions/checkout@v4
|
|
155
|
-
- uses: actions/setup-node@v4
|
|
156
|
-
with:
|
|
157
|
-
node-version: 20
|
|
158
|
-
cache: npm
|
|
159
|
-
|
|
160
|
-
- name: Install dependencies
|
|
161
|
-
run: npm ci
|
|
162
|
-
|
|
163
|
-
- name: Type check
|
|
164
|
-
run: npx tsc --noEmit
|
|
165
|
-
|
|
166
|
-
- name: Run migrations
|
|
167
|
-
run: npm run migrate
|
|
168
|
-
env:
|
|
169
|
-
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
170
|
-
|
|
171
|
-
- name: Run tests
|
|
172
|
-
run: npx ts-node src/tests.ts
|
|
173
|
-
env:
|
|
174
|
-
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
175
|
-
JWT_SECRET: test-secret
|
|
176
|
-
TEST_BASE_URL: http://localhost:3000
|
|
177
|
-
|
|
178
|
-
build:
|
|
179
|
-
needs: test
|
|
180
|
-
runs-on: ubuntu-latest
|
|
181
|
-
if: github.ref == 'refs/heads/main'
|
|
182
|
-
steps:
|
|
183
|
-
- uses: actions/checkout@v4
|
|
184
|
-
- name: Build Docker image
|
|
185
|
-
run: docker build -t ${name}:\${{ github.sha }} .
|
|
186
|
-
- name: Tag as latest
|
|
187
|
-
run: docker tag ${name}:\${{ github.sha }} ${name}:latest
|
|
130
|
+
return `# Generated by BoneScript compiler.
|
|
131
|
+
name: CI/CD
|
|
132
|
+
|
|
133
|
+
on:
|
|
134
|
+
push:
|
|
135
|
+
branches: [main]
|
|
136
|
+
pull_request:
|
|
137
|
+
branches: [main]
|
|
138
|
+
|
|
139
|
+
jobs:
|
|
140
|
+
test:
|
|
141
|
+
runs-on: ubuntu-latest
|
|
142
|
+
services:
|
|
143
|
+
postgres:
|
|
144
|
+
image: postgres:16
|
|
145
|
+
env:
|
|
146
|
+
POSTGRES_DB: ${toSnakeCase(system.name)}_test
|
|
147
|
+
POSTGRES_USER: postgres
|
|
148
|
+
POSTGRES_PASSWORD: postgres
|
|
149
|
+
ports:
|
|
150
|
+
- 5432:5432
|
|
151
|
+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
|
152
|
+
|
|
153
|
+
steps:
|
|
154
|
+
- uses: actions/checkout@v4
|
|
155
|
+
- uses: actions/setup-node@v4
|
|
156
|
+
with:
|
|
157
|
+
node-version: 20
|
|
158
|
+
cache: npm
|
|
159
|
+
|
|
160
|
+
- name: Install dependencies
|
|
161
|
+
run: npm ci
|
|
162
|
+
|
|
163
|
+
- name: Type check
|
|
164
|
+
run: npx tsc --noEmit
|
|
165
|
+
|
|
166
|
+
- name: Run migrations
|
|
167
|
+
run: npm run migrate
|
|
168
|
+
env:
|
|
169
|
+
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
170
|
+
|
|
171
|
+
- name: Run tests
|
|
172
|
+
run: npx ts-node src/tests.ts
|
|
173
|
+
env:
|
|
174
|
+
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/${toSnakeCase(system.name)}_test
|
|
175
|
+
JWT_SECRET: test-secret
|
|
176
|
+
TEST_BASE_URL: http://localhost:3000
|
|
177
|
+
|
|
178
|
+
build:
|
|
179
|
+
needs: test
|
|
180
|
+
runs-on: ubuntu-latest
|
|
181
|
+
if: github.ref == 'refs/heads/main'
|
|
182
|
+
steps:
|
|
183
|
+
- uses: actions/checkout@v4
|
|
184
|
+
- name: Build Docker image
|
|
185
|
+
run: docker build -t ${name}:\${{ github.sha }} .
|
|
186
|
+
- name: Tag as latest
|
|
187
|
+
run: docker tag ${name}:\${{ github.sha }} ${name}:latest
|
|
188
188
|
`;
|
|
189
189
|
}
|
|
190
190
|
exports.emitGithubActions = emitGithubActions;
|