@mdguggenbichler/slugbase-core 0.0.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 (381) hide show
  1. package/backend/dist/app-factory.d.ts +17 -0
  2. package/backend/dist/app-factory.d.ts.map +1 -0
  3. package/backend/dist/app-factory.js +106 -0
  4. package/backend/dist/app-factory.js.map +1 -0
  5. package/backend/dist/auth/authorization.d.ts +25 -0
  6. package/backend/dist/auth/authorization.d.ts.map +1 -0
  7. package/backend/dist/auth/authorization.js +100 -0
  8. package/backend/dist/auth/authorization.js.map +1 -0
  9. package/backend/dist/auth/jwt.d.ts +5 -0
  10. package/backend/dist/auth/jwt.d.ts.map +1 -0
  11. package/backend/dist/auth/jwt.js +34 -0
  12. package/backend/dist/auth/jwt.js.map +1 -0
  13. package/backend/dist/auth/oidc.d.ts +4 -0
  14. package/backend/dist/auth/oidc.d.ts.map +1 -0
  15. package/backend/dist/auth/oidc.js +201 -0
  16. package/backend/dist/auth/oidc.js.map +1 -0
  17. package/backend/dist/config/cloud-providers.d.ts +18 -0
  18. package/backend/dist/config/cloud-providers.d.ts.map +1 -0
  19. package/backend/dist/config/cloud-providers.js +60 -0
  20. package/backend/dist/config/cloud-providers.js.map +1 -0
  21. package/backend/dist/config/cookies.d.ts +17 -0
  22. package/backend/dist/config/cookies.d.ts.map +1 -0
  23. package/backend/dist/config/cookies.js +26 -0
  24. package/backend/dist/config/cookies.js.map +1 -0
  25. package/backend/dist/config/mode.d.ts +7 -0
  26. package/backend/dist/config/mode.d.ts.map +1 -0
  27. package/backend/dist/config/mode.js +7 -0
  28. package/backend/dist/config/mode.js.map +1 -0
  29. package/backend/dist/config/swagger.d.ts +2 -0
  30. package/backend/dist/config/swagger.d.ts.map +1 -0
  31. package/backend/dist/config/swagger.js +76 -0
  32. package/backend/dist/config/swagger.js.map +1 -0
  33. package/backend/dist/config.d.ts +29 -0
  34. package/backend/dist/config.d.ts.map +1 -0
  35. package/backend/dist/config.js +41 -0
  36. package/backend/dist/config.js.map +1 -0
  37. package/backend/dist/db/index.d.ts +14 -0
  38. package/backend/dist/db/index.d.ts.map +1 -0
  39. package/backend/dist/db/index.js +114 -0
  40. package/backend/dist/db/index.js.map +1 -0
  41. package/backend/dist/db/migrate-slug-nullable.d.ts +10 -0
  42. package/backend/dist/db/migrate-slug-nullable.d.ts.map +1 -0
  43. package/backend/dist/db/migrate-slug-nullable.js +87 -0
  44. package/backend/dist/db/migrate-slug-nullable.js.map +1 -0
  45. package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts +10 -0
  46. package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts.map +1 -0
  47. package/backend/dist/db/migrations/001_migrate_slug_nullable.js +103 -0
  48. package/backend/dist/db/migrations/001_migrate_slug_nullable.js.map +1 -0
  49. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts +11 -0
  50. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts.map +1 -0
  51. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js +92 -0
  52. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js.map +1 -0
  53. package/backend/dist/db/migrations/003_add_bookmark_features.d.ts +5 -0
  54. package/backend/dist/db/migrations/003_add_bookmark_features.d.ts.map +1 -0
  55. package/backend/dist/db/migrations/003_add_bookmark_features.js +98 -0
  56. package/backend/dist/db/migrations/003_add_bookmark_features.js.map +1 -0
  57. package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts +12 -0
  58. package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts.map +1 -0
  59. package/backend/dist/db/migrations/004_make_slug_globally_unique.js +152 -0
  60. package/backend/dist/db/migrations/004_make_slug_globally_unique.js.map +1 -0
  61. package/backend/dist/db/migrations/005_add_email_verification.d.ts +5 -0
  62. package/backend/dist/db/migrations/005_add_email_verification.d.ts.map +1 -0
  63. package/backend/dist/db/migrations/005_add_email_verification.js +102 -0
  64. package/backend/dist/db/migrations/005_add_email_verification.js.map +1 -0
  65. package/backend/dist/db/migrations/006_refresh_tokens.d.ts +9 -0
  66. package/backend/dist/db/migrations/006_refresh_tokens.d.ts.map +1 -0
  67. package/backend/dist/db/migrations/006_refresh_tokens.js +61 -0
  68. package/backend/dist/db/migrations/006_refresh_tokens.js.map +1 -0
  69. package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts +10 -0
  70. package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts.map +1 -0
  71. package/backend/dist/db/migrations/007_password_reset_token_hash.js +40 -0
  72. package/backend/dist/db/migrations/007_password_reset_token_hash.js.map +1 -0
  73. package/backend/dist/db/migrations/008_slug_preferences.d.ts +8 -0
  74. package/backend/dist/db/migrations/008_slug_preferences.d.ts.map +1 -0
  75. package/backend/dist/db/migrations/008_slug_preferences.js +24 -0
  76. package/backend/dist/db/migrations/008_slug_preferences.js.map +1 -0
  77. package/backend/dist/db/migrations/009_signup_email_verified.d.ts +5 -0
  78. package/backend/dist/db/migrations/009_signup_email_verified.d.ts.map +1 -0
  79. package/backend/dist/db/migrations/009_signup_email_verified.js +79 -0
  80. package/backend/dist/db/migrations/009_signup_email_verified.js.map +1 -0
  81. package/backend/dist/db/migrations/010_organizations.d.ts +5 -0
  82. package/backend/dist/db/migrations/010_organizations.d.ts.map +1 -0
  83. package/backend/dist/db/migrations/010_organizations.js +113 -0
  84. package/backend/dist/db/migrations/010_organizations.js.map +1 -0
  85. package/backend/dist/db/migrations/011_org_scoped_teams.d.ts +11 -0
  86. package/backend/dist/db/migrations/011_org_scoped_teams.d.ts.map +1 -0
  87. package/backend/dist/db/migrations/011_org_scoped_teams.js +59 -0
  88. package/backend/dist/db/migrations/011_org_scoped_teams.js.map +1 -0
  89. package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts +10 -0
  90. package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts.map +1 -0
  91. package/backend/dist/db/migrations/012_org_invitations_token_hash.js +40 -0
  92. package/backend/dist/db/migrations/012_org_invitations_token_hash.js.map +1 -0
  93. package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts +10 -0
  94. package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts.map +1 -0
  95. package/backend/dist/db/migrations/013_signup_verification_token_hash.js +39 -0
  96. package/backend/dist/db/migrations/013_signup_verification_token_hash.js.map +1 -0
  97. package/backend/dist/db/migrations/014_stats_indexes.d.ts +8 -0
  98. package/backend/dist/db/migrations/014_stats_indexes.d.ts.map +1 -0
  99. package/backend/dist/db/migrations/014_stats_indexes.js +19 -0
  100. package/backend/dist/db/migrations/014_stats_indexes.js.map +1 -0
  101. package/backend/dist/db/migrations/015_api_tokens.d.ts +9 -0
  102. package/backend/dist/db/migrations/015_api_tokens.d.ts.map +1 -0
  103. package/backend/dist/db/migrations/015_api_tokens.js +48 -0
  104. package/backend/dist/db/migrations/015_api_tokens.js.map +1 -0
  105. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts +9 -0
  106. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts.map +1 -0
  107. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js +50 -0
  108. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js.map +1 -0
  109. package/backend/dist/db/migrations/017_ai_suggestions.d.ts +11 -0
  110. package/backend/dist/db/migrations/017_ai_suggestions.d.ts.map +1 -0
  111. package/backend/dist/db/migrations/017_ai_suggestions.js +78 -0
  112. package/backend/dist/db/migrations/017_ai_suggestions.js.map +1 -0
  113. package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts +10 -0
  114. package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts.map +1 -0
  115. package/backend/dist/db/migrations/018_ai_cache_output_language.js +89 -0
  116. package/backend/dist/db/migrations/018_ai_cache_output_language.js.map +1 -0
  117. package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts +10 -0
  118. package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts.map +1 -0
  119. package/backend/dist/db/migrations/019_ai_suggestion_usage.js +47 -0
  120. package/backend/dist/db/migrations/019_ai_suggestion_usage.js.map +1 -0
  121. package/backend/dist/db/migrations/020_tenant_scope.d.ts +5 -0
  122. package/backend/dist/db/migrations/020_tenant_scope.d.ts.map +1 -0
  123. package/backend/dist/db/migrations/020_tenant_scope.js +105 -0
  124. package/backend/dist/db/migrations/020_tenant_scope.js.map +1 -0
  125. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts +5 -0
  126. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts.map +1 -0
  127. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js +113 -0
  128. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js.map +1 -0
  129. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts +11 -0
  130. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts.map +1 -0
  131. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js +59 -0
  132. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js.map +1 -0
  133. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts +10 -0
  134. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts.map +1 -0
  135. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js +40 -0
  136. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js.map +1 -0
  137. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts +9 -0
  138. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts.map +1 -0
  139. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js +50 -0
  140. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js.map +1 -0
  141. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts +11 -0
  142. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts.map +1 -0
  143. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js +78 -0
  144. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js.map +1 -0
  145. package/backend/dist/db/migrations/index.d.ts +22 -0
  146. package/backend/dist/db/migrations/index.d.ts.map +1 -0
  147. package/backend/dist/db/migrations/index.js +194 -0
  148. package/backend/dist/db/migrations/index.js.map +1 -0
  149. package/backend/dist/db/pool.d.ts +13 -0
  150. package/backend/dist/db/pool.d.ts.map +1 -0
  151. package/backend/dist/db/pool.js +41 -0
  152. package/backend/dist/db/pool.js.map +1 -0
  153. package/backend/dist/db/seed-data.d.ts +66 -0
  154. package/backend/dist/db/seed-data.d.ts.map +1 -0
  155. package/backend/dist/db/seed-data.js +394 -0
  156. package/backend/dist/db/seed-data.js.map +1 -0
  157. package/backend/dist/db/seed.d.ts +19 -0
  158. package/backend/dist/db/seed.d.ts.map +1 -0
  159. package/backend/dist/db/seed.js +406 -0
  160. package/backend/dist/db/seed.js.map +1 -0
  161. package/backend/dist/index.d.ts +3 -0
  162. package/backend/dist/index.d.ts.map +1 -0
  163. package/backend/dist/index.js +64 -0
  164. package/backend/dist/index.js.map +1 -0
  165. package/backend/dist/instrument.d.ts +2 -0
  166. package/backend/dist/instrument.d.ts.map +1 -0
  167. package/backend/dist/instrument.js +16 -0
  168. package/backend/dist/instrument.js.map +1 -0
  169. package/backend/dist/load-env.d.ts +2 -0
  170. package/backend/dist/load-env.d.ts.map +1 -0
  171. package/backend/dist/load-env.js +33 -0
  172. package/backend/dist/load-env.js.map +1 -0
  173. package/backend/dist/middleware/auth.d.ts +23 -0
  174. package/backend/dist/middleware/auth.d.ts.map +1 -0
  175. package/backend/dist/middleware/auth.js +69 -0
  176. package/backend/dist/middleware/auth.js.map +1 -0
  177. package/backend/dist/middleware/error-handler.d.ts +11 -0
  178. package/backend/dist/middleware/error-handler.d.ts.map +1 -0
  179. package/backend/dist/middleware/error-handler.js +40 -0
  180. package/backend/dist/middleware/error-handler.js.map +1 -0
  181. package/backend/dist/middleware/security.d.ts +26 -0
  182. package/backend/dist/middleware/security.d.ts.map +1 -0
  183. package/backend/dist/middleware/security.js +162 -0
  184. package/backend/dist/middleware/security.js.map +1 -0
  185. package/backend/dist/middleware/stats-auth.d.ts +7 -0
  186. package/backend/dist/middleware/stats-auth.d.ts.map +1 -0
  187. package/backend/dist/middleware/stats-auth.js +20 -0
  188. package/backend/dist/middleware/stats-auth.js.map +1 -0
  189. package/backend/dist/middleware/tenant.d.ts +3 -0
  190. package/backend/dist/middleware/tenant.d.ts.map +1 -0
  191. package/backend/dist/middleware/tenant.js +13 -0
  192. package/backend/dist/middleware/tenant.js.map +1 -0
  193. package/backend/dist/register-routes.d.ts +12 -0
  194. package/backend/dist/register-routes.d.ts.map +1 -0
  195. package/backend/dist/register-routes.js +59 -0
  196. package/backend/dist/register-routes.js.map +1 -0
  197. package/backend/dist/routes/admin/demo-reset.d.ts +8 -0
  198. package/backend/dist/routes/admin/demo-reset.d.ts.map +1 -0
  199. package/backend/dist/routes/admin/demo-reset.js +66 -0
  200. package/backend/dist/routes/admin/demo-reset.js.map +1 -0
  201. package/backend/dist/routes/admin/settings.d.ts +3 -0
  202. package/backend/dist/routes/admin/settings.d.ts.map +1 -0
  203. package/backend/dist/routes/admin/settings.js +452 -0
  204. package/backend/dist/routes/admin/settings.js.map +1 -0
  205. package/backend/dist/routes/admin/stats.d.ts +7 -0
  206. package/backend/dist/routes/admin/stats.d.ts.map +1 -0
  207. package/backend/dist/routes/admin/stats.js +66 -0
  208. package/backend/dist/routes/admin/stats.js.map +1 -0
  209. package/backend/dist/routes/admin/teams.d.ts +3 -0
  210. package/backend/dist/routes/admin/teams.d.ts.map +1 -0
  211. package/backend/dist/routes/admin/teams.js +509 -0
  212. package/backend/dist/routes/admin/teams.js.map +1 -0
  213. package/backend/dist/routes/admin/users.d.ts +3 -0
  214. package/backend/dist/routes/admin/users.d.ts.map +1 -0
  215. package/backend/dist/routes/admin/users.js +525 -0
  216. package/backend/dist/routes/admin/users.js.map +1 -0
  217. package/backend/dist/routes/auth.d.ts +3 -0
  218. package/backend/dist/routes/auth.d.ts.map +1 -0
  219. package/backend/dist/routes/auth.js +992 -0
  220. package/backend/dist/routes/auth.js.map +1 -0
  221. package/backend/dist/routes/billing.d.ts +8 -0
  222. package/backend/dist/routes/billing.d.ts.map +1 -0
  223. package/backend/dist/routes/billing.js +481 -0
  224. package/backend/dist/routes/billing.js.map +1 -0
  225. package/backend/dist/routes/bookmarks.d.ts +3 -0
  226. package/backend/dist/routes/bookmarks.d.ts.map +1 -0
  227. package/backend/dist/routes/bookmarks.js +1593 -0
  228. package/backend/dist/routes/bookmarks.js.map +1 -0
  229. package/backend/dist/routes/config.d.ts +7 -0
  230. package/backend/dist/routes/config.d.ts.map +1 -0
  231. package/backend/dist/routes/config.js +52 -0
  232. package/backend/dist/routes/config.js.map +1 -0
  233. package/backend/dist/routes/contact.d.ts +9 -0
  234. package/backend/dist/routes/contact.d.ts.map +1 -0
  235. package/backend/dist/routes/contact.js +99 -0
  236. package/backend/dist/routes/contact.js.map +1 -0
  237. package/backend/dist/routes/csrf.d.ts +3 -0
  238. package/backend/dist/routes/csrf.d.ts.map +1 -0
  239. package/backend/dist/routes/csrf.js +39 -0
  240. package/backend/dist/routes/csrf.js.map +1 -0
  241. package/backend/dist/routes/dashboard.d.ts +3 -0
  242. package/backend/dist/routes/dashboard.d.ts.map +1 -0
  243. package/backend/dist/routes/dashboard.js +212 -0
  244. package/backend/dist/routes/dashboard.js.map +1 -0
  245. package/backend/dist/routes/email-verification.d.ts +3 -0
  246. package/backend/dist/routes/email-verification.d.ts.map +1 -0
  247. package/backend/dist/routes/email-verification.js +124 -0
  248. package/backend/dist/routes/email-verification.js.map +1 -0
  249. package/backend/dist/routes/folders.d.ts +3 -0
  250. package/backend/dist/routes/folders.d.ts.map +1 -0
  251. package/backend/dist/routes/folders.js +524 -0
  252. package/backend/dist/routes/folders.js.map +1 -0
  253. package/backend/dist/routes/go-helpers.d.ts +18 -0
  254. package/backend/dist/routes/go-helpers.d.ts.map +1 -0
  255. package/backend/dist/routes/go-helpers.js +64 -0
  256. package/backend/dist/routes/go-helpers.js.map +1 -0
  257. package/backend/dist/routes/go.d.ts +23 -0
  258. package/backend/dist/routes/go.d.ts.map +1 -0
  259. package/backend/dist/routes/go.js +361 -0
  260. package/backend/dist/routes/go.js.map +1 -0
  261. package/backend/dist/routes/health.d.ts +6 -0
  262. package/backend/dist/routes/health.d.ts.map +1 -0
  263. package/backend/dist/routes/health.js +79 -0
  264. package/backend/dist/routes/health.js.map +1 -0
  265. package/backend/dist/routes/invitations.d.ts +3 -0
  266. package/backend/dist/routes/invitations.d.ts.map +1 -0
  267. package/backend/dist/routes/invitations.js +172 -0
  268. package/backend/dist/routes/invitations.js.map +1 -0
  269. package/backend/dist/routes/oidc-providers.d.ts +3 -0
  270. package/backend/dist/routes/oidc-providers.d.ts.map +1 -0
  271. package/backend/dist/routes/oidc-providers.js +495 -0
  272. package/backend/dist/routes/oidc-providers.js.map +1 -0
  273. package/backend/dist/routes/organizations.d.ts +3 -0
  274. package/backend/dist/routes/organizations.d.ts.map +1 -0
  275. package/backend/dist/routes/organizations.js +538 -0
  276. package/backend/dist/routes/organizations.js.map +1 -0
  277. package/backend/dist/routes/password-reset.d.ts +3 -0
  278. package/backend/dist/routes/password-reset.d.ts.map +1 -0
  279. package/backend/dist/routes/password-reset.js +212 -0
  280. package/backend/dist/routes/password-reset.js.map +1 -0
  281. package/backend/dist/routes/redirect.d.ts +3 -0
  282. package/backend/dist/routes/redirect.d.ts.map +1 -0
  283. package/backend/dist/routes/redirect.js +124 -0
  284. package/backend/dist/routes/redirect.js.map +1 -0
  285. package/backend/dist/routes/tags.d.ts +3 -0
  286. package/backend/dist/routes/tags.d.ts.map +1 -0
  287. package/backend/dist/routes/tags.js +302 -0
  288. package/backend/dist/routes/tags.js.map +1 -0
  289. package/backend/dist/routes/teams.d.ts +3 -0
  290. package/backend/dist/routes/teams.d.ts.map +1 -0
  291. package/backend/dist/routes/teams.js +60 -0
  292. package/backend/dist/routes/teams.js.map +1 -0
  293. package/backend/dist/routes/tokens.d.ts +3 -0
  294. package/backend/dist/routes/tokens.d.ts.map +1 -0
  295. package/backend/dist/routes/tokens.js +157 -0
  296. package/backend/dist/routes/tokens.js.map +1 -0
  297. package/backend/dist/routes/users.d.ts +3 -0
  298. package/backend/dist/routes/users.d.ts.map +1 -0
  299. package/backend/dist/routes/users.js +199 -0
  300. package/backend/dist/routes/users.js.map +1 -0
  301. package/backend/dist/services/ai-suggestions.d.ts +29 -0
  302. package/backend/dist/services/ai-suggestions.d.ts.map +1 -0
  303. package/backend/dist/services/ai-suggestions.js +163 -0
  304. package/backend/dist/services/ai-suggestions.js.map +1 -0
  305. package/backend/dist/services/api-tokens.d.ts +66 -0
  306. package/backend/dist/services/api-tokens.d.ts.map +1 -0
  307. package/backend/dist/services/api-tokens.js +129 -0
  308. package/backend/dist/services/api-tokens.js.map +1 -0
  309. package/backend/dist/services/fetch-page-metadata.d.ts +15 -0
  310. package/backend/dist/services/fetch-page-metadata.d.ts.map +1 -0
  311. package/backend/dist/services/fetch-page-metadata.js +205 -0
  312. package/backend/dist/services/fetch-page-metadata.js.map +1 -0
  313. package/backend/dist/services/stats.d.ts +73 -0
  314. package/backend/dist/services/stats.d.ts.map +1 -0
  315. package/backend/dist/services/stats.js +145 -0
  316. package/backend/dist/services/stats.js.map +1 -0
  317. package/backend/dist/types/oidc-provider.d.ts +17 -0
  318. package/backend/dist/types/oidc-provider.d.ts.map +1 -0
  319. package/backend/dist/types/oidc-provider.js +2 -0
  320. package/backend/dist/types/oidc-provider.js.map +1 -0
  321. package/backend/dist/types.d.ts +86 -0
  322. package/backend/dist/types.d.ts.map +1 -0
  323. package/backend/dist/types.js +2 -0
  324. package/backend/dist/types.js.map +1 -0
  325. package/backend/dist/utils/ai-feature.d.ts +23 -0
  326. package/backend/dist/utils/ai-feature.d.ts.map +1 -0
  327. package/backend/dist/utils/ai-feature.js +62 -0
  328. package/backend/dist/utils/ai-feature.js.map +1 -0
  329. package/backend/dist/utils/email.d.ts +40 -0
  330. package/backend/dist/utils/email.d.ts.map +1 -0
  331. package/backend/dist/utils/email.js +456 -0
  332. package/backend/dist/utils/email.js.map +1 -0
  333. package/backend/dist/utils/encryption.d.ts +18 -0
  334. package/backend/dist/utils/encryption.d.ts.map +1 -0
  335. package/backend/dist/utils/encryption.js +95 -0
  336. package/backend/dist/utils/encryption.js.map +1 -0
  337. package/backend/dist/utils/env-validation.d.ts +6 -0
  338. package/backend/dist/utils/env-validation.d.ts.map +1 -0
  339. package/backend/dist/utils/env-validation.js +51 -0
  340. package/backend/dist/utils/env-validation.js.map +1 -0
  341. package/backend/dist/utils/jwt.d.ts +20 -0
  342. package/backend/dist/utils/jwt.d.ts.map +1 -0
  343. package/backend/dist/utils/jwt.js +48 -0
  344. package/backend/dist/utils/jwt.js.map +1 -0
  345. package/backend/dist/utils/org-cleanup.d.ts +6 -0
  346. package/backend/dist/utils/org-cleanup.d.ts.map +1 -0
  347. package/backend/dist/utils/org-cleanup.js +37 -0
  348. package/backend/dist/utils/org-cleanup.js.map +1 -0
  349. package/backend/dist/utils/organizations.d.ts +12 -0
  350. package/backend/dist/utils/organizations.d.ts.map +1 -0
  351. package/backend/dist/utils/organizations.js +24 -0
  352. package/backend/dist/utils/organizations.js.map +1 -0
  353. package/backend/dist/utils/plan-errors.d.ts +18 -0
  354. package/backend/dist/utils/plan-errors.d.ts.map +1 -0
  355. package/backend/dist/utils/plan-errors.js +21 -0
  356. package/backend/dist/utils/plan-errors.js.map +1 -0
  357. package/backend/dist/utils/refresh-token.d.ts +31 -0
  358. package/backend/dist/utils/refresh-token.d.ts.map +1 -0
  359. package/backend/dist/utils/refresh-token.js +63 -0
  360. package/backend/dist/utils/refresh-token.js.map +1 -0
  361. package/backend/dist/utils/session-store.d.ts +46 -0
  362. package/backend/dist/utils/session-store.d.ts.map +1 -0
  363. package/backend/dist/utils/session-store.js +222 -0
  364. package/backend/dist/utils/session-store.js.map +1 -0
  365. package/backend/dist/utils/tenant.d.ts +5 -0
  366. package/backend/dist/utils/tenant.d.ts.map +1 -0
  367. package/backend/dist/utils/tenant.js +12 -0
  368. package/backend/dist/utils/tenant.js.map +1 -0
  369. package/backend/dist/utils/user-key.d.ts +24 -0
  370. package/backend/dist/utils/user-key.d.ts.map +1 -0
  371. package/backend/dist/utils/user-key.js +116 -0
  372. package/backend/dist/utils/user-key.js.map +1 -0
  373. package/backend/dist/utils/validation.d.ts +91 -0
  374. package/backend/dist/utils/validation.d.ts.map +1 -0
  375. package/backend/dist/utils/validation.js +337 -0
  376. package/backend/dist/utils/validation.js.map +1 -0
  377. package/backend/index.js +15 -0
  378. package/frontend/index.js +5 -0
  379. package/frontend/index.tsx +7 -0
  380. package/package.json +16 -0
  381. package/types/index.js +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"007_password_reset_token_hash.js","sourceRoot":"","sources":["../../../src/db/migrations/007_password_reset_token_hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,+BAA+B,CAAC;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,yDAAyD,CAAC;AAEvF,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;SAAM,CAAC;QACN,0BAA0B;QAC1B,MAAM,OAAO,CAAC;;KAEb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,2DAA2D,EAAE,EAAE,CAAC,CAAC;IAC/E,sEAAsE;IACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAChD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,oEAAoE,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Migration 008: Add slug_preferences table for /go remembered choices
3
+ */
4
+ export declare const migrationId = "008_slug_preferences";
5
+ export declare const migrationName = "Add slug_preferences table for /go remembered choices";
6
+ export declare function up(): Promise<void>;
7
+ export declare function down(): Promise<void>;
8
+ //# sourceMappingURL=008_slug_preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"008_slug_preferences.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/008_slug_preferences.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,aAAa,0DAA0D,CAAC;AAErF,wBAAsB,EAAE,kBAkBvB;AAED,wBAAsB,IAAI,kBAGzB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Migration 008: Add slug_preferences table for /go remembered choices
3
+ */
4
+ import { execute } from '../index.js';
5
+ export const migrationId = '008_slug_preferences';
6
+ export const migrationName = 'Add slug_preferences table for /go remembered choices';
7
+ export async function up() {
8
+ await execute(`CREATE TABLE IF NOT EXISTS slug_preferences (
9
+ user_id VARCHAR(255) NOT NULL,
10
+ slug VARCHAR(255) NOT NULL,
11
+ bookmark_id VARCHAR(255) NOT NULL,
12
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
13
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
14
+ PRIMARY KEY (user_id, slug),
15
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
16
+ FOREIGN KEY (bookmark_id) REFERENCES bookmarks(id) ON DELETE CASCADE
17
+ )`, []);
18
+ await execute('CREATE INDEX IF NOT EXISTS idx_slug_preferences_user_slug ON slug_preferences(user_id, slug)', []);
19
+ }
20
+ export async function down() {
21
+ await execute('DROP INDEX IF EXISTS idx_slug_preferences_user_slug', []);
22
+ await execute('DROP TABLE IF EXISTS slug_preferences', []);
23
+ }
24
+ //# sourceMappingURL=008_slug_preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"008_slug_preferences.js","sourceRoot":"","sources":["../../../src/db/migrations/008_slug_preferences.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,uDAAuD,CAAC;AAErF,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,CACX;;;;;;;;;MASE,EACF,EAAE,CACH,CAAC;IACF,MAAM,OAAO,CACX,8FAA8F,EAC9F,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,OAAO,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const migrationId = "009";
2
+ export declare const migrationName = "Signup email verified and verification tokens";
3
+ export declare function up(): Promise<void>;
4
+ export declare function down(): Promise<void>;
5
+ //# sourceMappingURL=009_signup_email_verified.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"009_signup_email_verified.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/009_signup_email_verified.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,kDAAkD,CAAC;AAE7E,wBAAsB,EAAE,kBA+DvB;AAED,wBAAsB,IAAI,kBAazB"}
@@ -0,0 +1,79 @@
1
+ import { execute, query } from '../index.js';
2
+ export const migrationId = '009';
3
+ export const migrationName = 'Signup email verified and verification tokens';
4
+ export async function up() {
5
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
6
+ if (DB_TYPE === 'postgresql') {
7
+ await execute(`
8
+ ALTER TABLE users
9
+ ADD COLUMN IF NOT EXISTS email_verified BOOLEAN DEFAULT TRUE
10
+ `, []);
11
+ await execute(`
12
+ CREATE TABLE IF NOT EXISTS signup_verification_tokens (
13
+ id VARCHAR(255) PRIMARY KEY,
14
+ user_id VARCHAR(255) NOT NULL,
15
+ token VARCHAR(255) UNIQUE NOT NULL,
16
+ expires_at TIMESTAMP NOT NULL,
17
+ used BOOLEAN DEFAULT FALSE,
18
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
19
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
20
+ )
21
+ `, []);
22
+ await execute(`
23
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_token
24
+ ON signup_verification_tokens(token)
25
+ `, []);
26
+ await execute(`
27
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_expires
28
+ ON signup_verification_tokens(expires_at)
29
+ `, []);
30
+ }
31
+ else {
32
+ const tableInfo = await query('PRAGMA table_info(users)', []);
33
+ const hasEmailVerified = tableInfo.some((col) => col.name === 'email_verified');
34
+ if (!hasEmailVerified) {
35
+ try {
36
+ await execute(`ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 1`, []);
37
+ }
38
+ catch (error) {
39
+ if (!error.message?.includes('duplicate column name')) {
40
+ throw error;
41
+ }
42
+ }
43
+ }
44
+ await execute(`
45
+ CREATE TABLE IF NOT EXISTS signup_verification_tokens (
46
+ id TEXT PRIMARY KEY,
47
+ user_id TEXT NOT NULL,
48
+ token TEXT UNIQUE NOT NULL,
49
+ expires_at TEXT NOT NULL,
50
+ used INTEGER DEFAULT 0,
51
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
52
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
53
+ )
54
+ `, []);
55
+ await execute(`
56
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_token
57
+ ON signup_verification_tokens(token)
58
+ `, []);
59
+ await execute(`
60
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_expires
61
+ ON signup_verification_tokens(expires_at)
62
+ `, []);
63
+ }
64
+ }
65
+ export async function down() {
66
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
67
+ if (DB_TYPE === 'postgresql') {
68
+ await execute(`DROP INDEX IF EXISTS idx_signup_verification_tokens_expires`, []);
69
+ await execute(`DROP INDEX IF EXISTS idx_signup_verification_tokens_token`, []);
70
+ await execute(`DROP TABLE IF EXISTS signup_verification_tokens`, []);
71
+ await execute(`ALTER TABLE users DROP COLUMN IF EXISTS email_verified`, []);
72
+ }
73
+ else {
74
+ await execute(`DROP INDEX IF EXISTS idx_signup_verification_tokens_expires`, []);
75
+ await execute(`DROP INDEX IF EXISTS idx_signup_verification_tokens_token`, []);
76
+ await execute(`DROP TABLE IF EXISTS signup_verification_tokens`, []);
77
+ }
78
+ }
79
+ //# sourceMappingURL=009_signup_email_verified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"009_signup_email_verified.js","sourceRoot":"","sources":["../../../src/db/migrations/009_signup_email_verified.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,+CAA+C,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAI,SAAmB,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAChG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,+DAA+D,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;oBACtD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,6DAA6D,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,OAAO,CAAC,2DAA2D,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,OAAO,CAAC,wDAAwD,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,6DAA6D,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,OAAO,CAAC,2DAA2D,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const migrationId = "010";
2
+ export declare const migrationName = "Organizations for Cloud billing";
3
+ export declare function up(): Promise<void>;
4
+ export declare function down(): Promise<void>;
5
+ //# sourceMappingURL=010_organizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"010_organizations.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/010_organizations.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAE/D,wBAAsB,EAAE,kBA4FvB;AAED,wBAAsB,IAAI,kBAoBzB"}
@@ -0,0 +1,113 @@
1
+ import { execute } from '../index.js';
2
+ // legacy cloud migration; no longer registered in selfhost-core
3
+ export const migrationId = '010';
4
+ export const migrationName = 'Organizations for Cloud billing';
5
+ export async function up() {
6
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
7
+ if (DB_TYPE === 'postgresql') {
8
+ await execute(`
9
+ CREATE TABLE IF NOT EXISTS organizations (
10
+ id VARCHAR(255) PRIMARY KEY,
11
+ name VARCHAR(255) NOT NULL,
12
+ plan VARCHAR(50) DEFAULT 'free',
13
+ stripe_customer_id VARCHAR(255),
14
+ stripe_subscription_id VARCHAR(255),
15
+ included_seats INTEGER DEFAULT 5,
16
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
17
+ )
18
+ `, []);
19
+ await execute(`
20
+ CREATE TABLE IF NOT EXISTS org_members (
21
+ user_id VARCHAR(255) NOT NULL,
22
+ org_id VARCHAR(255) NOT NULL,
23
+ role VARCHAR(50) DEFAULT 'member',
24
+ joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
25
+ PRIMARY KEY (user_id, org_id),
26
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
27
+ FOREIGN KEY (org_id) REFERENCES organizations(id) ON DELETE CASCADE
28
+ )
29
+ `, []);
30
+ await execute(`
31
+ CREATE TABLE IF NOT EXISTS org_invitations (
32
+ id VARCHAR(255) PRIMARY KEY,
33
+ org_id VARCHAR(255) NOT NULL,
34
+ email VARCHAR(255) NOT NULL,
35
+ invited_by VARCHAR(255) NOT NULL,
36
+ token VARCHAR(255) UNIQUE NOT NULL,
37
+ status VARCHAR(50) DEFAULT 'pending',
38
+ expires_at TIMESTAMP NOT NULL,
39
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
40
+ FOREIGN KEY (org_id) REFERENCES organizations(id) ON DELETE CASCADE,
41
+ FOREIGN KEY (invited_by) REFERENCES users(id) ON DELETE CASCADE
42
+ )
43
+ `, []);
44
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_members_org ON org_members(org_id)`, []);
45
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_members_user ON org_members(user_id)`, []);
46
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_invitations_token ON org_invitations(token)`, []);
47
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_invitations_org ON org_invitations(org_id)`, []);
48
+ }
49
+ else {
50
+ await execute(`
51
+ CREATE TABLE IF NOT EXISTS organizations (
52
+ id TEXT PRIMARY KEY,
53
+ name TEXT NOT NULL,
54
+ plan TEXT DEFAULT 'free',
55
+ stripe_customer_id TEXT,
56
+ stripe_subscription_id TEXT,
57
+ included_seats INTEGER DEFAULT 5,
58
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP
59
+ )
60
+ `, []);
61
+ await execute(`
62
+ CREATE TABLE IF NOT EXISTS org_members (
63
+ user_id TEXT NOT NULL,
64
+ org_id TEXT NOT NULL,
65
+ role TEXT DEFAULT 'member',
66
+ joined_at TEXT DEFAULT CURRENT_TIMESTAMP,
67
+ PRIMARY KEY (user_id, org_id),
68
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
69
+ FOREIGN KEY (org_id) REFERENCES organizations(id) ON DELETE CASCADE
70
+ )
71
+ `, []);
72
+ await execute(`
73
+ CREATE TABLE IF NOT EXISTS org_invitations (
74
+ id TEXT PRIMARY KEY,
75
+ org_id TEXT NOT NULL,
76
+ email TEXT NOT NULL,
77
+ invited_by TEXT NOT NULL,
78
+ token TEXT UNIQUE NOT NULL,
79
+ status TEXT DEFAULT 'pending',
80
+ expires_at TEXT NOT NULL,
81
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
82
+ FOREIGN KEY (org_id) REFERENCES organizations(id) ON DELETE CASCADE,
83
+ FOREIGN KEY (invited_by) REFERENCES users(id) ON DELETE CASCADE
84
+ )
85
+ `, []);
86
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_members_org ON org_members(org_id)`, []);
87
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_members_user ON org_members(user_id)`, []);
88
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_invitations_token ON org_invitations(token)`, []);
89
+ await execute(`CREATE INDEX IF NOT EXISTS idx_org_invitations_org ON org_invitations(org_id)`, []);
90
+ }
91
+ }
92
+ export async function down() {
93
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
94
+ if (DB_TYPE === 'postgresql') {
95
+ await execute(`DROP INDEX IF EXISTS idx_org_invitations_org`, []);
96
+ await execute(`DROP INDEX IF EXISTS idx_org_invitations_token`, []);
97
+ await execute(`DROP INDEX IF EXISTS idx_org_members_user`, []);
98
+ await execute(`DROP INDEX IF EXISTS idx_org_members_org`, []);
99
+ await execute(`DROP TABLE IF EXISTS org_invitations`, []);
100
+ await execute(`DROP TABLE IF EXISTS org_members`, []);
101
+ await execute(`DROP TABLE IF EXISTS organizations`, []);
102
+ }
103
+ else {
104
+ await execute(`DROP INDEX IF EXISTS idx_org_invitations_org`, []);
105
+ await execute(`DROP INDEX IF EXISTS idx_org_invitations_token`, []);
106
+ await execute(`DROP INDEX IF EXISTS idx_org_members_user`, []);
107
+ await execute(`DROP INDEX IF EXISTS idx_org_members_org`, []);
108
+ await execute(`DROP TABLE IF EXISTS org_invitations`, []);
109
+ await execute(`DROP TABLE IF EXISTS org_members`, []);
110
+ await execute(`DROP TABLE IF EXISTS organizations`, []);
111
+ }
112
+ }
113
+ //# sourceMappingURL=010_organizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"010_organizations.js","sourceRoot":"","sources":["../../../src/db/migrations/010_organizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;;;;KAab,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC,uEAAuE,EAAE,EAAE,CAAC,CAAC;QAC3F,MAAM,OAAO,CAAC,yEAAyE,EAAE,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,CAAC,+EAA+E,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;KAUb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;;;;KAab,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC,uEAAuE,EAAE,EAAE,CAAC,CAAC;QAC3F,MAAM,OAAO,CAAC,yEAAyE,EAAE,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,CAAC,+EAA+E,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC,8CAA8C,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Migration 011: Org-scoped teams and current org context (Cloud mode)
3
+ *
4
+ * Adds org_id to teams (nullable for Selfhosted) and current_org_id to users.
5
+ * Backfills existing teams to first org when orgs exist.
6
+ */
7
+ export declare const migrationId = "011";
8
+ export declare const migrationName = "Org-scoped teams and current org context";
9
+ export declare function up(): Promise<void>;
10
+ export declare function down(): Promise<void>;
11
+ //# sourceMappingURL=011_org_scoped_teams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"011_org_scoped_teams.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/011_org_scoped_teams.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,6CAA6C,CAAC;AAExE,wBAAsB,EAAE,kBAgCvB;AAED,wBAAsB,IAAI,kBAWzB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Migration 011: Org-scoped teams and current org context (Cloud mode)
3
+ *
4
+ * Adds org_id to teams (nullable for Selfhosted) and current_org_id to users.
5
+ * Backfills existing teams to first org when orgs exist.
6
+ */
7
+ import { execute, queryOne } from '../index.js';
8
+ // legacy cloud migration; no longer registered in selfhost-core
9
+ export const migrationId = '011';
10
+ export const migrationName = 'Org-scoped teams and current org context';
11
+ export async function up() {
12
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
13
+ if (DB_TYPE === 'postgresql') {
14
+ await execute('ALTER TABLE teams ADD COLUMN IF NOT EXISTS org_id VARCHAR(255)', []);
15
+ await execute('ALTER TABLE users ADD COLUMN IF NOT EXISTS current_org_id VARCHAR(255)', []);
16
+ }
17
+ else {
18
+ // SQLite: ADD COLUMN IF NOT EXISTS supported since 3.35.0
19
+ try {
20
+ await execute('ALTER TABLE teams ADD COLUMN org_id TEXT', []);
21
+ }
22
+ catch (error) {
23
+ if (!error.message?.includes('duplicate column name'))
24
+ throw error;
25
+ }
26
+ try {
27
+ await execute('ALTER TABLE users ADD COLUMN current_org_id TEXT', []);
28
+ }
29
+ catch (error) {
30
+ if (!error.message?.includes('duplicate column name'))
31
+ throw error;
32
+ }
33
+ }
34
+ await execute('CREATE INDEX IF NOT EXISTS idx_teams_org ON teams(org_id)', []);
35
+ // Backfill: assign existing teams (org_id IS NULL) to first org, when orgs exist
36
+ const firstOrg = await queryOne('SELECT id FROM organizations ORDER BY id LIMIT 1', []);
37
+ if (firstOrg && firstOrg.id) {
38
+ const orgId = firstOrg.id;
39
+ if (DB_TYPE === 'postgresql') {
40
+ await execute('UPDATE teams SET org_id = ? WHERE org_id IS NULL', [orgId]);
41
+ }
42
+ else {
43
+ await execute('UPDATE teams SET org_id = ? WHERE org_id IS NULL', [orgId]);
44
+ }
45
+ }
46
+ }
47
+ export async function down() {
48
+ await execute('DROP INDEX IF EXISTS idx_teams_org', []);
49
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
50
+ if (DB_TYPE === 'postgresql') {
51
+ await execute('ALTER TABLE teams DROP COLUMN IF EXISTS org_id', []);
52
+ await execute('ALTER TABLE users DROP COLUMN IF EXISTS current_org_id', []);
53
+ }
54
+ else {
55
+ // SQLite doesn't support DROP COLUMN easily; would need table recreation - skip for down
56
+ console.warn('SQLite: down migration does not remove columns (requires table recreation)');
57
+ }
58
+ }
59
+ //# sourceMappingURL=011_org_scoped_teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"011_org_scoped_teams.js","sourceRoot":"","sources":["../../../src/db/migrations/011_org_scoped_teams.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhD,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,0CAA0C,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAAC;QACpF,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,0DAA0D;QAC1D,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC;gBAAE,MAAM,KAAK,CAAC;QACrE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC;gBAAE,MAAM,KAAK,CAAC;QACrE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,2DAA2D,EAAE,EAAE,CAAC,CAAC;IAE/E,iFAAiF;IACjF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,kDAAkD,EAAE,EAAE,CAAC,CAAC;IACxF,IAAI,QAAQ,IAAK,QAAgB,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAI,QAAgB,CAAC,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,MAAM,OAAO,CAAC,kDAAkD,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,kDAAkD,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAChD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,CAAC,wDAAwD,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,yFAAyF;QACzF,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Migration: Add token_hash to org_invitations; store only hash, not plaintext token.
3
+ * New rows use token_hash for lookup; token column holds placeholder 'h:'+id. Legacy rows
4
+ * (token_hash IS NULL) are looked up by token and migrated on use.
5
+ */
6
+ export declare const migrationId = "012";
7
+ export declare const migrationName = "Add org_invitations.token_hash for secure storage";
8
+ export declare function up(): Promise<void>;
9
+ export declare function down(): Promise<void>;
10
+ //# sourceMappingURL=012_org_invitations_token_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"012_org_invitations_token_hash.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/012_org_invitations_token_hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,sDAAsD,CAAC;AAEjF,wBAAsB,EAAE,kBAsBvB;AAED,wBAAsB,IAAI,kBAMzB"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Migration: Add token_hash to org_invitations; store only hash, not plaintext token.
3
+ * New rows use token_hash for lookup; token column holds placeholder 'h:'+id. Legacy rows
4
+ * (token_hash IS NULL) are looked up by token and migrated on use.
5
+ */
6
+ import { execute } from '../index.js';
7
+ // legacy cloud migration; no longer registered in selfhost-core
8
+ export const migrationId = '012';
9
+ export const migrationName = 'Add org_invitations.token_hash for secure storage';
10
+ export async function up() {
11
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
12
+ if (DB_TYPE === 'postgresql') {
13
+ await execute(`
14
+ ALTER TABLE org_invitations
15
+ ADD COLUMN IF NOT EXISTS token_hash VARCHAR(255)
16
+ `, []);
17
+ await execute(`
18
+ CREATE INDEX IF NOT EXISTS idx_org_invitations_token_hash
19
+ ON org_invitations(token_hash)
20
+ `, []);
21
+ }
22
+ else {
23
+ // SQLite: ADD COLUMN only
24
+ await execute(`
25
+ ALTER TABLE org_invitations ADD COLUMN token_hash TEXT
26
+ `, []);
27
+ await execute(`
28
+ CREATE INDEX IF NOT EXISTS idx_org_invitations_token_hash
29
+ ON org_invitations(token_hash)
30
+ `, []);
31
+ }
32
+ }
33
+ export async function down() {
34
+ await execute(`DROP INDEX IF EXISTS idx_org_invitations_token_hash`, []);
35
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
36
+ if (DB_TYPE === 'postgresql') {
37
+ await execute(`ALTER TABLE org_invitations DROP COLUMN IF EXISTS token_hash`, []);
38
+ }
39
+ }
40
+ //# sourceMappingURL=012_org_invitations_token_hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"012_org_invitations_token_hash.js","sourceRoot":"","sources":["../../../src/db/migrations/012_org_invitations_token_hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,mDAAmD,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;SAAM,CAAC;QACN,0BAA0B;QAC1B,MAAM,OAAO,CAAC;;KAEb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAChD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,8DAA8D,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Migration: Add token_hash to signup_verification_tokens; store only hash, not plaintext token.
3
+ * New rows use token_hash for lookup; token column holds placeholder 'h:'+id. Legacy rows
4
+ * (token_hash IS NULL) are looked up by token and migrated on use.
5
+ */
6
+ export declare const migrationId = "013";
7
+ export declare const migrationName = "Add signup_verification_tokens.token_hash for secure storage";
8
+ export declare function up(): Promise<void>;
9
+ export declare function down(): Promise<void>;
10
+ //# sourceMappingURL=013_signup_verification_token_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"013_signup_verification_token_hash.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/013_signup_verification_token_hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,iEAAiE,CAAC;AAE5F,wBAAsB,EAAE,kBAsBvB;AAED,wBAAsB,IAAI,kBAMzB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Migration: Add token_hash to signup_verification_tokens; store only hash, not plaintext token.
3
+ * New rows use token_hash for lookup; token column holds placeholder 'h:'+id. Legacy rows
4
+ * (token_hash IS NULL) are looked up by token and migrated on use.
5
+ */
6
+ import { execute } from '../index.js';
7
+ export const migrationId = '013';
8
+ export const migrationName = 'Add signup_verification_tokens.token_hash for secure storage';
9
+ export async function up() {
10
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
11
+ if (DB_TYPE === 'postgresql') {
12
+ await execute(`
13
+ ALTER TABLE signup_verification_tokens
14
+ ADD COLUMN IF NOT EXISTS token_hash VARCHAR(255)
15
+ `, []);
16
+ await execute(`
17
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_token_hash
18
+ ON signup_verification_tokens(token_hash)
19
+ `, []);
20
+ }
21
+ else {
22
+ // SQLite: ADD COLUMN only
23
+ await execute(`
24
+ ALTER TABLE signup_verification_tokens ADD COLUMN token_hash TEXT
25
+ `, []);
26
+ await execute(`
27
+ CREATE INDEX IF NOT EXISTS idx_signup_verification_tokens_token_hash
28
+ ON signup_verification_tokens(token_hash)
29
+ `, []);
30
+ }
31
+ }
32
+ export async function down() {
33
+ await execute(`DROP INDEX IF EXISTS idx_signup_verification_tokens_token_hash`, []);
34
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
35
+ if (DB_TYPE === 'postgresql') {
36
+ await execute(`ALTER TABLE signup_verification_tokens DROP COLUMN IF EXISTS token_hash`, []);
37
+ }
38
+ }
39
+ //# sourceMappingURL=013_signup_verification_token_hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"013_signup_verification_token_hash.js","sourceRoot":"","sources":["../../../src/db/migrations/013_signup_verification_token_hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,8DAA8D,CAAC;AAE5F,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;SAAM,CAAC;QACN,0BAA0B;QAC1B,MAAM,OAAO,CAAC;;KAEb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC;;;KAGb,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAChD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,yEAAyE,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Migration: Add indexes for stats endpoint timeseries queries.
3
+ */
4
+ export declare const migrationId = "014";
5
+ export declare const migrationName = "Add stats indexes for created_at timeseries";
6
+ export declare function up(): Promise<void>;
7
+ export declare function down(): Promise<void>;
8
+ //# sourceMappingURL=014_stats_indexes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"014_stats_indexes.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/014_stats_indexes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,gDAAgD,CAAC;AAE3E,wBAAsB,EAAE,kBAKvB;AAED,wBAAsB,IAAI,kBAKzB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Migration: Add indexes for stats endpoint timeseries queries.
3
+ */
4
+ import { execute } from '../index.js';
5
+ export const migrationId = '014';
6
+ export const migrationName = 'Add stats indexes for created_at timeseries';
7
+ export async function up() {
8
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_created_at ON bookmarks(created_at)', []);
9
+ await execute('CREATE INDEX IF NOT EXISTS idx_users_created_at ON users(created_at)', []);
10
+ await execute('CREATE INDEX IF NOT EXISTS idx_folders_created_at ON folders(created_at)', []);
11
+ await execute('CREATE INDEX IF NOT EXISTS idx_tags_created_at ON tags(created_at)', []);
12
+ }
13
+ export async function down() {
14
+ await execute('DROP INDEX IF EXISTS idx_bookmarks_created_at', []);
15
+ await execute('DROP INDEX IF EXISTS idx_users_created_at', []);
16
+ await execute('DROP INDEX IF EXISTS idx_folders_created_at', []);
17
+ await execute('DROP INDEX IF EXISTS idx_tags_created_at', []);
18
+ }
19
+ //# sourceMappingURL=014_stats_indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"014_stats_indexes.js","sourceRoot":"","sources":["../../../src/db/migrations/014_stats_indexes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,6CAA6C,CAAC;AAE3E,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,CAAC,8EAA8E,EAAE,EAAE,CAAC,CAAC;IAClG,MAAM,OAAO,CAAC,sEAAsE,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,OAAO,CAAC,0EAA0E,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,OAAO,CAAC,oEAAoE,EAAE,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Migration: Add api_tokens table for personal API token management.
3
+ * Tokens are stored as SHA-256 hashes only; plaintext is never persisted.
4
+ */
5
+ export declare const migrationId = "015";
6
+ export declare const migrationName = "Add api_tokens table for personal API tokens";
7
+ export declare function up(): Promise<void>;
8
+ export declare function down(): Promise<void>;
9
+ //# sourceMappingURL=015_api_tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"015_api_tokens.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/015_api_tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,iDAAiD,CAAC;AAE5E,wBAAsB,EAAE,kBAkCvB;AAED,wBAAsB,IAAI,kBAIzB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Migration: Add api_tokens table for personal API token management.
3
+ * Tokens are stored as SHA-256 hashes only; plaintext is never persisted.
4
+ */
5
+ import { execute } from '../index.js';
6
+ export const migrationId = '015';
7
+ export const migrationName = 'Add api_tokens table for personal API tokens';
8
+ export async function up() {
9
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
10
+ if (DB_TYPE === 'postgresql') {
11
+ await execute(`
12
+ CREATE TABLE IF NOT EXISTS api_tokens (
13
+ id VARCHAR(255) PRIMARY KEY,
14
+ user_id VARCHAR(255) NOT NULL,
15
+ name VARCHAR(255) NOT NULL,
16
+ token_hash VARCHAR(255) NOT NULL,
17
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
18
+ last_used_at TIMESTAMP,
19
+ revoked_at TIMESTAMP,
20
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
21
+ )
22
+ `, []);
23
+ await execute(`CREATE INDEX IF NOT EXISTS idx_api_tokens_token_hash ON api_tokens(token_hash)`, []);
24
+ await execute(`CREATE INDEX IF NOT EXISTS idx_api_tokens_user_id ON api_tokens(user_id)`, []);
25
+ }
26
+ else {
27
+ await execute(`
28
+ CREATE TABLE IF NOT EXISTS api_tokens (
29
+ id TEXT PRIMARY KEY,
30
+ user_id TEXT NOT NULL,
31
+ name TEXT NOT NULL,
32
+ token_hash TEXT NOT NULL,
33
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
34
+ last_used_at TEXT,
35
+ revoked_at TEXT,
36
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
37
+ )
38
+ `, []);
39
+ await execute(`CREATE INDEX IF NOT EXISTS idx_api_tokens_token_hash ON api_tokens(token_hash)`, []);
40
+ await execute(`CREATE INDEX IF NOT EXISTS idx_api_tokens_user_id ON api_tokens(user_id)`, []);
41
+ }
42
+ }
43
+ export async function down() {
44
+ await execute(`DROP INDEX IF EXISTS idx_api_tokens_user_id`, []);
45
+ await execute(`DROP INDEX IF EXISTS idx_api_tokens_token_hash`, []);
46
+ await execute(`DROP TABLE IF EXISTS api_tokens`, []);
47
+ }
48
+ //# sourceMappingURL=015_api_tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"015_api_tokens.js","sourceRoot":"","sources":["../../../src/db/migrations/015_api_tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,EAAE;IACtB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;IAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC;;;;;;;;;;;KAWb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,CAAC,0EAA0E,EAAE,EAAE,CAAC,CAAC;IAChG,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,CAAC;;;;;;;;;;;KAWb,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,CAAC,0EAA0E,EAAE,EAAE,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,6CAA6C,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,OAAO,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Migration: Add free_plan_grace_ends_at to users for grace period when over 100 bookmarks on free plan.
3
+ * When a user moves to free plan with >100 bookmarks, they get a grace period to delete or upgrade.
4
+ */
5
+ export declare const migrationId = "016";
6
+ export declare const migrationName = "Add free_plan_grace_ends_at for over-limit bookmark grace period";
7
+ export declare function up(): Promise<void>;
8
+ export declare function down(): Promise<void>;
9
+ //# sourceMappingURL=016_free_plan_grace_ends_at.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"016_free_plan_grace_ends_at.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/016_free_plan_grace_ends_at.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,aAAa,qEAAqE,CAAC;AAIhG,wBAAsB,EAAE,kBAiCvB;AAED,wBAAsB,IAAI,kBAOzB"}