@revealui/db 0.2.1 → 0.3.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 (256) hide show
  1. package/dist/audit-store.d.ts.map +1 -1
  2. package/dist/audit-store.js.map +1 -1
  3. package/dist/cleanup/cross-db-cleanup.d.ts +82 -0
  4. package/dist/cleanup/cross-db-cleanup.d.ts.map +1 -0
  5. package/dist/cleanup/cross-db-cleanup.js +189 -0
  6. package/dist/cleanup/cross-db-cleanup.js.map +1 -0
  7. package/dist/cleanup/index.d.ts +11 -0
  8. package/dist/cleanup/index.d.ts.map +1 -0
  9. package/dist/cleanup/index.js +11 -0
  10. package/dist/cleanup/index.js.map +1 -0
  11. package/dist/cleanup/rag-site-cleanup.d.ts +58 -0
  12. package/dist/cleanup/rag-site-cleanup.d.ts.map +1 -0
  13. package/dist/cleanup/rag-site-cleanup.js +68 -0
  14. package/dist/cleanup/rag-site-cleanup.js.map +1 -0
  15. package/dist/cleanup/stale-tokens.d.ts +37 -0
  16. package/dist/cleanup/stale-tokens.d.ts.map +1 -0
  17. package/dist/cleanup/stale-tokens.js +113 -0
  18. package/dist/cleanup/stale-tokens.js.map +1 -0
  19. package/dist/client/index.d.ts +14 -1
  20. package/dist/client/index.d.ts.map +1 -1
  21. package/dist/client/index.js +49 -13
  22. package/dist/client/index.js.map +1 -1
  23. package/dist/client/types.d.ts.map +1 -1
  24. package/dist/crypto.js.map +1 -1
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +4 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/log-transport.d.ts.map +1 -1
  30. package/dist/log-transport.js +3 -1
  31. package/dist/log-transport.js.map +1 -1
  32. package/dist/pool.d.ts +2 -1
  33. package/dist/pool.d.ts.map +1 -1
  34. package/dist/pool.js +56 -22
  35. package/dist/pool.js.map +1 -1
  36. package/dist/queries/boards.d.ts +13 -1
  37. package/dist/queries/boards.d.ts.map +1 -1
  38. package/dist/queries/boards.js +5 -2
  39. package/dist/queries/boards.js.map +1 -1
  40. package/dist/queries/code-provenance.d.ts.map +1 -1
  41. package/dist/queries/code-provenance.js.map +1 -1
  42. package/dist/queries/conversations.d.ts +29 -0
  43. package/dist/queries/conversations.d.ts.map +1 -0
  44. package/dist/queries/conversations.js +80 -0
  45. package/dist/queries/conversations.js.map +1 -0
  46. package/dist/queries/media.d.ts +9 -0
  47. package/dist/queries/media.d.ts.map +1 -1
  48. package/dist/queries/media.js +23 -13
  49. package/dist/queries/media.js.map +1 -1
  50. package/dist/queries/orders.d.ts +87 -0
  51. package/dist/queries/orders.d.ts.map +1 -0
  52. package/dist/queries/orders.js +36 -0
  53. package/dist/queries/orders.js.map +1 -0
  54. package/dist/queries/pages.d.ts +10 -0
  55. package/dist/queries/pages.d.ts.map +1 -1
  56. package/dist/queries/pages.js +19 -5
  57. package/dist/queries/pages.js.map +1 -1
  58. package/dist/queries/posts.d.ts +41 -0
  59. package/dist/queries/posts.d.ts.map +1 -1
  60. package/dist/queries/posts.js +38 -5
  61. package/dist/queries/posts.js.map +1 -1
  62. package/dist/queries/products.d.ts +102 -0
  63. package/dist/queries/products.d.ts.map +1 -0
  64. package/dist/queries/products.js +55 -0
  65. package/dist/queries/products.js.map +1 -0
  66. package/dist/queries/sites.d.ts +36 -1
  67. package/dist/queries/sites.d.ts.map +1 -1
  68. package/dist/queries/sites.js +45 -5
  69. package/dist/queries/sites.js.map +1 -1
  70. package/dist/queries/ticket-comments.d.ts +34 -1
  71. package/dist/queries/ticket-comments.d.ts.map +1 -1
  72. package/dist/queries/ticket-comments.js +32 -1
  73. package/dist/queries/ticket-comments.js.map +1 -1
  74. package/dist/queries/ticket-labels.d.ts +10 -0
  75. package/dist/queries/ticket-labels.d.ts.map +1 -1
  76. package/dist/queries/ticket-labels.js +4 -0
  77. package/dist/queries/ticket-labels.js.map +1 -1
  78. package/dist/queries/tickets.d.ts +42 -1
  79. package/dist/queries/tickets.d.ts.map +1 -1
  80. package/dist/queries/tickets.js +28 -7
  81. package/dist/queries/tickets.js.map +1 -1
  82. package/dist/queries/users.d.ts +221 -0
  83. package/dist/queries/users.d.ts.map +1 -0
  84. package/dist/queries/users.js +94 -0
  85. package/dist/queries/users.js.map +1 -0
  86. package/dist/schema/accounts.d.ts +962 -0
  87. package/dist/schema/accounts.d.ts.map +1 -0
  88. package/dist/schema/accounts.js +117 -0
  89. package/dist/schema/accounts.js.map +1 -0
  90. package/dist/schema/agents.d.ts +216 -1
  91. package/dist/schema/agents.d.ts.map +1 -1
  92. package/dist/schema/agents.js +61 -6
  93. package/dist/schema/agents.js.map +1 -1
  94. package/dist/schema/api-keys.d.ts +17 -0
  95. package/dist/schema/api-keys.d.ts.map +1 -1
  96. package/dist/schema/api-keys.js +3 -0
  97. package/dist/schema/api-keys.js.map +1 -1
  98. package/dist/schema/app-logs.d.ts.map +1 -1
  99. package/dist/schema/app-logs.js.map +1 -1
  100. package/dist/schema/audit-log.d.ts.map +1 -1
  101. package/dist/schema/audit-log.js.map +1 -1
  102. package/dist/schema/circuit-breaker.d.ts +139 -0
  103. package/dist/schema/circuit-breaker.d.ts.map +1 -0
  104. package/dist/schema/circuit-breaker.js +28 -0
  105. package/dist/schema/circuit-breaker.js.map +1 -0
  106. package/dist/schema/cms.d.ts +68 -0
  107. package/dist/schema/cms.d.ts.map +1 -1
  108. package/dist/schema/cms.js +18 -4
  109. package/dist/schema/cms.js.map +1 -1
  110. package/dist/schema/code-provenance.d.ts.map +1 -1
  111. package/dist/schema/code-provenance.js.map +1 -1
  112. package/dist/schema/collab-edits.d.ts.map +1 -1
  113. package/dist/schema/collab-edits.js +2 -2
  114. package/dist/schema/collab-edits.js.map +1 -1
  115. package/dist/schema/coordination.d.ts +967 -0
  116. package/dist/schema/coordination.d.ts.map +1 -0
  117. package/dist/schema/coordination.js +109 -0
  118. package/dist/schema/coordination.js.map +1 -0
  119. package/dist/schema/crdt-operations.d.ts.map +1 -1
  120. package/dist/schema/crdt-operations.js.map +1 -1
  121. package/dist/schema/error-events.d.ts.map +1 -1
  122. package/dist/schema/error-events.js.map +1 -1
  123. package/dist/schema/gdpr.d.ts +529 -0
  124. package/dist/schema/gdpr.d.ts.map +1 -0
  125. package/dist/schema/gdpr.js +93 -0
  126. package/dist/schema/gdpr.js.map +1 -0
  127. package/dist/schema/index.d.ts +44 -1
  128. package/dist/schema/index.d.ts.map +1 -1
  129. package/dist/schema/index.js +93 -0
  130. package/dist/schema/index.js.map +1 -1
  131. package/dist/schema/jobs.d.ts +242 -0
  132. package/dist/schema/jobs.d.ts.map +1 -0
  133. package/dist/schema/jobs.js +48 -0
  134. package/dist/schema/jobs.js.map +1 -0
  135. package/dist/schema/licenses.d.ts +68 -0
  136. package/dist/schema/licenses.d.ts.map +1 -1
  137. package/dist/schema/licenses.js +11 -2
  138. package/dist/schema/licenses.js.map +1 -1
  139. package/dist/schema/magic-links.d.ts +136 -0
  140. package/dist/schema/magic-links.d.ts.map +1 -0
  141. package/dist/schema/magic-links.js +32 -0
  142. package/dist/schema/magic-links.js.map +1 -0
  143. package/dist/schema/marketplace.d.ts +496 -0
  144. package/dist/schema/marketplace.d.ts.map +1 -0
  145. package/dist/schema/marketplace.js +114 -0
  146. package/dist/schema/marketplace.js.map +1 -0
  147. package/dist/schema/node-ids.d.ts.map +1 -1
  148. package/dist/schema/node-ids.js.map +1 -1
  149. package/dist/schema/oauth-accounts.d.ts +34 -0
  150. package/dist/schema/oauth-accounts.d.ts.map +1 -1
  151. package/dist/schema/oauth-accounts.js +5 -0
  152. package/dist/schema/oauth-accounts.js.map +1 -1
  153. package/dist/schema/pages.d.ts +34 -0
  154. package/dist/schema/pages.d.ts.map +1 -1
  155. package/dist/schema/pages.js +14 -4
  156. package/dist/schema/pages.js.map +1 -1
  157. package/dist/schema/passkeys.d.ts +208 -0
  158. package/dist/schema/passkeys.d.ts.map +1 -0
  159. package/dist/schema/passkeys.js +48 -0
  160. package/dist/schema/passkeys.js.map +1 -0
  161. package/dist/schema/password-reset-tokens.d.ts.map +1 -1
  162. package/dist/schema/password-reset-tokens.js +5 -2
  163. package/dist/schema/password-reset-tokens.js.map +1 -1
  164. package/dist/schema/products.d.ts +519 -0
  165. package/dist/schema/products.d.ts.map +1 -0
  166. package/dist/schema/products.js +101 -0
  167. package/dist/schema/products.js.map +1 -0
  168. package/dist/schema/rag.d.ts.map +1 -1
  169. package/dist/schema/rag.js +5 -2
  170. package/dist/schema/rag.js.map +1 -1
  171. package/dist/schema/rate-limits.d.ts.map +1 -1
  172. package/dist/schema/rate-limits.js +5 -2
  173. package/dist/schema/rate-limits.js.map +1 -1
  174. package/dist/schema/rest.d.ts +12 -2
  175. package/dist/schema/rest.d.ts.map +1 -1
  176. package/dist/schema/rest.js +12 -2
  177. package/dist/schema/rest.js.map +1 -1
  178. package/dist/schema/revealcoin.d.ts +267 -0
  179. package/dist/schema/revealcoin.d.ts.map +1 -0
  180. package/dist/schema/revealcoin.js +54 -0
  181. package/dist/schema/revealcoin.js.map +1 -0
  182. package/dist/schema/sites.d.ts +34 -0
  183. package/dist/schema/sites.d.ts.map +1 -1
  184. package/dist/schema/sites.js +15 -3
  185. package/dist/schema/sites.js.map +1 -1
  186. package/dist/schema/tenants.d.ts +188 -0
  187. package/dist/schema/tenants.d.ts.map +1 -0
  188. package/dist/schema/tenants.js +14 -0
  189. package/dist/schema/tenants.js.map +1 -0
  190. package/dist/schema/tickets.d.ts.map +1 -1
  191. package/dist/schema/tickets.js +17 -5
  192. package/dist/schema/tickets.js.map +1 -1
  193. package/dist/schema/users.d.ts +174 -0
  194. package/dist/schema/users.d.ts.map +1 -1
  195. package/dist/schema/users.js +31 -3
  196. package/dist/schema/users.js.map +1 -1
  197. package/dist/schema/vector.d.ts +10 -3
  198. package/dist/schema/vector.d.ts.map +1 -1
  199. package/dist/schema/vector.js +11 -4
  200. package/dist/schema/vector.js.map +1 -1
  201. package/dist/schema/waitlist.d.ts.map +1 -1
  202. package/dist/schema/waitlist.js.map +1 -1
  203. package/dist/schema/webhook-events.d.ts.map +1 -1
  204. package/dist/schema/webhook-events.js.map +1 -1
  205. package/dist/schema/yjs-documents.d.ts.map +1 -1
  206. package/dist/schema/yjs-documents.js.map +1 -1
  207. package/dist/scripts/cleanup-expired.d.ts +12 -0
  208. package/dist/scripts/cleanup-expired.d.ts.map +1 -0
  209. package/dist/scripts/cleanup-expired.js +50 -0
  210. package/dist/scripts/cleanup-expired.js.map +1 -0
  211. package/dist/types/database.d.ts +387 -2
  212. package/dist/types/database.d.ts.map +1 -1
  213. package/dist/types/database.js +80 -1
  214. package/dist/types/database.js.map +1 -1
  215. package/dist/types/discover.d.ts +2 -2
  216. package/dist/types/discover.d.ts.map +1 -1
  217. package/dist/types/discover.js +16 -16
  218. package/dist/types/discover.js.map +1 -1
  219. package/dist/types/extract-relationships.d.ts.map +1 -1
  220. package/dist/types/extract-relationships.js.map +1 -1
  221. package/dist/types/generate-contracts.js +1 -1
  222. package/dist/types/generate-contracts.js.map +1 -1
  223. package/dist/types/generate-zod-schemas.js.map +1 -1
  224. package/dist/types/generate.js.map +1 -1
  225. package/dist/types/index.d.ts.map +1 -1
  226. package/dist/types/introspect.d.ts.map +1 -1
  227. package/dist/types/introspect.js +0 -1
  228. package/dist/types/introspect.js.map +1 -1
  229. package/dist/types/stripe-schema.d.ts.map +1 -1
  230. package/dist/types/stripe-schema.js +7 -2
  231. package/dist/types/stripe-schema.js.map +1 -1
  232. package/dist/utils/soft-delete.d.ts +45 -0
  233. package/dist/utils/soft-delete.d.ts.map +1 -0
  234. package/dist/utils/soft-delete.js +45 -0
  235. package/dist/utils/soft-delete.js.map +1 -0
  236. package/dist/validation/cross-db.d.ts +60 -0
  237. package/dist/validation/cross-db.d.ts.map +1 -0
  238. package/dist/validation/cross-db.js +146 -0
  239. package/dist/validation/cross-db.js.map +1 -0
  240. package/package.json +60 -12
  241. package/dist/queries/optimized-queries.d.ts +0 -89
  242. package/dist/queries/optimized-queries.d.ts.map +0 -1
  243. package/dist/queries/optimized-queries.js +0 -371
  244. package/dist/queries/optimized-queries.js.map +0 -1
  245. package/dist/queries/todos.d.ts +0 -37
  246. package/dist/queries/todos.d.ts.map +0 -1
  247. package/dist/queries/todos.js +0 -37
  248. package/dist/queries/todos.js.map +0 -1
  249. package/dist/schema/query.d.ts +0 -11
  250. package/dist/schema/query.d.ts.map +0 -1
  251. package/dist/schema/query.js +0 -11
  252. package/dist/schema/query.js.map +0 -1
  253. package/dist/schema/todos.d.ts +0 -98
  254. package/dist/schema/todos.d.ts.map +0 -1
  255. package/dist/schema/todos.js +0 -12
  256. package/dist/schema/todos.js.map +0 -1
