@tekki-forge/runtime-api 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.
Files changed (74) hide show
  1. package/README.md +5 -0
  2. package/dist/access.d.ts +15 -0
  3. package/dist/access.js +51 -0
  4. package/dist/access.js.map +1 -0
  5. package/dist/api-keys.d.ts +140 -0
  6. package/dist/api-keys.js +361 -0
  7. package/dist/api-keys.js.map +1 -0
  8. package/dist/backup.d.ts +142 -0
  9. package/dist/backup.js +280 -0
  10. package/dist/backup.js.map +1 -0
  11. package/dist/bootstrap.d.ts +57 -0
  12. package/dist/bootstrap.js +191 -0
  13. package/dist/bootstrap.js.map +1 -0
  14. package/dist/comments.d.ts +139 -0
  15. package/dist/comments.js +370 -0
  16. package/dist/comments.js.map +1 -0
  17. package/dist/computed.d.ts +27 -0
  18. package/dist/computed.js +174 -0
  19. package/dist/computed.js.map +1 -0
  20. package/dist/controllers.d.ts +309 -0
  21. package/dist/controllers.js +634 -0
  22. package/dist/controllers.js.map +1 -0
  23. package/dist/dashboard.d.ts +58 -0
  24. package/dist/dashboard.js +258 -0
  25. package/dist/dashboard.js.map +1 -0
  26. package/dist/errors.d.ts +6 -0
  27. package/dist/errors.js +55 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/events.d.ts +39 -0
  30. package/dist/events.js +36 -0
  31. package/dist/events.js.map +1 -0
  32. package/dist/extension.d.ts +103 -0
  33. package/dist/extension.js +8 -0
  34. package/dist/extension.js.map +1 -0
  35. package/dist/import.d.ts +69 -0
  36. package/dist/import.js +347 -0
  37. package/dist/import.js.map +1 -0
  38. package/dist/index.d.ts +22 -0
  39. package/dist/index.js +23 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/jobs.d.ts +41 -0
  42. package/dist/jobs.js +10 -0
  43. package/dist/jobs.js.map +1 -0
  44. package/dist/notifications.d.ts +61 -0
  45. package/dist/notifications.js +195 -0
  46. package/dist/notifications.js.map +1 -0
  47. package/dist/plugin.d.ts +43 -0
  48. package/dist/plugin.js +4 -0
  49. package/dist/plugin.js.map +1 -0
  50. package/dist/query.d.ts +29 -0
  51. package/dist/query.js +192 -0
  52. package/dist/query.js.map +1 -0
  53. package/dist/saved-views.d.ts +42 -0
  54. package/dist/saved-views.js +130 -0
  55. package/dist/saved-views.js.map +1 -0
  56. package/dist/search.d.ts +17 -0
  57. package/dist/search.js +42 -0
  58. package/dist/search.js.map +1 -0
  59. package/dist/seed.d.ts +12 -0
  60. package/dist/seed.js +132 -0
  61. package/dist/seed.js.map +1 -0
  62. package/dist/serialize.d.ts +37 -0
  63. package/dist/serialize.js +165 -0
  64. package/dist/serialize.js.map +1 -0
  65. package/dist/service.d.ts +168 -0
  66. package/dist/service.js +757 -0
  67. package/dist/service.js.map +1 -0
  68. package/dist/teams.d.ts +63 -0
  69. package/dist/teams.js +131 -0
  70. package/dist/teams.js.map +1 -0
  71. package/dist/testing.d.ts +63 -0
  72. package/dist/testing.js +420 -0
  73. package/dist/testing.js.map +1 -0
  74. package/package.json +61 -0
