@atproto/ozone 0.2.3 → 0.2.5

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 (166) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/api/health.d.ts.map +1 -1
  3. package/dist/api/label/queryLabels.d.ts.map +1 -1
  4. package/dist/api/label/queryLabels.js +13 -21
  5. package/dist/api/label/queryLabels.js.map +1 -1
  6. package/dist/api/moderation/util.d.ts.map +1 -1
  7. package/dist/api/util.d.ts +2 -2
  8. package/dist/api/util.d.ts.map +1 -1
  9. package/dist/api/well-known.d.ts.map +1 -1
  10. package/dist/assignment/index.d.ts.map +1 -1
  11. package/dist/assignment/index.js +9 -12
  12. package/dist/assignment/index.js.map +1 -1
  13. package/dist/auth-verifier.d.ts.map +1 -1
  14. package/dist/background.d.ts.map +1 -1
  15. package/dist/background.js.map +1 -1
  16. package/dist/communication-service/template.d.ts.map +1 -1
  17. package/dist/communication-service/template.js.map +1 -1
  18. package/dist/communication-service/util.d.ts.map +1 -1
  19. package/dist/config/config.d.ts.map +1 -1
  20. package/dist/config/secrets.d.ts.map +1 -1
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js.map +1 -1
  23. package/dist/daemon/blob-diverter.d.ts.map +1 -1
  24. package/dist/daemon/blob-diverter.js.map +1 -1
  25. package/dist/daemon/context.d.ts.map +1 -1
  26. package/dist/daemon/context.js.map +1 -1
  27. package/dist/daemon/event-pusher.d.ts +7 -1
  28. package/dist/daemon/event-pusher.d.ts.map +1 -1
  29. package/dist/daemon/event-reverser.d.ts.map +1 -1
  30. package/dist/daemon/index.d.ts.map +1 -1
  31. package/dist/daemon/index.js.map +1 -1
  32. package/dist/daemon/materialized-view-refresher.d.ts.map +1 -1
  33. package/dist/daemon/queue-router.d.ts.map +1 -1
  34. package/dist/daemon/scheduled-action-processor.d.ts.map +1 -1
  35. package/dist/daemon/stats-computer.d.ts.map +1 -1
  36. package/dist/daemon/strike-expiry-processor.d.ts.map +1 -1
  37. package/dist/daemon/team-profile-synchronizer.d.ts.map +1 -1
  38. package/dist/daemon/verification-listener.d.ts.map +1 -1
  39. package/dist/db/index.d.ts +4 -5
  40. package/dist/db/index.d.ts.map +1 -1
  41. package/dist/db/index.js +2 -1
  42. package/dist/db/index.js.map +1 -1
  43. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts +1 -2
  44. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.d.ts.map +1 -1
  45. package/dist/db/migrations/20241220T144630860Z-stats-materialized-views.js.map +1 -1
  46. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts +1 -2
  47. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.d.ts.map +1 -1
  48. package/dist/db/migrations/20250718T150931000Z-update-appeal-reason-stats.js.map +1 -1
  49. package/dist/db/migrations/provider.d.ts +2 -1
  50. package/dist/db/migrations/provider.d.ts.map +1 -1
  51. package/dist/db/migrations/provider.js.map +1 -1
  52. package/dist/db/pagination.d.ts +5 -4
  53. package/dist/db/pagination.d.ts.map +1 -1
  54. package/dist/db/pagination.js +4 -4
  55. package/dist/db/pagination.js.map +1 -1
  56. package/dist/db/schema/index.d.ts.map +1 -1
  57. package/dist/db/types.d.ts +1 -1
  58. package/dist/db/types.d.ts.map +1 -1
  59. package/dist/db/types.js.map +1 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/jetstream/service.d.ts.map +1 -1
  62. package/dist/lexicon/index.d.ts +2 -0
  63. package/dist/lexicon/index.d.ts.map +1 -1
  64. package/dist/lexicon/index.js +4 -0
  65. package/dist/lexicon/index.js.map +1 -1
  66. package/dist/lexicon/lexicons.d.ts +17160 -17038
  67. package/dist/lexicon/lexicons.d.ts.map +1 -1
  68. package/dist/lexicon/lexicons.js +68 -1
  69. package/dist/lexicon/lexicons.js.map +1 -1
  70. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +11 -0
  71. package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
  72. package/dist/lexicon/types/chat/bsky/convo/defs.js +7 -0
  73. package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
  74. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.d.ts +25 -0
  75. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.d.ts.map +1 -0
  76. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.js +5 -0
  77. package/dist/lexicon/types/chat/bsky/convo/getUnreadCounts.js.map +1 -0
  78. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts +1 -1
  79. package/dist/lexicon/types/chat/bsky/convo/sendMessage.d.ts.map +1 -1
  80. package/dist/lexicon/types/chat/bsky/convo/sendMessage.js.map +1 -1
  81. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts +1 -1
  82. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.d.ts.map +1 -1
  83. package/dist/lexicon/types/chat/bsky/convo/sendMessageBatch.js.map +1 -1
  84. package/dist/lexicon/util.d.ts.map +1 -1
  85. package/dist/mod-service/index.d.ts +38 -38
  86. package/dist/mod-service/index.d.ts.map +1 -1
  87. package/dist/mod-service/index.js +28 -52
  88. package/dist/mod-service/index.js.map +1 -1
  89. package/dist/mod-service/profile.d.ts.map +1 -1
  90. package/dist/mod-service/report.d.ts.map +1 -1
  91. package/dist/mod-service/report.js.map +1 -1
  92. package/dist/mod-service/status.d.ts +60 -165
  93. package/dist/mod-service/status.d.ts.map +1 -1
  94. package/dist/mod-service/strike.d.ts.map +1 -1
  95. package/dist/mod-service/strike.js.map +1 -1
  96. package/dist/mod-service/subject.d.ts +4 -4
  97. package/dist/mod-service/subject.d.ts.map +1 -1
  98. package/dist/mod-service/util.d.ts +1 -1
  99. package/dist/mod-service/util.d.ts.map +1 -1
  100. package/dist/mod-service/views.d.ts.map +1 -1
  101. package/dist/mod-service/views.js +7 -11
  102. package/dist/mod-service/views.js.map +1 -1
  103. package/dist/queue/service.d.ts.map +1 -1
  104. package/dist/queue/service.js +1 -3
  105. package/dist/queue/service.js.map +1 -1
  106. package/dist/report/activity.d.ts +17 -6
  107. package/dist/report/activity.d.ts.map +1 -1
  108. package/dist/report/handle-report-update.d.ts.map +1 -1
  109. package/dist/report/handle-report-update.js.map +1 -1
  110. package/dist/report/stats.d.ts.map +1 -1
  111. package/dist/report/stats.js.map +1 -1
  112. package/dist/report/views.d.ts +2 -2
  113. package/dist/report/views.d.ts.map +1 -1
  114. package/dist/safelink/service.d.ts +3 -3
  115. package/dist/safelink/service.d.ts.map +1 -1
  116. package/dist/safelink/service.js.map +1 -1
  117. package/dist/scheduled-action/service.d.ts.map +1 -1
  118. package/dist/scheduled-action/service.js +16 -20
  119. package/dist/scheduled-action/service.js.map +1 -1
  120. package/dist/sequencer/outbox.d.ts.map +1 -1
  121. package/dist/sequencer/outbox.js.map +1 -1
  122. package/dist/sequencer/sequencer.d.ts.map +1 -1
  123. package/dist/sequencer/sequencer.js.map +1 -1
  124. package/dist/set/service.d.ts +10 -1
  125. package/dist/set/service.d.ts.map +1 -1
  126. package/dist/set/service.js +5 -2
  127. package/dist/set/service.js.map +1 -1
  128. package/dist/setting/service.d.ts.map +1 -1
  129. package/dist/setting/service.js.map +1 -1
  130. package/dist/tag-service/content-tagger.d.ts.map +1 -1
  131. package/dist/tag-service/content-tagger.js.map +1 -1
  132. package/dist/tag-service/embed-tagger.d.ts.map +1 -1
  133. package/dist/tag-service/index.d.ts.map +1 -1
  134. package/dist/tag-service/index.js.map +1 -1
  135. package/dist/tag-service/language-tagger.d.ts.map +1 -1
  136. package/dist/tag-service/util.d.ts.map +1 -1
  137. package/dist/team/index.d.ts.map +1 -1
  138. package/dist/team/index.js +5 -4
  139. package/dist/team/index.js.map +1 -1
  140. package/dist/util.d.ts.map +1 -1
  141. package/dist/verification/issuer.d.ts +14 -4
  142. package/dist/verification/issuer.d.ts.map +1 -1
  143. package/dist/verification/service.d.ts +18 -6
  144. package/dist/verification/service.d.ts.map +1 -1
  145. package/dist/verification/service.js +1 -1
  146. package/dist/verification/service.js.map +1 -1
  147. package/dist/verification/util.d.ts.map +1 -1
  148. package/package.json +15 -16
  149. package/src/api/label/queryLabels.ts +11 -14
  150. package/src/assignment/index.ts +15 -18
  151. package/src/db/index.ts +1 -1
  152. package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +1 -2
  153. package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +1 -2
  154. package/src/db/migrations/provider.ts +2 -1
  155. package/src/db/pagination.ts +18 -18
  156. package/src/db/types.ts +3 -1
  157. package/src/mod-service/index.ts +78 -71
  158. package/src/mod-service/report.ts +5 -3
  159. package/src/mod-service/views.ts +16 -16
  160. package/src/queue/service.ts +5 -5
  161. package/src/report/stats.ts +5 -3
  162. package/src/scheduled-action/service.ts +22 -20
  163. package/src/set/service.ts +17 -14
  164. package/src/team/index.ts +6 -5
  165. package/src/verification/service.ts +2 -2
  166. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.js","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { OZONE_APPEAL_REASON_TYPE } from '../../api/util.js'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport { DatabaseSchemaType } from '../schema/index.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Drop and recreate materialized views to update appeal reason counting\n // to include both REASONAPPEAL and OZONE_APPEAL_REASON_TYPE\n // The primary difference between the old and new query is that we were using = and != operators\n // to match against the meta->>'reportType' field and now we use IN and NOT IN\n\n // Drop existing materialized views in reverse dependency order\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate account_events_stats with updated appeal counting\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate record_events_stats with updated appeal counting\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n // Recreate account_record_events_stats (unchanged logic, but depends on record_events_stats)\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate all indexes for the materialized views\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n\nexport async function down(db: Kysely<DatabaseSchemaType>): Promise<void> {\n // Drop the updated materialized views\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate the original views with single appeal reason type\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' != ${REASONAPPEAL}\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' = ${REASONAPPEAL}\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' != 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' = 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate indexes\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n"]}
