@tekki-forge/generator-prisma 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @tekki-forge/generator-prisma
2
+
3
+ Forge generator: IR -> Prisma schema.
4
+
5
+ Part of [Tekki Forge](https://www.npmjs.com/package/tekki-forge), which turns a `forge.config.ts` into a production-ready full-stack app. Apps created with `forge new` install this package for you; see the [tekki-forge](https://www.npmjs.com/package/tekki-forge) package for the documentation.
@@ -0,0 +1,5 @@
1
+ import { type AppIR, type EntityIR, type FieldIR, type Generator } from "@tekki-forge/compiler";
2
+ export declare const SCHEMA_PATH = "packages/database/prisma/schema.prisma";
3
+ export declare const prismaGenerator: Generator;
4
+ export declare function enumName(entity: EntityIR, field: FieldIR): string;
5
+ export declare function renderPrismaSchema(ir: AppIR): string;
package/dist/index.js ADDED
@@ -0,0 +1,496 @@
1
+ import { generated, indexPlan, pascalCase } from "@tekki-forge/compiler";
2
+ export const SCHEMA_PATH = "packages/database/prisma/schema.prisma";
3
+ export const prismaGenerator = {
4
+ name: "prisma",
5
+ generate: (ir) => [generated(SCHEMA_PATH, renderPrismaSchema(ir))],
6
+ };
7
+ export function enumName(entity, field) {
8
+ return `${entity.model}${pascalCase(field.name)}`;
9
+ }
10
+ function relationName(entity, field) {
11
+ return `${entity.model}_${field.name}`;
12
+ }
13
+ export function renderPrismaSchema(ir) {
14
+ const back = new Map();
15
+ const addBack = (target, rel) => back.set(target, [...(back.get(target) ?? []), rel]);
16
+ const fileFields = [];
17
+ for (const e of ir.entities) {
18
+ for (const f of e.fields) {
19
+ if (f.relation)
20
+ addBack(f.relation.model, { name: f.relation.inverse, model: e.model, relation: relationName(e, f) });
21
+ if (f.file) {
22
+ fileFields.push({ e, f });
23
+ addBack("File", { name: `${e.delegate}${pascalCase(f.name)}`, model: e.model, relation: relationName(e, f) });
24
+ }
25
+ }
26
+ if (e.features.tenant)
27
+ addBack("Organization", { name: lowerPlural(e), model: e.model, relation: `${e.model}_organization` });
28
+ }
29
+ const hasFiles = fileFields.length > 0 || ir.plugins.some((pl) => pl.name === "storage");
30
+ const hasComments = ir.entities.some((e) => e.features.comments);
31
+ const blocks = [
32
+ `// @generated by Forge from forge.config.ts — do not edit. Run \`forge generate\` instead.
33
+
34
+ generator client {
35
+ provider = "prisma-client"
36
+ output = "../src/generated/prisma"
37
+ }
38
+
39
+ datasource db {
40
+ provider = "postgresql"
41
+ }`,
42
+ ...authModels(ir, back, hasFiles, hasComments),
43
+ auditLogModel(ir),
44
+ notificationModel(ir),
45
+ savedViewModel(ir),
46
+ apiKeyModel(ir),
47
+ ...(ir.teams?.enabled ? teamModels(back.get("Team") ?? []) : []),
48
+ ...(hasFiles ? [fileModel(ir, back.get("File") ?? [])] : []),
49
+ ...(hasComments ? [commentModel(ir)] : []),
50
+ ];
51
+ for (const e of ir.entities) {
52
+ blocks.push(entityModel(ir, e, back.get(e.model) ?? []));
53
+ for (const f of e.fields) {
54
+ if (f.kind === "enum")
55
+ blocks.push(`enum ${enumName(e, f)} {\n${f.enumValues.map((v) => ` ${v.value}`).join("\n")}\n}`);
56
+ }
57
+ }
58
+ return blocks.join("\n\n") + "\n";
59
+ }
60
+ function lowerPlural(e) {
61
+ return e.delegate + (e.delegate.endsWith("s") ? "es" : "s");
62
+ }
63
+ function backRelationLines(rels) {
64
+ return rels.map((r) => ` ${r.name} ${r.model}[] @relation("${r.relation}")`);
65
+ }
66
+ function entityModel(ir, e, backRels) {
67
+ const lines = [`model ${e.model} {`, ` id String @id @default(uuid()) @db.Uuid`];
68
+ const indexes = [];
69
+ for (const f of e.fields) {
70
+ if (f.relation?.type === "many-to-many") {
71
+ // Implicit join table (_<Model>_<field>); Prisma removes links with either side.
72
+ lines.push(` ${f.name} ${f.relation.model}[] @relation("${relationName(e, f)}")`);
73
+ continue;
74
+ }
75
+ if (f.kind === "location") {
76
+ const opt = f.required ? "" : "?";
77
+ lines.push(` ${f.name}Lat Float${opt} @map("${f.column}_lat")`, ` ${f.name}Lng Float${opt} @map("${f.column}_lng")`);
78
+ continue;
79
+ }
80
+ if (f.file) {
81
+ lines.push(` ${f.apiName} String? @db.Uuid @map("${f.column}")`);
82
+ lines.push(` ${f.name} File? @relation("${relationName(e, f)}", fields: [${f.apiName}], references: [id], onDelete: SetNull)`);
83
+ continue;
84
+ }
85
+ if (f.relation) {
86
+ const fkType = f.relation.builtin ? "String" : "String @db.Uuid";
87
+ const [base, attr] = fkType.split(" ");
88
+ lines.push(` ${f.relation.foreignKey} ${base}${f.required ? "" : "?"}${attr ? " " + attr : ""} @map("${f.relation.foreignKeyColumn}")`);
89
+ const onDelete = { cascade: "Cascade", restrict: "Restrict", setNull: "SetNull" }[f.relation.onDelete];
90
+ lines.push(` ${f.name} ${f.relation.model}${f.required ? "" : "?"} @relation("${relationName(e, f)}", fields: [${f.relation.foreignKey}], references: [id], onDelete: ${onDelete})`);
91
+ continue;
92
+ }
93
+ const type = scalarType(e, f);
94
+ const attrs = [`@map("${f.column}")`];
95
+ if (f.unique && !e.features.tenant)
96
+ attrs.unshift("@unique");
97
+ const def = defaultAttr(f);
98
+ if (def)
99
+ attrs.unshift(def);
100
+ const native = nativeType(f);
101
+ if (native)
102
+ attrs.push(native);
103
+ lines.push(` ${f.name} ${type}${f.required || f.default ? "" : "?"} ${attrs.join(" ")}`);
104
+ if (f.unique && e.features.tenant)
105
+ indexes.push(` @@unique([organizationId, ${f.name}])`);
106
+ }
107
+ if (e.features.tenant) {
108
+ lines.push(` organizationId String @map("organization_id")`);
109
+ lines.push(` organization Organization @relation("${e.model}_organization", fields: [organizationId], references: [id], onDelete: Cascade)`);
110
+ }
111
+ if (e.features.timestamps) {
112
+ lines.push(` createdAt DateTime @default(now()) @map("created_at")`);
113
+ lines.push(` updatedAt DateTime @updatedAt @map("updated_at")`);
114
+ }
115
+ if (e.features.softDelete) {
116
+ lines.push(` deletedAt DateTime? @map("deleted_at")`);
117
+ }
118
+ lines.push(...backRelationLines(backRels));
119
+ // Indexes follow the queries the app runs (lists, filters, views, dashboard) — see indexPlan().
120
+ for (const idx of indexPlan(ir, e))
121
+ indexes.push(` @@index([${idx.fields.join(", ")}])`);
122
+ lines.push("", ...[...new Set(indexes)], ` @@map("${e.tableName}")`, "}");
123
+ return lines.join("\n");
124
+ }
125
+ function scalarType(e, f) {
126
+ switch (f.kind) {
127
+ case "integer":
128
+ return "Int";
129
+ case "decimal":
130
+ case "money":
131
+ return "Decimal";
132
+ case "percentage":
133
+ return "Float";
134
+ case "boolean":
135
+ return "Boolean";
136
+ case "date":
137
+ case "datetime":
138
+ return "DateTime";
139
+ case "json":
140
+ return "Json";
141
+ case "enum":
142
+ return enumName(e, f);
143
+ default:
144
+ return "String";
145
+ }
146
+ }
147
+ function nativeType(f) {
148
+ switch (f.kind) {
149
+ case "string":
150
+ case "email":
151
+ case "url":
152
+ case "phone":
153
+ case "color":
154
+ return `@db.VarChar(${f.validation.maxLength ?? 255})`;
155
+ case "text":
156
+ case "richtext":
157
+ return "@db.Text";
158
+ case "decimal":
159
+ case "money":
160
+ return `@db.Decimal(${f.precision}, ${f.scale})`;
161
+ case "date":
162
+ return "@db.Date";
163
+ case "datetime":
164
+ return "@db.Timestamptz(3)";
165
+ default:
166
+ return undefined;
167
+ }
168
+ }
169
+ function defaultAttr(f) {
170
+ const d = f.default;
171
+ if (!d)
172
+ return undefined;
173
+ if (d.kind === "now")
174
+ return "@default(now())";
175
+ const v = d.value;
176
+ if (f.kind === "enum")
177
+ return `@default(${v})`;
178
+ if (f.kind === "json")
179
+ return `@default(${JSON.stringify(JSON.stringify(v))})`;
180
+ if (f.kind === "date" || f.kind === "datetime")
181
+ return `@default(dbgenerated(${JSON.stringify(`'${v}'`)}))`;
182
+ if (typeof v === "string")
183
+ return `@default(${JSON.stringify(v)})`;
184
+ return `@default(${String(v)})`;
185
+ }
186
+ /** Uploaded objects (storage plugin). Rows are created on upload and attached when a record references them. */
187
+ function fileModel(ir, backRels) {
188
+ return `model File {
189
+ id String @id @default(uuid()) @db.Uuid
190
+ key String @unique
191
+ name String
192
+ size Int
193
+ mimeType String @map("mime_type")
194
+ entity String
195
+ field String
196
+ recordId String? @map("record_id")
197
+ status String @default("pending") // pending | attached | deleted
198
+ uploadedById String? @map("uploaded_by_id")
199
+ uploadedBy User? @relation("File_uploadedBy", fields: [uploadedById], references: [id], onDelete: SetNull)
200
+ ${ir.tenancy.enabled ? ` organizationId String? @map("organization_id")\n` : ""} createdAt DateTime @default(now()) @map("created_at")
201
+ attachedAt DateTime? @map("attached_at")
202
+ ${backRelationLines(backRels).join("\n")}
203
+
204
+ @@index([entity, recordId])
205
+ @@index([status, createdAt])
206
+ ${ir.tenancy.enabled ? " @@index([organizationId])\n" : ""} @@map("files")
207
+ }`;
208
+ }
209
+ /** In-app notifications (bell). */
210
+ function notificationModel(ir) {
211
+ return `model Notification {
212
+ id String @id @default(uuid()) @db.Uuid
213
+ userId String @map("user_id")
214
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
215
+ ${ir.tenancy.enabled ? ` organizationId String? @map("organization_id")\n` : ""} title String
216
+ body String?
217
+ link String?
218
+ event String?
219
+ entity String?
220
+ recordId String? @map("record_id")
221
+ readAt DateTime? @map("read_at")
222
+ createdAt DateTime @default(now()) @map("created_at")
223
+
224
+ @@index([userId, readAt])
225
+ @@index([userId, createdAt])
226
+ @@map("notifications")
227
+ }`;
228
+ }
229
+ /** Saved list filters ("views"), personal or shared with the organization. */
230
+ function savedViewModel(ir) {
231
+ return `model SavedView {
232
+ id String @id @default(uuid()) @db.Uuid
233
+ userId String @map("user_id")
234
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
235
+ ${ir.tenancy.enabled ? ` organizationId String? @map("organization_id")\n` : ""} resource String
236
+ name String
237
+ query Json
238
+ shared Boolean @default(false)
239
+ createdAt DateTime @default(now()) @map("created_at")
240
+ updatedAt DateTime @updatedAt @map("updated_at")
241
+
242
+ @@index([resource, userId])
243
+ @@map("saved_views")
244
+ }`;
245
+ }
246
+ /**
247
+ * Scoped API keys (`Authorization: Bearer fk_<prefix>_<secret>`). Only a SHA-256 hash of the secret is stored;
248
+ * `prefix` is the public lookup id.
249
+ */
250
+ function apiKeyModel(ir) {
251
+ const t = ir.tenancy.enabled;
252
+ return `model ApiKey {
253
+ id String @id @default(uuid()) @db.Uuid
254
+ name String
255
+ prefix String @unique
256
+ hash String
257
+ scopes String[]
258
+ role String
259
+ ${t ? ` organizationId String? @map("organization_id")\n organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n` : ""} createdById String? @map("created_by_id")
260
+ createdBy User? @relation("ApiKey_createdBy", fields: [createdById], references: [id], onDelete: SetNull)
261
+ expiresAt DateTime? @map("expires_at")
262
+ lastUsedAt DateTime? @map("last_used_at")
263
+ revokedAt DateTime? @map("revoked_at")
264
+ createdAt DateTime @default(now()) @map("created_at")
265
+ auditLogs AuditLog[]
266
+
267
+ ${t ? " @@index([organizationId])\n" : ""} @@map("api_keys")
268
+ }`;
269
+ }
270
+ /** Teams inside an organization (features.teams) and their members. */
271
+ function teamModels(backRels) {
272
+ return [
273
+ `model Team {
274
+ id String @id @default(uuid())
275
+ organizationId String @map("organization_id")
276
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
277
+ name String
278
+ description String?
279
+ createdAt DateTime @default(now()) @map("created_at")
280
+ updatedAt DateTime @updatedAt @map("updated_at")
281
+ members TeamMember[]
282
+ ${backRelationLines(backRels).join("\n")}
283
+
284
+ @@unique([organizationId, name])
285
+ @@map("teams")
286
+ }`,
287
+ `model TeamMember {
288
+ id String @id @default(uuid())
289
+ teamId String @map("team_id")
290
+ team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
291
+ userId String @map("user_id")
292
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
293
+ createdAt DateTime @default(now()) @map("created_at")
294
+
295
+ @@unique([teamId, userId])
296
+ @@index([userId])
297
+ @@map("team_members")
298
+ }`,
299
+ ];
300
+ }
301
+ /** Record comments, named so they never clash with a user entity called Comment (entities with `features: { comments: true }`); mentions hold user ids. */
302
+ function commentModel(ir) {
303
+ return `model RecordComment {
304
+ id String @id @default(uuid()) @db.Uuid
305
+ ${ir.tenancy.enabled ? ` organizationId String? @map("organization_id")\n` : ""} entity String
306
+ recordId String @map("record_id")
307
+ authorId String? @map("author_id")
308
+ author User? @relation("RecordComment_author", fields: [authorId], references: [id], onDelete: SetNull)
309
+ body String @db.Text
310
+ mentions String[] @default([])
311
+ editedAt DateTime? @map("edited_at")
312
+ deletedAt DateTime? @map("deleted_at")
313
+ createdAt DateTime @default(now()) @map("created_at")
314
+
315
+ @@index([entity, recordId, createdAt])
316
+ @@index([authorId])
317
+ ${ir.tenancy.enabled ? " @@index([organizationId])\n" : ""} @@map("record_comments")
318
+ }`;
319
+ }
320
+ function auditLogModel(ir) {
321
+ return `model AuditLog {
322
+ id String @id @default(uuid()) @db.Uuid
323
+ entity String
324
+ recordId String @map("record_id")
325
+ action String
326
+ userId String? @map("user_id")
327
+ user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
328
+ ${ir.tenancy.enabled ? ` organizationId String? @map("organization_id")\n` : ""} changes Json?
329
+ ipAddress String? @map("ip_address")
330
+ apiKeyId String? @db.Uuid @map("api_key_id")
331
+ apiKey ApiKey? @relation(fields: [apiKeyId], references: [id], onDelete: SetNull)
332
+ createdAt DateTime @default(now()) @map("created_at")
333
+
334
+ @@index([entity, recordId])
335
+ @@index([apiKeyId])
336
+ @@index([userId])
337
+ ${ir.tenancy.enabled ? " @@index([organizationId])\n" : ""} @@index([createdAt])
338
+ @@map("audit_logs")
339
+ }`;
340
+ }
341
+ /** Better Auth core + plugin models, matching better-auth 1.7 `getAuthTables`. */
342
+ function authModels(ir, back, files = false, comments = false) {
343
+ const t = ir.tenancy.enabled;
344
+ const models = [];
345
+ models.push(`model User {
346
+ id String @id
347
+ name String
348
+ email String @unique
349
+ emailVerified Boolean @default(false)
350
+ image String?
351
+ role String?
352
+ banned Boolean? @default(false)
353
+ banReason String?
354
+ banExpires DateTime?
355
+ twoFactorEnabled Boolean? @default(false)
356
+ createdAt DateTime @default(now())
357
+ updatedAt DateTime @default(now()) @updatedAt
358
+ sessions Session[]
359
+ accounts Account[]
360
+ auditLogs AuditLog[]
361
+ notifications Notification[]
362
+ savedViews SavedView[]
363
+ createdApiKeys ApiKey[] @relation("ApiKey_createdBy")
364
+ ${ir.teams?.enabled ? " teamMemberships TeamMember[]\n" : ""}${files ? ' uploadedFiles File[] @relation("File_uploadedBy")\n' : ""}${comments ? ' recordComments RecordComment[] @relation("RecordComment_author")\n' : ""}${ir.auth.twoFactor ? " twoFactors TwoFactor[]\n" : ""}${ir.auth.passkeys ? " passkeys Passkey[]\n" : ""}${t ? " members Member[]\n invitations Invitation[]\n" : ""}${backRelationLines(back.get("User") ?? []).join("\n")}
365
+
366
+ @@map("user")
367
+ }`);
368
+ models.push(`model Session {
369
+ id String @id
370
+ expiresAt DateTime
371
+ token String @unique
372
+ createdAt DateTime @default(now())
373
+ updatedAt DateTime @updatedAt
374
+ ipAddress String?
375
+ userAgent String?
376
+ userId String
377
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
378
+ impersonatedBy String?
379
+ ${t ? " activeOrganizationId String?\n" : ""}
380
+ @@index([userId])
381
+ @@map("session")
382
+ }`);
383
+ models.push(`model Account {
384
+ id String @id
385
+ accountId String
386
+ providerId String
387
+ userId String
388
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
389
+ accessToken String?
390
+ refreshToken String?
391
+ idToken String?
392
+ accessTokenExpiresAt DateTime?
393
+ refreshTokenExpiresAt DateTime?
394
+ scope String?
395
+ password String?
396
+ createdAt DateTime @default(now())
397
+ updatedAt DateTime @updatedAt
398
+
399
+ @@index([userId])
400
+ @@map("account")
401
+ }`);
402
+ models.push(`model Verification {
403
+ id String @id
404
+ identifier String
405
+ value String
406
+ expiresAt DateTime
407
+ createdAt DateTime @default(now())
408
+ updatedAt DateTime @default(now()) @updatedAt
409
+
410
+ @@index([identifier])
411
+ @@map("verification")
412
+ }`);
413
+ if (t) {
414
+ models.push(`model Organization {
415
+ id String @id
416
+ name String
417
+ slug String @unique
418
+ logo String?
419
+ createdAt DateTime
420
+ metadata String?
421
+ members Member[]
422
+ invitations Invitation[]
423
+ apiKeys ApiKey[]
424
+ ${ir.teams?.enabled ? " teams Team[]\n" : ""}${backRelationLines(back.get("Organization") ?? []).join("\n")}
425
+
426
+ @@map("organization")
427
+ }`);
428
+ models.push(`model Member {
429
+ id String @id
430
+ organizationId String
431
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
432
+ userId String
433
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
434
+ role String @default("member")
435
+ createdAt DateTime
436
+
437
+ @@index([organizationId])
438
+ @@index([userId])
439
+ @@map("member")
440
+ }`);
441
+ models.push(`model Invitation {
442
+ id String @id
443
+ organizationId String
444
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
445
+ email String
446
+ role String?
447
+ status String @default("pending")
448
+ expiresAt DateTime
449
+ createdAt DateTime @default(now())
450
+ inviterId String
451
+ user User @relation(fields: [inviterId], references: [id], onDelete: Cascade)
452
+
453
+ @@index([organizationId])
454
+ @@index([email])
455
+ @@map("invitation")
456
+ }`);
457
+ }
458
+ if (ir.auth.twoFactor) {
459
+ models.push(`model TwoFactor {
460
+ id String @id
461
+ secret String
462
+ backupCodes String
463
+ userId String
464
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
465
+ verified Boolean? @default(true)
466
+ failedVerificationCount Int? @default(0)
467
+ lockedUntil DateTime?
468
+
469
+ @@index([secret])
470
+ @@index([userId])
471
+ @@map("twoFactor")
472
+ }`);
473
+ }
474
+ if (ir.auth.passkeys) {
475
+ models.push(`model Passkey {
476
+ id String @id
477
+ name String?
478
+ publicKey String
479
+ userId String
480
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
481
+ credentialID String
482
+ counter Int
483
+ deviceType String
484
+ backedUp Boolean
485
+ transports String?
486
+ createdAt DateTime?
487
+ aaguid String?
488
+
489
+ @@index([userId])
490
+ @@index([credentialID])
491
+ @@map("passkey")
492
+ }`);
493
+ }
494
+ return models;
495
+ }
496
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAA2D,MAAM,uBAAuB,CAAC;AAElI,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAc;IACxC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAgB,EAAE,KAAc;IACvD,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,MAAgB,EAAE,KAAc;IACpD,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,EAAS;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,GAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAE5G,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACtH,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1B,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAChH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,eAAe,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,MAAM,GAAa;QACvB;;;;;;;;;EASF;QACE,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC;QAC9C,aAAa,CAAC,EAAE,CAAC;QACjB,iBAAiB,CAAC,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,CAAC;QAClB,WAAW,CAAC,EAAE,CAAC;QACf,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,UAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5H,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,CAAW;IAC9B,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,WAAW,CAAC,EAAS,EAAE,CAAW,EAAE,QAAwB;IACnE,MAAM,KAAK,GAAa,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,2CAA2C,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;YACxC,iFAAiF;YACjF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,iBAAiB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,YAAY,GAAG,UAAU,CAAC,CAAC,MAAM,QAAQ,EAAE,KAAK,CAAC,CAAC,IAAI,YAAY,GAAG,UAAU,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC;YACvH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,qBAAqB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,yCAAyC,CAAC,CAAC;YAChI,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC;YACjE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,gBAAgB,IAAI,CAAC,CAAC;YACzI,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvG,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,eAAe,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,UAAU,kCAAkC,QAAQ,GAAG,CAC1K,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;YAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IAC7F,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,KAAK,gFAAgF,CAAC,CAAC;IAChJ,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,gGAAgG;IAChG,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,CAAW,EAAE,CAAU;IACzC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,OAAO,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,CAAU;IAC5B,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,GAAG,GAAG,CAAC;QACzD,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,UAAU;YACb,OAAO,oBAAoB,CAAC;QAC9B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACpB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,iBAAiB,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC;IAC/C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/E,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5G,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACnE,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;AAClC,CAAC;AAED,gHAAgH;AAChH,SAAS,SAAS,CAAC,EAAS,EAAE,QAAwB;IACpD,OAAO;;;;;;;;;;;;EAYP,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;EAE9E,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAItC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE;EACzD,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,SAAS,iBAAiB,CAAC,EAAS;IAClC,OAAO;;;;EAIP,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;EAY9E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,cAAc,CAAC,EAAS;IAC/B,OAAO;;;;EAIP,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;;;;;;;EAS9E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,EAAS;IAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7B,OAAO;;;;;;;EAOP,CAAC,CAAC,CAAC,CAAC,2JAA2J,CAAC,CAAC,CAAC,EAAE;;;;;;;;EAQpK,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE;EACxC,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,SAAS,UAAU,CAAC,QAAwB;IAC1C,OAAO;QACL;;;;;;;;;EASF,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;EAItC;QACE;;;;;;;;;;;EAWF;KACC,CAAC;AACJ,CAAC;AAED,2JAA2J;AAC3J,SAAS,YAAY,CAAC,EAAS;IAC7B,OAAO;;EAEP,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;EAY9E,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE;EACzD,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,EAAS;IAC9B,OAAO;;;;;;;EAOP,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,oDAAoD,CAAC,CAAC,CAAC,EAAE;;;;;;;;;EAS9E,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE;;EAEzD,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAS,UAAU,CAAC,EAAS,EAAE,IAAiC,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,GAAG,KAAK;IAC/F,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;EAmBZ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,sEAAsE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG3b,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;EAWZ,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE;;;EAG3C,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;EAkBZ,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;EAUZ,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;EAUd,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG1G,CAAC,CAAC;QACA,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;EAYd,CAAC,CAAC;QACA,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;EAed,CAAC,CAAC;IACF,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;EAad,CAAC,CAAC;IACF,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;EAiBd,CAAC,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@tekki-forge/generator-prisma",
3
+ "version": "0.1.0",
4
+ "description": "Forge generator: IR -> Prisma schema",
5
+ "keywords": [
6
+ "code-generator",
7
+ "forge",
8
+ "full-stack",
9
+ "tekki-forge"
10
+ ],
11
+ "author": "Mahy KANE",
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "main": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "engines": {
26
+ "node": ">=22"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "@tekki-forge/compiler": "^0.1.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.json",
36
+ "typecheck": "tsc -p tsconfig.json --noEmit"
37
+ }
38
+ }