bonescript-compiler 0.6.1 → 0.7.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/dist/cli.js +121 -4
- package/dist/cli.js.map +1 -1
- package/dist/emit_prisma.d.ts +20 -0
- package/dist/emit_prisma.js +314 -0
- package/dist/emit_prisma.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/cli.ts +137 -5
- package/src/emit_prisma.ts +346 -0
- package/src/index.ts +1 -0
- package/dist/source_map.js.map +0 -1
- package/dist/test.js.map +0 -1
- package/dist/test_typechecker.d.ts +0 -5
- package/dist/test_typechecker.js +0 -126
- package/dist/test_typechecker.js.map +0 -1
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoneScript Prisma Schema Emitter
|
|
4
|
+
* Generates a Prisma schema file from the IR.
|
|
5
|
+
*
|
|
6
|
+
* Maps BoneScript entities, relations, and constraints to Prisma's
|
|
7
|
+
* schema language. Produces a single `schema.prisma` file that can
|
|
8
|
+
* be used with `npx prisma migrate dev` and `npx prisma generate`.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.PrismaEmitter = void 0;
|
|
12
|
+
function toSnakeCase(s) {
|
|
13
|
+
return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
function toPascalCase(s) {
|
|
16
|
+
return s.replace(/(^|[-_\s])(\w)/g, (_, __, c) => c.toUpperCase());
|
|
17
|
+
}
|
|
18
|
+
// ─── Type Mapping ─────────────────────────────────────────────────────────────
|
|
19
|
+
const PRISMA_TYPE_MAP = {
|
|
20
|
+
string: "String",
|
|
21
|
+
uint: "Int",
|
|
22
|
+
int: "Int",
|
|
23
|
+
float: "Float",
|
|
24
|
+
bool: "Boolean",
|
|
25
|
+
timestamp: "DateTime",
|
|
26
|
+
uuid: "String",
|
|
27
|
+
bytes: "Bytes",
|
|
28
|
+
json: "Json",
|
|
29
|
+
};
|
|
30
|
+
function toPrismaType(irType) {
|
|
31
|
+
if (PRISMA_TYPE_MAP[irType])
|
|
32
|
+
return PRISMA_TYPE_MAP[irType];
|
|
33
|
+
const listMatch = irType.match(/^(list|set)<(.+)>$/);
|
|
34
|
+
if (listMatch)
|
|
35
|
+
return `${toPrismaType(listMatch[2])}[]`;
|
|
36
|
+
const optMatch = irType.match(/^optional<(.+)>$/);
|
|
37
|
+
if (optMatch)
|
|
38
|
+
return `${toPrismaType(optMatch[1])}?`;
|
|
39
|
+
// Entity reference — will be handled as a relation
|
|
40
|
+
return "String";
|
|
41
|
+
}
|
|
42
|
+
function toPrismaNativeType(irType) {
|
|
43
|
+
switch (irType) {
|
|
44
|
+
case "uuid": return "@db.Uuid";
|
|
45
|
+
case "string": return null; // default is fine
|
|
46
|
+
case "json": return null; // Json maps directly
|
|
47
|
+
case "bytes": return null;
|
|
48
|
+
case "timestamp": return "@db.Timestamptz";
|
|
49
|
+
case "float": return "@db.DoublePrecision";
|
|
50
|
+
case "uint": return "@db.BigInt";
|
|
51
|
+
case "int": return "@db.BigInt";
|
|
52
|
+
default: return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── Prisma Emitter ───────────────────────────────────────────────────────────
|
|
56
|
+
class PrismaEmitter {
|
|
57
|
+
emit(system) {
|
|
58
|
+
const files = [];
|
|
59
|
+
files.push({
|
|
60
|
+
path: "prisma/schema.prisma",
|
|
61
|
+
content: this.emitSchema(system),
|
|
62
|
+
language: "typescript", // closest match for syntax highlighting
|
|
63
|
+
source_module: "prisma",
|
|
64
|
+
});
|
|
65
|
+
return files;
|
|
66
|
+
}
|
|
67
|
+
emitSchema(system) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
// Header
|
|
70
|
+
lines.push(`// Generated by BoneScript compiler. DO NOT EDIT.`);
|
|
71
|
+
lines.push(`// Source: ${system.name} (${system.source_hash})`);
|
|
72
|
+
lines.push(`// Run: npx prisma migrate dev --name init`);
|
|
73
|
+
lines.push(`// npx prisma generate`);
|
|
74
|
+
lines.push(``);
|
|
75
|
+
// Datasource
|
|
76
|
+
lines.push(`datasource db {`);
|
|
77
|
+
lines.push(` provider = "postgresql"`);
|
|
78
|
+
lines.push(` url = env("DATABASE_URL")`);
|
|
79
|
+
lines.push(`}`);
|
|
80
|
+
lines.push(``);
|
|
81
|
+
// Generator
|
|
82
|
+
lines.push(`generator client {`);
|
|
83
|
+
lines.push(` provider = "prisma-client-js"`);
|
|
84
|
+
lines.push(`}`);
|
|
85
|
+
lines.push(``);
|
|
86
|
+
// Collect all models across modules, deduplicating by name
|
|
87
|
+
const modelMap = new Map();
|
|
88
|
+
const allRelations = [];
|
|
89
|
+
for (const mod of system.modules) {
|
|
90
|
+
if (mod.kind === "data_store" || mod.kind === "api_service") {
|
|
91
|
+
for (const model of mod.models) {
|
|
92
|
+
if (!modelMap.has(model.name)) {
|
|
93
|
+
modelMap.set(model.name, { model, mod });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
allRelations.push(...mod.relations);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Deduplicate relations by a stable key
|
|
100
|
+
const seenRelations = new Set();
|
|
101
|
+
const uniqueRelations = [];
|
|
102
|
+
for (const rel of allRelations) {
|
|
103
|
+
const key = `${rel.from_entity}:${rel.to_entity}:${rel.kind}:${rel.foreign_key}`;
|
|
104
|
+
if (!seenRelations.has(key)) {
|
|
105
|
+
seenRelations.add(key);
|
|
106
|
+
uniqueRelations.push(rel);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Build a lookup: entity name → relations where it's the "from" side
|
|
110
|
+
const relationsFrom = new Map();
|
|
111
|
+
const relationsTo = new Map();
|
|
112
|
+
for (const rel of uniqueRelations) {
|
|
113
|
+
if (!relationsFrom.has(rel.from_entity))
|
|
114
|
+
relationsFrom.set(rel.from_entity, []);
|
|
115
|
+
relationsFrom.get(rel.from_entity).push(rel);
|
|
116
|
+
if (!relationsTo.has(rel.to_entity))
|
|
117
|
+
relationsTo.set(rel.to_entity, []);
|
|
118
|
+
relationsTo.get(rel.to_entity).push(rel);
|
|
119
|
+
}
|
|
120
|
+
// Emit each model
|
|
121
|
+
for (const [name, { model, mod }] of modelMap) {
|
|
122
|
+
lines.push(this.emitModel(name, model, mod, relationsFrom.get(name) || [], relationsTo.get(name) || [], modelMap));
|
|
123
|
+
lines.push(``);
|
|
124
|
+
}
|
|
125
|
+
// Emit junction tables for many_to_many
|
|
126
|
+
for (const rel of uniqueRelations) {
|
|
127
|
+
if (rel.kind === "many_to_many" && rel.junction_table) {
|
|
128
|
+
lines.push(this.emitJunctionModel(rel));
|
|
129
|
+
lines.push(``);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Emit audit_log and event_outbox models (infrastructure)
|
|
133
|
+
lines.push(this.emitAuditLogModel());
|
|
134
|
+
lines.push(``);
|
|
135
|
+
lines.push(this.emitEventOutboxModel());
|
|
136
|
+
lines.push(``);
|
|
137
|
+
return lines.join("\n");
|
|
138
|
+
}
|
|
139
|
+
emitModel(name, model, mod, relationsFrom, relationsTo, allModels) {
|
|
140
|
+
const lines = [];
|
|
141
|
+
const tableName = toSnakeCase(name) + "s";
|
|
142
|
+
lines.push(`model ${toPascalCase(name)} {`);
|
|
143
|
+
// Fields
|
|
144
|
+
for (const field of model.fields) {
|
|
145
|
+
lines.push(` ${this.emitField(field, model, name)}`);
|
|
146
|
+
}
|
|
147
|
+
// State field (if entity has a state machine)
|
|
148
|
+
const hasSM = mod.state_machines.some(sm => sm.entity === name);
|
|
149
|
+
const hasStateField = model.fields.some(f => f.name === "state");
|
|
150
|
+
if (hasSM && !hasStateField) {
|
|
151
|
+
lines.push(` state String`);
|
|
152
|
+
}
|
|
153
|
+
// Relation fields
|
|
154
|
+
for (const rel of relationsFrom) {
|
|
155
|
+
if (rel.kind === "belongs_to") {
|
|
156
|
+
// The FK field is already in the model fields. Add the relation object.
|
|
157
|
+
const targetModel = toPascalCase(rel.to_entity);
|
|
158
|
+
const fieldName = toSnakeCase(rel.to_entity);
|
|
159
|
+
lines.push(` ${fieldName} ${targetModel} @relation(fields: [${rel.foreign_key}], references: [id], onDelete: Cascade)`);
|
|
160
|
+
}
|
|
161
|
+
else if (rel.kind === "has_many") {
|
|
162
|
+
const targetModel = toPascalCase(rel.to_entity);
|
|
163
|
+
const fieldName = toSnakeCase(rel.to_entity) + "s";
|
|
164
|
+
lines.push(` ${fieldName} ${targetModel}[]`);
|
|
165
|
+
}
|
|
166
|
+
else if (rel.kind === "has_one") {
|
|
167
|
+
const targetModel = toPascalCase(rel.to_entity);
|
|
168
|
+
const fieldName = toSnakeCase(rel.to_entity);
|
|
169
|
+
lines.push(` ${fieldName} ${targetModel}?`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Inverse relations (where this model is the "to" side)
|
|
173
|
+
for (const rel of relationsTo) {
|
|
174
|
+
if (rel.kind === "belongs_to") {
|
|
175
|
+
// This model is the target of a belongs_to — add the inverse has_many
|
|
176
|
+
const sourceModel = toPascalCase(rel.from_entity);
|
|
177
|
+
const fieldName = toSnakeCase(rel.from_entity) + "s";
|
|
178
|
+
// Only add if not already covered by relationsFrom
|
|
179
|
+
const alreadyCovered = relationsFrom.some(r => r.to_entity === rel.from_entity && r.kind === "has_many");
|
|
180
|
+
if (!alreadyCovered) {
|
|
181
|
+
lines.push(` ${fieldName} ${sourceModel}[]`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Table mapping
|
|
186
|
+
lines.push(``);
|
|
187
|
+
lines.push(` @@map("${tableName}")`);
|
|
188
|
+
// Indexes
|
|
189
|
+
for (const idx of model.indexes) {
|
|
190
|
+
if (idx.unique) {
|
|
191
|
+
lines.push(` @@unique([${idx.fields.join(", ")}])`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
lines.push(` @@index([${idx.fields.join(", ")}])`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
lines.push(`}`);
|
|
198
|
+
return lines.join("\n");
|
|
199
|
+
}
|
|
200
|
+
emitField(field, model, entityName) {
|
|
201
|
+
const parts = [];
|
|
202
|
+
// Field name (padded for alignment)
|
|
203
|
+
parts.push(field.name.padEnd(14));
|
|
204
|
+
// Type
|
|
205
|
+
let prismaType = toPrismaType(field.type);
|
|
206
|
+
if (field.nullable)
|
|
207
|
+
prismaType += "?";
|
|
208
|
+
parts.push(prismaType.padEnd(12));
|
|
209
|
+
// Attributes
|
|
210
|
+
const attrs = [];
|
|
211
|
+
// Primary key
|
|
212
|
+
if (field.name === model.primary_key) {
|
|
213
|
+
attrs.push("@id");
|
|
214
|
+
}
|
|
215
|
+
// Default values
|
|
216
|
+
if (field.name === "id" && field.type === "uuid") {
|
|
217
|
+
attrs.push("@default(uuid())");
|
|
218
|
+
}
|
|
219
|
+
else if (field.name === "created_at" || (field.type === "timestamp" && field.name.includes("created"))) {
|
|
220
|
+
attrs.push("@default(now())");
|
|
221
|
+
}
|
|
222
|
+
else if (field.name === "updated_at") {
|
|
223
|
+
attrs.push("@updatedAt");
|
|
224
|
+
}
|
|
225
|
+
else if (field.default_value) {
|
|
226
|
+
const dv = this.mapDefaultValue(field.default_value, field.type);
|
|
227
|
+
if (dv)
|
|
228
|
+
attrs.push(dv);
|
|
229
|
+
}
|
|
230
|
+
// Unique constraint (skip if already primary key — @id implies uniqueness)
|
|
231
|
+
if (field.unique && field.name !== model.primary_key) {
|
|
232
|
+
attrs.push("@unique");
|
|
233
|
+
}
|
|
234
|
+
// Native type annotation
|
|
235
|
+
const nativeType = toPrismaNativeType(field.type);
|
|
236
|
+
if (nativeType) {
|
|
237
|
+
attrs.push(nativeType);
|
|
238
|
+
}
|
|
239
|
+
if (attrs.length > 0) {
|
|
240
|
+
parts.push(attrs.join(" "));
|
|
241
|
+
}
|
|
242
|
+
return parts.join(" ").trimEnd();
|
|
243
|
+
}
|
|
244
|
+
mapDefaultValue(value, type) {
|
|
245
|
+
if (value === "gen_random_uuid()" || value === "uuid()")
|
|
246
|
+
return "@default(uuid())";
|
|
247
|
+
if (value === "now()")
|
|
248
|
+
return "@default(now())";
|
|
249
|
+
if (value === "true" || value === "false")
|
|
250
|
+
return `@default(${value})`;
|
|
251
|
+
if (/^\d+$/.test(value))
|
|
252
|
+
return `@default(${value})`;
|
|
253
|
+
if (/^\d+\.\d+$/.test(value))
|
|
254
|
+
return `@default(${value})`;
|
|
255
|
+
if (value.startsWith('"') && value.endsWith('"'))
|
|
256
|
+
return `@default(${value})`;
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
emitJunctionModel(rel) {
|
|
260
|
+
const lines = [];
|
|
261
|
+
const fromCol = toSnakeCase(rel.from_entity) + "_id";
|
|
262
|
+
const toCol = toSnakeCase(rel.to_entity) + "_id";
|
|
263
|
+
lines.push(`model ${toPascalCase(rel.junction_table)} {`);
|
|
264
|
+
lines.push(` ${fromCol.padEnd(14)} String @db.Uuid`);
|
|
265
|
+
lines.push(` ${toCol.padEnd(14)} String @db.Uuid`);
|
|
266
|
+
lines.push(` created_at DateTime @default(now()) @db.Timestamptz`);
|
|
267
|
+
lines.push(``);
|
|
268
|
+
lines.push(` ${toSnakeCase(rel.from_entity).padEnd(14)} ${toPascalCase(rel.from_entity)} @relation(fields: [${fromCol}], references: [id], onDelete: Cascade)`);
|
|
269
|
+
lines.push(` ${toSnakeCase(rel.to_entity).padEnd(14)} ${toPascalCase(rel.to_entity)} @relation(fields: [${toCol}], references: [id], onDelete: Cascade)`);
|
|
270
|
+
lines.push(``);
|
|
271
|
+
lines.push(` @@id([${fromCol}, ${toCol}])`);
|
|
272
|
+
lines.push(` @@index([${fromCol}])`);
|
|
273
|
+
lines.push(` @@index([${toCol}])`);
|
|
274
|
+
lines.push(` @@map("${rel.junction_table}")`);
|
|
275
|
+
lines.push(`}`);
|
|
276
|
+
return lines.join("\n");
|
|
277
|
+
}
|
|
278
|
+
emitAuditLogModel() {
|
|
279
|
+
return `model AuditLog {
|
|
280
|
+
id String @id @default(uuid()) @db.Uuid
|
|
281
|
+
actor_id String? @db.Uuid
|
|
282
|
+
action String
|
|
283
|
+
entity_type String
|
|
284
|
+
entity_id String? @db.Uuid
|
|
285
|
+
payload Json?
|
|
286
|
+
ip String?
|
|
287
|
+
user_agent String?
|
|
288
|
+
trace_id String? @db.Uuid
|
|
289
|
+
created_at DateTime @default(now()) @db.Timestamptz
|
|
290
|
+
|
|
291
|
+
@@index([actor_id])
|
|
292
|
+
@@index([entity_type, entity_id])
|
|
293
|
+
@@index([created_at])
|
|
294
|
+
@@map("audit_log")
|
|
295
|
+
}`;
|
|
296
|
+
}
|
|
297
|
+
emitEventOutboxModel() {
|
|
298
|
+
return `model EventOutbox {
|
|
299
|
+
id String @id @default(uuid()) @db.Uuid
|
|
300
|
+
event_type String
|
|
301
|
+
payload Json
|
|
302
|
+
status String @default("pending")
|
|
303
|
+
attempts Int @default(0)
|
|
304
|
+
created_at DateTime @default(now()) @db.Timestamptz
|
|
305
|
+
processed_at DateTime? @db.Timestamptz
|
|
306
|
+
error String?
|
|
307
|
+
|
|
308
|
+
@@index([status, created_at])
|
|
309
|
+
@@map("event_outbox")
|
|
310
|
+
}`;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
exports.PrismaEmitter = PrismaEmitter;
|
|
314
|
+
//# sourceMappingURL=emit_prisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit_prisma.js","sourceRoot":"","sources":["../src/emit_prisma.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAKH,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,iFAAiF;AAEjF,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,UAAU;IACrB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,SAAS,YAAY,CAAC,MAAc;IAClC,IAAI,eAAe,CAAC,MAAM,CAAC;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACrD,IAAI,SAAS;QAAE,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClD,IAAI,QAAQ;QAAE,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACrD,mDAAmD;IACnD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAc;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM,CAAC,CAAC,OAAO,UAAU,CAAC;QAC/B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,kBAAkB;QAC9C,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,qBAAqB;QAC/C,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;QAC1B,KAAK,WAAW,CAAC,CAAC,OAAO,iBAAiB,CAAC;QAC3C,KAAK,OAAO,CAAC,CAAC,OAAO,qBAAqB,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC;QACjC,KAAK,KAAK,CAAC,CAAC,OAAO,YAAY,CAAC;QAChC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAa,aAAa;IACxB,IAAI,CAAC,MAAmB;QACtB,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,QAAQ,EAAE,YAAY,EAAE,wCAAwC;YAChE,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,MAAmB;QACpC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,SAAS;QACT,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,aAAa;QACb,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,YAAY;QACZ,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmD,CAAC;QAC5E,MAAM,YAAY,GAAoB,EAAE,CAAC;QAEzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC5D,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBACD,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,MAAM,eAAe,GAAoB,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACjF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,qEAAqE;QACrE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAChF,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACxE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;QAED,kBAAkB;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YACnH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,wCAAwC;QACxC,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,SAAS,CACf,IAAY,EACZ,KAAiB,EACjB,GAAgB,EAChB,aAA8B,EAC9B,WAA4B,EAC5B,SAA+D;QAE/D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QAE1C,KAAK,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,SAAS;QACT,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,8CAA8C;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACjE,IAAI,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,CAAC;QAED,kBAAkB;QAClB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,wEAAwE;gBACxE,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,WAAW,wBAAwB,GAAG,CAAC,WAAW,yCAAyC,CAAC,CAAC;YAC9H,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAChD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,WAAW,GAAG,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAED,wDAAwD;QACxD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,sEAAsE;gBACtE,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAClD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;gBACrD,mDAAmD;gBACnD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC5C,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC;QAEtC,UAAU;QACV,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,SAAS,CAAC,KAAiB,EAAE,KAAiB,EAAE,UAAkB;QACxE,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,oCAAoC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAElC,OAAO;QACP,IAAI,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ;YAAE,UAAU,IAAI,GAAG,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAElC,aAAa;QACb,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,cAAc;QACd,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,iBAAiB;QACjB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACzG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QAED,2EAA2E;QAC3E,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAEO,eAAe,CAAC,KAAa,EAAE,IAAY;QACjD,IAAI,KAAK,KAAK,mBAAmB,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,kBAAkB,CAAC;QACnF,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,iBAAiB,CAAC;QAChD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,YAAY,KAAK,GAAG,CAAC;QACvE,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,YAAY,KAAK,GAAG,CAAC;QACrD,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,YAAY,KAAK,GAAG,CAAC;QAC1D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,YAAY,KAAK,GAAG,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,iBAAiB,CAAC,GAAkB;QAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;QACrD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAEjD,KAAK,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC,cAAe,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,wBAAwB,OAAO,yCAAyC,CAAC,CAAC;QAClK,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,KAAK,yCAAyC,CAAC,CAAC;QAC5J,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,iBAAiB;QACvB,OAAO;;;;;;;;;;;;;;;;EAgBT,CAAC;IACD,CAAC;IAEO,oBAAoB;QAC1B,OAAO;;;;;;;;;;;;EAYT,CAAC;IACD,CAAC;CACF;AA7RD,sCA6RC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export { ConstraintSolver } from "./solver";
|
|
|
14
14
|
export type { SolverResult } from "./solver";
|
|
15
15
|
export { FullEmitter } from "./emit_full";
|
|
16
16
|
export { NakamaEmitter } from "./emit_nakama";
|
|
17
|
+
export { PrismaEmitter } from "./emit_prisma";
|
|
17
18
|
export type { NakamaEmittedFile } from "./emit_nakama";
|
|
18
19
|
export type { EmittedFile } from "./emitter";
|
|
19
20
|
export { Verifier } from "./verifier";
|
package/dist/index.js
CHANGED
|
@@ -27,7 +27,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
27
27
|
return result;
|
|
28
28
|
};
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.compile = exports.emitGraphQLSchema = exports.emitCronJobs = exports.emitNotifyService = exports.emitAdminPanel = exports.emitAuditMiddleware = exports.emitAuditSchema = exports.emitSeedFile = exports.emitPostmanCollection = exports.emitZodSchemas = exports.emitSdkPackageJson = exports.emitTypescriptSdk = exports.emitOpenApiJson = exports.emitOpenApiSpec = exports.validateExtensions = exports.extractImplementations = exports.mergeWithExisting = exports.listByCategory = exports.listAlgorithms = exports.lookupAlgorithm = exports.IR = exports.AST = exports.scaffold = exports.Formatter = exports.ModuleLoader = exports.optimize = exports.Verifier = exports.NakamaEmitter = exports.FullEmitter = exports.ConstraintSolver = exports.Lowering = exports.TypeChecker = exports.RecoveringParser = exports.ParseError = exports.Parser = exports.TokenKind = exports.LexerError = exports.Lexer = void 0;
|
|
30
|
+
exports.compile = exports.emitGraphQLSchema = exports.emitCronJobs = exports.emitNotifyService = exports.emitAdminPanel = exports.emitAuditMiddleware = exports.emitAuditSchema = exports.emitSeedFile = exports.emitPostmanCollection = exports.emitZodSchemas = exports.emitSdkPackageJson = exports.emitTypescriptSdk = exports.emitOpenApiJson = exports.emitOpenApiSpec = exports.validateExtensions = exports.extractImplementations = exports.mergeWithExisting = exports.listByCategory = exports.listAlgorithms = exports.lookupAlgorithm = exports.IR = exports.AST = exports.scaffold = exports.Formatter = exports.ModuleLoader = exports.optimize = exports.Verifier = exports.PrismaEmitter = exports.NakamaEmitter = exports.FullEmitter = exports.ConstraintSolver = exports.Lowering = exports.TypeChecker = exports.RecoveringParser = exports.ParseError = exports.Parser = exports.TokenKind = exports.LexerError = exports.Lexer = void 0;
|
|
31
31
|
// Core pipeline
|
|
32
32
|
var lexer_1 = require("./lexer");
|
|
33
33
|
Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_1.Lexer; } });
|
|
@@ -48,6 +48,8 @@ var emit_full_1 = require("./emit_full");
|
|
|
48
48
|
Object.defineProperty(exports, "FullEmitter", { enumerable: true, get: function () { return emit_full_1.FullEmitter; } });
|
|
49
49
|
var emit_nakama_1 = require("./emit_nakama");
|
|
50
50
|
Object.defineProperty(exports, "NakamaEmitter", { enumerable: true, get: function () { return emit_nakama_1.NakamaEmitter; } });
|
|
51
|
+
var emit_prisma_1 = require("./emit_prisma");
|
|
52
|
+
Object.defineProperty(exports, "PrismaEmitter", { enumerable: true, get: function () { return emit_prisma_1.PrismaEmitter; } });
|
|
51
53
|
var verifier_1 = require("./verifier");
|
|
52
54
|
Object.defineProperty(exports, "Verifier", { enumerable: true, get: function () { return verifier_1.Verifier; } });
|
|
53
55
|
var optimizer_1 = require("./optimizer");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bonescript-compiler",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "BoneScript compiler — compile .bone system descriptions into complete, runnable Node.js backends",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
20
|
"build": "tsc",
|
|
21
|
+
"prepare": "npm run build",
|
|
21
22
|
"prepublishOnly": "npm run build",
|
|
22
23
|
"start": "ts-node src/cli.ts",
|
|
23
24
|
"test": "ts-node src/test.ts && ts-node src/test_typechecker.ts && ts-node src/test_nakama.ts"
|
|
@@ -39,11 +40,11 @@
|
|
|
39
40
|
},
|
|
40
41
|
"repository": {
|
|
41
42
|
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/
|
|
43
|
+
"url": "git+https://github.com/Doorman11991/BoneScript.git"
|
|
43
44
|
},
|
|
44
|
-
"homepage": "https://github.com/
|
|
45
|
+
"homepage": "https://github.com/Doorman11991/BoneScript#readme",
|
|
45
46
|
"bugs": {
|
|
46
|
-
"url": "https://github.com/
|
|
47
|
+
"url": "https://github.com/Doorman11991/BoneScript/issues"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
50
|
"@types/node": "18.19.0",
|
package/src/cli.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { Lowering } from "./lowering";
|
|
|
13
13
|
import { ConstraintSolver } from "./solver";
|
|
14
14
|
import { FullEmitter } from "./emit_full";
|
|
15
15
|
import { NakamaEmitter } from "./emit_nakama";
|
|
16
|
+
import { PrismaEmitter } from "./emit_prisma";
|
|
16
17
|
import { Verifier } from "./verifier";
|
|
17
18
|
import { ModuleLoader } from "./module_loader";
|
|
18
19
|
import { Formatter } from "./formatter";
|
|
@@ -67,6 +68,9 @@ function main() {
|
|
|
67
68
|
case "verify-determinism":
|
|
68
69
|
requireFile(args[1], runVerifyDeterminism);
|
|
69
70
|
break;
|
|
71
|
+
case "validate":
|
|
72
|
+
runValidate(args.slice(1));
|
|
73
|
+
break;
|
|
70
74
|
default:
|
|
71
75
|
console.error(`Unknown command: ${command}`);
|
|
72
76
|
showHelp();
|
|
@@ -75,11 +79,12 @@ function main() {
|
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
function showHelp() {
|
|
78
|
-
console.log("BoneScript compiler v0.
|
|
82
|
+
console.log("BoneScript compiler v0.7.0");
|
|
79
83
|
console.log("");
|
|
80
84
|
console.log("Usage:");
|
|
81
85
|
console.log(" bonec compile <file> [--target <target>] Compile to runnable project");
|
|
82
86
|
console.log(" bonec check <file> Lex + parse + type check (no codegen)");
|
|
87
|
+
console.log(" bonec validate [dir] Type-check generated output (runs tsc --noEmit)");
|
|
83
88
|
console.log(" bonec lex <file> Show token stream");
|
|
84
89
|
console.log(" bonec parse <file> Show AST");
|
|
85
90
|
console.log(" bonec ir <file> Show IR (JSON)");
|
|
@@ -90,7 +95,7 @@ function showHelp() {
|
|
|
90
95
|
console.log("");
|
|
91
96
|
console.log("compile options:");
|
|
92
97
|
console.log(" --target <name> Output target (default: express)");
|
|
93
|
-
console.log(" Options: express, nakama");
|
|
98
|
+
console.log(" Options: express, nakama, prisma");
|
|
94
99
|
console.log(" --no-sdk Skip SDK generation");
|
|
95
100
|
console.log(" --no-openapi Skip OpenAPI spec generation");
|
|
96
101
|
console.log(" --no-seed Skip seed file generation");
|
|
@@ -278,7 +283,7 @@ function runInit(args: string[]) {
|
|
|
278
283
|
|
|
279
284
|
function runCompile(source: string, resolved: string, extraArgs: string[] = []) {
|
|
280
285
|
// Parse --target flag (default: express)
|
|
281
|
-
let target: "express" | "nakama" = "express";
|
|
286
|
+
let target: "express" | "nakama" | "prisma" = "express";
|
|
282
287
|
// Parse optional feature flags (future enhancement — documented for now)
|
|
283
288
|
let _noSdk = false;
|
|
284
289
|
let _noOpenApi = false;
|
|
@@ -286,8 +291,8 @@ function runCompile(source: string, resolved: string, extraArgs: string[] = [])
|
|
|
286
291
|
for (let i = 0; i < extraArgs.length; i++) {
|
|
287
292
|
if (extraArgs[i] === "--target" && extraArgs[i + 1]) {
|
|
288
293
|
const t = extraArgs[i + 1];
|
|
289
|
-
if (t !== "express" && t !== "nakama") {
|
|
290
|
-
console.error(`Unknown target '${t}'. Valid targets: express, nakama`);
|
|
294
|
+
if (t !== "express" && t !== "nakama" && t !== "prisma") {
|
|
295
|
+
console.error(`Unknown target '${t}'. Valid targets: express, nakama, prisma`);
|
|
291
296
|
process.exit(1);
|
|
292
297
|
}
|
|
293
298
|
target = t;
|
|
@@ -306,6 +311,11 @@ function runCompile(source: string, resolved: string, extraArgs: string[] = [])
|
|
|
306
311
|
return;
|
|
307
312
|
}
|
|
308
313
|
|
|
314
|
+
if (target === "prisma") {
|
|
315
|
+
runCompilePrisma(source, resolved);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
309
319
|
try {
|
|
310
320
|
const tokens = new Lexer(source).tokenize();
|
|
311
321
|
console.log(` [1/7] Lexed: ${tokens.length} tokens`);
|
|
@@ -763,3 +773,125 @@ function runVerifyDeterminism(source: string, resolved: string) {
|
|
|
763
773
|
}
|
|
764
774
|
}
|
|
765
775
|
}
|
|
776
|
+
|
|
777
|
+
// ─── Compile (Prisma target) ──────────────────────────────────────────────────
|
|
778
|
+
|
|
779
|
+
function runCompilePrisma(source: string, resolved: string) {
|
|
780
|
+
try {
|
|
781
|
+
const tokens = new Lexer(source).tokenize();
|
|
782
|
+
console.log(` [1/5] Lexed: ${tokens.length} tokens`);
|
|
783
|
+
|
|
784
|
+
const loader = new ModuleLoader();
|
|
785
|
+
const loadResult = loader.load(resolved);
|
|
786
|
+
if (loadResult.errors.length > 0) {
|
|
787
|
+
for (const e of loadResult.errors.slice(0, 10)) {
|
|
788
|
+
console.log(` ${path.basename(e.file)}: ${e.error.message}`);
|
|
789
|
+
}
|
|
790
|
+
if (!loadResult.ast) process.exit(1);
|
|
791
|
+
}
|
|
792
|
+
const ast = loadResult.ast!;
|
|
793
|
+
console.log(` [2/5] Parsed: ${ast.systems.length} system(s)`);
|
|
794
|
+
|
|
795
|
+
const typeErrors = new TypeChecker().check(ast);
|
|
796
|
+
if (typeErrors.length > 0) {
|
|
797
|
+
console.log(` [3/5] Type check: ${typeErrors.length} error(s)`);
|
|
798
|
+
for (const err of typeErrors) {
|
|
799
|
+
console.log(` ${err.code} at ${err.loc.line}:${err.loc.column}: ${err.message}`);
|
|
800
|
+
}
|
|
801
|
+
} else {
|
|
802
|
+
console.log(` [3/5] Type check: v (0 errors)`);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
const sourceHash = createHash("sha256").update(source).digest("hex").slice(0, 16);
|
|
806
|
+
const irSystems = new Lowering().lower(ast, sourceHash);
|
|
807
|
+
console.log(` [4/5] Lowered to IR: ${irSystems.reduce((s, sys) => s + sys.modules.length, 0)} modules`);
|
|
808
|
+
|
|
809
|
+
const emitter = new PrismaEmitter();
|
|
810
|
+
const allFiles: ReturnType<typeof emitter.emit> = [];
|
|
811
|
+
for (const sys of irSystems) {
|
|
812
|
+
allFiles.push(...emitter.emit(sys));
|
|
813
|
+
}
|
|
814
|
+
console.log(` [5/5] Prisma emit: ${allFiles.length} file(s)`);
|
|
815
|
+
|
|
816
|
+
const outputDir = path.resolve(path.dirname(resolved), "output");
|
|
817
|
+
for (const f of allFiles) {
|
|
818
|
+
const outPath = path.join(outputDir, f.path);
|
|
819
|
+
const dir = path.dirname(outPath);
|
|
820
|
+
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
821
|
+
fs.writeFileSync(outPath, f.content, "utf-8");
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
console.log(`\nv Prisma compilation complete. ${allFiles.length} file(s) written to output/prisma/`);
|
|
825
|
+
console.log(`\nNext steps:`);
|
|
826
|
+
console.log(` cd output`);
|
|
827
|
+
console.log(` npx prisma migrate dev --name init`);
|
|
828
|
+
console.log(` npx prisma generate`);
|
|
829
|
+
} catch (e: any) {
|
|
830
|
+
console.error(`x ${e.message}`);
|
|
831
|
+
process.exit(1);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
// ─── Validate ─────────────────────────────────────────────────────────────────
|
|
836
|
+
|
|
837
|
+
function runValidate(args: string[]) {
|
|
838
|
+
const outputDir = args[0] ? path.resolve(args[0]) : path.resolve("output");
|
|
839
|
+
|
|
840
|
+
if (!fs.existsSync(outputDir)) {
|
|
841
|
+
console.error(`Error: Output directory not found: ${outputDir}`);
|
|
842
|
+
console.error("Run 'bonec compile <file>' first to generate output.");
|
|
843
|
+
process.exit(1);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
const tsconfigPath = path.join(outputDir, "tsconfig.json");
|
|
847
|
+
if (!fs.existsSync(tsconfigPath)) {
|
|
848
|
+
console.error(`Error: No tsconfig.json found in ${outputDir}`);
|
|
849
|
+
console.error("The output directory doesn't appear to be a BoneScript-generated project.");
|
|
850
|
+
process.exit(1);
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// Check if node_modules exists — if not, suggest npm install
|
|
854
|
+
const nodeModulesPath = path.join(outputDir, "node_modules");
|
|
855
|
+
if (!fs.existsSync(nodeModulesPath)) {
|
|
856
|
+
console.error(`Error: node_modules/ not found in ${outputDir}`);
|
|
857
|
+
console.error("Run 'npm install' in the output directory first:");
|
|
858
|
+
console.error(` cd ${outputDir} && npm install`);
|
|
859
|
+
process.exit(1);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
console.log(`Validating generated TypeScript in ${outputDir}...`);
|
|
863
|
+
console.log(``);
|
|
864
|
+
|
|
865
|
+
const { execSync } = require("child_process");
|
|
866
|
+
|
|
867
|
+
try {
|
|
868
|
+
// Run tsc --noEmit to type-check without producing output
|
|
869
|
+
execSync("npx tsc --noEmit", {
|
|
870
|
+
cwd: outputDir,
|
|
871
|
+
stdio: "pipe",
|
|
872
|
+
encoding: "utf-8",
|
|
873
|
+
});
|
|
874
|
+
console.log(`v Validation passed. Generated code compiles cleanly.`);
|
|
875
|
+
} catch (e: any) {
|
|
876
|
+
// tsc returns non-zero on type errors — parse and display them
|
|
877
|
+
const output = (e.stdout || "") + (e.stderr || "");
|
|
878
|
+
const errorLines = output.split("\n").filter((l: string) => l.trim().length > 0);
|
|
879
|
+
const errorCount = errorLines.filter((l: string) => /error TS\d+/.test(l)).length;
|
|
880
|
+
|
|
881
|
+
console.error(`x Validation failed: ${errorCount} TypeScript error(s)\n`);
|
|
882
|
+
|
|
883
|
+
// Show up to 20 errors for readability
|
|
884
|
+
const displayLines = errorLines.slice(0, 40);
|
|
885
|
+
for (const line of displayLines) {
|
|
886
|
+
console.error(` ${line}`);
|
|
887
|
+
}
|
|
888
|
+
if (errorLines.length > 40) {
|
|
889
|
+
console.error(` ... and ${errorLines.length - 40} more lines`);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
console.error(``);
|
|
893
|
+
console.error(`To see all errors, run:`);
|
|
894
|
+
console.error(` cd ${outputDir} && npx tsc --noEmit`);
|
|
895
|
+
process.exit(1);
|
|
896
|
+
}
|
|
897
|
+
}
|