1
+ {"version":3,"file":"20250718T150931000Z-update-appeal-reason-stats.js","sourceRoot":"","sources":["../../../src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { Kysely, sql } from 'kysely'\nimport { OZONE_APPEAL_REASON_TYPE } from '../../api/util.js'\nimport { REASONAPPEAL } from '../../lexicon/types/com/atproto/moderation/defs.js'\nimport * as modEvent from '../schema/moderation_event.js'\nimport * as recordEventsStats from '../schema/record_events_stats.js'\n\nexport async function up(db: Kysely<any>): Promise<void> {\n // Drop and recreate materialized views to update appeal reason counting\n // to include both REASONAPPEAL and OZONE_APPEAL_REASON_TYPE\n // The primary difference between the old and new query is that we were using = and != operators\n // to match against the meta->>'reportType' field and now we use IN and NOT IN\n\n // Drop existing materialized views in reverse dependency order\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate account_events_stats with updated appeal counting\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE})\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate record_events_stats with updated appeal counting\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' NOT IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' IN (${REASONAPPEAL}, ${OZONE_APPEAL_REASON_TYPE}))`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n // Recreate account_record_events_stats (unchanged logic, but depends on record_events_stats)\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate all indexes for the materialized views\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n\nexport async function down(db: Kysely<any>): Promise<void> {\n // Drop the updated materialized views\n await db.schema\n .dropView('account_record_events_stats')\n .materialized()\n .execute()\n await db.schema.dropView('record_events_stats').materialized().execute()\n await db.schema.dropView('account_events_stats').materialized().execute()\n\n // Recreate the original views with single appeal reason type\n await db.schema\n .createView('account_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .where('subjectType', '=', 'com.atproto.admin.defs#repoRef')\n .where('subjectUri', 'is', null)\n .select('subjectDid')\n .select([\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NULL\n )`.as('takedownCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventTakedown'\n AND ${eb.ref('durationInHours')} IS NOT NULL\n )`.as('suspendCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate'\n )`.as('escalateCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' != ${REASONAPPEAL}\n )`.as('reportCount'),\n (eb) =>\n sql<number>`COUNT(*) FILTER(\n WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport'\n AND ${eb.ref('meta')} ->> 'reportType' = ${REASONAPPEAL}\n )`.as('appealCount'),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n await db.schema\n .createView('record_events_stats')\n .materialized()\n .as(\n (db as Kysely<modEvent.PartialDB>)\n .selectFrom('moderation_event')\n .select([\n 'subjectDid',\n 'subjectUri',\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventEscalate')`.as(\n 'escalateCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' != 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'reportCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('action')} = 'tools.ozone.moderation.defs#modEventReport' AND ${eb.ref('meta')} ->> 'reportType' = 'com.atproto.moderation.defs#reasonAppeal')`.as(\n 'appealCount',\n ),\n ])\n .where('subjectType', '=', 'com.atproto.repo.strongRef')\n .where('subjectUri', 'is not', null)\n .groupBy(['subjectDid', 'subjectUri']),\n )\n .execute()\n\n await db.schema\n .createView('account_record_events_stats')\n .materialized()\n .as(\n (db as Kysely<recordEventsStats.PartialDB>)\n .selectFrom('record_events_stats')\n .select([\n 'subjectDid',\n (eb) =>\n sql<number>`SUM(${eb.ref('reportCount')})::bigint`.as(\n 'totalReports',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('reportCount')} > 0)`.as(\n 'reportedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('escalateCount')} > 0)`.as(\n 'escalatedCount',\n ),\n (eb) =>\n sql<number>`COUNT(*) FILTER (WHERE ${eb.ref('appealCount')} > 0)`.as(\n 'appealedCount',\n ),\n ])\n .groupBy('subjectDid'),\n )\n .execute()\n\n // Recreate indexes\n await db.schema\n .createIndex('account_events_stats_did_idx')\n .unique()\n .on('account_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_events_stats_suspend_count_idx')\n .on('account_events_stats')\n .expression(sql`\"suspendCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_uri_idx')\n .unique()\n .on('record_events_stats')\n .column('subjectUri')\n .execute()\n\n await db.schema\n .createIndex('record_events_stats_did_idx')\n .on('record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_did_idx')\n .unique()\n .on('account_record_events_stats')\n .column('subjectDid')\n .execute()\n\n await db.schema\n .createIndex('account_record_events_stats_reported_count_idx')\n .on('account_record_events_stats')\n .expression(sql`\"reportedCount\" ASC NULLS FIRST`)\n .column('subjectDid')\n .execute()\n}\n"]}
@@ -1,4 +1,5 @@
1
- import { Kysely, Migration, MigrationProvider } from 'kysely';
1
+ import { Kysely } from 'kysely';
2
+ import { Migration, MigrationProvider } from 'kysely/migration';
2
3
  export declare class CtxMigrationProvider<T> implements MigrationProvider {
3
4
  private migrations;
4
5
  private ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAI7D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;gBADH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC;IAEV,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CAU1D;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAI/D,qBAAa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB;IAE7D,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAFb,YACU,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAC3C,GAAG,EAAE,CAAC,EACZ;IACE,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CASxD;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;QADN,eAAU,GAAV,UAAU,CAAiC;QAC3C,QAAG,GAAH,GAAG,CAAG;IACb,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely, Migration, MigrationProvider } from 'kysely'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/db/migrations/provider.ts"],"names":[],"mappings":"AAGA,6FAA6F;AAE7F,MAAM,OAAO,oBAAoB;IAC/B,YACU,UAA2C,EAC3C,GAAM;0BADN,UAAU;mBACV,GAAG;IACV,CAAC;IACJ,KAAK,CAAC,aAAa;QACjB,MAAM,aAAa,GAA8B,EAAE,CAAA;QACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAC5D,aAAa,CAAC,IAAI,CAAC,GAAG;gBACpB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;gBAClD,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;aACzD,CAAA;QACH,CAAC,CAAC,CAAA;QACF,OAAO,aAAa,CAAA;IACtB,CAAC;CACF","sourcesContent":["import { Kysely } from 'kysely'\nimport { Migration, MigrationProvider } from 'kysely/migration'\n\n// Passes a context argument to migrations. We use this to thread the dialect into migrations\n\nexport class CtxMigrationProvider<T> implements MigrationProvider {\n constructor(\n private migrations: Record<string, CtxMigration<T>>,\n private ctx: T,\n ) {}\n async getMigrations(): Promise<Record<string, Migration>> {\n const ctxMigrations: Record<string, Migration> = {}\n Object.entries(this.migrations).forEach(([name, migration]) => {\n ctxMigrations[name] = {\n up: async (db) => await migration.up(db, this.ctx),\n down: async (db) => await migration.down?.(db, this.ctx),\n }\n })\n return ctxMigrations\n }\n}\n\nexport interface CtxMigration<T> {\n up(db: Kysely<unknown>, ctx: T): Promise<void>\n down?(db: Kysely<unknown>, ctx: T): Promise<void>\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { SqlBool } from 'kysely';