@@ -0,0 +1,420 @@
1
+ /**
2
+ * API test kit for generated apps (`forge test`). It starts the real API (controllers, validation,
3
+ * permissions, tenancy, hooks) on a random port against a test database, with a test sign-in instead of
4
+ * Better Auth sessions, and runs a generic suite per entity derived from forge.config.ts.
5
+ */
6
+ import { execFileSync } from "node:child_process";
7
+ import { randomUUID } from "node:crypto";
8
+ import { effectiveRoles } from "@tekki-forge/runtime-permissions";
9
+ import { createForge } from "./bootstrap.js";
10
+ export const TEST_USER_HEADER = "x-forge-test-user";
11
+ /** Better Auth stand-in: a request is signed in as the user named in the x-forge-test-user header. */
12
+ function testAuth(sessions) {
13
+ return {
14
+ api: {
15
+ getSession: async ({ headers }) => {
16
+ const id = headers.get(TEST_USER_HEADER);
17
+ return id ? (sessions.get(id) ?? null) : null;
18
+ },
19
+ },
20
+ handler: async () => new Response(JSON.stringify({ message: "Better Auth is replaced by a test sign-in in API tests" }), { status: 404, headers: { "content-type": "application/json" } }),
21
+ };
22
+ }
23
+ export async function createApiTestKit(options) {
24
+ const { app: ir, prisma } = options;
25
+ const sessions = new Map();
26
+ const actors = { anonymous: { name: "anonymous", id: null, roles: [], organizationId: null } };
27
+ const tag = randomUUID().slice(0, 8);
28
+ const tenancy = ir.tenancy.enabled;
29
+ const org = async (name) => (await prisma.organization.create({ data: { id: randomUUID(), name: `${name} ${tag}`, slug: `${name.toLowerCase()}-${tag}`, createdAt: new Date() } })).id;
30
+ const home = tenancy ? await org("Test") : null;
31
+ const away = tenancy ? await org("Other") : null;
32
+ const addUser = async (name, role, organizationId) => {
33
+ const id = randomUUID();
34
+ const globalRole = tenancy ? "user" : role === "user" ? "user" : role;
35
+ const user = await prisma.user.create({ data: { id, name: `Test ${name}`, email: `${name}-${tag}@test.forge`, emailVerified: true, role: globalRole } });
36
+ if (organizationId)
37
+ await prisma.member.create({ data: { id: randomUUID(), organizationId, userId: id, role, createdAt: new Date() } });
38
+ sessions.set(id, { user, session: { id: randomUUID(), userId: id, activeOrganizationId: organizationId } });
39
+ actors[name] = { name, id, roles: effectiveRoles(globalRole, tenancy ? role : null, tenancy), organizationId };
40
+ };
41
+ // One user per role; with organizations the role is their membership role in the test organization.
42
+ const roles = tenancy ? ir.roles : [...new Set([...ir.roles, "user"])];
43
+ for (const role of roles)
44
+ await addUser(role, role, home);
45
+ if (tenancy)
46
+ await addUser("outsider", "admin", away);
47
+ const { app } = await createForge({ ...options, auth: testAuth(sessions), plugins: options.plugins ?? [], logger: options.logger ?? false });
48
+ await app.listen(0, "127.0.0.1");
49
+ const address = app.getHttpServer().address();
50
+ const url = `http://127.0.0.1:${address.port}${ir.api.prefix}`;
51
+ return {
52
+ app: ir,
53
+ prisma,
54
+ url,
55
+ actors,
56
+ async request(actor, method, path, body) {
57
+ const res = await fetch(`${url}${path}`, {
58
+ method,
59
+ headers: { accept: "application/json", ...(body !== undefined ? { "content-type": "application/json" } : {}), ...(actor.id ? { [TEST_USER_HEADER]: actor.id } : {}) },
60
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
61
+ });
62
+ const text = await res.text();
63
+ let parsed = text;
64
+ try {
65
+ parsed = text ? JSON.parse(text) : null;
66
+ }
67
+ catch {
68
+ // CSV and other text bodies
69
+ }
70
+ return { status: res.status, body: parsed };
71
+ },
72
+ async close() {
73
+ await app.close();
74
+ },
75
+ };
76
+ }
77
+ /** What a permission rule grants `actor`: everything, only their own records, nothing, or "decided by a policy". */
78
+ export function accessFor(rule, actor) {
79
+ if (rule.public)
80
+ return "allowed";
81
+ if (!actor.id)
82
+ return "denied";
83
+ if (rule.authenticated || rule.roles.some((r) => actor.roles.includes(r)))
84
+ return "allowed";
85
+ if (rule.owner)
86
+ return "own";
87
+ // Team rules depend on team membership, which the generated suite does not set up: checked like policies (skipped).
88
+ if (rule.policies.length || rule.team)
89
+ return "policy";
90
+ return "denied";
91
+ }
92
+ const isWritableBy = (f, actor) => {
93
+ const rule = f.access?.write;
94
+ return !rule || accessFor(rule, actor) !== "denied";
95
+ };
96
+ const isReadableBy = (f, actor) => {
97
+ const rule = f.access?.read;
98
+ return !rule || accessFor(rule, actor) === "allowed";
99
+ };
100
+ // ─── Sample payloads ───────────────────────────────────────────────────────────────────────
101
+ const WORDS = ["Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel"];
102
+ function sampleScalar(f, n) {
103
+ const v = f.validation;
104
+ const clamp = (x) => Math.min(v.max ?? Number.MAX_SAFE_INTEGER, Math.max(v.min ?? 0, x));
105
+ const word = `${WORDS[n % WORDS.length]} ${randomUUID().slice(0, 6)}`;
106
+ switch (f.kind) {
107
+ case "string":
108
+ case "text":
109
+ case "richtext":
110
+ case "phone": {
111
+ const s = f.kind === "phone" ? `+1555${String(1000000 + n).slice(-7)}` : `${word} ${f.label}`;
112
+ return s.padEnd(v.minLength ?? 0, "x").slice(0, v.maxLength ?? 200);
113
+ }
114
+ case "email":
115
+ return `test-${randomUUID().slice(0, 8)}@example.com`;
116
+ case "url":
117
+ return `https://example.com/${randomUUID().slice(0, 8)}`;
118
+ case "color":
119
+ return "#3b82f6";
120
+ case "integer":
121
+ return clamp(n + 1);
122
+ case "percentage":
123
+ return clamp(10);
124
+ case "decimal":
125
+ case "money":
126
+ return String(clamp(n + 12.5));
127
+ case "boolean":
128
+ return true;
129
+ case "date":
130
+ return new Date(Date.now() + n * 86_400_000).toISOString().slice(0, 10);
131
+ case "datetime":
132
+ return new Date(Date.now() + n * 86_400_000).toISOString();
133
+ case "enum":
134
+ return f.enumValues[0].value;
135
+ case "json":
136
+ return { test: true };
137
+ case "location":
138
+ return { lat: 14.7 + n / 100, lng: -17.4 };
139
+ default:
140
+ return undefined;
141
+ }
142
+ }
143
+ export class CannotCreate extends Error {
144
+ }
145
+ /**
146
+ * A valid create payload for `entity` written as `actor`. Required relations are satisfied by creating
147
+ * target records as the test admin first (or using the actor for User relations).
148
+ */
149
+ export async function samplePayload(kit, entity, actor, n = 0, depth = 0) {
150
+ if (depth > 4)
151
+ throw new CannotCreate(`relation chain too deep at ${entity.name}`);
152
+ const body = {};
153
+ for (const f of entity.fields) {
154
+ if (f.hidden || f.readonly || f.computed || f.name === entity.workflow?.field || !isWritableBy(f, actor))
155
+ continue;
156
+ if (f.relation?.owner)
157
+ continue; // the API sets the owner to the caller
158
+ if (f.file) {
159
+ if (f.required)
160
+ throw new CannotCreate(`${entity.name}.${f.name} is a required file`);
161
+ continue;
162
+ }
163
+ if (f.relation) {
164
+ if (!f.required && f.relation.type === "many-to-one")
165
+ continue;
166
+ if (f.relation.type === "many-to-many") {
167
+ body[f.apiName] = f.required ? [await targetId(kit, f.relation.entity, actor, depth)] : [];
168
+ continue;
169
+ }
170
+ body[f.apiName] = await targetId(kit, f.relation.entity, actor, depth);
171
+ continue;
172
+ }
173
+ if (f.validation.pattern) {
174
+ if (f.required)
175
+ throw new CannotCreate(`${entity.name}.${f.name} has a custom pattern — write this test by hand`);
176
+ continue;
177
+ }
178
+ if (!f.required && f.kind !== "boolean" && n % 2 === 1)
179
+ continue;
180
+ const value = sampleScalar(f, n);
181
+ if (value !== undefined)
182
+ body[f.apiName] = value;
183
+ }
184
+ return body;
185
+ }
186
+ async function targetId(kit, entityName, actor, depth) {
187
+ if (entityName === "User")
188
+ return actor.id ?? kit.actors.admin.id;
189
+ if (entityName === "Organization")
190
+ return actor.organizationId;
191
+ const target = kit.app.entities.find((e) => e.name === entityName);
192
+ // Targets live in the actor's organization: the test admin's, or the outsider's own.
193
+ const admin = actor.name === "outsider" ? actor : kit.actors.admin;
194
+ const res = await kit.request(admin, "POST", `/${target.path}`, await samplePayload(kit, target, admin, 0, depth + 1));
195
+ if (res.status !== 201)
196
+ throw new CannotCreate(`could not create the ${entityName} it needs (${res.status} ${JSON.stringify(res.body?.message ?? res.body)})`);
197
+ return res.body.id;
198
+ }
199
+ /**
200
+ * CRUD and permission checks for one entity, for every role: what forge.config.ts allows must succeed,
201
+ * what it doesn't must be refused, other organizations must see nothing and hidden fields must stay hidden.
202
+ */
203
+ export function describeEntityApi(entityName, getKit, t) {
204
+ t.describe(`${entityName} API`, () => {
205
+ let kit;
206
+ let entity;
207
+ let path;
208
+ /** A record created by the admin (owned by them when the entity has an owner). */
209
+ let adminRecord = null;
210
+ let setupError = null;
211
+ t.beforeAll(async () => {
212
+ kit = await getKit();
213
+ const found = kit.app.entities.find((e) => e.name === entityName);
214
+ if (!found) {
215
+ setupError = `${entityName} no longer exists — run forge generate`;
216
+ entity = kit.app.entities[0];
217
+ return;
218
+ }
219
+ entity = found;
220
+ path = `/${entity.path}`;
221
+ const admin = kit.actors.admin;
222
+ if (accessFor(entity.permissions.create, admin) !== "allowed")
223
+ return;
224
+ try {
225
+ const res = await kit.request(admin, "POST", path, await samplePayload(kit, entity, admin));
226
+ if (res.status !== 201)
227
+ setupError = `admin could not create a ${entityName}: ${res.status} ${JSON.stringify(res.body)}`;
228
+ else
229
+ adminRecord = res.body;
230
+ }
231
+ catch (e) {
232
+ setupError = e instanceof CannotCreate ? e.message : String(e);
233
+ }
234
+ }, 60_000);
235
+ const actors = () => Object.values(kit.actors);
236
+ const label = (a) => (a.name === "outsider" ? "admin of another organization" : a.name);
237
+ t.it("refuses anonymous callers unless the entity is public", async () => {
238
+ if (setupError?.includes("no longer exists"))
239
+ return;
240
+ const res = await kit.request(kit.actors.anonymous, "GET", path);
241
+ t.expect(res.status, `GET ${path} anonymously`).toBe(entity.permissions.read.public ? 200 : 401);
242
+ });
243
+ t.it("creates records for exactly the roles allowed to", async () => {
244
+ if (setupError)
245
+ return console.warn(`[forge test] ${entityName}: ${setupError}`);
246
+ for (const actor of actors()) {
247
+ if (!actor.id)
248
+ continue;
249
+ const access = accessFor(entity.permissions.create, actor);
250
+ if (access === "policy")
251
+ continue;
252
+ let body;
253
+ try {
254
+ body = await samplePayload(kit, entity, actor, 1);
255
+ }
256
+ catch (e) {
257
+ if (e instanceof CannotCreate)
258
+ continue;
259
+ throw e;
260
+ }
261
+ const res = await kit.request(actor, "POST", path, body);
262
+ if (access === "denied")
263
+ t.expect(res.status, `${label(actor)} must not create a ${entityName}`).toBe(403);
264
+ else
265
+ t.expect(res.status, `${label(actor)} creates a ${entityName}: ${JSON.stringify(res.body)}`).toBe(201);
266
+ }
267
+ }, 60_000);
268
+ t.it("lists and reads records within each role's scope", async () => {
269
+ if (!adminRecord)
270
+ return;
271
+ for (const actor of actors()) {
272
+ if (!actor.id)
273
+ continue;
274
+ const access = actor.name === "outsider" && entity.features.tenant ? "outsider" : accessFor(entity.permissions.read, actor);
275
+ if (access === "policy")
276
+ continue;
277
+ const list = await kit.request(actor, "GET", `${path}?pageSize=500`);
278
+ const one = await kit.request(actor, "GET", `${path}/${adminRecord.id}`);
279
+ if (access === "denied") {
280
+ t.expect(list.status, `${label(actor)} must not list ${entity.pluralLabel}`).toBe(403);
281
+ t.expect([403, 404], `${label(actor)} must not read a ${entityName}`).toContain(one.status);
282
+ continue;
283
+ }
284
+ t.expect(list.status, `${label(actor)} lists ${entity.pluralLabel}`).toBe(200);
285
+ const visible = list.body.data.some((r) => r.id === adminRecord.id);
286
+ const ownsIt = actor.id === kit.actors.admin.id;
287
+ if (access === "outsider" || (access === "own" && !ownsIt)) {
288
+ t.expect(visible, `${label(actor)} must not see the admin's ${entityName} in the list`).toBe(false);
289
+ t.expect(one.status, `${label(actor)} must not read the admin's ${entityName}`).toBe(404);
290
+ }
291
+ else {
292
+ t.expect(visible, `${label(actor)} sees the ${entityName} in the list`).toBe(true);
293
+ t.expect(one.status, `${label(actor)} reads the ${entityName}`).toBe(200);
294
+ }
295
+ }
296
+ }, 60_000);
297
+ t.it("hides fields a role may not read", async () => {
298
+ if (!adminRecord)
299
+ return;
300
+ const restricted = entity.fields.filter((f) => f.access?.read && !f.hidden);
301
+ for (const actor of actors()) {
302
+ if (!actor.id || actor.name === "outsider" || accessFor(entity.permissions.read, actor) !== "allowed")
303
+ continue;
304
+ const res = await kit.request(actor, "GET", `${path}/${adminRecord.id}`);
305
+ if (res.status !== 200)
306
+ continue;
307
+ for (const f of restricted) {
308
+ if (!isReadableBy(f, actor) && accessFor(f.access.read, actor) !== "own")
309
+ t.expect(res.body, `${label(actor)} must not see ${entityName}.${f.name}`).not.toHaveProperty(f.name);
310
+ }
311
+ }
312
+ }, 60_000);
313
+ t.it("updates records for exactly the roles allowed to", async () => {
314
+ if (!adminRecord)
315
+ return;
316
+ const field = entity.fields.find((f) => !f.hidden && !f.readonly && !f.computed && !f.relation && !f.file && !f.access?.write && f.name !== entity.workflow?.field && ["string", "text", "integer", "boolean", "decimal", "money"].includes(f.kind) && !f.unique && !f.validation.pattern);
317
+ if (!field)
318
+ return;
319
+ for (const actor of actors()) {
320
+ if (!actor.id)
321
+ continue;
322
+ const access = actor.name === "outsider" && entity.features.tenant ? "outsider" : accessFor(entity.permissions.update, actor);
323
+ if (access === "policy")
324
+ continue;
325
+ const res = await kit.request(actor, "PATCH", `${path}/${adminRecord.id}`, { [field.apiName]: sampleScalar(field, 3) });
326
+ const ownsIt = actor.id === kit.actors.admin.id;
327
+ if (access === "outsider")
328
+ t.expect(res.status, `${label(actor)} must not update another organization's ${entityName}`).toBe(404);
329
+ else if (access === "denied" || (access === "own" && !ownsIt))
330
+ t.expect([403, 404], `${label(actor)} must not update the admin's ${entityName} (got ${res.status})`).toContain(res.status);
331
+ else
332
+ t.expect(res.status, `${label(actor)} updates the ${entityName}: ${JSON.stringify(res.body)}`).toBe(200);
333
+ }
334
+ }, 60_000);
335
+ t.it("rejects invalid input with field errors", async () => {
336
+ const admin = kit.actors.admin;
337
+ if (accessFor(entity.permissions.create, admin) !== "allowed")
338
+ return;
339
+ const required = entity.fields.filter((f) => f.required && !f.hidden && !f.readonly && !f.computed && !f.relation?.owner && f.default === undefined && f.kind !== "boolean" && f.name !== entity.workflow?.field);
340
+ if (!required.length)
341
+ return;
342
+ const res = await kit.request(admin, "POST", path, {});
343
+ t.expect(res.status, "an empty payload is refused").toBe(400);
344
+ t.expect(res.body.issues.map((i) => i.path), "each missing required field is reported").toEqual(t.expect.arrayContaining(required.map((f) => f.apiName)));
345
+ });
346
+ t.it("deletes records for exactly the roles allowed to", async () => {
347
+ if (!adminRecord)
348
+ return;
349
+ const admin = kit.actors.admin;
350
+ for (const actor of actors()) {
351
+ if (!actor.id)
352
+ continue;
353
+ const access = actor.name === "outsider" && entity.features.tenant ? "outsider" : accessFor(entity.permissions.delete, actor);
354
+ if (access === "policy")
355
+ continue;
356
+ let fresh;
357
+ try {
358
+ const created = await kit.request(admin, "POST", path, await samplePayload(kit, entity, admin, 2));
359
+ if (created.status !== 201)
360
+ return;
361
+ fresh = created.body;
362
+ }
363
+ catch (e) {
364
+ if (e instanceof CannotCreate)
365
+ return;
366
+ throw e;
367
+ }
368
+ const res = await kit.request(actor, "DELETE", `${path}/${fresh.id}`);
369
+ const ownsIt = actor.id === admin.id;
370
+ if (access === "outsider")
371
+ t.expect(res.status, `${label(actor)} must not delete another organization's ${entityName}`).toBe(404);
372
+ else if (access === "denied" || (access === "own" && !ownsIt))
373
+ t.expect([403, 404], `${label(actor)} must not delete the admin's ${entityName} (got ${res.status})`).toContain(res.status);
374
+ else {
375
+ t.expect([200, 204], `${label(actor)} deletes the ${entityName}: ${JSON.stringify(res.body)}`).toContain(res.status);
376
+ t.expect((await kit.request(admin, "GET", `${path}/${fresh.id}`)).status, "a deleted record is gone").toBe(404);
377
+ }
378
+ }
379
+ }, 60_000);
380
+ });
381
+ }
382
+ /** Entities the generated suite covers: the app's own (plugins test theirs). */
383
+ export function testedEntities(ir) {
384
+ const pluginEntities = new Set(ir.plugins.flatMap((p) => p.entities));
385
+ return ir.entities.filter((e) => !pluginEntities.has(e.name));
386
+ }
387
+ // ─── Test database ─────────────────────────────────────────────────────────────────────────
388
+ /** TEST_DATABASE_URL, else DATABASE_URL with "_test" appended to the database name. */
389
+ export function testDatabaseUrl(env = process.env) {
390
+ if (env.TEST_DATABASE_URL)
391
+ return env.TEST_DATABASE_URL;
392
+ if (!env.DATABASE_URL)
393
+ throw new Error("Set DATABASE_URL (or TEST_DATABASE_URL) to run the API tests");
394
+ const u = new URL(env.DATABASE_URL);
395
+ u.pathname = `/${decodeURIComponent(u.pathname.slice(1)) || "app"}_test`;
396
+ return u.toString();
397
+ }
398
+ /**
399
+ * Recreate the test database and apply the migrations (run once per `forge test`, from vitest's
400
+ * globalSetup). Refuses database names that don't end in "_test" so it can never wipe real data.
401
+ */
402
+ export function prepareTestDatabase(databaseDir, url) {
403
+ const u = new URL(url);
404
+ const name = decodeURIComponent(u.pathname.slice(1));
405
+ if (!/^[A-Za-z0-9_]+_test$/.test(name))
406
+ throw new Error(`Refusing to reset "${name}": the test database name must end in _test`);
407
+ const maintenance = new URL(url);
408
+ maintenance.pathname = "/postgres";
409
+ const prisma = (args, env, input) => execFileSync("pnpm", ["exec", "prisma", ...args], { cwd: databaseDir, env: { ...process.env, DATABASE_URL: env, PRISMA_HIDE_UPDATE_MESSAGE: "1" }, input, stdio: [input ? "pipe" : "ignore", "pipe", "pipe"] });
410
+ try {
411
+ prisma(["db", "execute", "--stdin"], maintenance.toString(), `DROP DATABASE IF EXISTS "${name}" WITH (FORCE);`);
412
+ prisma(["db", "execute", "--stdin"], maintenance.toString(), `CREATE DATABASE "${name}";`);
413
+ prisma(["migrate", "deploy"], url);
414
+ }
415
+ catch (e) {
416
+ const err = e;
417
+ throw new Error(`Preparing the test database failed: ${err.stderr?.toString() || err.stdout?.toString() || err.message}`);
418
+ }
419
+ }
420
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAwB,MAAM,gBAAgB,CAAC;AAInE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AA0BpD,sGAAsG;AACtG,SAAS,QAAQ,CAAC,QAAkD;IAClE,OAAO;QACL,GAAG,EAAE;YACH,UAAU,EAAE,KAAK,EAAE,EAAE,OAAO,EAAwB,EAAE,EAAE;gBACtD,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBACzC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;SACF;QACD,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,wDAAwD,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC;KAC3L,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAuB;IAC5D,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuC,CAAC;IAChE,MAAM,MAAM,GAA8B,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;IAC1H,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;IAEnC,MAAM,GAAG,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CACjC,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAY,CAAC;IACvK,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEjD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,cAA6B,EAAE,EAAE;QAClF,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACzJ,IAAI,cAAc;YAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxI,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IACjH,CAAC,CAAC;IACF,oGAAoG;IACpG,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,OAAO;QAAE,MAAM,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAEtD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,EAAqB,CAAC,CAAC;IAChK,MAAO,GAAwB,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,OAAO,GAAI,GAAwB,CAAC,aAAa,EAAE,CAAC,OAAO,EAAsB,CAAC;IACxF,MAAM,GAAG,GAAG,oBAAoB,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IAE/D,OAAO;QACL,GAAG,EAAE,EAAE;QACP,MAAM;QACN,GAAG;QACH,MAAM;QACN,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;YACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,EAAE;gBACvC,MAAM;gBACN,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;gBACrK,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,MAAM,GAAY,IAAI,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAO,GAAwB,CAAC,KAAK,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAMD,oHAAoH;AACpH,MAAM,UAAU,SAAS,CAAC,IAAkB,EAAE,KAAgB;IAC5D,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC/B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5F,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC7B,oHAAoH;IACpH,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAU,EAAE,KAAgB,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC;IAC7B,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,QAAQ,CAAC;AACtD,CAAC,CAAC;AACF,MAAM,YAAY,GAAG,CAAC,CAAU,EAAE,KAAgB,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IAC5B,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,SAAS,CAAC;AACvD,CAAC,CAAC;AAEF,8FAA8F;AAE9F,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzF,SAAS,YAAY,CAAC,CAAU,EAAE,CAAS;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IACtE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9F,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,OAAO;YACV,OAAO,QAAQ,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC;QACxD,KAAK,KAAK;YACR,OAAO,uBAAuB,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,KAAK,YAAY;YACf,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,KAAK,UAAU;YACb,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7D,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,UAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,MAAgB,EAAE,KAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;IACvG,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,YAAY,CAAC,8BAA8B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAQ,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;YAAE,SAAS;QACnH,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK;YAAE,SAAS,CAAC,uCAAuC;QACxE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,QAAQ;gBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC;YACtF,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,aAAa;gBAAE,SAAS;YAC/D,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACvC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3F,SAAS;YACX,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,QAAQ;gBAAE,MAAM,IAAI,YAAY,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,iDAAiD,CAAC,CAAC;YAClH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACjE,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAe,EAAE,UAAkB,EAAE,KAAgB,EAAE,KAAa;IAC1F,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC,EAAG,CAAC;IACpE,IAAI,UAAU,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC,cAAe,CAAC;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAE,CAAC;IACpE,qFAAqF;IACrF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC;IACpE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACvH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,YAAY,CAAC,wBAAwB,UAAU,cAAc,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/J,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB,CAAC;AAaD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,MAAiC,EAAE,CAAW;IAClG,CAAC,CAAC,QAAQ,CAAC,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE;QACnC,IAAI,GAAe,CAAC;QACpB,IAAI,MAAgB,CAAC;QACrB,IAAI,IAAY,CAAC;QACjB,kFAAkF;QAClF,IAAI,WAAW,GAAe,IAAI,CAAC;QACnC,IAAI,UAAU,GAAkB,IAAI,CAAC;QAErC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;YACrB,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,UAAU,GAAG,GAAG,UAAU,wCAAwC,CAAC;gBACnE,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,MAAM,GAAG,KAAK,CAAC;YACf,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC;YAChC,IAAI,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,SAAS;gBAAE,OAAO;YACtE,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5F,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,UAAU,GAAG,4BAA4B,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;oBACpH,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;YAC9B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,UAAU,GAAG,CAAC,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEnG,CAAC,CAAC,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACvE,IAAI,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC;gBAAE,OAAO;YACrD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAClE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;QAEH,CAAC,CAAC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAClE,IAAI,UAAU;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,gBAAgB,UAAU,KAAK,UAAU,EAAE,CAAC,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,SAAS;gBACxB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC3D,IAAI,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBAClC,IAAI,IAAS,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,YAAY,YAAY;wBAAE,SAAS;oBACxC,MAAM,CAAC,CAAC;gBACV,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzD,IAAI,MAAM,KAAK,QAAQ;oBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;;oBACtG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,CAAC,CAAC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAClE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,SAAS;gBACxB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC5H,IAAI,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBAClC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,eAAe,CAAC,CAAC;gBACrE,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACvF,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC5F,SAAS;gBACX,CAAC;gBACD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAY,CAAC,EAAE,CAAC,CAAC;gBAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC,EAAE,CAAC;gBACjD,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3D,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,UAAU,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACpG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5F,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,UAAU,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnF,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,CAAC,CAAC,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAClD,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,SAAS;oBAAE,SAAS;gBAChH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,SAAS;gBACjC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAO,CAAC,IAAK,EAAE,KAAK,CAAC,KAAK,KAAK;wBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,UAAU,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpL,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,CAAC,CAAC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAClE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3R,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,SAAS;gBACxB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC9H,IAAI,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBAClC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxH,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC,EAAE,CAAC;gBACjD,IAAI,MAAM,KAAK,UAAU;oBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAC7H,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC;oBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,UAAU,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;;oBACtL,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,CAAC,CAAC,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC;YAChC,IAAI,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,SAAS;gBAAE,OAAO;YACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClN,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAAE,OAAO;YAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,yCAAyC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjK,CAAC,CAAC,CAAC;QAEH,CAAC,CAAC,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAClE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAM,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,KAAK,CAAC,EAAE;oBAAE,SAAS;gBACxB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC9H,IAAI,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBAClC,IAAI,KAAU,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;oBACnG,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG;wBAAE,OAAO;oBACnC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;gBACvB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,YAAY,YAAY;wBAAE,OAAO;oBACtC,MAAM,CAAC,CAAC;gBACV,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,MAAM,KAAK,UAAU;oBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,2CAA2C,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAC7H,IAAI,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC;oBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,gCAAgC,UAAU,SAAS,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;qBACtL,CAAC;oBACJ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACrH,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClH,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,EAAS;IACtC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,8FAA8F;AAE9F,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,IAAI,GAAG,CAAC,iBAAiB;QAAE,OAAO,GAAG,CAAC,iBAAiB,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACvG,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,QAAQ,GAAG,IAAI,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IACzE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,GAAW;IAClE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,6CAA6C,CAAC,CAAC;IACjI,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,IAAc,EAAE,GAAW,EAAE,KAAc,EAAE,EAAE,CAC7D,YAAY,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,0BAA0B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAClN,IAAI,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,4BAA4B,IAAI,iBAAiB,CAAC,CAAC;QAChH,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,oBAAoB,IAAI,IAAI,CAAC,CAAC;QAC3F,MAAM,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAA0D,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5H,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@tekki-forge/runtime-api",
3
+ "version": "0.1.0",
4
+ "description": "Forge API runtime: generic, IR-driven CRUD on NestJS with auth, RBAC, tenancy, audit and hooks",
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
+ "./testing": {
22
+ "types": "./dist/testing.d.ts",
23
+ "default": "./dist/testing.js"
24
+ },
25
+ "./backup": {
26
+ "types": "./dist/backup.d.ts",
27
+ "default": "./dist/backup.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "engines": {
34
+ "node": ">=22"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@nestjs/common": "^12.1.2",
41
+ "@nestjs/core": "^12.1.2",
42
+ "@nestjs/platform-express": "^12.1.2",
43
+ "@nestjs/swagger": "^12.0.2",
44
+ "better-auth": "1.7.6",
45
+ "express": "^5.1.0",
46
+ "reflect-metadata": "^0.2.2",
47
+ "rxjs": "^7.8.2",
48
+ "decimal.js": "^10.6.0",
49
+ "@tekki-forge/compiler": "^0.1.0",
50
+ "@tekki-forge/runtime-schema": "^0.1.0",
51
+ "@tekki-forge/runtime-permissions": "^0.1.0",
52
+ "@tekki-forge/expression": "^0.1.0"
53
+ },
54
+ "devDependencies": {
55
+ "@types/express": "^5.0.3"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc -p tsconfig.json",
59
+ "typecheck": "tsc -p tsconfig.json --noEmit"
60
+ }
61
+ }