@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":"cloud-providers.js","sourceRoot":"","sources":["../../src/config/cloud-providers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,QAAQ,CAAC;AACvE,MAAM,gBAAgB,GAAG,qCAAqC,gBAAgB,OAAO,CAAC;AACtF,MAAM,WAAW,GAAG,0CAA0C,CAAC;AAC/D,MAAM,YAAY,GAAG,6CAA6C,CAAC;AACnE,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,aAAa;YACzB,MAAM,EAAE,sBAAsB;YAC9B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IAClE,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,gBAAgB;YAC5B,iBAAiB,EAAE,GAAG,gBAAgB,YAAY;YAClD,SAAS,EAAE,GAAG,gBAAgB,QAAQ;YACtC,YAAY,EAAE,2CAA2C;YACzD,MAAM,EAAE,sBAAsB;YAC9B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC;YACb,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,oBAAoB;YAChC,iBAAiB,EAAE,WAAW;YAC9B,SAAS,EAAE,YAAY;YACvB,YAAY,EAAE,WAAW;YACzB,MAAM,EAAE,mBAAmB;YAC3B,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Auth cookie options for self-hosted runtime.
3
+ * Import only after load-env.js (used by routes/auth.ts).
4
+ */
5
+ export interface AuthCookieOptions {
6
+ httpOnly: boolean;
7
+ secure: boolean;
8
+ sameSite: 'strict';
9
+ maxAge?: number;
10
+ }
11
+ export declare function getAuthCookieOptions(maxAgeMs?: number): AuthCookieOptions;
12
+ export declare function getClearAuthCookieOptions(): {
13
+ httpOnly: boolean;
14
+ secure: boolean;
15
+ sameSite: 'strict';
16
+ };
17
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/config/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAQzE;AAED,wBAAgB,yBAAyB,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAOtG"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Auth cookie options for self-hosted runtime.
3
+ * Import only after load-env.js (used by routes/auth.ts).
4
+ */
5
+ const baseUrl = process.env.BASE_URL || 'http://localhost:5000';
6
+ const isHttps = baseUrl.startsWith('https://');
7
+ const isProduction = process.env.NODE_ENV === 'production' && isHttps;
8
+ export function getAuthCookieOptions(maxAgeMs) {
9
+ const opts = {
10
+ httpOnly: true,
11
+ secure: isProduction,
12
+ sameSite: 'strict',
13
+ };
14
+ if (maxAgeMs != null)
15
+ opts.maxAge = maxAgeMs;
16
+ return opts;
17
+ }
18
+ export function getClearAuthCookieOptions() {
19
+ const opts = {
20
+ httpOnly: true,
21
+ secure: isProduction,
22
+ sameSite: 'strict',
23
+ };
24
+ return opts;
25
+ }
26
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/config/cookies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB,CAAC;AAChE,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,CAAC;AAStE,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,MAAM,IAAI,GAAsB;QAC9B,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,QAAQ;KACnB,CAAC;IACF,IAAI,QAAQ,IAAI,IAAI;QAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,QAAiB;KAC5B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SlugBase runtime mode is now self-hosted only.
3
+ */
4
+ export declare const mode: 'selfhosted';
5
+ export declare const isCloud = false;
6
+ export declare const isSelfhosted = true;
7
+ //# sourceMappingURL=mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.d.ts","sourceRoot":"","sources":["../../src/config/mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,YAA2B,CAAC;AAC/C,eAAO,MAAM,OAAO,QAAQ,CAAC;AAC7B,eAAO,MAAM,YAAY,OAAO,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SlugBase runtime mode is now self-hosted only.
3
+ */
4
+ export const mode = 'selfhosted';
5
+ export const isCloud = false;
6
+ export const isSelfhosted = true;
7
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../../src/config/mode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAiB,YAAY,CAAC;AAC/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const swaggerSpec: object;
2
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../src/config/swagger.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,WAAW,QAAwB,CAAC"}
@@ -0,0 +1,76 @@
1
+ import swaggerJsdoc from 'swagger-jsdoc';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join } from 'path';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ // Determine if we're running from compiled JS (production) or TS source (development)
7
+ // When running from dist/, __dirname will be dist/config, and routes will be at ../routes/
8
+ // In production, files are .js, in development they're .ts
9
+ const isProduction = __dirname.includes('dist');
10
+ const fileExtension = isProduction ? 'js' : 'ts';
11
+ const options = {
12
+ definition: {
13
+ openapi: '3.0.0',
14
+ info: {
15
+ title: 'SlugBase API',
16
+ version: '1.0.0',
17
+ description: `API documentation for SlugBase - A bookmark management system.
18
+
19
+ **Authentication:**
20
+ - **JWT (cookie or Bearer):** Session-based, short-lived. Used when logging in via the web app.
21
+ - **Personal API Token (Bearer):** Long-lived tokens with prefix \`sb_\`. Use for scripts, CLI, or CI/CD. Create tokens at Profile > API Access. Send as \`Authorization: Bearer <token>\`.`,
22
+ contact: {
23
+ name: 'SlugBase',
24
+ },
25
+ },
26
+ servers: [
27
+ {
28
+ url: process.env.BASE_URL || 'http://localhost:5000',
29
+ description: 'Development server',
30
+ },
31
+ ],
32
+ components: {
33
+ securitySchemes: {
34
+ cookieAuth: {
35
+ type: 'apiKey',
36
+ in: 'cookie',
37
+ name: 'token',
38
+ description: 'JWT in httpOnly cookie (web app session)',
39
+ },
40
+ bearerAuth: {
41
+ type: 'http',
42
+ scheme: 'bearer',
43
+ bearerFormat: 'JWT',
44
+ description: 'JWT token (short-lived session)',
45
+ },
46
+ apiTokenAuth: {
47
+ type: 'http',
48
+ scheme: 'bearer',
49
+ bearerFormat: 'API Token',
50
+ description: 'Personal API token (prefix sb_). Long-lived. Create at Profile > API Access.',
51
+ },
52
+ },
53
+ },
54
+ security: [
55
+ {
56
+ cookieAuth: [],
57
+ },
58
+ {
59
+ bearerAuth: [],
60
+ },
61
+ {
62
+ apiTokenAuth: [],
63
+ },
64
+ ],
65
+ },
66
+ apis: [
67
+ // Use appropriate file extension based on environment
68
+ // In development: scans .ts files from src/
69
+ // In production: scans .js files from dist/
70
+ join(__dirname, `../routes/*.${fileExtension}`),
71
+ join(__dirname, `../routes/**/*.${fileExtension}`),
72
+ join(__dirname, `../**/*.${fileExtension}`),
73
+ ],
74
+ };
75
+ export const swaggerSpec = swaggerJsdoc(options);
76
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.js","sourceRoot":"","sources":["../../src/config/swagger.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,sFAAsF;AACtF,2FAA2F;AAC3F,2DAA2D;AAC3D,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjD,MAAM,OAAO,GAAyB;IACpC,UAAU,EAAE;QACV,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE;;;;4LAIyK;YACtL,OAAO,EAAE;gBACP,IAAI,EAAE,UAAU;aACjB;SACF;QACD,OAAO,EAAE;YACP;gBACE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,uBAAuB;gBACpD,WAAW,EAAE,oBAAoB;aAClC;SACF;QACD,UAAU,EAAE;YACV,eAAe,EAAE;gBACf,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,0CAA0C;iBACxD;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,KAAK;oBACnB,WAAW,EAAE,iCAAiC;iBAC/C;gBACD,YAAY,EAAE;oBACZ,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;oBAChB,YAAY,EAAE,WAAW;oBACzB,WAAW,EAAE,8EAA8E;iBAC5F;aACF;SACF;QACD,QAAQ,EAAE;YACR;gBACE,UAAU,EAAE,EAAE;aACf;YACD;gBACE,UAAU,EAAE,EAAE;aACf;YACD;gBACE,YAAY,EAAE,EAAE;aACjB;SACF;KACF;IACD,IAAI,EAAE;QACJ,sDAAsD;QACtD,4CAA4C;QAC5C,4CAA4C;QAC5C,IAAI,CAAC,SAAS,EAAE,eAAe,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,kBAAkB,aAAa,EAAE,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,WAAW,aAAa,EAAE,CAAC;KAC5C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Core config from environment. Used by app entrypoints and by @slugbase/core/backend.
3
+ */
4
+ export interface DbConfig {
5
+ type: 'sqlite' | 'postgresql';
6
+ path?: string;
7
+ connectionString?: string;
8
+ host?: string;
9
+ port?: number;
10
+ database?: string;
11
+ user?: string;
12
+ password?: string;
13
+ }
14
+ export interface CoreConfig {
15
+ baseUrl: string;
16
+ frontendUrl: string;
17
+ db: DbConfig;
18
+ jwtSecret: string;
19
+ encryptionKey: string;
20
+ sessionSecret: string;
21
+ nodeEnv: string;
22
+ registrationsEnabled: boolean;
23
+ port: number;
24
+ }
25
+ /**
26
+ * Read and return typed config from env. Does not validate secrets (use validateEnvironmentVariables for that).
27
+ */
28
+ export declare function getConfig(env?: NodeJS.ProcessEnv): CoreConfig;
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,CA6B1E"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Core config from environment. Used by app entrypoints and by @slugbase/core/backend.
3
+ */
4
+ const DEFAULT_PORT = 5000;
5
+ const DEFAULT_FRONTEND = 'http://localhost:3000';
6
+ const DEFAULT_BASE = 'http://localhost:5000';
7
+ /**
8
+ * Read and return typed config from env. Does not validate secrets (use validateEnvironmentVariables for that).
9
+ */
10
+ export function getConfig(env = process.env) {
11
+ const dbType = (env.DB_TYPE || 'sqlite');
12
+ const db = { type: dbType };
13
+ if (dbType === 'postgresql') {
14
+ if (env.DATABASE_URL) {
15
+ db.connectionString = env.DATABASE_URL;
16
+ }
17
+ else {
18
+ db.host = env.DB_HOST || 'localhost';
19
+ db.port = parseInt(env.DB_PORT || '5432', 10);
20
+ db.database = env.DB_NAME || 'slugbase';
21
+ db.user = env.DB_USER || 'postgres';
22
+ db.password = env.DB_PASSWORD || '';
23
+ }
24
+ }
25
+ else {
26
+ db.path = env.DB_PATH;
27
+ }
28
+ const sessionSecret = env.SESSION_SECRET || env.JWT_SECRET || 'slugbase-session-secret-change-in-production';
29
+ return {
30
+ baseUrl: env.BASE_URL || DEFAULT_BASE,
31
+ frontendUrl: (env.FRONTEND_URL || DEFAULT_FRONTEND).replace(/\/$/, ''),
32
+ db,
33
+ jwtSecret: (env.JWT_SECRET || ''),
34
+ encryptionKey: (env.ENCRYPTION_KEY || ''),
35
+ sessionSecret,
36
+ nodeEnv: env.NODE_ENV || 'development',
37
+ registrationsEnabled: env.REGISTRATIONS_ENABLED !== 'false',
38
+ port: parseInt(env.PORT || String(DEFAULT_PORT), 10),
39
+ };
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACjD,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAA4B,CAAC;IACpE,MAAM,EAAE,GAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,EAAE,CAAC,gBAAgB,GAAG,GAAG,CAAC,YAAY,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,WAAW,CAAC;YACrC,EAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;YACxC,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC;YACpC,EAAE,CAAC,QAAQ,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,UAAU,IAAI,8CAA8C,CAAC;IAC7G,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,YAAY;QACrC,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACtE,EAAE;QACF,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAW;QAC3C,aAAa,EAAE,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAW;QACnD,aAAa;QACb,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,aAAa;QACtC,oBAAoB,EAAE,GAAG,CAAC,qBAAqB,KAAK,OAAO;QAC3D,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import Database from 'better-sqlite3';
2
+ import { type DbPool } from './pool.js';
3
+ export declare function setDb(pool: DbPool, type: 'sqlite' | 'postgresql'): void;
4
+ export declare function getDb(): DbPool;
5
+ export declare function getDbType(): 'sqlite' | 'postgresql';
6
+ export declare function initDatabase(): Promise<void>;
7
+ export declare function query(sql: string, params?: any[]): Promise<any[]>;
8
+ export declare function queryOne(sql: string, params?: any[]): Promise<any>;
9
+ export declare function execute(sql: string, params?: any[]): Promise<Database.RunResult | {
10
+ changes: number;
11
+ lastInsertRowid: null;
12
+ }>;
13
+ export declare function isInitialized(): Promise<boolean>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAQtD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAGvE;AAED,wBAAgB,KAAK,IAAI,MAAM,CAG9B;AAED,wBAAgB,SAAS,IAAI,QAAQ,GAAG,YAAY,CAEnD;AAiBD,wBAAsB,YAAY,kBAqCjC;AAED,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,kBAO1D;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO,gBAO7D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAO;;;GAW5D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD"}
@@ -0,0 +1,114 @@
1
+ import { readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname } from 'path';
5
+ import { getConfig } from '../config.js';
6
+ import { createDbPool } from './pool.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ let db = null;
10
+ let dbType = 'sqlite';
11
+ export function setDb(pool, type) {
12
+ db = pool;
13
+ dbType = type;
14
+ }
15
+ export function getDb() {
16
+ if (!db)
17
+ throw new Error('Database not initialized. Call initDatabase() first.');
18
+ return db;
19
+ }
20
+ export function getDbType() {
21
+ return dbType;
22
+ }
23
+ /**
24
+ * Convert boolean to database-compatible value
25
+ */
26
+ function boolToDb(value) {
27
+ if (value === null || value === undefined)
28
+ return null;
29
+ if (dbType === 'postgresql')
30
+ return value;
31
+ return value ? 1 : 0;
32
+ }
33
+ /** Convert ? placeholders to $1, $2, ... for PostgreSQL */
34
+ function toPg(sql) {
35
+ let n = 0;
36
+ return sql.replace(/\?/g, () => `$${++n}`);
37
+ }
38
+ export async function initDatabase() {
39
+ const config = getConfig(process.env);
40
+ const pool = createDbPool(config.db);
41
+ setDb(pool, config.db.type);
42
+ let schema = readFileSync(join(__dirname, 'schema.sql'), 'utf-8');
43
+ if (dbType === 'postgresql') {
44
+ const pg = pool;
45
+ schema = schema.replace(/VARCHAR\((\d+)\)/g, 'VARCHAR($1)');
46
+ const statements = schema.split(';').filter((s) => s.trim().length > 0);
47
+ for (const statement of statements) {
48
+ if (statement.trim()) {
49
+ try {
50
+ await pg.query(statement);
51
+ }
52
+ catch (error) {
53
+ if (!error.message?.includes('already exists') && !error.message?.includes('duplicate')) {
54
+ console.error('Schema error:', error.message, 'Statement:', statement.substring(0, 100));
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ else {
61
+ const sqlite = pool;
62
+ schema = schema
63
+ .replace(/VARCHAR\((\d+)\)/g, 'TEXT')
64
+ .replace(/TIMESTAMP/g, 'DATETIME');
65
+ sqlite.exec(schema);
66
+ }
67
+ try {
68
+ const { runMigrations } = await import('./migrations/index.js');
69
+ await runMigrations();
70
+ }
71
+ catch (error) {
72
+ console.error('Error running migrations:', error);
73
+ throw error;
74
+ }
75
+ }
76
+ export async function query(sql, params = []) {
77
+ const current = getDb();
78
+ if (dbType === 'postgresql') {
79
+ const result = await current.query(toPg(sql), params);
80
+ return result.rows;
81
+ }
82
+ return current.prepare(sql).all(...params);
83
+ }
84
+ export async function queryOne(sql, params = []) {
85
+ const current = getDb();
86
+ if (dbType === 'postgresql') {
87
+ const result = await current.query(toPg(sql), params);
88
+ return result.rows[0] || null;
89
+ }
90
+ return current.prepare(sql).get(...params) || null;
91
+ }
92
+ export async function execute(sql, params = []) {
93
+ const processedParams = params.map((param) => {
94
+ if (typeof param === 'boolean')
95
+ return boolToDb(param);
96
+ return param;
97
+ });
98
+ const current = getDb();
99
+ if (dbType === 'postgresql') {
100
+ const result = await current.query(toPg(sql), processedParams);
101
+ return { changes: result.rowCount || 0, lastInsertRowid: null };
102
+ }
103
+ return current.prepare(sql).run(...processedParams);
104
+ }
105
+ export async function isInitialized() {
106
+ try {
107
+ const result = await queryOne('SELECT COUNT(*) as count FROM users', []);
108
+ return result && parseInt(result.count) > 0;
109
+ }
110
+ catch {
111
+ return false;
112
+ }
113
+ }
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Migration script to:
3
+ * 1. Make slug column nullable
4
+ * 2. Convert all _internal_ placeholder slugs to NULL
5
+ * 3. Remove UNIQUE constraint issues with NULL slugs
6
+ *
7
+ * Run this once to migrate existing database
8
+ */
9
+ export declare function migrateSlugNullable(): Promise<void>;
10
+ //# sourceMappingURL=migrate-slug-nullable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-slug-nullable.d.ts","sourceRoot":"","sources":["../../src/db/migrate-slug-nullable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,wBAAsB,mBAAmB,kBA4ExC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Migration script to:
3
+ * 1. Make slug column nullable
4
+ * 2. Convert all _internal_ placeholder slugs to NULL
5
+ * 3. Remove UNIQUE constraint issues with NULL slugs
6
+ *
7
+ * Run this once to migrate existing database
8
+ */
9
+ import { execute } from './index.js';
10
+ export async function migrateSlugNullable() {
11
+ try {
12
+ console.log('Starting slug migration...');
13
+ // For SQLite, we need to recreate the table to make slug nullable
14
+ // For PostgreSQL, we can use ALTER TABLE
15
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
16
+ if (DB_TYPE === 'postgresql') {
17
+ // PostgreSQL: Just alter the column
18
+ await execute('ALTER TABLE bookmarks ALTER COLUMN slug DROP NOT NULL', []);
19
+ console.log('Made slug column nullable');
20
+ }
21
+ else {
22
+ // SQLite: Need to recreate table
23
+ console.log('SQLite detected - recreating bookmarks table...');
24
+ // Create new table with nullable slug
25
+ await execute(`
26
+ CREATE TABLE IF NOT EXISTS bookmarks_new (
27
+ id VARCHAR(255) PRIMARY KEY,
28
+ user_id VARCHAR(255) NOT NULL,
29
+ title TEXT NOT NULL,
30
+ url TEXT NOT NULL,
31
+ slug VARCHAR(255),
32
+ forwarding_enabled BOOLEAN DEFAULT FALSE,
33
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
34
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
35
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
36
+ )
37
+ `, []);
38
+ // Copy data, converting _internal_ slugs to NULL
39
+ await execute(`
40
+ INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
41
+ SELECT
42
+ id,
43
+ user_id,
44
+ title,
45
+ url,
46
+ CASE
47
+ WHEN slug IS NULL OR slug = '' OR slug LIKE '_internal_%' THEN NULL
48
+ ELSE slug
49
+ END as slug,
50
+ forwarding_enabled,
51
+ created_at,
52
+ updated_at
53
+ FROM bookmarks
54
+ `, []);
55
+ // Drop old table
56
+ await execute('DROP TABLE bookmarks', []);
57
+ // Rename new table
58
+ await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
59
+ // Recreate indexes
60
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
61
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
62
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
63
+ console.log('Recreated bookmarks table with nullable slug');
64
+ }
65
+ // Clean up any remaining _internal_ slugs (set to NULL)
66
+ const result = await execute(`UPDATE bookmarks SET slug = NULL WHERE slug LIKE '_internal_%' OR slug = ''`, []);
67
+ console.log(`Cleaned up ${result.changes || 0} internal placeholder slugs`);
68
+ console.log('Slug migration completed successfully!');
69
+ }
70
+ catch (error) {
71
+ console.error('Migration error:', error);
72
+ throw error;
73
+ }
74
+ }
75
+ // Run migration if called directly
76
+ if (import.meta.url === `file://${process.argv[1]}`) {
77
+ migrateSlugNullable()
78
+ .then(() => {
79
+ console.log('Migration complete');
80
+ process.exit(0);
81
+ })
82
+ .catch((error) => {
83
+ console.error('Migration failed:', error);
84
+ process.exit(1);
85
+ });
86
+ }
87
+ //# sourceMappingURL=migrate-slug-nullable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-slug-nullable.js","sourceRoot":"","sources":["../../src/db/migrate-slug-nullable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAS,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,kEAAkE;QAClE,yCAAyC;QAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;QAEhD,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,oCAAoC;YACpC,MAAM,OAAO,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAE/D,sCAAsC;YACtC,MAAM,OAAO,CAAC;;;;;;;;;;;;OAYb,EAAE,EAAE,CAAC,CAAC;YAEP,iDAAiD;YACjD,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;OAeb,EAAE,EAAE,CAAC,CAAC;YAEP,iBAAiB;YACjB,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;YAE1C,mBAAmB;YACnB,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;YAEnE,mBAAmB;YACnB,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;YAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;YACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;YAEpG,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,6EAA6E,EAC7E,EAAE,CACH,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,OAAO,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAE5E,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,mBAAmB,EAAE;SAClB,IAAI,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Migration: Make slug column nullable in bookmarks table
3
+ * Date: 2024-01-01
4
+ * Description: Makes the slug column nullable and converts all _internal_ placeholder slugs to NULL
5
+ */
6
+ export declare const migrationId = "001_migrate_slug_nullable";
7
+ export declare const migrationName = "Make slug column nullable";
8
+ export declare function up(): Promise<void>;
9
+ export declare function down(): Promise<void>;
10
+ //# sourceMappingURL=001_migrate_slug_nullable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001_migrate_slug_nullable.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/001_migrate_slug_nullable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAEzD,wBAAsB,EAAE,kBA0DvB;AAED,wBAAsB,IAAI,kBA6CzB"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Migration: Make slug column nullable in bookmarks table
3
+ * Date: 2024-01-01
4
+ * Description: Makes the slug column nullable and converts all _internal_ placeholder slugs to NULL
5
+ */
6
+ import { execute } from '../index.js';
7
+ export const migrationId = '001_migrate_slug_nullable';
8
+ export const migrationName = 'Make slug column nullable';
9
+ export async function up() {
10
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
11
+ if (DB_TYPE === 'postgresql') {
12
+ // PostgreSQL: Just alter the column
13
+ await execute('ALTER TABLE bookmarks ALTER COLUMN slug DROP NOT NULL', []);
14
+ }
15
+ else {
16
+ // SQLite: Need to recreate table
17
+ // Create new table with nullable slug
18
+ await execute(`
19
+ CREATE TABLE IF NOT EXISTS bookmarks_new (
20
+ id VARCHAR(255) PRIMARY KEY,
21
+ user_id VARCHAR(255) NOT NULL,
22
+ title TEXT NOT NULL,
23
+ url TEXT NOT NULL,
24
+ slug VARCHAR(255),
25
+ forwarding_enabled BOOLEAN DEFAULT FALSE,
26
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
27
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
28
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
29
+ )
30
+ `, []);
31
+ // Copy data, converting _internal_ slugs to NULL
32
+ await execute(`
33
+ INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
34
+ SELECT
35
+ id,
36
+ user_id,
37
+ title,
38
+ url,
39
+ CASE
40
+ WHEN slug IS NULL OR slug = '' OR slug LIKE '_internal_%' THEN NULL
41
+ ELSE slug
42
+ END as slug,
43
+ forwarding_enabled,
44
+ created_at,
45
+ updated_at
46
+ FROM bookmarks
47
+ `, []);
48
+ // Drop old table
49
+ await execute('DROP TABLE bookmarks', []);
50
+ // Rename new table
51
+ await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
52
+ // Recreate indexes
53
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
54
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
55
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
56
+ }
57
+ // Clean up any remaining _internal_ slugs (set to NULL)
58
+ await execute(`UPDATE bookmarks SET slug = NULL WHERE slug LIKE '_internal_%' OR slug = ''`, []);
59
+ }
60
+ export async function down() {
61
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
62
+ if (DB_TYPE === 'postgresql') {
63
+ // For PostgreSQL, we can't easily make it NOT NULL if there are NULL values
64
+ // So we'll set a default value first, then make it NOT NULL
65
+ await execute(`UPDATE bookmarks SET slug = '_internal_' || id WHERE slug IS NULL`, []);
66
+ await execute('ALTER TABLE bookmarks ALTER COLUMN slug SET NOT NULL', []);
67
+ }
68
+ else {
69
+ // SQLite: Need to recreate table
70
+ await execute(`
71
+ CREATE TABLE IF NOT EXISTS bookmarks_new (
72
+ id VARCHAR(255) PRIMARY KEY,
73
+ user_id VARCHAR(255) NOT NULL,
74
+ title TEXT NOT NULL,
75
+ url TEXT NOT NULL,
76
+ slug VARCHAR(255) NOT NULL,
77
+ forwarding_enabled BOOLEAN DEFAULT FALSE,
78
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
79
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
80
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
81
+ )
82
+ `, []);
83
+ await execute(`
84
+ INSERT INTO bookmarks_new (id, user_id, title, url, slug, forwarding_enabled, created_at, updated_at)
85
+ SELECT
86
+ id,
87
+ user_id,
88
+ title,
89
+ url,
90
+ COALESCE(slug, '_internal_' || id) as slug,
91
+ forwarding_enabled,
92
+ created_at,
93
+ updated_at
94
+ FROM bookmarks
95
+ `, []);
96
+ await execute('DROP TABLE bookmarks', []);
97
+ await execute('ALTER TABLE bookmarks_new RENAME TO bookmarks', []);
98
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_id ON bookmarks(user_id)', []);
99
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_slug ON bookmarks(slug)', []);
100
+ await execute('CREATE INDEX IF NOT EXISTS idx_bookmarks_user_slug ON bookmarks(user_id, slug)', []);
101
+ }
102
+ }
103
+ //# sourceMappingURL=001_migrate_slug_nullable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"001_migrate_slug_nullable.js","sourceRoot":"","sources":["../../../src/db/migrations/001_migrate_slug_nullable.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAEzD,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,oCAAoC;QACpC,MAAM,OAAO,CAAC,uDAAuD,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,sCAAsC;QACtC,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,iDAAiD;QACjD,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;KAeb,EAAE,EAAE,CAAC,CAAC;QAEP,iBAAiB;QACjB,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAE1C,mBAAmB;QACnB,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;QAEnE,mBAAmB;QACnB,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,wDAAwD;IACxD,MAAM,OAAO,CACX,6EAA6E,EAC7E,EAAE,CACH,CAAC;AACJ,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,4EAA4E;QAC5E,4DAA4D;QAC5D,MAAM,OAAO,CAAC,mEAAmE,EAAE,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,CAAC,sDAAsD,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC;;;;;;;;;;;;KAYb,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC;QAEnE,MAAM,OAAO,CAAC,wEAAwE,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,OAAO,CAAC,kEAAkE,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,CAAC,gFAAgF,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Migration: Add custom OIDC endpoint fields
3
+ * Date: 2026-01-12
4
+ * Description: Adds optional custom endpoint fields (authorization_url, token_url, userinfo_url) to oidc_providers table
5
+ * to allow providers with non-standard endpoint paths
6
+ */
7
+ export declare const migrationId = "002_add_oidc_custom_endpoints";
8
+ export declare const migrationName = "Add custom OIDC endpoint fields";
9
+ export declare function up(): Promise<void>;
10
+ export declare function down(): Promise<void>;
11
+ //# sourceMappingURL=002_add_oidc_custom_endpoints.d.ts.map