1
2
  import { AnyQb, DbRef } from './types.js';
2
3
  export type Cursor = {
3
4
  primary: string;
@@ -33,7 +34,7 @@ export declare abstract class GenericKeyset<R, LR extends LabeledResult> {
33
34
  unpack(cursorStr?: string): LR | undefined;
34
35
  packCursor(cursor?: Cursor): string | undefined;
35
36
  unpackCursor(cursorStr?: string): Cursor | undefined;
36
- getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<unknown> | undefined;
37
+ getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<SqlBool> | undefined;
37
38
  }
38
39
  type StatusKeysetParam = {
39
40
  lastReviewedAt: string | null;
@@ -51,7 +52,7 @@ export declare class StatusKeyset extends GenericKeyset<StatusKeysetParam, Curso
51
52
  secondary: string;
52
53
  };
53
54
  unpackCursor(cursorStr?: string): Cursor | undefined;
54
- getSql(labeled?: Cursor, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<unknown> | undefined;
55
+ getSql(labeled?: Cursor, direction?: 'asc' | 'desc'): import("kysely").RawBuilder<SqlBool> | undefined;
55
56
  }
56
57
  type TimeIdKeysetParam = {
57
58
  id: number;
@@ -98,7 +99,7 @@ export declare class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cur
98
99
  primary: string;
99
100
  secondary: string;
100
101
  };
101
- getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<unknown> | undefined;
102
+ getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean): import("kysely").RawBuilder<SqlBool> | undefined;
102
103
  }
