@the-situation/indexer 0.17.1 → 0.18.1

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 (122) hide show
  1. package/dist/aggregator/cohort.d.ts +30 -0
  2. package/dist/aggregator/cohort.d.ts.map +1 -0
  3. package/dist/aggregator/cohort.js +153 -0
  4. package/dist/aggregator/cohort.js.map +1 -0
  5. package/dist/aggregator/daily.d.ts +71 -0
  6. package/dist/aggregator/daily.d.ts.map +1 -0
  7. package/dist/aggregator/daily.js +249 -0
  8. package/dist/aggregator/daily.js.map +1 -0
  9. package/dist/aggregator/domains.d.ts +20 -0
  10. package/dist/aggregator/domains.d.ts.map +1 -0
  11. package/dist/aggregator/domains.js +38 -0
  12. package/dist/aggregator/domains.js.map +1 -0
  13. package/dist/aggregator/index.d.ts +31 -0
  14. package/dist/aggregator/index.d.ts.map +1 -0
  15. package/dist/aggregator/index.js +100 -0
  16. package/dist/aggregator/index.js.map +1 -0
  17. package/dist/aggregator/lifetime.d.ts +52 -0
  18. package/dist/aggregator/lifetime.d.ts.map +1 -0
  19. package/dist/aggregator/lifetime.js +222 -0
  20. package/dist/aggregator/lifetime.js.map +1 -0
  21. package/dist/aggregator/roi.d.ts +42 -0
  22. package/dist/aggregator/roi.d.ts.map +1 -0
  23. package/dist/aggregator/roi.js +153 -0
  24. package/dist/aggregator/roi.js.map +1 -0
  25. package/dist/aggregator/sources.d.ts +59 -0
  26. package/dist/aggregator/sources.d.ts.map +1 -0
  27. package/dist/aggregator/sources.js +53 -0
  28. package/dist/aggregator/sources.js.map +1 -0
  29. package/dist/aggregator/writers.d.ts +22 -0
  30. package/dist/aggregator/writers.d.ts.map +1 -0
  31. package/dist/aggregator/writers.js +147 -0
  32. package/dist/aggregator/writers.js.map +1 -0
  33. package/dist/api/app.d.ts +177 -13
  34. package/dist/api/app.d.ts.map +1 -1
  35. package/dist/api/app.js +4 -3
  36. package/dist/api/app.js.map +1 -1
  37. package/dist/api/routes/admin-subscriptions.d.ts +10 -10
  38. package/dist/api/routes/analytics.d.ts +205 -0
  39. package/dist/api/routes/analytics.d.ts.map +1 -0
  40. package/dist/api/routes/analytics.js +122 -0
  41. package/dist/api/routes/analytics.js.map +1 -0
  42. package/dist/api/routes/index.d.ts +1 -0
  43. package/dist/api/routes/index.d.ts.map +1 -1
  44. package/dist/api/routes/index.js +1 -0
  45. package/dist/api/routes/index.js.map +1 -1
  46. package/dist/api/routes/lp-history.d.ts +1 -1
  47. package/dist/api/routes/rankings.d.ts +17 -3
  48. package/dist/api/routes/rankings.d.ts.map +1 -1
  49. package/dist/api/routes/rankings.js +44 -5
  50. package/dist/api/routes/rankings.js.map +1 -1
  51. package/dist/api/routes/trader-stats.d.ts +11 -2
  52. package/dist/api/routes/trader-stats.d.ts.map +1 -1
  53. package/dist/api/routes/trader-stats.js +72 -2
  54. package/dist/api/routes/trader-stats.js.map +1 -1
  55. package/dist/client/IndexerClient.d.ts +30 -1
  56. package/dist/client/IndexerClient.d.ts.map +1 -1
  57. package/dist/client/IndexerClient.js.map +1 -1
  58. package/dist/client/IndexerClientLive.d.ts.map +1 -1
  59. package/dist/client/IndexerClientLive.js +50 -1
  60. package/dist/client/IndexerClientLive.js.map +1 -1
  61. package/dist/client/convenience.d.ts +9 -2
  62. package/dist/client/convenience.d.ts.map +1 -1
  63. package/dist/client/convenience.js +9 -1
  64. package/dist/client/convenience.js.map +1 -1
  65. package/dist/client/index.d.ts +3 -2
  66. package/dist/client/index.d.ts.map +1 -1
  67. package/dist/client/index.js +1 -1
  68. package/dist/client/index.js.map +1 -1
  69. package/dist/config.d.ts +9 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/config.js +2 -0
  72. package/dist/config.js.map +1 -1
  73. package/dist/etl/event-indexer.d.ts +1 -1
  74. package/dist/etl/lp-position-refresher.d.ts +2 -1
  75. package/dist/etl/lp-position-refresher.d.ts.map +1 -1
  76. package/dist/etl/lp-position-refresher.js +24 -11
  77. package/dist/etl/lp-position-refresher.js.map +1 -1
  78. package/dist/etl/position-refresher.d.ts +1 -1
  79. package/dist/etl/state-refresher.d.ts +1 -1
  80. package/dist/index.js +54 -5
  81. package/dist/index.js.map +1 -1
  82. package/dist/layers/ChainReaderLive.d.ts.map +1 -1
  83. package/dist/layers/ChainReaderLive.js +15 -0
  84. package/dist/layers/ChainReaderLive.js.map +1 -1
  85. package/dist/services/ChainReader.d.ts +10 -0
  86. package/dist/services/ChainReader.d.ts.map +1 -1
  87. package/dist/services/ChainReader.js.map +1 -1
  88. package/dist/types/analytics.d.ts +194 -0
  89. package/dist/types/analytics.d.ts.map +1 -0
  90. package/dist/types/analytics.js +10 -0
  91. package/dist/types/analytics.js.map +1 -0
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/warehouse/analytics-helpers.d.ts +36 -0
  95. package/dist/warehouse/analytics-helpers.d.ts.map +1 -0
  96. package/dist/warehouse/analytics-helpers.js +142 -0
  97. package/dist/warehouse/analytics-helpers.js.map +1 -0
  98. package/dist/warehouse/backfill.d.ts +26 -0
  99. package/dist/warehouse/backfill.d.ts.map +1 -0
  100. package/dist/warehouse/backfill.js +77 -0
  101. package/dist/warehouse/backfill.js.map +1 -0
  102. package/dist/warehouse/connection.d.ts +24 -0
  103. package/dist/warehouse/connection.d.ts.map +1 -0
  104. package/dist/warehouse/connection.js +30 -0
  105. package/dist/warehouse/connection.js.map +1 -0
  106. package/dist/warehouse/index.d.ts +14 -0
  107. package/dist/warehouse/index.d.ts.map +1 -0
  108. package/dist/warehouse/index.js +14 -0
  109. package/dist/warehouse/index.js.map +1 -0
  110. package/dist/warehouse/repositories/analytics.d.ts +61 -0
  111. package/dist/warehouse/repositories/analytics.d.ts.map +1 -0
  112. package/dist/warehouse/repositories/analytics.js +418 -0
  113. package/dist/warehouse/repositories/analytics.js.map +1 -0
  114. package/dist/warehouse/schema.d.ts +9 -0
  115. package/dist/warehouse/schema.d.ts.map +1 -0
  116. package/dist/warehouse/schema.js +219 -0
  117. package/dist/warehouse/schema.js.map +1 -0
  118. package/dist/warehouse/seed-domains.d.ts +29 -0
  119. package/dist/warehouse/seed-domains.d.ts.map +1 -0
  120. package/dist/warehouse/seed-domains.js +223 -0
  121. package/dist/warehouse/seed-domains.js.map +1 -0
  122. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Aggregator data sources — synchronous reads from SQLite.
