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.
Files changed (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/algorithm_catalog.d.ts +32 -0
  3. package/dist/algorithm_catalog.js +323 -0
  4. package/dist/algorithm_catalog.js.map +1 -0
  5. package/dist/ast.d.ts +244 -0
  6. package/dist/ast.js +8 -0
  7. package/dist/ast.js.map +1 -0
  8. package/dist/cli.d.ts +4 -0
  9. package/dist/cli.js +605 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/emit_batch.d.ts +7 -0
  12. package/dist/emit_batch.js +133 -0
  13. package/dist/emit_batch.js.map +1 -0
  14. package/dist/emit_capability.d.ts +7 -0
  15. package/dist/emit_capability.js +376 -0
  16. package/dist/emit_capability.js.map +1 -0
  17. package/dist/emit_composition.d.ts +22 -0
  18. package/dist/emit_composition.js +184 -0
  19. package/dist/emit_composition.js.map +1 -0
  20. package/dist/emit_deploy.d.ts +9 -0
  21. package/dist/emit_deploy.js +191 -0
  22. package/dist/emit_deploy.js.map +1 -0
  23. package/dist/emit_events.d.ts +14 -0
  24. package/dist/emit_events.js +305 -0
  25. package/dist/emit_events.js.map +1 -0
  26. package/dist/emit_extras.d.ts +12 -0
  27. package/dist/emit_extras.js +234 -0
  28. package/dist/emit_extras.js.map +1 -0
  29. package/dist/emit_full.d.ts +13 -0
  30. package/dist/emit_full.js +273 -0
  31. package/dist/emit_full.js.map +1 -0
  32. package/dist/emit_maintenance.d.ts +16 -0
  33. package/dist/emit_maintenance.js +442 -0
  34. package/dist/emit_maintenance.js.map +1 -0
  35. package/dist/emit_runtime.d.ts +13 -0
  36. package/dist/emit_runtime.js +691 -0
  37. package/dist/emit_runtime.js.map +1 -0
  38. package/dist/emit_sourcemap.d.ts +29 -0
  39. package/dist/emit_sourcemap.js +123 -0
  40. package/dist/emit_sourcemap.js.map +1 -0
  41. package/dist/emit_tests.d.ts +15 -0
  42. package/dist/emit_tests.js +185 -0
  43. package/dist/emit_tests.js.map +1 -0
  44. package/dist/emit_websocket.d.ts +6 -0
  45. package/dist/emit_websocket.js +223 -0
  46. package/dist/emit_websocket.js.map +1 -0
  47. package/dist/emitter.d.ts +25 -0
  48. package/dist/emitter.js +511 -0
  49. package/dist/emitter.js.map +1 -0
  50. package/dist/extension_manager.d.ts +38 -0
  51. package/dist/extension_manager.js +170 -0
  52. package/dist/extension_manager.js.map +1 -0
  53. package/dist/formatter.d.ts +34 -0
  54. package/dist/formatter.js +317 -0
  55. package/dist/formatter.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +113 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/ir.d.ts +168 -0
  60. package/dist/ir.js +10 -0
  61. package/dist/ir.js.map +1 -0
  62. package/dist/lexer.d.ts +195 -0
  63. package/dist/lexer.js +619 -0
  64. package/dist/lexer.js.map +1 -0
  65. package/dist/lowering.d.ts +25 -0
  66. package/dist/lowering.js +500 -0
  67. package/dist/lowering.js.map +1 -0
  68. package/dist/module_loader.d.ts +25 -0
  69. package/dist/module_loader.js +126 -0
  70. package/dist/module_loader.js.map +1 -0
  71. package/dist/optimizer.d.ts +26 -0
  72. package/dist/optimizer.js +158 -0
  73. package/dist/optimizer.js.map +1 -0
  74. package/dist/parse_decls.d.ts +13 -0
  75. package/dist/parse_decls.js +442 -0
  76. package/dist/parse_decls.js.map +1 -0
  77. package/dist/parse_decls2.d.ts +13 -0
  78. package/dist/parse_decls2.js +295 -0
  79. package/dist/parse_decls2.js.map +1 -0
  80. package/dist/parse_expr.d.ts +7 -0
  81. package/dist/parse_expr.js +197 -0
  82. package/dist/parse_expr.js.map +1 -0
  83. package/dist/parse_types.d.ts +6 -0
  84. package/dist/parse_types.js +51 -0
  85. package/dist/parse_types.js.map +1 -0
  86. package/dist/parser.d.ts +10 -0
  87. package/dist/parser.js +62 -0
  88. package/dist/parser.js.map +1 -0
  89. package/dist/parser_base.d.ts +19 -0
  90. package/dist/parser_base.js +50 -0
  91. package/dist/parser_base.js.map +1 -0
  92. package/dist/parser_recovery.d.ts +26 -0
  93. package/dist/parser_recovery.js +140 -0
  94. package/dist/parser_recovery.js.map +1 -0
  95. package/dist/scaffold.d.ts +13 -0
  96. package/dist/scaffold.js +376 -0
  97. package/dist/scaffold.js.map +1 -0
  98. package/dist/solver.d.ts +26 -0
  99. package/dist/solver.js +281 -0
  100. package/dist/solver.js.map +1 -0
  101. package/dist/typechecker.d.ts +52 -0
  102. package/dist/typechecker.js +534 -0
  103. package/dist/typechecker.js.map +1 -0
  104. package/dist/types.d.ts +38 -0
  105. package/dist/types.js +85 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/verifier.d.ts +46 -0
  108. package/dist/verifier.js +307 -0
  109. package/dist/verifier.js.map +1 -0
  110. package/package.json +52 -0
  111. package/src/algorithm_catalog.ts +345 -0
  112. package/src/ast.ts +334 -0
  113. package/src/cli.ts +624 -0
  114. package/src/emit_batch.ts +140 -0
  115. package/src/emit_capability.ts +436 -0
  116. package/src/emit_composition.ts +196 -0
  117. package/src/emit_deploy.ts +190 -0
  118. package/src/emit_events.ts +307 -0
  119. package/src/emit_extras.ts +240 -0
  120. package/src/emit_full.ts +309 -0
  121. package/src/emit_maintenance.ts +459 -0
  122. package/src/emit_runtime.ts +731 -0
  123. package/src/emit_sourcemap.ts +140 -0
  124. package/src/emit_tests.ts +205 -0
  125. package/src/emit_websocket.ts +229 -0
  126. package/src/emitter.ts +566 -0
  127. package/src/extension_manager.ts +187 -0
  128. package/src/formatter.ts +297 -0
  129. package/src/index.ts +88 -0
  130. package/src/ir.ts +215 -0
  131. package/src/lexer.ts +630 -0
  132. package/src/lowering.ts +556 -0
  133. package/src/module_loader.ts +114 -0
  134. package/src/optimizer.ts +196 -0
  135. package/src/parse_decls.ts +409 -0
  136. package/src/parse_decls2.ts +244 -0
  137. package/src/parse_expr.ts +197 -0
  138. package/src/parse_types.ts +54 -0
  139. package/src/parser.ts +64 -0
  140. package/src/parser_base.ts +57 -0
  141. package/src/parser_recovery.ts +153 -0
  142. package/src/scaffold.ts +375 -0
  143. package/src/solver.ts +330 -0
  144. package/src/typechecker.ts +591 -0
  145. package/src/types.ts +122 -0
  146. 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;