@openora/core 0.4.1-canary.47 → 0.4.1-canary.49

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 (44) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/__tests__/backoffice.service.test.js +62 -41
  3. package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
  4. package/dist/admin-console/contract/index.d.ts +2 -1
  5. package/dist/admin-console/contract/index.d.ts.map +1 -1
  6. package/dist/admin-console/contract/index.js +2 -9
  7. package/dist/admin-console/contract/index.js.map +1 -1
  8. package/dist/admin-console/router/index.d.ts +1 -0
  9. package/dist/admin-console/router/index.d.ts.map +1 -1
  10. package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
  11. package/dist/admin-console/service/backoffice.service.js +1 -0
  12. package/dist/admin-console/service/backoffice.service.js.map +1 -1
  13. package/dist/analytics/__tests__/funnel-analytics.service.test.js +3 -3
  14. package/dist/analytics/__tests__/funnel-analytics.service.test.js.map +1 -1
  15. package/dist/analytics/contract/funnel.d.ts +3 -3
  16. package/dist/analytics/contract/funnel.js +1 -1
  17. package/dist/analytics/contract/funnel.js.map +1 -1
  18. package/dist/analytics/contract/index.d.ts +1 -1
  19. package/dist/analytics/router/index.d.ts +1 -1
  20. package/dist/analytics/service/funnel-analytics.service.js +1 -1
  21. package/dist/analytics/service/funnel-analytics.service.js.map +1 -1
  22. package/dist/audit/contract/index.d.ts +2 -2
  23. package/dist/audit/router/index.d.ts +1 -1
  24. package/dist/casino/gaming/__tests__/admin-reporting.test.js +114 -75
  25. package/dist/casino/gaming/__tests__/admin-reporting.test.js.map +1 -1
  26. package/dist/casino/gaming/admin-reporting.d.ts.map +1 -1
  27. package/dist/casino/gaming/admin-reporting.js +6 -3
  28. package/dist/casino/gaming/admin-reporting.js.map +1 -1
  29. package/dist/casino/server.d.ts +1 -0
  30. package/dist/casino/server.d.ts.map +1 -1
  31. package/dist/casino/server.js +1 -0
  32. package/dist/casino/server.js.map +1 -1
  33. package/dist/contracts/adapters/admin-game-reporting.d.ts +1 -0
  34. package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -1
  35. package/dist/contracts/adapters/admin-game-reporting.js.map +1 -1
  36. package/dist/contracts/schemas/game.d.ts.map +1 -1
  37. package/dist/contracts/schemas/game.js +0 -6
  38. package/dist/contracts/schemas/game.js.map +1 -1
  39. package/dist/iam/__tests__/admin-player-activity.test.js +111 -43
  40. package/dist/iam/__tests__/admin-player-activity.test.js.map +1 -1
  41. package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -1
  42. package/dist/iam/adapters/admin-player-activity.js +21 -14
  43. package/dist/iam/adapters/admin-player-activity.js.map +1 -1
  44. package/package.json +1 -1
@@ -1,87 +1,126 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { mock } from '../../../testing/mock.js';
1
+ import { randomUUID } from 'node:crypto';
2
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
3
+ import { sql } from 'drizzle-orm';
4
+ import { createTestDb } from '@openora/core/testing';
5
+ import { migrate } from '../migrate.js';
6
+ import { game, gameRound } from '../schema/index.js';
3
7
  import { DrizzleAdminGameReporting } from '../admin-reporting.js';