3
+ *
4
+ * These functions extract the minimum columns needed for analytics rollups.
5
+ * Keeping the projection narrow keeps memory usage bounded even at 10M+ events.
6
+ */
7
+ import type { Database as SqliteDatabase } from 'bun:sqlite';
8
+ /** Magnitude divisor for `collateral_posted` raw values (token has 18 decimals). */
9
+ export declare const TOKEN_DECIMALS = 1000000000000000000;
10
+ export interface AggEventRow {
11
+ readonly id: number;
12
+ readonly market_address: string;
13
+ readonly event_type: string;
14
+ readonly trader: string | null;
15
+ readonly timestamp: number;
16
+ readonly collateral_posted: string | null;
17
+ readonly is_position_sell: number | null;
18
+ }
19
+ export interface AggPositionRow {
20
+ readonly market_address: string;
21
+ readonly trader: string;
22
+ readonly has_position: number;
23
+ readonly settlement_state: string;
24
+ readonly unrealized_pnl: number | null;
25
+ readonly realized_pnl: number | null;
26
+ readonly expected_value: number | null;
27
+ readonly delta_count: number;
28
+ readonly claimed: number;
29
+ }
30
+ export interface AggLPPositionRow {
31
+ readonly market_address: string;
32
+ readonly provider: string;
33
+ readonly total_deposited: number;
34
+ readonly total_withdrawn: number;
35
+ readonly current_value: number | null;
36
+ readonly unrealized_pnl: number | null;
37
+ readonly deposit_count: number;
38
+ readonly withdrawal_count: number;
39
+ readonly first_deposit_at: number | null;
40
+ readonly last_activity_at: number | null;
41
+ readonly claimed_at: number | null;
42
+ readonly claim_payout: number | null;
43
+ }
44
+ export declare function readAllEvents(db: SqliteDatabase): readonly AggEventRow[];
45
+ export declare function readAllPositions(db: SqliteDatabase): readonly AggPositionRow[];
46
+ export declare function readAllLPPositions(db: SqliteDatabase): readonly AggLPPositionRow[];
47
+ /**
48
+ * Parse the raw SQ128x128-style magnitude string into a human-readable token
49
+ * amount. Mirrors `parseCollateral` in services/ActivityEnricher.ts.
50
+ */
51
+ export declare function parseCollateralAmount(raw: string | null): number;
52
+ /**
53
+ * Trade-like events count toward trader volume. Liquidity events are tracked
54
+ * separately for LPs.
55
+ */
56
+ export declare const TRADE_EVENT_TYPES: Set<string>;
57
+ export declare const LIQUIDITY_ADD_TYPES: Set<string>;
58
+ export declare const LIQUIDITY_REMOVE_TYPES: Set<string>;
59
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/aggregator/sources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,oFAAoF;AACpF,eAAO,MAAM,cAAc,sBAAO,CAAC;AAEnC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,WAAW,EAAE,CASxE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,cAAc,EAAE,CAQ9E;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,gBAAgB,EAAE,CASlF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKhE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,aAI5B,CAAC;AAEH,eAAO,MAAM,mBAAmB,aAI9B,CAAC;AAEH,eAAO,MAAM,sBAAsB,aAAiC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /** Magnitude divisor for `collateral_posted` raw values (token has 18 decimals). */
2
+ export const TOKEN_DECIMALS = 1e18;
3
+ export function readAllEvents(db) {
4
+ return db
5
+ .query(`SELECT id, market_address, event_type, trader, timestamp,
6
+ collateral_posted, is_position_sell
7
+ FROM market_events
8
+ ORDER BY id ASC`)
9
+ .all();
10
+ }
11
+ export function readAllPositions(db) {
12
+ return db
13
+ .query(`SELECT market_address, trader, has_position, settlement_state,
14
+ unrealized_pnl, realized_pnl, expected_value, delta_count, claimed
15
+ FROM user_positions`)
16
+ .all();
17
+ }
18
+ export function readAllLPPositions(db) {
19
+ return db
20
+ .query(`SELECT market_address, provider, total_deposited, total_withdrawn,
21
+ current_value, unrealized_pnl, deposit_count, withdrawal_count,
22
+ first_deposit_at, last_activity_at, claimed_at, claim_payout
23
+ FROM lp_positions`)
24
+ .all();
25
+ }
26
+ /**
27
+ * Parse the raw SQ128x128-style magnitude string into a human-readable token
28
+ * amount. Mirrors `parseCollateral` in services/ActivityEnricher.ts.
29
+ */
30
+ export function parseCollateralAmount(raw) {
31
+ if (raw == null || raw.length === 0)
32
+ return 0;
33
+ const val = Number(raw);
34
+ if (!Number.isFinite(val))
35
+ return 0;
36
+ return val / TOKEN_DECIMALS;
37
+ }
38
+ /**
39
+ * Trade-like events count toward trader volume. Liquidity events are tracked
40
+ * separately for LPs.
41
+ */
42
+ export const TRADE_EVENT_TYPES = new Set([
43
+ 'trade_executed',
44
+ 'trade_moved',
45
+ 'multinoulli_trade_executed',
46
+ ]);
47
+ export const LIQUIDITY_ADD_TYPES = new Set([
48
+ 'liquidity_added',
49
+ 'market_initialized',
50
+ 'bootstrapped',
51
+ ]);
52
+ export const LIQUIDITY_REMOVE_TYPES = new Set(['liquidity_removed']);
53
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/aggregator/sources.ts"],"names":[],"mappings":"AAQA,oFAAoF;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAuCnC,MAAM,UAAU,aAAa,CAAC,EAAkB;IAC9C,OAAO,EAAE;SACN,KAAK,CACJ;;;uBAGiB,CAClB;SACA,GAAG,EAA4B,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAkB;IACjD,OAAO,EAAE;SACN,KAAK,CACJ;;2BAEqB,CACtB;SACA,GAAG,EAA+B,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAkB;IACnD,OAAO,EAAE;SACN,KAAK,CACJ;;;yBAGmB,CACpB;SACA,GAAG,EAAiC,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,GAAG,GAAG,cAAc,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,gBAAgB;IAChB,aAAa;IACb,4BAA4B;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IACzC,iBAAiB;IACjB,oBAAoB;IACpB,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Bulk-write builders.
3
+ *
4
+ * Each writer truncates its target table and re-inserts. Truncate-and-reload
5
+ * is fine while the data set is small (~100k events) and avoids subtle
6
+ * incremental-update bugs. Switch to UPSERT-by-key once event volume justifies it.
7
+ *
8
+ * All writes happen inside a single transaction per table so readers never
9
+ * see a partially-written warehouse state.
10
+ */
11
+ import type { SQL } from 'bun';
12
+ import type { DailyDomainStatRow, DailyLPStatRow, DailyMarketStatRow, DailyPlatformStatRow, DailyTraderStatRow } from './daily';
13
+ import type { LPLifetimeRow, TraderLifetimeRow } from './lifetime';
14
+ export declare function writeDailyTraderStats(pg: SQL, rows: readonly DailyTraderStatRow[]): Promise<void>;
15
+ export declare function writeDailyLPStats(pg: SQL, rows: readonly DailyLPStatRow[]): Promise<void>;
16
+ export declare function writeDailyMarketStats(pg: SQL, rows: readonly DailyMarketStatRow[]): Promise<void>;
17
+ export declare function writeDailyDomainStats(pg: SQL, rows: readonly DailyDomainStatRow[]): Promise<void>;
18
+ export declare function writeDailyPlatformStats(pg: SQL, rows: readonly DailyPlatformStatRow[]): Promise<void>;
19
+ export declare function writeTraderLifetime(pg: SQL, rows: readonly TraderLifetimeRow[]): Promise<void>;
20
+ export declare function writeLPLifetime(pg: SQL, rows: readonly LPLifetimeRow[]): Promise<void>;
21
+ export declare function recordAggregatorRun(pg: SQL, jobName: string, ok: boolean, error: string | null): Promise<void>;
22
+ //# sourceMappingURL=writers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writers.d.ts","sourceRoot":"","sources":["../../src/aggregator/writers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,cAAc,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,oBAAoB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,iBAAiB,EAAE,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,GAAG,EACP,IAAI,EAAE,SAAS,aAAa,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,147 @@
1
+ const TIMESTAMP_OR_NULL = (ts) => ts == null ? null : new Date(ts * 1000).toISOString();
2
+ export async function writeDailyTraderStats(pg, rows) {
3
+ await pg.begin(async (tx) => {
4
+ await tx `TRUNCATE TABLE daily_trader_stats`;
5
+ for (const r of rows) {
6
+ await tx `
7
+ INSERT INTO daily_trader_stats
8
+ (date, trader, domain_slug, trade_count, buy_count, sell_count,
9
+ volume_collateral, markets_traded, updated_at)
10
+ VALUES
11
+ (${r.date}, ${r.trader}, ${r.domain_slug}, ${r.trade_count}, ${r.buy_count},
12
+ ${r.sell_count}, ${r.volume_collateral}, ${r.markets_traded}, now())
13
+ `;
14
+ }
15
+ });
16
+ }
17
+ export async function writeDailyLPStats(pg, rows) {
18
+ await pg.begin(async (tx) => {
19
+ await tx `TRUNCATE TABLE daily_lp_stats`;
20
+ for (const r of rows) {
21
+ await tx `
22
+ INSERT INTO daily_lp_stats
23
+ (date, provider, domain_slug, deposit_count, withdraw_count,
24
+ deposited, withdrawn, net_position, markets_active, updated_at)
25
+ VALUES
26
+ (${r.date}, ${r.provider}, ${r.domain_slug}, ${r.deposit_count}, ${r.withdraw_count},
27
+ ${r.deposited}, ${r.withdrawn}, ${r.deposited - r.withdrawn}, ${r.markets_active}, now())
28
+ `;
29
+ }
30
+ });
31
+ }
32
+ export async function writeDailyMarketStats(pg, rows) {
33
+ await pg.begin(async (tx) => {
34
+ await tx `TRUNCATE TABLE daily_market_stats`;
35
+ for (const r of rows) {
36
+ await tx `
37
+ INSERT INTO daily_market_stats
38
+ (date, market_address, trade_count, unique_traders, volume_collateral,
39
+ liquidity_added, liquidity_removed, unique_lps, updated_at)
40
+ VALUES
41
+ (${r.date}, ${r.market_address}, ${r.trade_count}, ${r.unique_traders},
42
+ ${r.volume_collateral}, ${r.liquidity_added}, ${r.liquidity_removed},
43
+ ${r.unique_lps}, now())
44
+ `;
45
+ }
46
+ });
47
+ }
48
+ export async function writeDailyDomainStats(pg, rows) {
49
+ await pg.begin(async (tx) => {
50
+ await tx `TRUNCATE TABLE daily_domain_stats`;
51
+ for (const r of rows) {
52
+ await tx `
53
+ INSERT INTO daily_domain_stats
54
+ (date, domain_slug, trade_count, unique_traders, unique_lps,
55
+ volume_collateral, liquidity_net, active_markets, updated_at)
56
+ VALUES
57
+ (${r.date}, ${r.domain_slug}, ${r.trade_count}, ${r.unique_traders}, ${r.unique_lps},
58
+ ${r.volume_collateral}, ${r.liquidity_net}, ${r.active_markets}, now())
59
+ `;
60
+ }
61
+ });
62
+ }
63
+ export async function writeDailyPlatformStats(pg, rows) {
64
+ await pg.begin(async (tx) => {
65
+ await tx `TRUNCATE TABLE daily_platform_stats`;
66
+ for (const r of rows) {
67
+ await tx `
68
+ INSERT INTO daily_platform_stats
69
+ (date, trade_count, unique_traders, unique_lps, new_traders, new_lps,
70
+ volume_collateral, liquidity_net, active_markets, updated_at)
71
+ VALUES
72
+ (${r.date}, ${r.trade_count}, ${r.unique_traders}, ${r.unique_lps},
73
+ ${r.new_traders}, ${r.new_lps}, ${r.volume_collateral}, ${r.liquidity_net},
74
+ ${r.active_markets}, now())
75
+ `;
76
+ }
77
+ });
78
+ }
79
+ export async function writeTraderLifetime(pg, rows) {
80
+ await pg.begin(async (tx) => {
81
+ await tx `TRUNCATE TABLE trader_lifetime`;
82
+ for (const r of rows) {
83
+ const domainsJson = JSON.stringify(r.domains_json);
84
+ await tx `
85
+ INSERT INTO trader_lifetime
86
+ (trader, first_trade_at, last_trade_at, cohort_week,
87
+ total_trades, buy_count, sell_count, markets_traded,
88
+ domains_traded, domains_json, total_volume, total_collateral_at_risk,
89
+ realized_pnl, unrealized_pnl, total_pnl, roi_pct, active_days, updated_at)
90
+ VALUES
91
+ (${r.trader}, ${TIMESTAMP_OR_NULL(r.first_trade_at)},
92
+ ${TIMESTAMP_OR_NULL(r.last_trade_at)}, ${r.cohort_week},
93
+ ${r.total_trades}, ${r.buy_count}, ${r.sell_count}, ${r.markets_traded},
94
+ ${r.domains_traded}, ${domainsJson}::jsonb,
95
+ ${r.total_volume}, ${r.total_collateral_at_risk},
96
+ ${r.realized_pnl}, ${r.unrealized_pnl}, ${r.total_pnl},
97
+ ${r.roi_pct}, ${r.active_days}, now())
98
+ `;
99
+ }
100
+ });
101
+ }
102
+ export async function writeLPLifetime(pg, rows) {
103
+ await pg.begin(async (tx) => {
104
+ await tx `TRUNCATE TABLE lp_lifetime`;
105
+ for (const r of rows) {
106
+ const domainsJson = JSON.stringify(r.domains_json);
107
+ await tx `
108
+ INSERT INTO lp_lifetime
109
+ (provider, first_deposit_at, last_activity_at, cohort_week,
110
+ deposit_count, withdraw_count, total_deposited, total_withdrawn,
111
+ net_position, current_value, unrealized_pnl, realized_pnl,
112
+ markets_provided, domains_provided, domains_json, active_days,
113
+ roi_pct, updated_at)
114
+ VALUES
115
+ (${r.provider}, ${TIMESTAMP_OR_NULL(r.first_deposit_at)},
116
+ ${TIMESTAMP_OR_NULL(r.last_activity_at)}, ${r.cohort_week},
117
+ ${r.deposit_count}, ${r.withdraw_count}, ${r.total_deposited},
118
+ ${r.total_withdrawn}, ${r.net_position}, ${r.current_value},
119
+ ${r.unrealized_pnl}, ${r.realized_pnl}, ${r.markets_provided},
120
+ ${r.domains_provided}, ${domainsJson}::jsonb, ${r.active_days},
121
+ ${r.roi_pct}, now())
122
+ `;
123
+ }
124
+ });
125
+ }
126
+ export async function recordAggregatorRun(pg, jobName, ok, error) {
127
+ if (ok) {
128
+ await pg `
129
+ INSERT INTO aggregator_state (job_name, last_run_at, last_success_at, last_error)
130
+ VALUES (${jobName}, now(), now(), NULL)
131
+ ON CONFLICT (job_name) DO UPDATE SET
132
+ last_run_at = EXCLUDED.last_run_at,
133
+ last_success_at = EXCLUDED.last_success_at,
134
+ last_error = NULL
135
+ `;
136
+ }
137
+ else {
138
+ await pg `
139
+ INSERT INTO aggregator_state (job_name, last_run_at, last_error)
140
+ VALUES (${jobName}, now(), ${error})
141
+ ON CONFLICT (job_name) DO UPDATE SET
142
+ last_run_at = EXCLUDED.last_run_at,
143
+ last_error = EXCLUDED.last_error
144
+ `;
145
+ }
146
+ }
147
+ //# sourceMappingURL=writers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writers.js","sourceRoot":"","sources":["../../src/aggregator/writers.ts"],"names":[],"mappings":"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"}
package/dist/api/app.d.ts CHANGED
@@ -5,11 +5,19 @@ import { Elysia } from 'elysia';
5
5
  import type { DatabaseService } from '../services/Database';