@@ -179,6 +179,74 @@ export declare const licenses: import("drizzle-orm/pg-core").PgTableWithColumns<
179
179
  identity: undefined;
180
180
  generated: undefined;
181
181
  }, {}, {}>;
182
+ perpetual: import("drizzle-orm/pg-core").PgColumn<{
183
+ name: "perpetual";
184
+ tableName: "licenses";
185
+ dataType: "boolean";
186
+ columnType: "PgBoolean";
187
+ data: boolean;
188
+ driverParam: boolean;
189
+ notNull: true;
190
+ hasDefault: true;
191
+ isPrimaryKey: false;
192
+ isAutoincrement: false;
193
+ hasRuntimeDefault: false;
194
+ enumValues: undefined;
195
+ baseColumn: never;
196
+ identity: undefined;
197
+ generated: undefined;
198
+ }, {}, {}>;
199
+ supportExpiresAt: import("drizzle-orm/pg-core").PgColumn<{
200
+ name: "support_expires_at";
201
+ tableName: "licenses";
202
+ dataType: "date";
203
+ columnType: "PgTimestamp";
204
+ data: Date;
205
+ driverParam: string;
206
+ notNull: false;
207
+ hasDefault: false;
208
+ isPrimaryKey: false;
209
+ isAutoincrement: false;
210
+ hasRuntimeDefault: false;
211
+ enumValues: undefined;
212
+ baseColumn: never;
213
+ identity: undefined;
214
+ generated: undefined;
215
+ }, {}, {}>;
216
+ githubUsername: import("drizzle-orm/pg-core").PgColumn<{
217
+ name: "github_username";
218
+ tableName: "licenses";
219
+ dataType: "string";
220
+ columnType: "PgText";
221
+ data: string;
222
+ driverParam: string;
223
+ notNull: false;
224
+ hasDefault: false;
225
+ isPrimaryKey: false;
226
+ isAutoincrement: false;
227
+ hasRuntimeDefault: false;
228
+ enumValues: [string, ...string[]];
229
+ baseColumn: never;
230
+ identity: undefined;
231
+ generated: undefined;
232
+ }, {}, {}>;
233
+ npmUsername: import("drizzle-orm/pg-core").PgColumn<{
234
+ name: "npm_username";
235
+ tableName: "licenses";
236
+ dataType: "string";
237
+ columnType: "PgText";
238
+ data: string;
239
+ driverParam: string;
240
+ notNull: false;
241
+ hasDefault: false;
242
+ isPrimaryKey: false;
243
+ isAutoincrement: false;
244
+ hasRuntimeDefault: false;
245
+ enumValues: [string, ...string[]];
246
+ baseColumn: never;
247
+ identity: undefined;
248
+ generated: undefined;
249
+ }, {}, {}>;
182
250
  };
