bonescript-compiler 0.2.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 -0
- package/dist/algorithm_catalog.d.ts +32 -0
- package/dist/algorithm_catalog.js +323 -0
- package/dist/algorithm_catalog.js.map +1 -0
- package/dist/ast.d.ts +244 -0
- package/dist/ast.js +8 -0
- package/dist/ast.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +605 -0
- package/dist/cli.js.map +1 -0
- package/dist/emit_batch.d.ts +7 -0
- package/dist/emit_batch.js +133 -0
- package/dist/emit_batch.js.map +1 -0
- package/dist/emit_capability.d.ts +7 -0
- package/dist/emit_capability.js +376 -0
- package/dist/emit_capability.js.map +1 -0
- package/dist/emit_composition.d.ts +22 -0
- package/dist/emit_composition.js +184 -0
- package/dist/emit_composition.js.map +1 -0
- package/dist/emit_deploy.d.ts +9 -0
- package/dist/emit_deploy.js +191 -0
- package/dist/emit_deploy.js.map +1 -0
- package/dist/emit_events.d.ts +14 -0
- package/dist/emit_events.js +305 -0
- package/dist/emit_events.js.map +1 -0
- package/dist/emit_extras.d.ts +12 -0
- package/dist/emit_extras.js +234 -0
- package/dist/emit_extras.js.map +1 -0
- package/dist/emit_full.d.ts +13 -0
- package/dist/emit_full.js +273 -0
- package/dist/emit_full.js.map +1 -0
- package/dist/emit_maintenance.d.ts +16 -0
- package/dist/emit_maintenance.js +442 -0
- package/dist/emit_maintenance.js.map +1 -0
- package/dist/emit_runtime.d.ts +13 -0
- package/dist/emit_runtime.js +691 -0
- package/dist/emit_runtime.js.map +1 -0
- package/dist/emit_sourcemap.d.ts +29 -0
- package/dist/emit_sourcemap.js +123 -0
- package/dist/emit_sourcemap.js.map +1 -0
- package/dist/emit_tests.d.ts +15 -0
- package/dist/emit_tests.js +185 -0
- package/dist/emit_tests.js.map +1 -0
- package/dist/emit_websocket.d.ts +6 -0
- package/dist/emit_websocket.js +223 -0
- package/dist/emit_websocket.js.map +1 -0
- package/dist/emitter.d.ts +25 -0
- package/dist/emitter.js +511 -0
- package/dist/emitter.js.map +1 -0
- package/dist/extension_manager.d.ts +38 -0
- package/dist/extension_manager.js +170 -0
- package/dist/extension_manager.js.map +1 -0
- package/dist/formatter.d.ts +34 -0
- package/dist/formatter.js +317 -0
- package/dist/formatter.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +113 -0
- package/dist/index.js.map +1 -0
- package/dist/ir.d.ts +168 -0
- package/dist/ir.js +10 -0
- package/dist/ir.js.map +1 -0
- package/dist/lexer.d.ts +195 -0
- package/dist/lexer.js +619 -0
- package/dist/lexer.js.map +1 -0
- package/dist/lowering.d.ts +25 -0
- package/dist/lowering.js +500 -0
- package/dist/lowering.js.map +1 -0
- package/dist/module_loader.d.ts +25 -0
- package/dist/module_loader.js +126 -0
- package/dist/module_loader.js.map +1 -0
- package/dist/optimizer.d.ts +26 -0
- package/dist/optimizer.js +158 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/parse_decls.d.ts +13 -0
- package/dist/parse_decls.js +442 -0
- package/dist/parse_decls.js.map +1 -0
- package/dist/parse_decls2.d.ts +13 -0
- package/dist/parse_decls2.js +295 -0
- package/dist/parse_decls2.js.map +1 -0
- package/dist/parse_expr.d.ts +7 -0
- package/dist/parse_expr.js +197 -0
- package/dist/parse_expr.js.map +1 -0
- package/dist/parse_types.d.ts +6 -0
- package/dist/parse_types.js +51 -0
- package/dist/parse_types.js.map +1 -0
- package/dist/parser.d.ts +10 -0
- package/dist/parser.js +62 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser_base.d.ts +19 -0
- package/dist/parser_base.js +50 -0
- package/dist/parser_base.js.map +1 -0
- package/dist/parser_recovery.d.ts +26 -0
- package/dist/parser_recovery.js +140 -0
- package/dist/parser_recovery.js.map +1 -0
- package/dist/scaffold.d.ts +13 -0
- package/dist/scaffold.js +376 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/solver.d.ts +26 -0
- package/dist/solver.js +281 -0
- package/dist/solver.js.map +1 -0
- package/dist/typechecker.d.ts +52 -0
- package/dist/typechecker.js +534 -0
- package/dist/typechecker.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.js +85 -0
- package/dist/types.js.map +1 -0
- package/dist/verifier.d.ts +46 -0
- package/dist/verifier.js +307 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +52 -0
- package/src/algorithm_catalog.ts +345 -0
- package/src/ast.ts +334 -0
- package/src/cli.ts +624 -0
- package/src/emit_batch.ts +140 -0
- package/src/emit_capability.ts +436 -0
- package/src/emit_composition.ts +196 -0
- package/src/emit_deploy.ts +190 -0
- package/src/emit_events.ts +307 -0
- package/src/emit_extras.ts +240 -0
- package/src/emit_full.ts +309 -0
- package/src/emit_maintenance.ts +459 -0
- package/src/emit_runtime.ts +731 -0
- package/src/emit_sourcemap.ts +140 -0
- package/src/emit_tests.ts +205 -0
- package/src/emit_websocket.ts +229 -0
- package/src/emitter.ts +566 -0
- package/src/extension_manager.ts +187 -0
- package/src/formatter.ts +297 -0
- package/src/index.ts +88 -0
- package/src/ir.ts +215 -0
- package/src/lexer.ts +630 -0
- package/src/lowering.ts +556 -0
- package/src/module_loader.ts +114 -0
- package/src/optimizer.ts +196 -0
- package/src/parse_decls.ts +409 -0
- package/src/parse_decls2.ts +244 -0
- package/src/parse_expr.ts +197 -0
- package/src/parse_types.ts +54 -0
- package/src/parser.ts +64 -0
- package/src/parser_base.ts +57 -0
- package/src/parser_recovery.ts +153 -0
- package/src/scaffold.ts +375 -0
- package/src/solver.ts +330 -0
- package/src/typechecker.ts +591 -0
- package/src/types.ts +122 -0
- package/src/verifier.ts +348 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Composition Emitter
|
|
4
|
+
* Generates real implementations for pipeline and algorithm capabilities.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.collectUsedAlgorithms = exports.emitAlgorithmsFile = exports.emitAlgorithmBody = exports.emitPipelineBody = void 0;
|
|
8
|
+
const algorithm_catalog_1 = require("./algorithm_catalog");
|
|
9
|
+
// ─── Pipeline Emission (Leap 1) ──────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Generate the body of a pipeline-based capability.
|
|
12
|
+
* Sequential pipelines thread results step-to-step with auto-rollback on error.
|
|
13
|
+
* Parallel pipelines run all steps concurrently and collect results.
|
|
14
|
+
*/
|
|
15
|
+
function emitPipelineBody(method, indent = " ") {
|
|
16
|
+
if (!method.pipeline)
|
|
17
|
+
return "";
|
|
18
|
+
const lines = [];
|
|
19
|
+
const p = method.pipeline;
|
|
20
|
+
if (p.parallel) {
|
|
21
|
+
return emitParallelPipeline(method, indent);
|
|
22
|
+
}
|
|
23
|
+
// Sequential pipeline
|
|
24
|
+
lines.push(`${indent}// Pipeline: ${p.steps.length} step(s), sequential`);
|
|
25
|
+
lines.push(`${indent}const __pipeline_completed: { step: string; rollback: (() => Promise<void>) | null }[] = [];`);
|
|
26
|
+
lines.push(`${indent}const __pipeline_results: Record<string, unknown> = {};`);
|
|
27
|
+
lines.push(``);
|
|
28
|
+
lines.push(`${indent}try {`);
|
|
29
|
+
for (const step of p.steps) {
|
|
30
|
+
const callExpr = generateStepCall(step);
|
|
31
|
+
if (step.bind_as) {
|
|
32
|
+
lines.push(`${indent} __pipeline_results["${step.bind_as}"] = await ${callExpr};`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
lines.push(`${indent} await ${callExpr};`);
|
|
36
|
+
}
|
|
37
|
+
lines.push(`${indent} __pipeline_completed.push({ step: "${step.call_name}", rollback: null });`);
|
|
38
|
+
lines.push(`${indent} counter("pipeline.step_completed", { method: "${method.name}", step: "${step.call_name}" });`);
|
|
39
|
+
}
|
|
40
|
+
lines.push(`${indent} return { ok: true, value: __pipeline_results } as any;`);
|
|
41
|
+
lines.push(`${indent}} catch (__err: any) {`);
|
|
42
|
+
// Error handler
|
|
43
|
+
if (p.on_error) {
|
|
44
|
+
if (p.on_error.action === "rollback") {
|
|
45
|
+
lines.push(`${indent} // on_error: rollback completed steps in reverse order`);
|
|
46
|
+
lines.push(`${indent} for (const c of [...__pipeline_completed].reverse()) {`);
|
|
47
|
+
lines.push(`${indent} if (c.rollback) await c.rollback().catch(() => {});`);
|
|
48
|
+
lines.push(`${indent} }`);
|
|
49
|
+
}
|
|
50
|
+
else if (p.on_error.action === "compensate" && p.on_error.call_name) {
|
|
51
|
+
lines.push(`${indent} // on_error: invoke compensation`);
|
|
52
|
+
const args = p.on_error.call_args.join(", ");
|
|
53
|
+
lines.push(`${indent} await ${p.on_error.call_name}(${args}).catch(() => {});`);
|
|
54
|
+
}
|
|
55
|
+
else if (p.on_error.action === "ignore") {
|
|
56
|
+
lines.push(`${indent} // on_error: ignore — log only`);
|
|
57
|
+
}
|
|
58
|
+
else if (p.on_error.action === "retry") {
|
|
59
|
+
lines.push(`${indent} // on_error: retry not yet supported in inline emission`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Default: rollback on error
|
|
64
|
+
lines.push(`${indent} // Default: rollback completed steps in reverse order`);
|
|
65
|
+
lines.push(`${indent} for (const c of [...__pipeline_completed].reverse()) {`);
|
|
66
|
+
lines.push(`${indent} if (c.rollback) await c.rollback().catch(() => {});`);
|
|
67
|
+
lines.push(`${indent} }`);
|
|
68
|
+
}
|
|
69
|
+
lines.push(`${indent} counter("pipeline.failed", { method: "${method.name}" });`);
|
|
70
|
+
lines.push(`${indent} logger.error("pipeline_failed", { event: "${method.name}", metadata: { error: __err.message } });`);
|
|
71
|
+
lines.push(`${indent} return { ok: false, error: { code: "PIPELINE_FAILED", message: __err.message } } as any;`);
|
|
72
|
+
lines.push(`${indent}}`);
|
|
73
|
+
return lines.join("\n");
|
|
74
|
+
}
|
|
75
|
+
exports.emitPipelineBody = emitPipelineBody;
|
|
76
|
+
function emitParallelPipeline(method, indent) {
|
|
77
|
+
if (!method.pipeline)
|
|
78
|
+
return "";
|
|
79
|
+
const lines = [];
|
|
80
|
+
const p = method.pipeline;
|
|
81
|
+
lines.push(`${indent}// Pipeline: ${p.steps.length} step(s), parallel`);
|
|
82
|
+
lines.push(`${indent}try {`);
|
|
83
|
+
lines.push(`${indent} const __results = await Promise.all([`);
|
|
84
|
+
for (const step of p.steps) {
|
|
85
|
+
lines.push(`${indent} ${generateStepCall(step)},`);
|
|
86
|
+
}
|
|
87
|
+
lines.push(`${indent} ]);`);
|
|
88
|
+
lines.push(`${indent} counter("pipeline.parallel_completed", { method: "${method.name}", count: "${p.steps.length}" });`);
|
|
89
|
+
lines.push(`${indent} return { ok: true, value: __results } as any;`);
|
|
90
|
+
lines.push(`${indent}} catch (__err: any) {`);
|
|
91
|
+
lines.push(`${indent} logger.error("parallel_pipeline_failed", { event: "${method.name}", metadata: { error: __err.message } });`);
|
|
92
|
+
lines.push(`${indent} return { ok: false, error: { code: "PIPELINE_FAILED", message: __err.message } } as any;`);
|
|
93
|
+
lines.push(`${indent}}`);
|
|
94
|
+
return lines.join("\n");
|
|
95
|
+
}
|
|
96
|
+
function generateStepCall(step) {
|
|
97
|
+
// Replace any args that reference previous bindings with __pipeline_results
|
|
98
|
+
const args = step.call_args.map(arg => {
|
|
99
|
+
// If arg looks like an identifier path, check if it might be a binding ref
|
|
100
|
+
return arg;
|
|
101
|
+
});
|
|
102
|
+
return `${step.call_name}(${args.join(", ")})`;
|
|
103
|
+
}
|
|
104
|
+
// ─── Algorithm Emission (Leap 2) ─────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Generate the body of an algorithm-based capability by looking up the
|
|
107
|
+
* implementation in the algorithm catalog.
|
|
108
|
+
*/
|
|
109
|
+
function emitAlgorithmBody(method, indent = " ") {
|
|
110
|
+
if (!method.algorithm)
|
|
111
|
+
return "";
|
|
112
|
+
const spec = (0, algorithm_catalog_1.lookupAlgorithm)(method.algorithm.catalog_name);
|
|
113
|
+
if (!spec) {
|
|
114
|
+
return `${indent}return { ok: false, error: { code: "UNKNOWN_ALGORITHM", message: "Algorithm '${method.algorithm.catalog_name}' not in catalog" } } as any;`;
|
|
115
|
+
}
|
|
116
|
+
const lines = [];
|
|
117
|
+
lines.push(`${indent}// Algorithm: ${spec.name} (${spec.complexity})`);
|
|
118
|
+
lines.push(`${indent}// ${spec.description}`);
|
|
119
|
+
lines.push(``);
|
|
120
|
+
lines.push(`${indent}try {`);
|
|
121
|
+
// Bind named arguments to algorithm parameters
|
|
122
|
+
const argNames = [];
|
|
123
|
+
for (const input of spec.inputs) {
|
|
124
|
+
const binding = method.algorithm.bindings.find(b => b.param === input.name);
|
|
125
|
+
if (binding) {
|
|
126
|
+
argNames.push(binding.value);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
argNames.push(input.name); // assume it's a method parameter
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const fnName = camelize(spec.name);
|
|
133
|
+
lines.push(`${indent} const __result = ${fnName}(${argNames.join(", ")});`);
|
|
134
|
+
lines.push(`${indent} counter("algorithm.invoked", { algorithm: "${spec.name}" });`);
|
|
135
|
+
lines.push(`${indent} return { ok: true, value: __result } as any;`);
|
|
136
|
+
lines.push(`${indent}} catch (__err: any) {`);
|
|
137
|
+
lines.push(`${indent} logger.error("algorithm_failed", { event: "${spec.name}", metadata: { error: __err.message } });`);
|
|
138
|
+
lines.push(`${indent} return { ok: false, error: { code: "ALGORITHM_FAILED", message: __err.message } } as any;`);
|
|
139
|
+
lines.push(`${indent}}`);
|
|
140
|
+
return lines.join("\n");
|
|
141
|
+
}
|
|
142
|
+
exports.emitAlgorithmBody = emitAlgorithmBody;
|
|
143
|
+
function camelize(s) {
|
|
144
|
+
return s.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
|
|
145
|
+
}
|
|
146
|
+
// ─── Algorithms File Emission ────────────────────────────────────────────────
|
|
147
|
+
/**
|
|
148
|
+
* Emit a single TypeScript file containing all algorithm implementations
|
|
149
|
+
* referenced by capabilities in the system.
|
|
150
|
+
*/
|
|
151
|
+
function emitAlgorithmsFile(usedAlgorithms) {
|
|
152
|
+
if (usedAlgorithms.size === 0)
|
|
153
|
+
return "";
|
|
154
|
+
const lines = [];
|
|
155
|
+
lines.push(`// Generated by BoneScript compiler. DO NOT EDIT.`);
|
|
156
|
+
lines.push(`// Algorithm implementations from BoneScript catalog.`);
|
|
157
|
+
lines.push(``);
|
|
158
|
+
for (const name of [...usedAlgorithms].sort()) {
|
|
159
|
+
const spec = (0, algorithm_catalog_1.lookupAlgorithm)(name);
|
|
160
|
+
if (!spec)
|
|
161
|
+
continue;
|
|
162
|
+
lines.push(`// ─── ${spec.name} (${spec.category}, ${spec.complexity}) ─────`);
|
|
163
|
+
lines.push(`// ${spec.description}`);
|
|
164
|
+
lines.push(`export ${spec.emit({}).trim()}`);
|
|
165
|
+
lines.push(``);
|
|
166
|
+
}
|
|
167
|
+
return lines.join("\n");
|
|
168
|
+
}
|
|
169
|
+
exports.emitAlgorithmsFile = emitAlgorithmsFile;
|
|
170
|
+
// ─── Collect Used Algorithms ─────────────────────────────────────────────────
|
|
171
|
+
function collectUsedAlgorithms(system) {
|
|
172
|
+
const used = new Set();
|
|
173
|
+
for (const mod of system.modules) {
|
|
174
|
+
for (const iface of mod.interfaces) {
|
|
175
|
+
for (const method of iface.methods) {
|
|
176
|
+
if (method.algorithm)
|
|
177
|
+
used.add(method.algorithm.catalog_name);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return used;
|
|
182
|
+
}
|
|
183
|
+
exports.collectUsedAlgorithms = collectUsedAlgorithms;
|
|
184
|
+
//# sourceMappingURL=emit_composition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_composition.js","sourceRoot":"","sources":["../src/emit_composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Deploy Target Emitter
|
|
3
|
+
* Generates Dockerfile, k8s manifests, and GitHub Actions CI/CD.
|
|
4
|
+
*/
|
|
5
|
+
import * as IR from "./ir";
|
|
6
|
+
export declare function emitDockerfile(system: IR.IRSystem): string;
|
|
7
|
+
export declare function emitDockerignore(): string;
|
|
8
|
+
export declare function emitK8sDeployment(system: IR.IRSystem): string;
|
|
9
|
+
export declare function emitGithubActions(system: IR.IRSystem): string;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Deploy Target Emitter
|
|
4
|
+
* Generates Dockerfile, k8s manifests, and GitHub Actions CI/CD.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.emitGithubActions = exports.emitK8sDeployment = exports.emitDockerignore = exports.emitDockerfile = void 0;
|
|
8
|
+
function toSnakeCase(s) {
|
|
9
|
+
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
10
|
+
}
|
|
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"]
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
exports.emitDockerfile = emitDockerfile;
|
|
37
|
+
function emitDockerignore() {
|
|
38
|
+
return `node_modules
|
|
39
|
+
dist
|
|
40
|
+
.env
|
|
41
|
+
*.log
|
|
42
|
+
.git
|
|
43
|
+
*.bone
|
|
44
|
+
*.bone.map
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
exports.emitDockerignore = emitDockerignore;
|
|
48
|
+
function emitK8sDeployment(system) {
|
|
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
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
exports.emitK8sDeployment = emitK8sDeployment;
|
|
128
|
+
function emitGithubActions(system) {
|
|
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
|
|
188
|
+
`;
|
|
189
|
+
}
|
|
190
|
+
exports.emitGithubActions = emitGithubActions;
|
|
191
|
+
//# sourceMappingURL=emit_deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_deploy.js","sourceRoot":"","sources":["../src/emit_deploy.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,cAAc,CAAC,MAAmB;IAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBR,CAAC;AACF,CAAC;AAxBD,wCAwBC;AAED,SAAgB,gBAAgB;IAC9B,OAAO;;;;;;;CAOR,CAAC;AACF,CAAC;AATD,4CASC;AAED,SAAgB,iBAAiB,CAAC,MAAmB;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO;;;;UAIC,IAAI;;WAEH,IAAI;gBACC,MAAM,CAAC,OAAO;;;;;aAKjB,IAAI;;;;eAIF,IAAI;;;kBAGD,IAAI;mBACH,IAAI,IAAI,MAAM,CAAC,OAAO;;;;;;;;;;;0BAWf,IAAI;;;;;0BAKJ,IAAI;;;;;0BAKJ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BpB,IAAI;;;WAGH,IAAI;;;;;CAKd,CAAC;AACF,CAAC;AA9ED,8CA8EC;AAED,SAAgB,iBAAiB,CAAC,MAAmB;IACnD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO;;;;;;;;;;;;;;;;yBAgBgB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;wEAuBuB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;wEAKxB,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;+BAWjE,IAAI;;0BAET,IAAI,uBAAuB,IAAI;CACxD,CAAC;AACF,CAAC;AA7DD,8CA6DC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BoneScript Durable Event System Emitter
|
|
3
|
+
*
|
|
4
|
+
* Generates two event delivery modes:
|
|
5
|
+
* in_process — default dev mode, in-memory bus (existing behavior)
|
|
6
|
+
* durable — Postgres-backed transactional outbox
|
|
7
|
+
*
|
|
8
|
+
* Durable mode guarantees:
|
|
9
|
+
* at_least_once — retry until acknowledged
|
|
10
|
+
* exactly_once — deduplicated via event_id table
|
|
11
|
+
*/
|
|
12
|
+
import * as IR from "./ir";
|
|
13
|
+
export declare function emitOutboxSchema(): string;
|
|
14
|
+
export declare function emitDurableEventBus(system: IR.IRSystem): string;
|