6
6
  import type { EventBusService } from '../services/EventBus';
7
7
  import type { VoyagerRateLimitState } from '../services/VoyagerRateLimit';
8
+ import type { AnalyticsRepository } from '../warehouse/repositories/analytics';
8
9
  export interface AppConfig {
9
10
  readonly db: DatabaseService;
10
11
  readonly eventBus: EventBusService;
11
12
  readonly adminApiKey: string;
12
13
  readonly rateLimit: VoyagerRateLimitState;
14
+ /**
15
+ * Warehouse analytics repository. `null` (or omitted) when
16
+ * WAREHOUSE_DATABASE_URL is not set — analytics routes return 503 and
17
+ * filter-aware variants of /api/rankings, /api/positions/:trader/stats fall
18
+ * back to OLTP / 503 for filtered requests.
19
+ */
20
+ readonly analytics?: AnalyticsRepository | null;
13
21
  }
14
22
  export declare function createApp(config: AppConfig): Elysia<"", {
15
23
  decorator: {};
@@ -228,8 +236,8 @@ export declare function createApp(config: AppConfig): Elysia<"", {
228
236
  get: {
229
237
  body: unknown;
230
238
  params: {
231
- provider: string;
232
239
  address: string;
240
+ provider: string;
233
241
  } & {};
234
242
  query: unknown;
235
243
  headers: unknown;
@@ -321,7 +329,9 @@ export declare function createApp(config: AppConfig): Elysia<"", {
321
329
  query: unknown;
322
330
  headers: unknown;
323
331
  response: {
324
- 200: import("../types").TraderStatsResponse;
332
+ 200: import("../types").TraderStatsResponse | {
333
+ error: string;
334
+ };
325
335
  422: {
326
336
  type: "validation";
327
337
  on: string;
@@ -346,7 +356,9 @@ export declare function createApp(config: AppConfig): Elysia<"", {
346
356
  query: unknown;
347
357
  headers: unknown;
348
358
  response: {
349
- 200: import("../types").RankingEntry[];
359
+ 200: import("../types").RankingEntry[] | {
360
+ error: string;
361
+ };
350
362
  };
351
363
  };
352
364
  };
@@ -527,10 +539,10 @@ export declare function createApp(config: AppConfig): Elysia<"", {
527
539
  name: string;
528
540
  webhook_url: string;
529
541
  filters: {
530
- traders?: string[];
531
- eventTypes?: ("settlement" | "trade_move" | "market_created")[];
542
+ eventTypes?: ("trade_move" | "settlement" | "market_created")[];
532
543
  marketTypes?: string[];
533
544
  marketAddresses?: string[];
545
+ traders?: string[];
534
546
  minCollateral?: number;
535
547
  };
536
548
  };
@@ -538,9 +550,9 @@ export declare function createApp(config: AppConfig): Elysia<"", {
538
550
  query: unknown;
539
551
  headers: unknown;
540
552
  response: {
541
- 200: {
553
+ 200: import("../types").SubscriptionResponse | {
542
554
  error: string;
543
- } | import("../types").SubscriptionResponse;
555
+ };
544
556
  422: {
545
557
  type: "validation";
546
558
  on: string;
@@ -582,9 +594,9 @@ export declare function createApp(config: AppConfig): Elysia<"", {
582
594
  query: unknown;
583
595
  headers: unknown;
584
596
  response: {
585
- 200: {
597
+ 200: import("../types").SubscriptionResponse | {
586
598
  error: string;
587
- } | import("../types").SubscriptionResponse | {
599
+ } | {
588
600
  error: string;
589
601
  };
590
602
  422: {
@@ -611,10 +623,10 @@ export declare function createApp(config: AppConfig): Elysia<"", {
611
623
  webhook_url?: string;
612
624
  secret?: string;
613
625
  filters?: {
614
- traders?: string[];
615
- eventTypes?: ("settlement" | "trade_move" | "market_created")[];
626
+ eventTypes?: ("trade_move" | "settlement" | "market_created")[];
616
627
  marketTypes?: string[];
617
628
  marketAddresses?: string[];
629
+ traders?: string[];
618
630
  minCollateral?: number;
619
631
  };
620
632
  is_active?: boolean;
@@ -625,9 +637,9 @@ export declare function createApp(config: AppConfig): Elysia<"", {
625
637
  query: unknown;
626
638
  headers: unknown;
627
639
  response: {
628
- 200: {
640
+ 200: import("../types").SubscriptionResponse | {
629
641
  error: string;
630
- } | import("../types").SubscriptionResponse | {
642
+ } | {
631
643
  error: string;
632
644
  };
633
645
  422: {
@@ -679,6 +691,158 @@ export declare function createApp(config: AppConfig): Elysia<"", {
679
691
  };
680
692
  };
681
693
  };
694
+ } & {
695
+ api: {
696
+ analytics: {
697
+ overview: {
698
+ get: {
699
+ body: unknown;
700
+ params: {};
701
+ query: unknown;
702
+ headers: unknown;
703
+ response: {
704
+ 200: import("../types").AnalyticsOverviewResponse | {
705
+ error: string;
706
+ };
707
+ };
708
+ };
709
+ };
710
+ };
711
+ };
712
+ } & {
713
+ api: {
714
+ analytics: {
715
+ domains: {
716
+ get: {
717
+ body: unknown;
718
+ params: {};
719
+ query: unknown;
720
+ headers: unknown;
721
+ response: {
722
+ 200: import("../types").DomainsResponse | {
723
+ error: string;
724
+ };
725
+ };
726
+ };
727
+ };
728
+ };
729
+ };
730
+ } & {
731
+ api: {
732
+ analytics: {
733
+ domains: {
734
+ ":slug": {
735
+ get: {
736
+ body: unknown;
737
+ params: {
738
+ slug: string;
739
+ } & {};
740
+ query: unknown;
741
+ headers: unknown;
742
+ response: {
743
+ 200: import("../types").DomainDetailResponse | {
744
+ error: string;
745
+ };
746
+ 422: {
747
+ type: "validation";
748
+ on: string;
749
+ summary?: string;
750
+ message?: string;
751
+ found?: unknown;
752
+ property?: string;
753
+ expected?: string;
754
+ };
755
+ };
756
+ };
757
+ };
758
+ };
759
+ };
760
+ };
761
+ } & {
762
+ api: {
763
+ analytics: {
764
+ cohorts: {
765
+ get: {
766
+ body: unknown;
767
+ params: {};
768
+ query: unknown;
769
+ headers: unknown;
770
+ response: {
771
+ 200: import("../types").CohortsResponse | {
772
+ error: string;
773
+ };
774
+ };
775
+ };
776
+ };
777
+ };
778
+ };
779
+ } & {
780
+ api: {
781
+ analytics: {
782
+ roi: {
783
+ get: {
784
+ body: unknown;
785
+ params: {};
786
+ query: unknown;
787
+ headers: unknown;
788
+ response: {
789
+ 200: import("../types").RoiResponse | {
790
+ error: string;
791
+ };
792
+ };
793
+ };
794
+ };
795
+ };
796
+ };
797
+ } & {
798
+ api: {
799
+ analytics: {
800
+ leaderboard: {
801
+ get: {
802
+ body: unknown;
803
+ params: {};
804
+ query: unknown;
805
+ headers: unknown;
806
+ response: {
807
+ 200: import("../types").AnalyticsLeaderboardResponse | {
808
+ error: string;
809
+ };
810
+ };
811
+ };
812
+ };
813
+ };
814
+ };
815
+ } & {
816
+ api: {
817
+ analytics: {
818
+ traders: {
819
+ ":address": {
820
+ get: {
821
+ body: unknown;
822
+ params: {
823
+ address: string;
824
+ } & {};
825
+ query: unknown;
826
+ headers: unknown;
827
+ response: {
828
+ 200: import("../types").TraderAnalyticsResponse | {
829
+ error: string;
830
+ };
831
+ 422: {
832
+ type: "validation";
833
+ on: string;
834
+ summary?: string;
835
+ message?: string;
836
+ found?: unknown;
837
+ property?: string;
838
+ expected?: string;
839
+ };
840
+ };
841
+ };
842
+ };
843
+ };
844
+ };
845
+ };
682
846
  } & {
683
847
  ws: {
684
848
  subscribe: {
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAqB1E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;CAC3C;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoB1C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAsB/E,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqB1C"}
package/dist/api/app.js CHANGED
@@ -4,7 +4,7 @@
4
4
  import { cors } from '@elysiajs/cors';
5
5
  import { Elysia } from 'elysia';
6
6
  import { errorHandler } from './middleware/error-handler';
7
- import { activityFeedRoutes, adminRoutes, adminSubscriptionRoutes, spiceFaucetRoutes, healthRoutes, lpHistoryRoutes, marketEventsRoutes, marketLPsRoutes, marketRoutes, marketTradersRoutes, multinoulliSnapshotsRoute, positionRoutes, rankingRoutes, traderEventsRoutes, traderStatsRoutes, wsRoutes, } from './routes';
7
+ import { activityFeedRoutes, adminRoutes, adminSubscriptionRoutes, analyticsRoutes, spiceFaucetRoutes, healthRoutes, lpHistoryRoutes, marketEventsRoutes, marketLPsRoutes, marketRoutes, marketTradersRoutes, multinoulliSnapshotsRoute, positionRoutes, rankingRoutes, traderEventsRoutes, traderStatsRoutes, wsRoutes, } from './routes';
8
8
  export function createApp(config) {
9
9
  return new Elysia()
10
10
  .use(cors())
@@ -18,12 +18,13 @@ export function createApp(config) {
18
18
  .use(lpHistoryRoutes(config.db))
19
19
  .use(positionRoutes(config.db))
20
20
  .use(traderEventsRoutes(config.db))
21
- .use(traderStatsRoutes(config.db))
22
- .use(rankingRoutes(config.db))
21
+ .use(traderStatsRoutes(config.db, config.analytics ?? null))
22
+ .use(rankingRoutes(config.db, config.analytics ?? null))
23
23
  .use(activityFeedRoutes(config.db))
24
24
  .use(spiceFaucetRoutes(config.db))
25
25
  .use(adminRoutes(config.db, config.adminApiKey))
26
26
  .use(adminSubscriptionRoutes(config.db, config.adminApiKey))
27
+ .use(analyticsRoutes(config.analytics ?? null))
27
28
  .use(wsRoutes(config.eventBus));
28
29
  }
29
30
  //# sourceMappingURL=app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,uBAAuB,EACvB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,UAAU,CAAC;AASlB,MAAM,UAAU,SAAS,CAAC,MAAiB;IACzC,OAAO,IAAI,MAAM,EAAE;SAChB,GAAG,CAAC,IAAI,EAAE,CAAC;SACX,GAAG,CAAC,YAAY,CAAC;SACjB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;SAC9C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC5B,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACzC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC/B,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC/B,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC9B,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACjC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC7B,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACjC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;SAC/C,GAAG,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;SAC3D,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/api/app.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,UAAU,CAAC;AAgBlB,MAAM,UAAU,SAAS,CAAC,MAAiB;IACzC,OAAO,IAAI,MAAM,EAAE;SAChB,GAAG,CAAC,IAAI,EAAE,CAAC;SACX,GAAG,CAAC,YAAY,CAAC;SACjB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;SAC9C,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC5B,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACzC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACnC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC/B,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC/B,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC9B,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;SAC3D,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;SACvD,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAClC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SACjC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;SAC/C,GAAG,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;SAC3D,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;SAC9C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpC,CAAC"}