4
- function makeDrizzle(rows) {
5
- const whereArgs = [];
6
- const orderByArgs = [];
7
- const builder = {};
8
- const chain = () => builder;
9
- builder['select'] = vi.fn(chain);
10
- builder['from'] = vi.fn(chain);
11
- builder['leftJoin'] = vi.fn(chain);
12
- builder['groupBy'] = vi.fn(chain);
13
- builder['orderBy'] = vi.fn((arg) => {
14
- orderByArgs.push(arg);
15
- return builder;
16
- });
17
- builder['where'] = vi.fn((arg) => {
18
- whereArgs.push(arg);
19
- return builder;
20
- });
21
- // oxlint-disable-next-line unicorn/no-thenable -- builder must be awaitable to mimic Drizzle.
22
- builder['then'] = (resolve) => resolve(rows);
23
- const db = { ...builder };
24
- return { drizzle: mock({ db }), whereArgs, orderByArgs };
8
+ let db;
9
+ let reporting;
10
+ const AT = (iso) => new Date(iso);
11
+ async function seedGame(overrides = {}) {
12
+ const [row] = await db.drizzle.db
13
+ .insert(game)
14
+ .values({ name: 'Aces', provider: 'p', category: 'slots', ...overrides })
15
+ .returning();
16
+ return row;
25
17
  }
26
- function row(over = {}) {
27
- return {
28
- gameId: 'g-1',
29
- name: 'Aces',
30
- gameType: 'casino',
31
- volume: '1000',
32
- revenue: '200',
33
- uniquePlayers: '3',
34
- roundsPlayed: '10',
35
- ...over,
36
- };
18
+ async function seedRound(gameId, overrides = {}) {
19
+ const [row] = await db.drizzle.db
20
+ .insert(gameRound)
21
+ .values({
22
+ gameId,
23
+ userId: randomUUID(),
24
+ status: 'completed',
25
+ betAmount: '100',
26
+ winAmount: '0',
27
+ currency: 'USD',
28
+ startedAt: AT('2026-01-01T00:00:00.000Z'),
29
+ ...overrides,
30
+ })
31
+ .returning();
32
+ return row;
37
33
  }
38
- describe('DrizzleAdminGameReporting.listGamePerformance', () => {
39
- it('maps rows and coerces count columns to numbers', async () => {
40
- const { drizzle } = makeDrizzle([row()]);
41
- const reporting = new DrizzleAdminGameReporting(drizzle);
42
- const rows = await reporting.listGamePerformance({});
43
- expect(rows).toEqual([
44
- {
45
- gameId: 'g-1',
46
- name: 'Aces',
47
- gameType: 'casino',
48
- volume: '1000',
49
- revenue: '200',
50
- uniquePlayers: 3,
51
- roundsPlayed: 10,
52
- },
53
- ]);
34
+ beforeAll(async () => {
35
+ db = await createTestDb([migrate]);
36
+ reporting = new DrizzleAdminGameReporting(db.drizzle);
37
+ });
38
+ afterAll(async () => {
39
+ await db.drop();
40
+ });
41
+ beforeEach(async () => {
42
+ await db.drizzle.db.execute(sql `TRUNCATE ${gameRound}, ${game} RESTART IDENTITY CASCADE`);
43
+ });
44
+ describe('DrizzleAdminGameReporting.listGamePerformance (real PG)', () => {
45
+ it('sums volume/revenue and counts distinct players/rounds for completed rounds', async () => {
46
+ const g = await seedGame();
47
+ await seedRound(g.id, { betAmount: '100', winAmount: '20' });
48
+ await seedRound(g.id, { betAmount: '50', winAmount: '80' });
49
+ const [row] = await reporting.listGamePerformance({});
50
+ expect(row).toMatchObject({
51
+ gameId: g.id,
52
+ name: 'Aces',
53
+ gameType: 'casino',
54
+ uniquePlayers: 2,
55
+ roundsPlayed: 2,
56
+ });
57
+ expect(Number(row?.volume)).toBe(150);
58
+ expect(Number(row?.revenue)).toBe(50);
54
59
  });
55
- it('keeps a negative revenue string intact (GGR can go negative)', async () => {
56
- const { drizzle } = makeDrizzle([row({ revenue: '-50' })]);
57
- const reporting = new DrizzleAdminGameReporting(drizzle);
58
- const rows = await reporting.listGamePerformance({});
59
- expect(rows[0]?.revenue).toBe('-50');
60
+ it('keeps revenue negative when a game pays out more than it takes in (GGR can go negative)', async () => {
61
+ const g = await seedGame();
62
+ await seedRound(g.id, { betAmount: '10', winAmount: '100' });
63
+ const [row] = await reporting.listGamePerformance({});
64
+ expect(Number(row?.revenue)).toBe(-90);
65
+ });
66
+ it('still lists a game with zero completed rounds in range, with all-zero metrics', async () => {
67
+ const g = await seedGame({ name: 'Empty' });
68
+ await seedRound(g.id, { status: 'active' });
69
+ const [row] = await reporting.listGamePerformance({});
70
+ expect(row).toMatchObject({ gameId: g.id, uniquePlayers: 0, roundsPlayed: 0 });
71
+ expect(Number(row?.volume)).toBe(0);
72
+ expect(Number(row?.revenue)).toBe(0);
73
+ });
74
+ it('ignores non-completed rounds when summing metrics', async () => {
75
+ const g = await seedGame();
76
+ await seedRound(g.id, { status: 'active', betAmount: '999' });
77
+ await seedRound(g.id, { status: 'cancelled', betAmount: '999' });
78
+ const counted = await seedRound(g.id, { status: 'completed', betAmount: '10' });
79
+ const [row] = await reporting.listGamePerformance({});
80
+ expect(row?.roundsPlayed).toBe(1);
81
+ expect(Number(row?.volume)).toBe(10);
82
+ void counted;
60
83
  });
61
- it('adds a WHERE clause when gameType is filtered', async () => {
62
- const { drizzle, whereArgs } = makeDrizzle([]);
63
- const reporting = new DrizzleAdminGameReporting(drizzle);
64
- await reporting.listGamePerformance({ gameType: 'sportsbook' });
65
- expect(whereArgs).toEqual([expect.anything()]);
84
+ it('filters by gameType, dropping non-matching games entirely', async () => {
85
+ const casino = await seedGame({ gameType: 'casino' });
86
+ await seedGame({ gameType: 'sportsbook' });
87
+ const rows = await reporting.listGamePerformance({ gameType: 'sportsbook' });
88
+ expect(rows.map((r) => r.gameId)).not.toContain(casino.id);
66
89
  });
67
- it('passes an undefined WHERE when no gameType filter is given', async () => {
68
- const { drizzle, whereArgs } = makeDrizzle([]);
69
- const reporting = new DrizzleAdminGameReporting(drizzle);
70
- await reporting.listGamePerformance({});
71
- expect(whereArgs).toEqual([undefined]);
90
+ it('scopes rounds by dateFrom/dateTo without dropping the game', async () => {
91
+ const g = await seedGame();
92
+ await seedRound(g.id, { betAmount: '10', startedAt: AT('2025-01-01T00:00:00.000Z') });
93
+ await seedRound(g.id, { betAmount: '20', startedAt: AT('2026-01-15T00:00:00.000Z') });
94
+ const [row] = await reporting.listGamePerformance({
95
+ dateFrom: AT('2026-01-01T00:00:00.000Z'),
96
+ dateTo: AT('2026-02-01T00:00:00.000Z'),
97
+ });
98
+ expect(row?.roundsPlayed).toBe(1);
99
+ expect(Number(row?.volume)).toBe(20);
100
+ });
101
+ it('scopes rounds by currency without dropping the game or mixing currencies', async () => {
102
+ const g = await seedGame();
103
+ await seedRound(g.id, { betAmount: '100', currency: 'USD' });
104
+ await seedRound(g.id, { betAmount: '50', currency: 'EUR' });
105
+ const [row] = await reporting.listGamePerformance({ currency: 'USD' });
106
+ expect(row?.roundsPlayed).toBe(1);
107
+ expect(Number(row?.volume)).toBe(100);
72
108
  });
73
109
  it('sorts by the requested column and direction', async () => {
74
- const { drizzle, orderByArgs } = makeDrizzle([]);
75
- const reporting = new DrizzleAdminGameReporting(drizzle);
76
- await reporting.listGamePerformance({ sortBy: 'name', sortDir: 'asc' });
77
- expect(orderByArgs).toHaveLength(1);
110
+ const low = await seedGame({ name: 'Low' });
111
+ const high = await seedGame({ name: 'High' });
112
+ await seedRound(low.id, { betAmount: '10' });
113
+ await seedRound(high.id, { betAmount: '100' });
114
+ const rows = await reporting.listGamePerformance({ sortBy: 'volume', sortDir: 'asc' });
115
+ expect(rows.map((r) => r.gameId)).toEqual([low.id, high.id]);
78
116
  });
79
- it('defaults to a defined sort when sortBy is omitted', async () => {
80
- const { drizzle, orderByArgs } = makeDrizzle([]);
81
- const reporting = new DrizzleAdminGameReporting(drizzle);
82
- await reporting.listGamePerformance({});
83
- expect(orderByArgs).toHaveLength(1);
84
- expect(orderByArgs[0]).toBeDefined();
117
+ it('defaults to sorting by volume descending when sortBy is omitted', async () => {
118
+ const low = await seedGame({ name: 'Low' });
119
+ const high = await seedGame({ name: 'High' });
120
+ await seedRound(low.id, { betAmount: '10' });
121
+ await seedRound(high.id, { betAmount: '100' });
122
+ const rows = await reporting.listGamePerformance({});
123
+ expect(rows.map((r) => r.gameId)).toEqual([high.id, low.id]);
85
124
  });
86
125
  });
87
126
  //# sourceMappingURL=admin-reporting.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-reporting.test.js","sourceRoot":"","sources":["../../../../src/casino/gaming/__tests__/admin-reporting.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-reporting.test.js","sourceRoot":"","sources":["../../../../src/casino/gaming/__tests__/admin-reporting.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-reporting.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,qBAAa,yBAA0B,YAAW,kBAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAyDxF"}
1
+ {"version":3,"file":"admin-reporting.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,qBAAa,yBAA0B,YAAW,kBAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA4DxF"}
@@ -8,15 +8,18 @@ export class DrizzleAdminGameReporting {
8
8
  }
9
9
  async listGamePerformance(filter) {
10
10
  const db = this.drizzle.db;
11
- // status/date filters scope which ROUNDS count towards a game's metrics, so they
12
- // live in the join condition, not WHERE - a game with zero completed rounds in
13
- // range still appears with all-zero metrics rather than being dropped from the
11
+ // status/date/currency filters scope which ROUNDS count towards a game's metrics,
12
+ // so they live in the join condition, not WHERE - a game with zero completed rounds
13
+ // in range still appears with all-zero metrics rather than being dropped from the
14
14
  // report. `gameType` narrows which GAMES appear at all, so it stays in WHERE.
15
15
  const joinConditions = [
16
16
  eq(gameRound.gameId, game.id),
17
17
  eq(gameRound.status, 'completed'),
18
18
  filter.dateFrom ? gte(gameRound.startedAt, filter.dateFrom) : undefined,
19
19
  filter.dateTo ? lte(gameRound.startedAt, filter.dateTo) : undefined,
20
+ // No currency filter mixes bet/win amounts across currencies into one unconverted
21
+ // sum - the operator UI shows a disclaimer in that case; this is intentional.
22
+ filter.currency ? eq(gameRound.currency, filter.currency) : undefined,
20
23
  ].filter(Boolean);
21
24
  const where = filter.gameType ? eq(game.gameType, filter.gameType) : undefined;
22
25
  const volume = sql `coalesce(sum(${gameRound.betAmount}), 0)`;
@@ -1 +1 @@
1
- {"version":3,"file":"admin-reporting.js","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-reporting.js","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAqB;AACrB,MAAM,OAAO,yBAAyB;IACP;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,KAAK,CAAC,mBAAmB,CAAC,MAA6B;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAE3B,kFAAkF;QAClF,oFAAoF;QACpF,kFAAkF;QAClF,8EAA8E;QAC9E,MAAM,cAAc,GAAG;YACrB,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACvE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YACnE,kFAAkF;YAClF,8EAA8E;YAC9E,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SACtE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE/E,MAAM,MAAM,GAAG,GAAG,CAAQ,gBAAgB,SAAS,CAAC,SAAS,OAAO,CAAC;QACrE,mFAAmF;QACnF,MAAM,OAAO,GAAG,GAAG,CAAQ,gBAAgB,SAAS,CAAC,SAAS,WAAW,SAAS,CAAC,SAAS,OAAO,CAAC;QACpG,MAAM,aAAa,GAAG,GAAG,CAAQ,kBAAkB,SAAS,CAAC,MAAM,GAAG,CAAC;QACvE,MAAM,YAAY,GAAG,GAAG,CAAQ,SAAS,SAAS,CAAC,EAAE,GAAG,CAAC;QAEzD,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,OAAO;YACP,aAAa;YACb,YAAY;SACb,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpD,MAAM,IAAI,GAAG,MAAM,EAAE;aAClB,MAAM,CAAC;YACN,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;YACN,OAAO;YACP,aAAa;YACb,YAAY;SACb,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;aACV,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;aAC3C,KAAK,CAAC,KAAK,CAAC;aACZ,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;aAC1C,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACtC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;SACrC,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
@@ -1,3 +1,4 @@
1
1
  export { default as gamingPlugin } from './gaming/plugin.js';
2
2
  export { default as lobbyPlugin } from './lobby/plugin.js';
3
+ export { DrizzleAdminGameReporting } from './gaming/admin-reporting.js';
3
4
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { default as gamingPlugin } from './gaming/plugin.js';
2
2
  export { default as lobbyPlugin } from './lobby/plugin.js';
3
+ export { DrizzleAdminGameReporting } from './gaming/admin-reporting.js';
3
4
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -6,6 +6,7 @@ export type GamePerformanceFilter = {
6
6
  dateFrom?: Date;
7
7
  dateTo?: Date;
8
8
  gameType?: GameType;
9
+ currency?: string;
9
10
  sortBy?: GamePerformanceSortBy;
10
11
  sortDir?: 'asc' | 'desc';
11
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin-game-reporting.d.ts","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,eAAO,MAAM,4BAA4B,qFAO/B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACnF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,kBAAkB,CAAuC,CAAC"}
1
+ {"version":3,"file":"admin-game-reporting.d.ts","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,eAAO,MAAM,4BAA4B,qFAO/B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACnF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,kBAAkB,CAAuC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-game-reporting.js","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAGrD,0EAA0E;AAC1E,gFAAgF;AAChF,2EAA2E;AAC3E,6CAA6C;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,eAAe;IACf,cAAc;CACN,CAAC;AA6BX,MAAM,CAAC,MAAM,oBAAoB,GAA8B,WAAW,CAAC,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"admin-game-reporting.js","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAGrD,0EAA0E;AAC1E,gFAAgF;AAChF,2EAA2E;AAC3E,6CAA6C;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,eAAe;IACf,cAAc;CACN,CAAC;AA8BX,MAAM,CAAC,MAAM,oBAAoB,GAA8B,WAAW,CAAC,sBAAsB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,UAAU,+CAAgD,CAAC;AACxE,eAAO,MAAM,cAAc;;;;EAAqB,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,UAAU,+CAAgD,CAAC;AACxE,eAAO,MAAM,cAAc;;;;EAAqB,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -1,9 +1,3 @@
1
- // Canonical game-type enum. Kept in the isomorphic contracts zone (not the gaming
2
- // module's local contract/) because it is consumed cross-domain: the ADMIN_GAME_REPORTING
3
- // port (contracts/adapters, isomorphic - can never import a domain) and admin-console's
4
- // contract both need it, same reasoning as WALLET_TRANSACTION_TYPES in wallet-tx.ts. The
5
- // casino/gaming module re-derives its `game` pgEnum from this same tuple so the DB enum,
6
- // this contract, and every consumer share one source of truth.
7
1
  import * as z from 'zod';
8
2
  export const GAME_TYPES = ['original', 'casino', 'sportsbook'];
9
3
  export const GameTypeSchema = z.enum(GAME_TYPES);
@@ -1 +1 @@
1
- {"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,0FAA0F;AAC1F,wFAAwF;AACxF,yFAAyF;AACzF,yFAAyF;AACzF,+DAA+D;AAC/D,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC"}
@@ -1,58 +1,126 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { mock } from '../../testing/mock.js';
1
+ import { randomUUID } from 'node:crypto';
2
+ import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
3
+ import { sql } from 'drizzle-orm';
4
+ import { createTestDb } from '@openora/core/testing';
5
+ import { migrate as migrateIdentity } from '@openora/core/pam/migrate/identity';
6
+ import { user, session } from '@openora/core/pam/schema/identity';
3
7
  import { DrizzleAdminPlayerActivity } from '../adapters/admin-player-activity.js';
4
- function makeDrizzle(rows) {
5
- const execute = vi.fn().mockResolvedValue({ rows });
6
- return { drizzle: mock({ db: { execute } }), execute };
8
+ let db;
9
+ let activity;
10
+ const AT = (iso) => new Date(iso);
11
+ async function seedUser(createdAt) {
12
+ const [row] = await db.drizzle.db
13
+ .insert(user)
14
+ .values({ name: 'U', email: `${randomUUID()}@x.dev`, createdAt })
15
+ .returning();
16
+ return row;
7
17
  }
8
- describe('DrizzleAdminPlayerActivity.getRegistrationsOverTime', () => {
9
- it('maps rows to { date, registrations } with a numeric count', async () => {
10
- const { drizzle } = makeDrizzle([{ date: '2026-01-01', registrations: '3' }]);
11
- const svc = new DrizzleAdminPlayerActivity(drizzle);
12
- const rows = await svc.getRegistrationsOverTime({});
13
- expect(rows).toEqual([{ date: '2026-01-01', registrations: 3 }]);
14
- });
15
- it('runs a single query even without an explicit date range (defaults applied)', async () => {
16
- const { drizzle, execute } = makeDrizzle([]);
17
- const svc = new DrizzleAdminPlayerActivity(drizzle);
18
- await svc.getRegistrationsOverTime({});
19
- expect(execute).toHaveBeenCalledOnce();
18
+ async function seedSession(userId, updatedAt) {
19
+ await db.drizzle.db.insert(session).values({
20
+ userId,
21
+ token: randomUUID(),
22
+ expiresAt: new Date(updatedAt.getTime() + 24 * 60 * 60 * 1000),
23
+ createdAt: updatedAt,
24
+ updatedAt,
20
25
  });
26
+ }
27
+ beforeAll(async () => {
28
+ db = await createTestDb([migrateIdentity]);
29
+ activity = new DrizzleAdminPlayerActivity(db.drizzle);
21
30
  });
22
- describe('DrizzleAdminPlayerActivity.getActiveUsersTrend', () => {
23
- it('maps rows to { date, dau, wau, mau } as numbers', async () => {
24
- const { drizzle } = makeDrizzle([{ date: '2026-01-01', dau: '1', wau: '4', mau: '10' }]);
25
- const svc = new DrizzleAdminPlayerActivity(drizzle);
26
- const rows = await svc.getActiveUsersTrend({});
27
- expect(rows).toEqual([{ date: '2026-01-01', dau: 1, wau: 4, mau: 10 }]);
28
- });
31
+ afterAll(async () => {
32
+ await db.drop();
29
33
  });
30
- describe('DrizzleAdminPlayerActivity.getRetentionCohorts', () => {
31
- it('computes returnRate from cohortSize/returned and passes through isComplete', async () => {
32
- const { drizzle } = makeDrizzle([
33
- { cohort_date: '2026-01-01', cohort_size: '10', returned: '4', is_complete: true },
34
+ beforeEach(async () => {
35
+ await db.drizzle.db.execute(sql `TRUNCATE ${session}, ${user} RESTART IDENTITY CASCADE`);
36
+ });
37
+ describe('DrizzleAdminPlayerActivity.getRegistrationsOverTime (real PG)', () => {
38
+ it('counts registrations per day and includes zero-registration days', async () => {
39
+ await seedUser(AT('2026-01-01T10:00:00.000Z'));
40
+ await seedUser(AT('2026-01-01T15:00:00.000Z'));
41
+ await seedUser(AT('2026-01-03T00:00:00.000Z'));
42
+ const rows = await activity.getRegistrationsOverTime({
43
+ dateFrom: AT('2026-01-01T00:00:00.000Z'),
44
+ dateTo: AT('2026-01-03T00:00:00.000Z'),
45
+ });
46
+ expect(rows).toEqual([
47
+ { date: '2026-01-01', registrations: 2 },
48
+ { date: '2026-01-02', registrations: 0 },
49
+ { date: '2026-01-03', registrations: 1 },
34
50
  ]);
35
- const svc = new DrizzleAdminPlayerActivity(drizzle);
36
- const rows = await svc.getRetentionCohorts({}, 7);
51
+ });
52
+ });
53
+ describe('DrizzleAdminPlayerActivity.getActiveUsersTrend (real PG)', () => {
54
+ it('computes distinct DAU/WAU/MAU per day from session activity', async () => {
55
+ const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
56
+ const bob = await seedUser(AT('2025-11-01T00:00:00.000Z'));
57
+ // Alice active on the target day; Bob active 5 days earlier (inside WAU/MAU, outside DAU).
58
+ await seedSession(alice.id, AT('2026-01-10T12:00:00.000Z'));
59
+ await seedSession(bob.id, AT('2026-01-05T12:00:00.000Z'));
60
+ const rows = await activity.getActiveUsersTrend({
61
+ dateFrom: AT('2026-01-10T00:00:00.000Z'),
62
+ dateTo: AT('2026-01-10T00:00:00.000Z'),
63
+ });
64
+ expect(rows).toEqual([{ date: '2026-01-10', dau: 1, wau: 2, mau: 2 }]);
65
+ });
66
+ it('excludes a session outside every window from all three counts', async () => {
67
+ const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
68
+ await seedSession(alice.id, AT('2025-12-01T00:00:00.000Z'));
69
+ const rows = await activity.getActiveUsersTrend({
70
+ dateFrom: AT('2026-01-10T00:00:00.000Z'),
71
+ dateTo: AT('2026-01-10T00:00:00.000Z'),
72
+ });
73
+ expect(rows).toEqual([{ date: '2026-01-10', dau: 0, wau: 0, mau: 0 }]);
74
+ });
75
+ it('counts a user with two sessions on the same day only once', async () => {
76
+ const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
77
+ await seedSession(alice.id, AT('2026-01-10T08:00:00.000Z'));
78
+ await seedSession(alice.id, AT('2026-01-10T18:00:00.000Z'));
79
+ const rows = await activity.getActiveUsersTrend({
80
+ dateFrom: AT('2026-01-10T00:00:00.000Z'),
81
+ dateTo: AT('2026-01-10T00:00:00.000Z'),
82
+ });
83
+ expect(rows).toEqual([{ date: '2026-01-10', dau: 1, wau: 1, mau: 1 }]);
84
+ });
85
+ });
86
+ describe('DrizzleAdminPlayerActivity.getRetentionCohorts (real PG)', () => {
87
+ it('does not count the registration-day session itself as a return', async () => {
88
+ const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
89
+ // Only session is the one created at registration - should NOT count as returned.
90
+ await seedSession(alice.id, AT('2026-01-01T10:00:00.000Z'));
91
+ const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
37
92
  expect(rows).toEqual([
38
- { cohortDate: '2026-01-01', cohortSize: 10, returned: 4, returnRate: 0.4, isComplete: true },
93
+ { cohortDate: '2026-01-01', cohortSize: 1, returned: 0, returnRate: 0, isComplete: true },
39
94
  ]);
40
95
  });
96
+ it('counts a session the next calendar day even if less than 24h after registration', async () => {
97
+ const alice = await seedUser(AT('2026-01-01T23:00:00.000Z'));
98
+ await seedSession(alice.id, AT('2026-01-02T09:00:00.000Z'));
99
+ const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
100
+ expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 1, returnRate: 1 });
101
+ });
102
+ it('counts a session on the day after registration as returned', async () => {
103
+ const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
104
+ await seedSession(alice.id, AT('2026-01-02T10:00:00.000Z'));
105
+ const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
106
+ expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 1, returnRate: 1 });
107
+ });
108
+ it('excludes a session after the retention window from the count', async () => {
109
+ const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
110
+ await seedSession(alice.id, AT('2026-01-10T10:00:00.000Z'));
111
+ const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
112
+ expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 0, returnRate: 0 });
113
+ });
41
114
  it('flags an incomplete cohort whose window has not elapsed yet', async () => {
42
- const { drizzle } = makeDrizzle([
43
- { cohort_date: '2026-07-20', cohort_size: '5', returned: '1', is_complete: false },
44
- ]);
45
- const svc = new DrizzleAdminPlayerActivity(drizzle);
46
- const rows = await svc.getRetentionCohorts({}, 30);
115
+ const now = new Date();
116
+ await seedUser(now);
117
+ const rows = await activity.getRetentionCohorts({ dateFrom: now, dateTo: now }, 30);
118
+ expect(rows).toHaveLength(1);
47
119
  expect(rows[0]?.isComplete).toBe(false);
48
120
  });
49
- it('returns a 0 rate for an empty cohort instead of dividing by zero', async () => {
50
- const { drizzle } = makeDrizzle([
51
- { cohort_date: '2026-01-01', cohort_size: '0', returned: '0', is_complete: false },
52
- ]);
53
- const svc = new DrizzleAdminPlayerActivity(drizzle);
54
- const rows = await svc.getRetentionCohorts({}, 30);
55
- expect(rows[0]?.returnRate).toBe(0);
121
+ it('has no rows when nobody registered in the requested range', async () => {
122
+ const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-01T00:00:00.000Z') }, 30);
123
+ expect(rows).toEqual([]);
56
124
  });
57
125
  });
58
126
  //# sourceMappingURL=admin-player-activity.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin-player-activity.test.js","sourceRoot":"","sources":["../../../src/iam/__tests__/admin-player-activity.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-player-activity.test.js","sourceRoot":"","sources":["../../../src/iam/__tests__/admin-player-activity.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-player-activity.d.ts","sourceRoot":"","sources":["../../../src/iam/adapters/admin-player-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAkBtD,qBAAa,0BAA2B,YAAW,mBAAmB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,wBAAwB,CAC5B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAiBlC,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IA6BnF,mBAAmB,CACvB,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA4CjC"}
1
+ {"version":3,"file":"admin-player-activity.d.ts","sourceRoot":"","sources":["../../../src/iam/adapters/admin-player-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAgBtD,qBAAa,0BAA2B,YAAW,mBAAmB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,wBAAwB,CAC5B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAiBlC,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAuCnF,mBAAmB,CACvB,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA2CjC"}