103
104
  type ComputedAtIdKeysetParam = {
104
105
  id: number;
@@ -118,7 +119,7 @@ export declare class ComputedAtIdKeyset extends GenericKeyset<ComputedAtIdKeyset
118
119
  export declare const paginate: <QB extends AnyQb, K extends GenericKeyset<unknown, any>>(qb: QB, opts: {
119
120
  limit?: number;
120
121
  cursor?: string;
121
- direction?: "asc" | "desc";
122
+ direction?: 'asc' | 'desc';
122
123
  keyset: K;
123
124
  tryIndex?: boolean;
124
125
  nullsLast?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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"}
@@ -250,15 +250,15 @@ export const paginate = (qb, opts) => {
250
250
  const { limit, cursor, keyset, direction = 'desc', tryIndex, nullsLast, } = opts;
251
251
  const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex);
252
252
  return qb
253
- .if(!!limit, (q) => q.limit(limit))
254
- .if(!nullsLast, (q) => q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction))
255
- .if(!!nullsLast, (q) => q
253
+ .$if(!!limit, (q) => q.limit(limit))
254
+ .$if(!nullsLast, (q) => q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction))
255
+ .$if(!!nullsLast, (q) => q
256
256
  .orderBy(direction === 'asc'
257
257
  ? sql `${keyset.primary} asc nulls last`
258
258
  : sql `${keyset.primary} desc nulls last`)
259
259
  .orderBy(direction === 'asc'
260
260
  ? sql `${keyset.secondary} asc nulls last`
261
261
  : sql `${keyset.secondary} desc nulls last`))
262
- .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
262
+ .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb));
263
263
  };