183
251
  dialect: "pg";
184
252
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"licenses.d.ts","sourceRoot":"","sources":["../../src/schema/licenses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCpB,CAAA;AAED,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAA;AAEtD,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAA"}
1
+ {"version":3,"file":"licenses.d.ts","sourceRoot":"","sources":["../../src/schema/licenses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDpB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AAEvD,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * Generated on Stripe checkout.session.completed and stored here for
6
6
  * retrieval, auditing, and revocation.
7
7
  */
8
- import { index, pgTable, text, timestamp } from 'drizzle-orm/pg-core';
8
+ import { boolean, index, pgTable, text, timestamp, uniqueIndex } from 'drizzle-orm/pg-core';
9
9
  import { users } from './users.js';
10
10
  // =============================================================================
11
11
  // Licenses Table
@@ -31,12 +31,21 @@ export const licenses = pgTable('licenses', {
31
31
  createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
32
32
  /** When the license was last updated */
33
33
  updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
34
- /** When the license expires (null = never) */
34
+ /** When the license expires (null = never for perpetual licenses) */
35
35
  expiresAt: timestamp('expires_at', { withTimezone: true }),
36
+ /** True for one-time perpetual purchases — license never expires */
37
+ perpetual: boolean('perpetual').notNull().default(false),
38
+ /** When annual support contract expires (perpetual only) */
39
+ supportExpiresAt: timestamp('support_expires_at', { withTimezone: true }),
40
+ /** GitHub username for revealui-pro team provisioning (perpetual only) */
41
+ githubUsername: text('github_username'),
42
+ /** npm username for @revealui Pro package access provisioning */
43
+ npmUsername: text('npm_username'),
36
44
  }, (table) => [
37
45
  index('licenses_customer_id_idx').on(table.customerId),
38
46
  index('licenses_user_id_idx').on(table.userId),
39
47
  index('licenses_status_idx').on(table.status),
40
48
  index('licenses_subscription_id_idx').on(table.subscriptionId),
49
+ uniqueIndex('licenses_customer_subscription_unique').on(table.customerId, table.subscriptionId),
41
50
  ]);
42
51
  //# sourceMappingURL=licenses.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../src/schema/licenses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAC7B,UAAU,EACV;IACE,+BAA+B;IAC/B,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,iCAAiC;IACjC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,iCAAiC;IACjC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,sCAAsC;IACtC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAE5B,yDAAyD;IACzD,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAEvC,yBAAyB;IACzB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,qBAAqB;IACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IAElD,mCAAmC;IACnC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IAEjF,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IAEjF,8CAA8C;IAC9C,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CAC3D,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IACtD,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9C,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7C,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;CAC/D,CACF,CAAA"}
1
+ {"version":3,"file":"licenses.js","sourceRoot":"","sources":["../../src/schema/licenses.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAC7B,UAAU,EACV;IACE,+BAA+B;IAC/B,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,iCAAiC;IACjC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,iCAAiC;IACjC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,sCAAsC;IACtC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAE5B,yDAAyD;IACzD,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAEvC,yBAAyB;IACzB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,qBAAqB;IACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IAElD,mCAAmC;IACnC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IAEjF,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IAEjF,qEAAqE;IACrE,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAE1D,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAExD,4DAA4D;IAC5D,gBAAgB,EAAE,SAAS,CAAC,oBAAoB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAEzE,0EAA0E;IAC1E,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAEvC,iEAAiE;IACjE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;CAClC,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC;IACtD,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC9C,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7C,KAAK,CAAC,8BAA8B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IAC9D,WAAW,CAAC,uCAAuC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;CAChG,CACF,CAAC"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Magic Links table
3
+ *
4
+ * Stores single-use, time-limited tokens for passwordless email authentication.
5
+ * Token values are stored as HMAC-SHA256 hashes with a per-token salt
6
+ * for protection against rainbow table attacks on DB breach.
7
+ */
8
+ export declare const magicLinks: import("drizzle-orm/pg-core").PgTableWithColumns<{
9
+ name: "magic_links";
10
+ schema: undefined;
11
+ columns: {
12
+ id: import("drizzle-orm/pg-core").PgColumn<{
13
+ name: "id";
14
+ tableName: "magic_links";
15
+ dataType: "string";
16
+ columnType: "PgText";
17
+ data: string;
18
+ driverParam: string;
19
+ notNull: true;
20
+ hasDefault: false;
21
+ isPrimaryKey: true;
22
+ isAutoincrement: false;
23
+ hasRuntimeDefault: false;
24
+ enumValues: [string, ...string[]];
25
+ baseColumn: never;
26
+ identity: undefined;
27
+ generated: undefined;
28
+ }, {}, {}>;
29
+ userId: import("drizzle-orm/pg-core").PgColumn<{
30
+ name: "user_id";
31
+ tableName: "magic_links";
32
+ dataType: "string";
33
+ columnType: "PgText";
34
+ data: string;
35
+ driverParam: string;
36
+ notNull: true;
37
+ hasDefault: false;
38
+ isPrimaryKey: false;
39
+ isAutoincrement: false;
40
+ hasRuntimeDefault: false;
41
+ enumValues: [string, ...string[]];
42
+ baseColumn: never;
43
+ identity: undefined;
44
+ generated: undefined;
45
+ }, {}, {}>;
46
+ tokenHash: import("drizzle-orm/pg-core").PgColumn<{
47
+ name: "token_hash";
48
+ tableName: "magic_links";
49
+ dataType: "string";
50
+ columnType: "PgText";
51
+ data: string;
52
+ driverParam: string;
53
+ notNull: true;
54
+ hasDefault: false;
55
+ isPrimaryKey: false;
56
+ isAutoincrement: false;
57
+ hasRuntimeDefault: false;
58
+ enumValues: [string, ...string[]];
59
+ baseColumn: never;
60
+ identity: undefined;
61
+ generated: undefined;
62
+ }, {}, {}>;
63
+ tokenSalt: import("drizzle-orm/pg-core").PgColumn<{
64
+ name: "token_salt";
65
+ tableName: "magic_links";
66
+ dataType: "string";
67
+ columnType: "PgText";
68
+ data: string;
69
+ driverParam: string;
70
+ notNull: true;
71
+ hasDefault: false;
72
+ isPrimaryKey: false;
73
+ isAutoincrement: false;
74
+ hasRuntimeDefault: false;
75
+ enumValues: [string, ...string[]];
76
+ baseColumn: never;
77
+ identity: undefined;
78
+ generated: undefined;
79
+ }, {}, {}>;
80
+ expiresAt: import("drizzle-orm/pg-core").PgColumn<{
81
+ name: "expires_at";
82
+ tableName: "magic_links";
83
+ dataType: "date";
84
+ columnType: "PgTimestamp";
85
+ data: Date;
86
+ driverParam: string;
87
+ notNull: true;
88
+ hasDefault: false;
89
+ isPrimaryKey: false;
90
+ isAutoincrement: false;
91
+ hasRuntimeDefault: false;
92
+ enumValues: undefined;
93
+ baseColumn: never;
94
+ identity: undefined;
95
+ generated: undefined;
96
+ }, {}, {}>;
97
+ usedAt: import("drizzle-orm/pg-core").PgColumn<{
98
+ name: "used_at";
99
+ tableName: "magic_links";
100
+ dataType: "date";
101
+ columnType: "PgTimestamp";
102
+ data: Date;
103
+ driverParam: string;
104
+ notNull: false;
105
+ hasDefault: false;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: undefined;
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}, {}>;
114
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
115
+ name: "created_at";
116
+ tableName: "magic_links";
117
+ dataType: "date";
118
+ columnType: "PgTimestamp";
119
+ data: Date;
120
+ driverParam: string;
121
+ notNull: true;
122
+ hasDefault: true;
123
+ isPrimaryKey: false;
124
+ isAutoincrement: false;
125
+ hasRuntimeDefault: false;
126
+ enumValues: undefined;
127
+ baseColumn: never;
128
+ identity: undefined;
129
+ generated: undefined;
130
+ }, {}, {}>;
131
+ };
132
+ dialect: "pg";
133
+ }>;
134
+ export type MagicLink = typeof magicLinks.$inferSelect;
135
+ export type NewMagicLink = typeof magicLinks.$inferInsert;
136
+ //# sourceMappingURL=magic-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-links.d.ts","sourceRoot":"","sources":["../../src/schema/magic-links.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BtB,CAAC;AAMF,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,YAAY,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,OAAO,UAAU,CAAC,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Magic Links table
3
+ *
4
+ * Stores single-use, time-limited tokens for passwordless email authentication.
5
+ * Token values are stored as HMAC-SHA256 hashes with a per-token salt
6
+ * for protection against rainbow table attacks on DB breach.
7
+ */
8
+ import { index, pgTable, text, timestamp, uniqueIndex } from 'drizzle-orm/pg-core';
9
+ import { users } from './users.js';
10
+ // =============================================================================
11
+ // Magic Links Table
12
+ // =============================================================================
13
+ export const magicLinks = pgTable('magic_links', {
14
+ id: text('id').primaryKey(),
15
+ userId: text('user_id')
16
+ .notNull()
17
+ .references(() => users.id, { onDelete: 'cascade' }),
18
+ // HMAC-SHA256 hash of the raw token sent in the email link
19
+ tokenHash: text('token_hash').notNull(),
20
+ // Per-token random salt used in HMAC-SHA256 hashing (16 bytes hex = 32 chars)
21
+ tokenSalt: text('token_salt').notNull(),
22
+ // Expiry and usage tracking
23
+ expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
24
+ usedAt: timestamp('used_at', { withTimezone: true }),
25
+ // Timestamps
26
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
27
+ }, (table) => [
28
+ index('magic_links_user_id_idx').on(table.userId),
29
+ uniqueIndex('magic_links_token_hash_idx').on(table.tokenHash),
30
+ index('magic_links_expires_at_idx').on(table.expiresAt),
31
+ ]);
32
+ //# sourceMappingURL=magic-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-links.js","sourceRoot":"","sources":["../../src/schema/magic-links.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAC/B,aAAa,EACb;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;SACpB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAEtD,2DAA2D;IAC3D,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,8EAA8E;IAC9E,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAEvC,4BAA4B;IAC5B,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACpE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IAEpD,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CAClF,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;IACjD,WAAW,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7D,KAAK,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CACxD,CACF,CAAC"}