264
264
  //# sourceMappingURL=pagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types.js'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype EndAtIdKeysetParam = {\n id: number\n endAt: string | null\n}\n\n// Special value used here to represent a \"permanent\" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).\n// Chosen to sort before all real timestamps in DESC order.\nconst PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z'\n\nexport class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cursor> {\n labelResult(result: EndAtIdKeysetParam): Cursor\n labelResult(result: EndAtIdKeysetParam) {\n return {\n primary: result.endAt ?? PERMANENT_ENDSAT,\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows\n // so cursor pagination works across permanent (endAt IS NULL) assignments.\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`\n if (tryIndex) {\n if (direction === 'asc') {\n return sql`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n if (direction === 'asc') {\n return sql`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype ComputedAtIdKeysetParam = {\n id: number\n computedAt: string | Date\n}\n\nexport class ComputedAtIdKeyset extends GenericKeyset<\n ComputedAtIdKeysetParam,\n Cursor\n> {\n labelResult(result: ComputedAtIdKeysetParam): Cursor\n labelResult(result: ComputedAtIdKeysetParam) {\n return { primary: result.computedAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .if(!!limit, (q) => q.limit(limit as number))\n .if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/db/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DynamicModule, SqlBool, sql } from 'kysely'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport { AnyQb, DbRef } from './types.js'\n\nexport type Cursor = { primary: string; secondary: string }\nexport type LabeledResult = {\n primary: string | number\n secondary: string | number\n}\n\n/**\n * The GenericKeyset is an abstract class that sets-up the interface and partial implementation\n * of a keyset-paginated cursor with two parts. There are three types involved:\n * - Result: a raw result (i.e. a row from the db) containing data that will make-up a cursor.\n * - E.g. { createdAt: '2022-01-01T12:00:00Z', cid: 'bafyx' }\n * - LabeledResult: a Result processed such that the \"primary\" and \"secondary\" parts of the cursor are labeled.\n * - E.g. { primary: '2022-01-01T12:00:00Z', secondary: 'bafyx' }\n * - Cursor: the two string parts that make-up the packed/string cursor.\n * - E.g. packed cursor '1641038400000::bafyx' in parts { primary: '1641038400000', secondary: 'bafyx' }\n *\n * These types relate as such. Implementers define the relations marked with a *:\n * Result -*-> LabeledResult <-*-> Cursor <--> packed/string cursor\n * ↳ SQL Condition\n */\nexport abstract class GenericKeyset<R, LR extends LabeledResult> {\n constructor(\n public primary: DbRef,\n public secondary: DbRef,\n ) {}\n abstract labelResult(result: R): LR\n abstract labeledResultToCursor(labeled: LR): Cursor\n abstract cursorToLabeledResult(cursor: Cursor): LR\n packFromResult(results: R | R[]): string | undefined {\n const result = Array.isArray(results) ? results.at(-1) : results\n if (!result) return\n return this.pack(this.labelResult(result))\n }\n pack(labeled?: LR): string | undefined {\n if (!labeled) return\n const cursor = this.labeledResultToCursor(labeled)\n return this.packCursor(cursor)\n }\n unpack(cursorStr?: string): LR | undefined {\n const cursor = this.unpackCursor(cursorStr)\n if (!cursor) return\n return this.cursorToLabeledResult(cursor)\n }\n packCursor(cursor?: Cursor): string | undefined {\n if (!cursor) return\n return `${cursor.primary}::${cursor.secondary}`\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!primary || !secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n getSql(labeled?: LR, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n if (tryIndex) {\n // The tryIndex param will likely disappear and become the default implementation: here for now for gradual rollout query-by-query.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n // @NOTE this implementation can struggle to use an index on (primary, secondary) for pagination due to the \"or\" usage.\n if (direction === 'asc') {\n return sql<SqlBool>`((${this.primary} > ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${this.primary} < ${labeled.primary}) or (${this.primary} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype StatusKeysetParam = {\n lastReviewedAt: string | null\n lastReportedAt: string | null\n id: number\n}\n\nexport class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {\n labelResult(result: StatusKeysetParam): Cursor\n labelResult(result: StatusKeysetParam) {\n const primaryField = (\n this.primary as ReturnType<DynamicModule<unknown>['ref']>\n ).dynamicReference.includes('lastReviewedAt')\n ? 'lastReviewedAt'\n : 'lastReportedAt'\n\n return {\n primary: result[primaryField]\n ? new Date(`${result[primaryField]}`).getTime().toString()\n : '',\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: labeled.primary,\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n return {\n primary: cursor.primary\n ? new Date(parseInt(cursor.primary, 10)).toISOString()\n : '',\n secondary: cursor.secondary,\n }\n }\n unpackCursor(cursorStr?: string): Cursor | undefined {\n if (!cursorStr) return\n const result = cursorStr.split('::')\n const [primary, secondary, ...others] = result\n if (!secondary || others.length > 0) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary,\n secondary,\n }\n }\n // This is specifically built to handle nullable columns as primary sorting column\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc') {\n if (labeled === undefined) return\n if (direction === 'asc') {\n return !labeled.primary\n ? sql<SqlBool>`(${this.primary} IS NULL AND ${this.secondary} > ${labeled.secondary})`\n : sql<SqlBool>`((${this.primary}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n } else {\n return !labeled.primary\n ? sql<SqlBool>`(${this.primary} IS NULL AND ${this.secondary} < ${labeled.secondary})`\n : sql<SqlBool>`((${this.primary}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}) OR (${this.primary} is null))`\n }\n }\n}\n\ntype TimeIdKeysetParam = {\n id: number\n createdAt: string | Date\n}\ntype TimeIdResult = TimeIdKeysetParam\n\nexport class TimeIdKeyset extends GenericKeyset<TimeIdKeysetParam, Cursor> {\n labelResult(result: TimeIdResult): Cursor\n labelResult(result: TimeIdResult) {\n return { primary: result.createdAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype CreatedAtUriKeysetParam = {\n createdAt: string\n uri: string\n}\n\nexport class CreatedAtUriKeyset extends GenericKeyset<\n CreatedAtUriKeysetParam,\n Cursor\n> {\n labelResult(result: CreatedAtUriKeysetParam): Cursor\n labelResult(result: CreatedAtUriKeysetParam) {\n return { primary: result.createdAt, secondary: result.uri }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\ntype EndAtIdKeysetParam = {\n id: number\n endAt: string | null\n}\n\n// Special value used here to represent a \"permanent\" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future).\n// Chosen to sort before all real timestamps in DESC order.\nconst PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z'\n\nexport class EndAtIdKeyset extends GenericKeyset<EndAtIdKeysetParam, Cursor> {\n labelResult(result: EndAtIdKeysetParam): Cursor\n labelResult(result: EndAtIdKeysetParam) {\n return {\n primary: result.endAt ?? PERMANENT_ENDSAT,\n secondary: result.id.toString(),\n }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows\n // so cursor pagination works across permanent (endAt IS NULL) assignments.\n getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) {\n if (labeled === undefined) return\n const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})`\n if (tryIndex) {\n if (direction === 'asc') {\n return sql<SqlBool>`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))`\n }\n } else {\n if (direction === 'asc') {\n return sql<SqlBool>`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))`\n } else {\n return sql<SqlBool>`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))`\n }\n }\n }\n}\n\ntype ComputedAtIdKeysetParam = {\n id: number\n computedAt: string | Date\n}\n\nexport class ComputedAtIdKeyset extends GenericKeyset<\n ComputedAtIdKeysetParam,\n Cursor\n> {\n labelResult(result: ComputedAtIdKeysetParam): Cursor\n labelResult(result: ComputedAtIdKeysetParam) {\n return { primary: result.computedAt, secondary: result.id.toString() }\n }\n labeledResultToCursor(labeled: Cursor) {\n return {\n primary: new Date(labeled.primary).getTime().toString(),\n secondary: labeled.secondary,\n }\n }\n cursorToLabeledResult(cursor: Cursor) {\n const primaryDate = new Date(parseInt(cursor.primary, 10))\n if (isNaN(primaryDate.getTime())) {\n throw new InvalidRequestError('Malformed cursor')\n }\n return {\n primary: primaryDate.toISOString(),\n secondary: cursor.secondary,\n }\n }\n}\n\nexport const paginate = <\n QB extends AnyQb,\n K extends GenericKeyset<unknown, any>,\n>(\n qb: QB,\n opts: {\n limit?: number\n cursor?: string\n direction?: 'asc' | 'desc'\n keyset: K\n tryIndex?: boolean\n // By default, pg does nullsFirst\n nullsLast?: boolean\n },\n): QB => {\n const {\n limit,\n cursor,\n keyset,\n direction = 'desc',\n tryIndex,\n nullsLast,\n } = opts\n const keysetSql = keyset.getSql(keyset.unpack(cursor), direction, tryIndex)\n return qb\n .$if(!!limit, (q) => q.limit(limit as number))\n .$if(!nullsLast, (q) =>\n q.orderBy(keyset.primary, direction).orderBy(keyset.secondary, direction),\n )\n .$if(!!nullsLast, (q) =>\n q\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.primary} asc nulls last`\n : sql`${keyset.primary} desc nulls last`,\n )\n .orderBy(\n direction === 'asc'\n ? sql`${keyset.secondary} asc nulls last`\n : sql`${keyset.secondary} desc nulls last`,\n ),\n )\n .$if(!!keysetSql, (qb) => (keysetSql ? qb.where(keysetSql) : qb)) as QB\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,wBAAwB,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,wBAAwB,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,qBAAqB,MAAM,6BAA6B,CAAA;AACpE,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,gBAAgB,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,GACjD,gBAAgB,CAAC,SAAS,GAC1B,MAAM,CAAC,SAAS,GAChB,cAAc,CAAC,SAAS,GACxB,WAAW,CAAC,SAAS,GACrB,KAAK,CAAC,SAAS,GACf,UAAU,CAAC,SAAS,GACpB,aAAa,CAAC,SAAS,GACvB,eAAe,CAAC,SAAS,GACzB,aAAa,CAAC,SAAS,GACvB,qBAAqB,CAAC,SAAS,GAC/B,GAAG,CAAC,SAAS,GACb,MAAM,CAAC,SAAS,GAChB,OAAO,CAAC,SAAS,GACjB,kBAAkB,CAAC,SAAS,GAC5B,iBAAiB,CAAC,SAAS,GAC3B,wBAAwB,CAAC,SAAS,GAClC,wBAAwB,CAAC,SAAS,GAClC,aAAa,CAAC,SAAS,GACvB,YAAY,CAAC,SAAS,GACtB,cAAc,CAAC,SAAS,GACxB,SAAS,CAAC,SAAS,GACnB,QAAQ,CAAC,SAAS,GAClB,eAAe,CAAC,SAAS,GACzB,mBAAmB,CAAC,SAAS,GAC7B,UAAU,CAAC,SAAS,GACpB,WAAW,CAAC,SAAS,CAAA;AAEvB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;AAEvD,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,wBAAwB,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,wBAAwB,MAAM,kCAAkC,CAAA;AAC5E,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,qBAAqB,MAAM,6BAA6B,CAAA;AACpE,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,gBAAgB,MAAM,gCAAgC,CAAA;AAClE,OAAO,KAAK,mBAAmB,MAAM,2BAA2B,CAAA;AAChE,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAA;AACrC,OAAO,KAAK,iBAAiB,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AACzD,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,KAAK,eAAe,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,OAAO,MAAM,cAAc,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,GACjD,gBAAgB,CAAC,SAAS,GAC1B,MAAM,CAAC,SAAS,GAChB,cAAc,CAAC,SAAS,GACxB,WAAW,CAAC,SAAS,GACrB,KAAK,CAAC,SAAS,GACf,UAAU,CAAC,SAAS,GACpB,aAAa,CAAC,SAAS,GACvB,eAAe,CAAC,SAAS,GACzB,aAAa,CAAC,SAAS,GACvB,qBAAqB,CAAC,SAAS,GAC/B,GAAG,CAAC,SAAS,GACb,MAAM,CAAC,SAAS,GAChB,OAAO,CAAC,SAAS,GACjB,kBAAkB,CAAC,SAAS,GAC5B,iBAAiB,CAAC,SAAS,GAC3B,wBAAwB,CAAC,SAAS,GAClC,wBAAwB,CAAC,SAAS,GAClC,aAAa,CAAC,SAAS,GACvB,YAAY,CAAC,SAAS,GACtB,cAAc,CAAC,SAAS,GACxB,SAAS,CAAC,SAAS,GACnB,QAAQ,CAAC,SAAS,GAClB,eAAe,CAAC,SAAS,GACzB,mBAAmB,CAAC,SAAS,GAC7B,UAAU,CAAC,SAAS,GACpB,WAAW,CAAC,SAAS,CAAA;AAEvB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAA;eAExC,cAAc"}
@@ -1,7 +1,7 @@
1
1
  import { DynamicModule, RawBuilder, SelectQueryBuilder } from 'kysely';
2
2
  import pg from 'pg';
3
3
  type PgPool = pg.Pool;
4
- export type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>;
4
+ export type DbRef = RawBuilder<unknown> | ReturnType<DynamicModule<unknown>['ref']>;
5
5
  export type AnyQb = SelectQueryBuilder<any, any, any>;
6
6
  export type PgOptions = {
7
7
  url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAO,MAAM,QAAQ,CAAA;AAE3E,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,CAAA;AAErB,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,KAAK,CAAC,kBAG9B,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAO,MAAM,QAAQ,CAAA;AAE3E,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,CAAA;AAErB,MAAM,MAAM,KAAK,GACb,UAAU,CAAC,OAAO,CAAC,GACnB,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;AAE7C,MAAM,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,OAAO,CAAC,kBAG9B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,GAAG,EAAE,MAAM,QAAQ,CAAA;AAkB3E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,GAAM,EAAE,EAAE;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAG,MAAM,CAAA;IACrC,OAAO,GAAG,CAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PgPool = pg.Pool\n\nexport type DbRef = RawBuilder | ReturnType<DynamicModule['ref']>\n\nexport type AnyQb = SelectQueryBuilder<any, any, any>\n\nexport type PgOptions = {\n url: string\n pool?: PgPool\n schema?: string\n poolSize?: number\n poolMaxUses?: number\n poolIdleTimeoutMs?: number\n}\n\nexport const jsonb = <T>(val: T) => {\n if (val === null) return sql<T>`null`\n return sql<T>`${JSON.stringify(val)}::jsonb`\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,GAAG,EAAE,MAAM,QAAQ,CAAA;AAoB3E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,GAAM,EAAE,EAAE;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAG,MAAM,CAAA;IACrC,OAAO,GAAG,CAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAA;AAC9C,CAAC,CAAA","sourcesContent":["import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'\n// eslint-disable-next-line import/default\nimport pg from 'pg'\ntype PgPool = pg.Pool\n\nexport type DbRef =\n | RawBuilder<unknown>\n | ReturnType<DynamicModule<unknown>['ref']>\n\nexport type AnyQb = SelectQueryBuilder<any, any, any>\n\nexport type PgOptions = {\n url: string\n pool?: PgPool\n schema?: string\n poolSize?: number\n poolMaxUses?: number\n poolIdleTimeoutMs?: number\n}\n\nexport const jsonb = <T>(val: T) => {\n if (val === null) return sql<T>`null`\n return sql<T>`${JSON.stringify(val)}::jsonb`\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAQ7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAM5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,YAAY;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,eAAe,CAAC,CAAgB;gBAE5B,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE;WAKlD,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC;IA4BlB,kBAAkB;IA8BlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAgC7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ/B;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B,OAAO,OAAO,MAAM,SAAS,CAAA;AAQ7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAM5D,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,qBAAa,YAAY;IAChB,GAAG,EAAE,UAAU,CAAA;IACf,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,eAAe,CAAC,CAAgB;IAExC,YAAY,IAAI,EAAE;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAA;KAAE,EAG9D;IAED,OAAa,MAAM,CACjB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,YAAY,EACrB,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC,CA0BvB;IAEK,kBAAkB,kBA4BvB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CA8BlC;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAO7B;CACF;eAEc,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/jetstream/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9C,KAAK,gBAAgB,CAAC,CAAC,SAAS,eAAe,IAAI,CACjD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IAEf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,WAAW,iBAAiB,CAAC,UAAU,SAAS,eAAe,CACnE,SAAQ,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;QACnB,MAAM,EAAE,UAAU,CAAA;KACnB,GAAG,UAAU,CAAA;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;KACpB,GAAG,UAAU,CAAA;CACf;AAED,qBAAa,SAAS;IACb,EAAE,CAAC,EAAE,kBAAkB,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACf,0BAA0B;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEV,IAAI,EAAE,gBAAgB;IAW5B,KAAK,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;KACnE;IA0BD;;OAEG;IACH,KAAK;CAGN"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/jetstream/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC9C,KAAK,gBAAgB,CAAC,CAAC,SAAS,eAAe,IAAI,CACjD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,IAAI,CAAC,CAAA;AAElB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IAEf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AACD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,WAAW,iBAAiB,CAAC,UAAU,SAAS,eAAe,CACnE,SAAQ,SAAS;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;QACnB,MAAM,EAAE,UAAU,CAAA;KACnB,GAAG,UAAU,CAAA;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE;QACN,SAAS,EAAE,QAAQ,CAAA;KACpB,GAAG,UAAU,CAAA;CACf;AAED,qBAAa,SAAS;IACb,EAAE,CAAC,EAAE,kBAAkB,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACf,0BAA0B;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IAEtB,YAAY,IAAI,EAAE,gBAAgB,EASjC;IAEK,KAAK,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;QAChD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;KACnE,iBAwBA;IAED;;OAEG;IACH,KAAK,SAEJ;CACF"}
@@ -125,6 +125,7 @@ import * as ChatBskyConvoGetConvoForMembers from './types/chat/bsky/convo/getCon
125
125
  import * as ChatBskyConvoGetConvoMembers from './types/chat/bsky/convo/getConvoMembers.js';
126
126
  import * as ChatBskyConvoGetLog from './types/chat/bsky/convo/getLog.js';
127
127
  import * as ChatBskyConvoGetMessages from './types/chat/bsky/convo/getMessages.js';
128
+ import * as ChatBskyConvoGetUnreadCounts from './types/chat/bsky/convo/getUnreadCounts.js';
128
129
  import * as ChatBskyConvoLeaveConvo from './types/chat/bsky/convo/leaveConvo.js';
129
130
  import * as ChatBskyConvoListConvoRequests from './types/chat/bsky/convo/listConvoRequests.js';
130
131
  import * as ChatBskyConvoListConvos from './types/chat/bsky/convo/listConvos.js';
@@ -628,6 +629,7 @@ export declare class ChatBskyConvoNS {
628
629
  getConvoMembers<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoGetConvoMembers.QueryParams, ChatBskyConvoGetConvoMembers.HandlerInput, ChatBskyConvoGetConvoMembers.HandlerOutput>): void;
629
630
  getLog<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoGetLog.QueryParams, ChatBskyConvoGetLog.HandlerInput, ChatBskyConvoGetLog.HandlerOutput>): void;
630
631
  getMessages<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoGetMessages.QueryParams, ChatBskyConvoGetMessages.HandlerInput, ChatBskyConvoGetMessages.HandlerOutput>): void;
632
+ getUnreadCounts<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoGetUnreadCounts.QueryParams, ChatBskyConvoGetUnreadCounts.HandlerInput, ChatBskyConvoGetUnreadCounts.HandlerOutput>): void;
631
633
  leaveConvo<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoLeaveConvo.QueryParams, ChatBskyConvoLeaveConvo.HandlerInput, ChatBskyConvoLeaveConvo.HandlerOutput>): void;
632
634
  listConvoRequests<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoListConvoRequests.QueryParams, ChatBskyConvoListConvoRequests.HandlerInput, ChatBskyConvoListConvoRequests.HandlerOutput>): void;
633
635
  listConvos<A extends Auth = void>(cfg: MethodConfigOrHandler<A, ChatBskyConvoListConvos.QueryParams, ChatBskyConvoListConvos.HandlerInput, ChatBskyConvoListConvos.HandlerOutput>): void;