@crowi/api 2.0.0-alpha.0

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 (887) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app.d.ts +8 -0
  3. package/dist/app.js +65 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/collab/attach.d.ts +33 -0
  6. package/dist/collab/attach.js +341 -0
  7. package/dist/collab/attach.js.map +1 -0
  8. package/dist/collab/extension-redis.d.ts +25 -0
  9. package/dist/collab/extension-redis.js +133 -0
  10. package/dist/collab/extension-redis.js.map +1 -0
  11. package/dist/common/functions/path2name.d.ts +1 -0
  12. package/dist/common/functions/path2name.js +22 -0
  13. package/dist/common/functions/path2name.js.map +1 -0
  14. package/dist/common/functions/renderIcon.d.ts +1 -0
  15. package/dist/common/functions/renderIcon.js +9 -0
  16. package/dist/common/functions/renderIcon.js.map +1 -0
  17. package/dist/controllers/admin.d.ts +3 -0
  18. package/dist/controllers/admin.js +474 -0
  19. package/dist/controllers/admin.js.map +1 -0
  20. package/dist/controllers/attachment.d.ts +4 -0
  21. package/dist/controllers/attachment.js +200 -0
  22. package/dist/controllers/attachment.js.map +1 -0
  23. package/dist/controllers/backlink.d.ts +3 -0
  24. package/dist/controllers/backlink.js +42 -0
  25. package/dist/controllers/backlink.js.map +1 -0
  26. package/dist/controllers/bookmark.d.ts +3 -0
  27. package/dist/controllers/bookmark.js +100 -0
  28. package/dist/controllers/bookmark.js.map +1 -0
  29. package/dist/controllers/comment.d.ts +3 -0
  30. package/dist/controllers/comment.js +111 -0
  31. package/dist/controllers/comment.js.map +1 -0
  32. package/dist/controllers/index.d.ts +25 -0
  33. package/dist/controllers/index.js +44 -0
  34. package/dist/controllers/index.js.map +1 -0
  35. package/dist/controllers/installer.d.ts +3 -0
  36. package/dist/controllers/installer.js +48 -0
  37. package/dist/controllers/installer.js.map +1 -0
  38. package/dist/controllers/login.d.ts +4 -0
  39. package/dist/controllers/login.js +438 -0
  40. package/dist/controllers/login.js.map +1 -0
  41. package/dist/controllers/logout.d.ts +5 -0
  42. package/dist/controllers/logout.js +11 -0
  43. package/dist/controllers/logout.js.map +1 -0
  44. package/dist/controllers/me.d.ts +4 -0
  45. package/dist/controllers/me.js +369 -0
  46. package/dist/controllers/me.js.map +1 -0
  47. package/dist/controllers/notification.d.ts +3 -0
  48. package/dist/controllers/notification.js +88 -0
  49. package/dist/controllers/notification.js.map +1 -0
  50. package/dist/controllers/page.d.ts +3 -0
  51. package/dist/controllers/page.js +881 -0
  52. package/dist/controllers/page.js.map +1 -0
  53. package/dist/controllers/revision.d.ts +3 -0
  54. package/dist/controllers/revision.js +91 -0
  55. package/dist/controllers/revision.js.map +1 -0
  56. package/dist/controllers/search.d.ts +3 -0
  57. package/dist/controllers/search.js +93 -0
  58. package/dist/controllers/search.js.map +1 -0
  59. package/dist/controllers/share.d.ts +3 -0
  60. package/dist/controllers/share.js +207 -0
  61. package/dist/controllers/share.js.map +1 -0
  62. package/dist/controllers/shareAccess.d.ts +3 -0
  63. package/dist/controllers/shareAccess.js +28 -0
  64. package/dist/controllers/shareAccess.js.map +1 -0
  65. package/dist/controllers/slack.d.ts +3 -0
  66. package/dist/controllers/slack.js +87 -0
  67. package/dist/controllers/slack.js.map +1 -0
  68. package/dist/controllers/tokenAuth.d.ts +10 -0
  69. package/dist/controllers/tokenAuth.js +292 -0
  70. package/dist/controllers/tokenAuth.js.map +1 -0
  71. package/dist/controllers/user.d.ts +3 -0
  72. package/dist/controllers/user.js +67 -0
  73. package/dist/controllers/user.js.map +1 -0
  74. package/dist/controllers/version.d.ts +4 -0
  75. package/dist/controllers/version.js +19 -0
  76. package/dist/controllers/version.js.map +1 -0
  77. package/dist/crowi/express-init.d.ts +4 -0
  78. package/dist/crowi/express-init.js +101 -0
  79. package/dist/crowi/express-init.js.map +1 -0
  80. package/dist/crowi/index.d.ts +245 -0
  81. package/dist/crowi/index.js +726 -0
  82. package/dist/crowi/index.js.map +1 -0
  83. package/dist/events/activity.d.ts +7 -0
  84. package/dist/events/activity.js +15 -0
  85. package/dist/events/activity.js.map +1 -0
  86. package/dist/events/bookmark.d.ts +8 -0
  87. package/dist/events/bookmark.js +16 -0
  88. package/dist/events/bookmark.js.map +1 -0
  89. package/dist/events/comment.d.ts +6 -0
  90. package/dist/events/comment.js +14 -0
  91. package/dist/events/comment.js.map +1 -0
  92. package/dist/events/config.d.ts +6 -0
  93. package/dist/events/config.js +12 -0
  94. package/dist/events/config.js.map +1 -0
  95. package/dist/events/index.d.ts +17 -0
  96. package/dist/events/index.js +22 -0
  97. package/dist/events/index.js.map +1 -0
  98. package/dist/events/mention-dispatch.d.ts +44 -0
  99. package/dist/events/mention-dispatch.js +151 -0
  100. package/dist/events/mention-dispatch.js.map +1 -0
  101. package/dist/events/notification.d.ts +7 -0
  102. package/dist/events/notification.js +15 -0
  103. package/dist/events/notification.js.map +1 -0
  104. package/dist/events/page.d.ts +44 -0
  105. package/dist/events/page.js +134 -0
  106. package/dist/events/page.js.map +1 -0
  107. package/dist/events/render-cache.d.ts +24 -0
  108. package/dist/events/render-cache.js +63 -0
  109. package/dist/events/render-cache.js.map +1 -0
  110. package/dist/events/user.d.ts +9 -0
  111. package/dist/events/user.js +39 -0
  112. package/dist/events/user.js.map +1 -0
  113. package/dist/form/admin/app.d.ts +2 -0
  114. package/dist/form/admin/app.js +9 -0
  115. package/dist/form/admin/app.js.map +1 -0
  116. package/dist/form/admin/auth.d.ts +2 -0
  117. package/dist/form/admin/auth.js +9 -0
  118. package/dist/form/admin/auth.js.map +1 -0
  119. package/dist/form/admin/aws.d.ts +2 -0
  120. package/dist/form/admin/aws.js +13 -0
  121. package/dist/form/admin/aws.js.map +1 -0
  122. package/dist/form/admin/github.d.ts +2 -0
  123. package/dist/form/admin/github.js +15 -0
  124. package/dist/form/admin/github.js.map +1 -0
  125. package/dist/form/admin/google.d.ts +2 -0
  126. package/dist/form/admin/google.js +13 -0
  127. package/dist/form/admin/google.js.map +1 -0
  128. package/dist/form/admin/mail.d.ts +2 -0
  129. package/dist/form/admin/mail.js +13 -0
  130. package/dist/form/admin/mail.js.map +1 -0
  131. package/dist/form/admin/sec.d.ts +2 -0
  132. package/dist/form/admin/sec.js +10 -0
  133. package/dist/form/admin/sec.js.map +1 -0
  134. package/dist/form/admin/slackSetting.d.ts +2 -0
  135. package/dist/form/admin/slackSetting.js +13 -0
  136. package/dist/form/admin/slackSetting.js.map +1 -0
  137. package/dist/form/admin/userEdit.d.ts +2 -0
  138. package/dist/form/admin/userEdit.js +9 -0
  139. package/dist/form/admin/userEdit.js.map +1 -0
  140. package/dist/form/admin/userInvite.d.ts +2 -0
  141. package/dist/form/admin/userInvite.js +9 -0
  142. package/dist/form/admin/userInvite.js.map +1 -0
  143. package/dist/form/comment.d.ts +2 -0
  144. package/dist/form/comment.js +9 -0
  145. package/dist/form/comment.js.map +1 -0
  146. package/dist/form/index.d.ts +25 -0
  147. package/dist/form/index.js +48 -0
  148. package/dist/form/index.js.map +1 -0
  149. package/dist/form/invited.d.ts +2 -0
  150. package/dist/form/invited.js +13 -0
  151. package/dist/form/invited.js.map +1 -0
  152. package/dist/form/login.d.ts +2 -0
  153. package/dist/form/login.js +11 -0
  154. package/dist/form/login.js.map +1 -0
  155. package/dist/form/me/apiToken.d.ts +2 -0
  156. package/dist/form/me/apiToken.js +9 -0
  157. package/dist/form/me/apiToken.js.map +1 -0
  158. package/dist/form/me/password.d.ts +2 -0
  159. package/dist/form/me/password.js +11 -0
  160. package/dist/form/me/password.js.map +1 -0
  161. package/dist/form/me/user.d.ts +2 -0
  162. package/dist/form/me/user.js +9 -0
  163. package/dist/form/me/user.js.map +1 -0
  164. package/dist/form/register.d.ts +2 -0
  165. package/dist/form/register.js +13 -0
  166. package/dist/form/register.js.map +1 -0
  167. package/dist/form/revision.d.ts +2 -0
  168. package/dist/form/revision.js +13 -0
  169. package/dist/form/revision.js.map +1 -0
  170. package/dist/hono/app.d.ts +19 -0
  171. package/dist/hono/app.js +21 -0
  172. package/dist/hono/app.js.map +1 -0
  173. package/dist/hono/handlers/_helpers/errors.d.ts +61 -0
  174. package/dist/hono/handlers/_helpers/errors.js +51 -0
  175. package/dist/hono/handlers/_helpers/errors.js.map +1 -0
  176. package/dist/hono/handlers/_helpers/user-shape.d.ts +46 -0
  177. package/dist/hono/handlers/_helpers/user-shape.js +23 -0
  178. package/dist/hono/handlers/_helpers/user-shape.js.map +1 -0
  179. package/dist/hono/handlers/access-token.d.ts +221 -0
  180. package/dist/hono/handlers/access-token.js +113 -0
  181. package/dist/hono/handlers/access-token.js.map +1 -0
  182. package/dist/hono/handlers/activation.d.ts +117 -0
  183. package/dist/hono/handlers/activation.js +77 -0
  184. package/dist/hono/handlers/activation.js.map +1 -0
  185. package/dist/hono/handlers/admin/app.d.ts +123 -0
  186. package/dist/hono/handlers/admin/app.js +76 -0
  187. package/dist/hono/handlers/admin/app.js.map +1 -0
  188. package/dist/hono/handlers/admin/auth.d.ts +127 -0
  189. package/dist/hono/handlers/admin/auth.js +91 -0
  190. package/dist/hono/handlers/admin/auth.js.map +1 -0
  191. package/dist/hono/handlers/admin/mail.d.ts +168 -0
  192. package/dist/hono/handlers/admin/mail.js +76 -0
  193. package/dist/hono/handlers/admin/mail.js.map +1 -0
  194. package/dist/hono/handlers/admin/plugins.d.ts +409 -0
  195. package/dist/hono/handlers/admin/plugins.js +257 -0
  196. package/dist/hono/handlers/admin/plugins.js.map +1 -0
  197. package/dist/hono/handlers/admin/search.d.ts +57 -0
  198. package/dist/hono/handlers/admin/search.js +55 -0
  199. package/dist/hono/handlers/admin/search.js.map +1 -0
  200. package/dist/hono/handlers/admin/security.d.ts +112 -0
  201. package/dist/hono/handlers/admin/security.js +71 -0
  202. package/dist/hono/handlers/admin/security.js.map +1 -0
  203. package/dist/hono/handlers/admin/share.d.ts +106 -0
  204. package/dist/hono/handlers/admin/share.js +55 -0
  205. package/dist/hono/handlers/admin/share.js.map +1 -0
  206. package/dist/hono/handlers/admin/storage.d.ts +55 -0
  207. package/dist/hono/handlers/admin/storage.js +40 -0
  208. package/dist/hono/handlers/admin/storage.js.map +1 -0
  209. package/dist/hono/handlers/admin/users.d.ts +1230 -0
  210. package/dist/hono/handlers/admin/users.js +316 -0
  211. package/dist/hono/handlers/admin/users.js.map +1 -0
  212. package/dist/hono/handlers/adminCrypto.d.ts +110 -0
  213. package/dist/hono/handlers/adminCrypto.js +151 -0
  214. package/dist/hono/handlers/adminCrypto.js.map +1 -0
  215. package/dist/hono/handlers/app.d.ts +26 -0
  216. package/dist/hono/handlers/app.js +34 -0
  217. package/dist/hono/handlers/app.js.map +1 -0
  218. package/dist/hono/handlers/attachment-stream.d.ts +4 -0
  219. package/dist/hono/handlers/attachment-stream.js +211 -0
  220. package/dist/hono/handlers/attachment-stream.js.map +1 -0
  221. package/dist/hono/handlers/attachment.d.ts +687 -0
  222. package/dist/hono/handlers/attachment.js +566 -0
  223. package/dist/hono/handlers/attachment.js.map +1 -0
  224. package/dist/hono/handlers/autocomplete.d.ts +160 -0
  225. package/dist/hono/handlers/autocomplete.js +181 -0
  226. package/dist/hono/handlers/autocomplete.js.map +1 -0
  227. package/dist/hono/handlers/backlink.d.ts +78 -0
  228. package/dist/hono/handlers/backlink.js +93 -0
  229. package/dist/hono/handlers/backlink.js.map +1 -0
  230. package/dist/hono/handlers/bookmark.d.ts +558 -0
  231. package/dist/hono/handlers/bookmark.js +166 -0
  232. package/dist/hono/handlers/bookmark.js.map +1 -0
  233. package/dist/hono/handlers/comment.d.ts +231 -0
  234. package/dist/hono/handlers/comment.js +191 -0
  235. package/dist/hono/handlers/comment.js.map +1 -0
  236. package/dist/hono/handlers/draft.d.ts +136 -0
  237. package/dist/hono/handlers/draft.js +191 -0
  238. package/dist/hono/handlers/draft.js.map +1 -0
  239. package/dist/hono/handlers/emailChange.d.ts +124 -0
  240. package/dist/hono/handlers/emailChange.js +79 -0
  241. package/dist/hono/handlers/emailChange.js.map +1 -0
  242. package/dist/hono/handlers/installer.d.ts +94 -0
  243. package/dist/hono/handlers/installer.js +93 -0
  244. package/dist/hono/handlers/installer.js.map +1 -0
  245. package/dist/hono/handlers/inviteAccept.d.ts +180 -0
  246. package/dist/hono/handlers/inviteAccept.js +94 -0
  247. package/dist/hono/handlers/inviteAccept.js.map +1 -0
  248. package/dist/hono/handlers/me.d.ts +401 -0
  249. package/dist/hono/handlers/me.js +390 -0
  250. package/dist/hono/handlers/me.js.map +1 -0
  251. package/dist/hono/handlers/notification.d.ts +274 -0
  252. package/dist/hono/handlers/notification.js +224 -0
  253. package/dist/hono/handlers/notification.js.map +1 -0
  254. package/dist/hono/handlers/oauth.d.ts +299 -0
  255. package/dist/hono/handlers/oauth.js +443 -0
  256. package/dist/hono/handlers/oauth.js.map +1 -0
  257. package/dist/hono/handlers/page-collab.d.ts +79 -0
  258. package/dist/hono/handlers/page-collab.js +98 -0
  259. package/dist/hono/handlers/page-collab.js.map +1 -0
  260. package/dist/hono/handlers/page-preview.d.ts +48 -0
  261. package/dist/hono/handlers/page-preview.js +83 -0
  262. package/dist/hono/handlers/page-preview.js.map +1 -0
  263. package/dist/hono/handlers/page.d.ts +2059 -0
  264. package/dist/hono/handlers/page.js +793 -0
  265. package/dist/hono/handlers/page.js.map +1 -0
  266. package/dist/hono/handlers/passwordReset.d.ts +181 -0
  267. package/dist/hono/handlers/passwordReset.js +101 -0
  268. package/dist/hono/handlers/passwordReset.js.map +1 -0
  269. package/dist/hono/handlers/presence.d.ts +178 -0
  270. package/dist/hono/handlers/presence.js +163 -0
  271. package/dist/hono/handlers/presence.js.map +1 -0
  272. package/dist/hono/handlers/revision.d.ts +345 -0
  273. package/dist/hono/handlers/revision.js +202 -0
  274. package/dist/hono/handlers/revision.js.map +1 -0
  275. package/dist/hono/handlers/search.d.ts +208 -0
  276. package/dist/hono/handlers/search.js +152 -0
  277. package/dist/hono/handlers/search.js.map +1 -0
  278. package/dist/hono/handlers/tokenAuth.d.ts +369 -0
  279. package/dist/hono/handlers/tokenAuth.js +240 -0
  280. package/dist/hono/handlers/tokenAuth.js.map +1 -0
  281. package/dist/hono/handlers/user.d.ts +710 -0
  282. package/dist/hono/handlers/user.js +212 -0
  283. package/dist/hono/handlers/user.js.map +1 -0
  284. package/dist/hono/index.d.ts +289 -0
  285. package/dist/hono/index.js +240 -0
  286. package/dist/hono/index.js.map +1 -0
  287. package/dist/hono/middleware/admin.d.ts +5 -0
  288. package/dist/hono/middleware/admin.js +34 -0
  289. package/dist/hono/middleware/admin.js.map +1 -0
  290. package/dist/hono/middleware/auth.d.ts +54 -0
  291. package/dist/hono/middleware/auth.js +142 -0
  292. package/dist/hono/middleware/auth.js.map +1 -0
  293. package/dist/hono/middleware/cors.d.ts +3 -0
  294. package/dist/hono/middleware/cors.js +86 -0
  295. package/dist/hono/middleware/cors.js.map +1 -0
  296. package/dist/hono/middleware/default-hook.d.ts +8 -0
  297. package/dist/hono/middleware/default-hook.js +17 -0
  298. package/dist/hono/middleware/default-hook.js.map +1 -0
  299. package/dist/hono/middleware/error-handler.d.ts +2 -0
  300. package/dist/hono/middleware/error-handler.js +20 -0
  301. package/dist/hono/middleware/error-handler.js.map +1 -0
  302. package/dist/hono/middleware/rate-limit.d.ts +57 -0
  303. package/dist/hono/middleware/rate-limit.js +42 -0
  304. package/dist/hono/middleware/rate-limit.js.map +1 -0
  305. package/dist/hono/middleware/require-scope.d.ts +50 -0
  306. package/dist/hono/middleware/require-scope.js +64 -0
  307. package/dist/hono/middleware/require-scope.js.map +1 -0
  308. package/dist/hono/path-rewrite.d.ts +15 -0
  309. package/dist/hono/path-rewrite.js +59 -0
  310. package/dist/hono/path-rewrite.js.map +1 -0
  311. package/dist/mail/i18n/en.d.ts +2 -0
  312. package/dist/mail/i18n/en.js +66 -0
  313. package/dist/mail/i18n/en.js.map +1 -0
  314. package/dist/mail/i18n/index.d.ts +46 -0
  315. package/dist/mail/i18n/index.js +31 -0
  316. package/dist/mail/i18n/index.js.map +1 -0
  317. package/dist/mail/i18n/ja.d.ts +2 -0
  318. package/dist/mail/i18n/ja.js +66 -0
  319. package/dist/mail/i18n/ja.js.map +1 -0
  320. package/dist/mcp/attach.d.ts +25 -0
  321. package/dist/mcp/attach.js +104 -0
  322. package/dist/mcp/attach.js.map +1 -0
  323. package/dist/mcp/dispatch.d.ts +59 -0
  324. package/dist/mcp/dispatch.js +70 -0
  325. package/dist/mcp/dispatch.js.map +1 -0
  326. package/dist/mcp/result.d.ts +40 -0
  327. package/dist/mcp/result.js +78 -0
  328. package/dist/mcp/result.js.map +1 -0
  329. package/dist/mcp/server.d.ts +67 -0
  330. package/dist/mcp/server.js +113 -0
  331. package/dist/mcp/server.js.map +1 -0
  332. package/dist/mcp/tools/page.d.ts +2 -0
  333. package/dist/mcp/tools/page.js +256 -0
  334. package/dist/mcp/tools/page.js.map +1 -0
  335. package/dist/mcp/tools/search.d.ts +2 -0
  336. package/dist/mcp/tools/search.js +36 -0
  337. package/dist/mcp/tools/search.js.map +1 -0
  338. package/dist/middlewares/accessTokenParser.d.ts +4 -0
  339. package/dist/middlewares/accessTokenParser.js +29 -0
  340. package/dist/middlewares/accessTokenParser.js.map +1 -0
  341. package/dist/middlewares/adminRequired.d.ts +10 -0
  342. package/dist/middlewares/adminRequired.js +35 -0
  343. package/dist/middlewares/adminRequired.js.map +1 -0
  344. package/dist/middlewares/applicationInstalled.d.ts +3 -0
  345. package/dist/middlewares/applicationInstalled.js +20 -0
  346. package/dist/middlewares/applicationInstalled.js.map +1 -0
  347. package/dist/middlewares/applicationNotInstalled.d.ts +3 -0
  348. package/dist/middlewares/applicationNotInstalled.js +13 -0
  349. package/dist/middlewares/applicationNotInstalled.js.map +1 -0
  350. package/dist/middlewares/basicAuth.d.ts +4 -0
  351. package/dist/middlewares/basicAuth.js +23 -0
  352. package/dist/middlewares/basicAuth.js.map +1 -0
  353. package/dist/middlewares/csrfVerify.d.ts +4 -0
  354. package/dist/middlewares/csrfVerify.js +24 -0
  355. package/dist/middlewares/csrfVerify.js.map +1 -0
  356. package/dist/middlewares/encodeSpace.d.ts +3 -0
  357. package/dist/middlewares/encodeSpace.js +14 -0
  358. package/dist/middlewares/encodeSpace.js.map +1 -0
  359. package/dist/middlewares/fileAccessRightOrLoginRequired.d.ts +4 -0
  360. package/dist/middlewares/fileAccessRightOrLoginRequired.js +29 -0
  361. package/dist/middlewares/fileAccessRightOrLoginRequired.js.map +1 -0
  362. package/dist/middlewares/index.d.ts +16 -0
  363. package/dist/middlewares/index.js +30 -0
  364. package/dist/middlewares/index.js.map +1 -0
  365. package/dist/middlewares/jwtAdminRequired.d.ts +8 -0
  366. package/dist/middlewares/jwtAdminRequired.js +35 -0
  367. package/dist/middlewares/jwtAdminRequired.js.map +1 -0
  368. package/dist/middlewares/jwtAuth.d.ts +4 -0
  369. package/dist/middlewares/jwtAuth.js +104 -0
  370. package/dist/middlewares/jwtAuth.js.map +1 -0
  371. package/dist/middlewares/loginChecker.d.ts +4 -0
  372. package/dist/middlewares/loginChecker.js +32 -0
  373. package/dist/middlewares/loginChecker.js.map +1 -0
  374. package/dist/middlewares/loginRequired.d.ts +4 -0
  375. package/dist/middlewares/loginRequired.js +88 -0
  376. package/dist/middlewares/loginRequired.js.map +1 -0
  377. package/dist/migration/cli-api.d.ts +83 -0
  378. package/dist/migration/cli-api.js +128 -0
  379. package/dist/migration/cli-api.js.map +1 -0
  380. package/dist/migration/migrations/index.d.ts +12 -0
  381. package/dist/migration/migrations/index.js +24 -0
  382. package/dist/migration/migrations/index.js.map +1 -0
  383. package/dist/migration/migrations/page-status-default.d.ts +25 -0
  384. package/dist/migration/migrations/page-status-default.js +79 -0
  385. package/dist/migration/migrations/page-status-default.js.map +1 -0
  386. package/dist/migration/migrations/revisions-schema-unify.d.ts +33 -0
  387. package/dist/migration/migrations/revisions-schema-unify.js +88 -0
  388. package/dist/migration/migrations/revisions-schema-unify.js.map +1 -0
  389. package/dist/migration/migrations/user-unique-prepare.d.ts +1 -0
  390. package/dist/migration/migrations/user-unique-prepare.js +214 -0
  391. package/dist/migration/migrations/user-unique-prepare.js.map +1 -0
  392. package/dist/migration/migrations/wikilink-format.d.ts +97 -0
  393. package/dist/migration/migrations/wikilink-format.js +418 -0
  394. package/dist/migration/migrations/wikilink-format.js.map +1 -0
  395. package/dist/migration/rebuild-api.d.ts +50 -0
  396. package/dist/migration/rebuild-api.js +45 -0
  397. package/dist/migration/rebuild-api.js.map +1 -0
  398. package/dist/migration/rebuild-runner.d.ts +64 -0
  399. package/dist/migration/rebuild-runner.js +42 -0
  400. package/dist/migration/rebuild-runner.js.map +1 -0
  401. package/dist/migration/rebuilds/index.d.ts +26 -0
  402. package/dist/migration/rebuilds/index.js +69 -0
  403. package/dist/migration/rebuilds/index.js.map +1 -0
  404. package/dist/migration/registry.d.ts +15 -0
  405. package/dist/migration/registry.js +96 -0
  406. package/dist/migration/registry.js.map +1 -0
  407. package/dist/migration/run-boot-migrations.d.ts +31 -0
  408. package/dist/migration/run-boot-migrations.js +95 -0
  409. package/dist/migration/run-boot-migrations.js.map +1 -0
  410. package/dist/migration/runner.d.ts +120 -0
  411. package/dist/migration/runner.js +276 -0
  412. package/dist/migration/runner.js.map +1 -0
  413. package/dist/migration/types.d.ts +153 -0
  414. package/dist/migration/types.js +13 -0
  415. package/dist/migration/types.js.map +1 -0
  416. package/dist/models/activity.d.ts +34 -0
  417. package/dist/models/activity.js +263 -0
  418. package/dist/models/activity.js.map +1 -0
  419. package/dist/models/attachment.d.ts +25 -0
  420. package/dist/models/attachment.js +82 -0
  421. package/dist/models/attachment.js.map +1 -0
  422. package/dist/models/backlink.d.ts +19 -0
  423. package/dist/models/backlink.js +138 -0
  424. package/dist/models/backlink.js.map +1 -0
  425. package/dist/models/bookmark.d.ts +28 -0
  426. package/dist/models/bookmark.js +136 -0
  427. package/dist/models/bookmark.js.map +1 -0
  428. package/dist/models/comment.d.ts +21 -0
  429. package/dist/models/comment.js +87 -0
  430. package/dist/models/comment.js.map +1 -0
  431. package/dist/models/config-sensitive.d.ts +21 -0
  432. package/dist/models/config-sensitive.js +71 -0
  433. package/dist/models/config-sensitive.js.map +1 -0
  434. package/dist/models/config.d.ts +34 -0
  435. package/dist/models/config.js +161 -0
  436. package/dist/models/config.js.map +1 -0
  437. package/dist/models/index.d.ts +30 -0
  438. package/dist/models/index.js +55 -0
  439. package/dist/models/index.js.map +1 -0
  440. package/dist/models/migration-application.d.ts +54 -0
  441. package/dist/models/migration-application.js +36 -0
  442. package/dist/models/migration-application.js.map +1 -0
  443. package/dist/models/notification.d.ts +28 -0
  444. package/dist/models/notification.js +285 -0
  445. package/dist/models/notification.js.map +1 -0
  446. package/dist/models/oauth-authorization-code.d.ts +34 -0
  447. package/dist/models/oauth-authorization-code.js +100 -0
  448. package/dist/models/oauth-authorization-code.js.map +1 -0
  449. package/dist/models/oauth-client.d.ts +36 -0
  450. package/dist/models/oauth-client.js +56 -0
  451. package/dist/models/oauth-client.js.map +1 -0
  452. package/dist/models/oauth-device-code.d.ts +55 -0
  453. package/dist/models/oauth-device-code.js +158 -0
  454. package/dist/models/oauth-device-code.js.map +1 -0
  455. package/dist/models/oauth-refresh-token.d.ts +31 -0
  456. package/dist/models/oauth-refresh-token.js +118 -0
  457. package/dist/models/oauth-refresh-token.js.map +1 -0
  458. package/dist/models/page-yjs-update.d.ts +35 -0
  459. package/dist/models/page-yjs-update.js +33 -0
  460. package/dist/models/page-yjs-update.js.map +1 -0
  461. package/dist/models/page.d.ts +200 -0
  462. package/dist/models/page.js +1117 -0
  463. package/dist/models/page.js.map +1 -0
  464. package/dist/models/personal-access-token.d.ts +30 -0
  465. package/dist/models/personal-access-token.js +107 -0
  466. package/dist/models/personal-access-token.js.map +1 -0
  467. package/dist/models/plugin-render-cache.d.ts +40 -0
  468. package/dist/models/plugin-render-cache.js +39 -0
  469. package/dist/models/plugin-render-cache.js.map +1 -0
  470. package/dist/models/revision.d.ts +145 -0
  471. package/dist/models/revision.js +241 -0
  472. package/dist/models/revision.js.map +1 -0
  473. package/dist/models/share.d.ts +38 -0
  474. package/dist/models/share.js +137 -0
  475. package/dist/models/share.js.map +1 -0
  476. package/dist/models/shareAccess.d.ts +20 -0
  477. package/dist/models/shareAccess.js +45 -0
  478. package/dist/models/shareAccess.js.map +1 -0
  479. package/dist/models/tracking.d.ts +14 -0
  480. package/dist/models/tracking.js +14 -0
  481. package/dist/models/tracking.js.map +1 -0
  482. package/dist/models/updatePost.d.ts +25 -0
  483. package/dist/models/updatePost.js +87 -0
  484. package/dist/models/updatePost.js.map +1 -0
  485. package/dist/models/user.d.ts +144 -0
  486. package/dist/models/user.js +681 -0
  487. package/dist/models/user.js.map +1 -0
  488. package/dist/models/watcher.d.ts +23 -0
  489. package/dist/models/watcher.js +75 -0
  490. package/dist/models/watcher.js.map +1 -0
  491. package/dist/notifications/attach.d.ts +63 -0
  492. package/dist/notifications/attach.js +426 -0
  493. package/dist/notifications/attach.js.map +1 -0
  494. package/dist/notifications/channel.d.ts +13 -0
  495. package/dist/notifications/channel.js +18 -0
  496. package/dist/notifications/channel.js.map +1 -0
  497. package/dist/plugin/index.d.ts +2 -0
  498. package/dist/plugin/index.js +6 -0
  499. package/dist/plugin/index.js.map +1 -0
  500. package/dist/plugin/plugin-context.d.ts +22 -0
  501. package/dist/plugin/plugin-context.js +126 -0
  502. package/dist/plugin/plugin-context.js.map +1 -0
  503. package/dist/plugin/plugin-manager.d.ts +164 -0
  504. package/dist/plugin/plugin-manager.js +328 -0
  505. package/dist/plugin/plugin-manager.js.map +1 -0
  506. package/dist/plugin/plugin-namespace.d.ts +28 -0
  507. package/dist/plugin/plugin-namespace.js +53 -0
  508. package/dist/plugin/plugin-namespace.js.map +1 -0
  509. package/dist/plugin/registries.d.ts +38 -0
  510. package/dist/plugin/registries.js +71 -0
  511. package/dist/plugin/registries.js.map +1 -0
  512. package/dist/plugin/schema-serializer.d.ts +34 -0
  513. package/dist/plugin/schema-serializer.js +122 -0
  514. package/dist/plugin/schema-serializer.js.map +1 -0
  515. package/dist/plugin/topo-sort.d.ts +15 -0
  516. package/dist/plugin/topo-sort.js +59 -0
  517. package/dist/plugin/topo-sort.js.map +1 -0
  518. package/dist/presence/attach.d.ts +36 -0
  519. package/dist/presence/attach.js +399 -0
  520. package/dist/presence/attach.js.map +1 -0
  521. package/dist/renderer/__fixtures__/echo-embed.d.ts +27 -0
  522. package/dist/renderer/__fixtures__/echo-embed.js +24 -0
  523. package/dist/renderer/__fixtures__/echo-embed.js.map +1 -0
  524. package/dist/renderer/cache/index.d.ts +60 -0
  525. package/dist/renderer/cache/index.js +219 -0
  526. package/dist/renderer/cache/index.js.map +1 -0
  527. package/dist/renderer/cache/mongodb-cache.d.ts +82 -0
  528. package/dist/renderer/cache/mongodb-cache.js +180 -0
  529. package/dist/renderer/cache/mongodb-cache.js.map +1 -0
  530. package/dist/renderer/cache/reservation.d.ts +20 -0
  531. package/dist/renderer/cache/reservation.js +115 -0
  532. package/dist/renderer/cache/reservation.js.map +1 -0
  533. package/dist/renderer/core/_mdast-walk.d.ts +35 -0
  534. package/dist/renderer/core/_mdast-walk.js +45 -0
  535. package/dist/renderer/core/_mdast-walk.js.map +1 -0
  536. package/dist/renderer/core/code-block-dispatch.d.ts +31 -0
  537. package/dist/renderer/core/code-block-dispatch.js +166 -0
  538. package/dist/renderer/core/code-block-dispatch.js.map +1 -0
  539. package/dist/renderer/core/code-blocks.d.ts +12 -0
  540. package/dist/renderer/core/code-blocks.js +32 -0
  541. package/dist/renderer/core/code-blocks.js.map +1 -0
  542. package/dist/renderer/core/embed-tags.d.ts +14 -0
  543. package/dist/renderer/core/embed-tags.js +154 -0
  544. package/dist/renderer/core/embed-tags.js.map +1 -0
  545. package/dist/renderer/core/headings.d.ts +16 -0
  546. package/dist/renderer/core/headings.js +31 -0
  547. package/dist/renderer/core/headings.js.map +1 -0
  548. package/dist/renderer/core/index.d.ts +65 -0
  549. package/dist/renderer/core/index.js +83 -0
  550. package/dist/renderer/core/index.js.map +1 -0
  551. package/dist/renderer/core/mention-resolve.d.ts +39 -0
  552. package/dist/renderer/core/mention-resolve.js +75 -0
  553. package/dist/renderer/core/mention-resolve.js.map +1 -0
  554. package/dist/renderer/core/mentions.d.ts +2 -0
  555. package/dist/renderer/core/mentions.js +83 -0
  556. package/dist/renderer/core/mentions.js.map +1 -0
  557. package/dist/renderer/core/syntax-highlight.d.ts +21 -0
  558. package/dist/renderer/core/syntax-highlight.js +64 -0
  559. package/dist/renderer/core/syntax-highlight.js.map +1 -0
  560. package/dist/renderer/core/url-inline-expand.d.ts +9 -0
  561. package/dist/renderer/core/url-inline-expand.js +157 -0
  562. package/dist/renderer/core/url-inline-expand.js.map +1 -0
  563. package/dist/renderer/core/wikilinks.d.ts +2 -0
  564. package/dist/renderer/core/wikilinks.js +118 -0
  565. package/dist/renderer/core/wikilinks.js.map +1 -0
  566. package/dist/renderer/index.d.ts +67 -0
  567. package/dist/renderer/index.js +99 -0
  568. package/dist/renderer/index.js.map +1 -0
  569. package/dist/renderer/pipeline.d.ts +134 -0
  570. package/dist/renderer/pipeline.js +203 -0
  571. package/dist/renderer/pipeline.js.map +1 -0
  572. package/dist/renderer/registry.d.ts +83 -0
  573. package/dist/renderer/registry.js +130 -0
  574. package/dist/renderer/registry.js.map +1 -0
  575. package/dist/renderer/serialize.d.ts +27 -0
  576. package/dist/renderer/serialize.js +46 -0
  577. package/dist/renderer/serialize.js.map +1 -0
  578. package/dist/renderer/version.d.ts +30 -0
  579. package/dist/renderer/version.js +34 -0
  580. package/dist/renderer/version.js.map +1 -0
  581. package/dist/routes/admin.d.ts +4 -0
  582. package/dist/routes/admin.js +17 -0
  583. package/dist/routes/admin.js.map +1 -0
  584. package/dist/routes/api/admin.d.ts +4 -0
  585. package/dist/routes/api/admin.js +37 -0
  586. package/dist/routes/api/admin.js.map +1 -0
  587. package/dist/routes/api/attachment.d.ts +4 -0
  588. package/dist/routes/api/attachment.js +19 -0
  589. package/dist/routes/api/attachment.js.map +1 -0
  590. package/dist/routes/api/bookmark.d.ts +4 -0
  591. package/dist/routes/api/bookmark.js +15 -0
  592. package/dist/routes/api/bookmark.js.map +1 -0
  593. package/dist/routes/api/comment.d.ts +4 -0
  594. package/dist/routes/api/comment.js +14 -0
  595. package/dist/routes/api/comment.js.map +1 -0
  596. package/dist/routes/api/index.d.ts +4 -0
  597. package/dist/routes/api/index.js +36 -0
  598. package/dist/routes/api/index.js.map +1 -0
  599. package/dist/routes/api/like.d.ts +4 -0
  600. package/dist/routes/api/like.js +13 -0
  601. package/dist/routes/api/like.js.map +1 -0
  602. package/dist/routes/api/notification.d.ts +4 -0
  603. package/dist/routes/api/notification.js +15 -0
  604. package/dist/routes/api/notification.js.map +1 -0
  605. package/dist/routes/api/page.d.ts +4 -0
  606. package/dist/routes/api/page.js +24 -0
  607. package/dist/routes/api/page.js.map +1 -0
  608. package/dist/routes/api/revision.d.ts +4 -0
  609. package/dist/routes/api/revision.js +14 -0
  610. package/dist/routes/api/revision.js.map +1 -0
  611. package/dist/routes/api/share.d.ts +4 -0
  612. package/dist/routes/api/share.js +16 -0
  613. package/dist/routes/api/share.js.map +1 -0
  614. package/dist/routes/api/version.d.ts +4 -0
  615. package/dist/routes/api/version.js +10 -0
  616. package/dist/routes/api/version.js.map +1 -0
  617. package/dist/routes/index.d.ts +4 -0
  618. package/dist/routes/index.js +71 -0
  619. package/dist/routes/index.js.map +1 -0
  620. package/dist/routes/login.d.ts +4 -0
  621. package/dist/routes/login.js +18 -0
  622. package/dist/routes/login.js.map +1 -0
  623. package/dist/routes/me.d.ts +4 -0
  624. package/dist/routes/me.js +24 -0
  625. package/dist/routes/me.js.map +1 -0
  626. package/dist/routes/ts-rest/admin/app.d.ts +4 -0
  627. package/dist/routes/ts-rest/admin/app.js +67 -0
  628. package/dist/routes/ts-rest/admin/app.js.map +1 -0
  629. package/dist/routes/ts-rest/admin/auth.d.ts +4 -0
  630. package/dist/routes/ts-rest/admin/auth.js +95 -0
  631. package/dist/routes/ts-rest/admin/auth.js.map +1 -0
  632. package/dist/routes/ts-rest/admin/index.d.ts +10 -0
  633. package/dist/routes/ts-rest/admin/index.js +35 -0
  634. package/dist/routes/ts-rest/admin/index.js.map +1 -0
  635. package/dist/routes/ts-rest/admin/mail.d.ts +4 -0
  636. package/dist/routes/ts-rest/admin/mail.js +156 -0
  637. package/dist/routes/ts-rest/admin/mail.js.map +1 -0
  638. package/dist/routes/ts-rest/admin/plugins.d.ts +4 -0
  639. package/dist/routes/ts-rest/admin/plugins.js +317 -0
  640. package/dist/routes/ts-rest/admin/plugins.js.map +1 -0
  641. package/dist/routes/ts-rest/admin/search.d.ts +4 -0
  642. package/dist/routes/ts-rest/admin/search.js +67 -0
  643. package/dist/routes/ts-rest/admin/search.js.map +1 -0
  644. package/dist/routes/ts-rest/admin/security.d.ts +4 -0
  645. package/dist/routes/ts-rest/admin/security.js +114 -0
  646. package/dist/routes/ts-rest/admin/security.js.map +1 -0
  647. package/dist/routes/ts-rest/admin/share.d.ts +4 -0
  648. package/dist/routes/ts-rest/admin/share.js +69 -0
  649. package/dist/routes/ts-rest/admin/share.js.map +1 -0
  650. package/dist/routes/ts-rest/admin/storage.d.ts +4 -0
  651. package/dist/routes/ts-rest/admin/storage.js +59 -0
  652. package/dist/routes/ts-rest/admin/storage.js.map +1 -0
  653. package/dist/routes/ts-rest/admin/users.d.ts +4 -0
  654. package/dist/routes/ts-rest/admin/users.js +215 -0
  655. package/dist/routes/ts-rest/admin/users.js.map +1 -0
  656. package/dist/routes/ts-rest/adminCrypto.d.ts +4 -0
  657. package/dist/routes/ts-rest/adminCrypto.js +111 -0
  658. package/dist/routes/ts-rest/adminCrypto.js.map +1 -0
  659. package/dist/routes/ts-rest/app.d.ts +4 -0
  660. package/dist/routes/ts-rest/app.js +23 -0
  661. package/dist/routes/ts-rest/app.js.map +1 -0
  662. package/dist/routes/ts-rest/attachment.d.ts +4 -0
  663. package/dist/routes/ts-rest/attachment.js +830 -0
  664. package/dist/routes/ts-rest/attachment.js.map +1 -0
  665. package/dist/routes/ts-rest/auth.d.ts +4 -0
  666. package/dist/routes/ts-rest/auth.js +70 -0
  667. package/dist/routes/ts-rest/auth.js.map +1 -0
  668. package/dist/routes/ts-rest/autocomplete.d.ts +30 -0
  669. package/dist/routes/ts-rest/autocomplete.js +189 -0
  670. package/dist/routes/ts-rest/autocomplete.js.map +1 -0
  671. package/dist/routes/ts-rest/backlink.d.ts +4 -0
  672. package/dist/routes/ts-rest/backlink.js +106 -0
  673. package/dist/routes/ts-rest/backlink.js.map +1 -0
  674. package/dist/routes/ts-rest/bookmark.d.ts +4 -0
  675. package/dist/routes/ts-rest/bookmark.js +189 -0
  676. package/dist/routes/ts-rest/bookmark.js.map +1 -0
  677. package/dist/routes/ts-rest/comment.d.ts +4 -0
  678. package/dist/routes/ts-rest/comment.js +217 -0
  679. package/dist/routes/ts-rest/comment.js.map +1 -0
  680. package/dist/routes/ts-rest/draft.d.ts +22 -0
  681. package/dist/routes/ts-rest/draft.js +200 -0
  682. package/dist/routes/ts-rest/draft.js.map +1 -0
  683. package/dist/routes/ts-rest/index.d.ts +4 -0
  684. package/dist/routes/ts-rest/index.js +103 -0
  685. package/dist/routes/ts-rest/index.js.map +1 -0
  686. package/dist/routes/ts-rest/installer.d.ts +4 -0
  687. package/dist/routes/ts-rest/installer.js +77 -0
  688. package/dist/routes/ts-rest/installer.js.map +1 -0
  689. package/dist/routes/ts-rest/me.d.ts +4 -0
  690. package/dist/routes/ts-rest/me.js +410 -0
  691. package/dist/routes/ts-rest/me.js.map +1 -0
  692. package/dist/routes/ts-rest/notification.d.ts +4 -0
  693. package/dist/routes/ts-rest/notification.js +241 -0
  694. package/dist/routes/ts-rest/notification.js.map +1 -0
  695. package/dist/routes/ts-rest/page-collab.d.ts +29 -0
  696. package/dist/routes/ts-rest/page-collab.js +90 -0
  697. package/dist/routes/ts-rest/page-collab.js.map +1 -0
  698. package/dist/routes/ts-rest/page-preview.d.ts +26 -0
  699. package/dist/routes/ts-rest/page-preview.js +80 -0
  700. package/dist/routes/ts-rest/page-preview.js.map +1 -0
  701. package/dist/routes/ts-rest/page.d.ts +4 -0
  702. package/dist/routes/ts-rest/page.js +676 -0
  703. package/dist/routes/ts-rest/page.js.map +1 -0
  704. package/dist/routes/ts-rest/presence.d.ts +30 -0
  705. package/dist/routes/ts-rest/presence.js +155 -0
  706. package/dist/routes/ts-rest/presence.js.map +1 -0
  707. package/dist/routes/ts-rest/revision.d.ts +4 -0
  708. package/dist/routes/ts-rest/revision.js +240 -0
  709. package/dist/routes/ts-rest/revision.js.map +1 -0
  710. package/dist/routes/ts-rest/search.d.ts +4 -0
  711. package/dist/routes/ts-rest/search.js +121 -0
  712. package/dist/routes/ts-rest/search.js.map +1 -0
  713. package/dist/routes/ts-rest/tokenAuth.d.ts +4 -0
  714. package/dist/routes/ts-rest/tokenAuth.js +94 -0
  715. package/dist/routes/ts-rest/tokenAuth.js.map +1 -0
  716. package/dist/routes/ts-rest/user.d.ts +4 -0
  717. package/dist/routes/ts-rest/user.js +307 -0
  718. package/dist/routes/ts-rest/user.js.map +1 -0
  719. package/dist/service/config.d.ts +50 -0
  720. package/dist/service/config.js +202 -0
  721. package/dist/service/config.js.map +1 -0
  722. package/dist/service/lru.d.ts +11 -0
  723. package/dist/service/lru.js +47 -0
  724. package/dist/service/lru.js.map +1 -0
  725. package/dist/service/mail.d.ts +107 -0
  726. package/dist/service/mail.js +220 -0
  727. package/dist/service/mail.js.map +1 -0
  728. package/dist/service/notification.d.ts +9 -0
  729. package/dist/service/notification.js +19 -0
  730. package/dist/service/notification.js.map +1 -0
  731. package/dist/service/presence.d.ts +219 -0
  732. package/dist/service/presence.js +602 -0
  733. package/dist/service/presence.js.map +1 -0
  734. package/dist/types/error.d.ts +13 -0
  735. package/dist/types/error.js +13 -0
  736. package/dist/types/error.js.map +1 -0
  737. package/dist/types/express.d.ts +34 -0
  738. package/dist/types/express.js +50 -0
  739. package/dist/types/express.js.map +1 -0
  740. package/dist/types/mongoose-extensions.d.ts +8 -0
  741. package/dist/types/mongoose-extensions.js +24 -0
  742. package/dist/types/mongoose-extensions.js.map +1 -0
  743. package/dist/util/accessTokenParser.d.ts +1 -0
  744. package/dist/util/accessTokenParser.js +34 -0
  745. package/dist/util/accessTokenParser.js.map +1 -0
  746. package/dist/util/activityDefine.d.ts +15 -0
  747. package/dist/util/activityDefine.js +52 -0
  748. package/dist/util/activityDefine.js.map +1 -0
  749. package/dist/util/admin-config.d.ts +57 -0
  750. package/dist/util/admin-config.js +99 -0
  751. package/dist/util/admin-config.js.map +1 -0
  752. package/dist/util/admin-pager.d.ts +24 -0
  753. package/dist/util/admin-pager.js +73 -0
  754. package/dist/util/admin-pager.js.map +1 -0
  755. package/dist/util/apiPaginate.d.ts +11 -0
  756. package/dist/util/apiPaginate.js +33 -0
  757. package/dist/util/apiPaginate.js.map +1 -0
  758. package/dist/util/apiResponse.d.ts +9 -0
  759. package/dist/util/apiResponse.js +23 -0
  760. package/dist/util/apiResponse.js.map +1 -0
  761. package/dist/util/auth.d.ts +11 -0
  762. package/dist/util/auth.js +48 -0
  763. package/dist/util/auth.js.map +1 -0
  764. package/dist/util/auto-watch.d.ts +35 -0
  765. package/dist/util/auto-watch.js +24 -0
  766. package/dist/util/auto-watch.js.map +1 -0
  767. package/dist/util/autocomplete-match.d.ts +44 -0
  768. package/dist/util/autocomplete-match.js +80 -0
  769. package/dist/util/autocomplete-match.js.map +1 -0
  770. package/dist/util/aws-config-migration.d.ts +11 -0
  771. package/dist/util/aws-config-migration.js +68 -0
  772. package/dist/util/aws-config-migration.js.map +1 -0
  773. package/dist/util/boot-reporter.d.ts +130 -0
  774. package/dist/util/boot-reporter.js +242 -0
  775. package/dist/util/boot-reporter.js.map +1 -0
  776. package/dist/util/collab-cap.d.ts +39 -0
  777. package/dist/util/collab-cap.js +90 -0
  778. package/dist/util/collab-cap.js.map +1 -0
  779. package/dist/util/crypto.d.ts +39 -0
  780. package/dist/util/crypto.js +105 -0
  781. package/dist/util/crypto.js.map +1 -0
  782. package/dist/util/dedup-users.d.ts +96 -0
  783. package/dist/util/dedup-users.js +149 -0
  784. package/dist/util/dedup-users.js.map +1 -0
  785. package/dist/util/editor-cap-counter.d.ts +90 -0
  786. package/dist/util/editor-cap-counter.js +175 -0
  787. package/dist/util/editor-cap-counter.js.map +1 -0
  788. package/dist/util/fileUploader.d.ts +55 -0
  789. package/dist/util/fileUploader.js +70 -0
  790. package/dist/util/fileUploader.js.map +1 -0
  791. package/dist/util/formUtil.d.ts +2 -0
  792. package/dist/util/formUtil.js +15 -0
  793. package/dist/util/formUtil.js.map +1 -0
  794. package/dist/util/githubAuth.d.ts +2 -0
  795. package/dist/util/githubAuth.js +82 -0
  796. package/dist/util/githubAuth.js.map +1 -0
  797. package/dist/util/googleAuth.d.ts +2 -0
  798. package/dist/util/googleAuth.js +85 -0
  799. package/dist/util/googleAuth.js.map +1 -0
  800. package/dist/util/jwt.d.ts +50 -0
  801. package/dist/util/jwt.js +127 -0
  802. package/dist/util/jwt.js.map +1 -0
  803. package/dist/util/linkDetector.d.ts +3 -0
  804. package/dist/util/linkDetector.js +91 -0
  805. package/dist/util/linkDetector.js.map +1 -0
  806. package/dist/util/mail-token.d.ts +24 -0
  807. package/dist/util/mail-token.js +117 -0
  808. package/dist/util/mail-token.js.map +1 -0
  809. package/dist/util/mailer.d.ts +7 -0
  810. package/dist/util/mailer.js +98 -0
  811. package/dist/util/mailer.js.map +1 -0
  812. package/dist/util/map-duplicate-key-error.d.ts +26 -0
  813. package/dist/util/map-duplicate-key-error.js +41 -0
  814. package/dist/util/map-duplicate-key-error.js.map +1 -0
  815. package/dist/util/mongoose-paginate.d.ts +10 -0
  816. package/dist/util/mongoose-paginate.js +23 -0
  817. package/dist/util/mongoose-paginate.js.map +1 -0
  818. package/dist/util/notifications-token.d.ts +35 -0
  819. package/dist/util/notifications-token.js +140 -0
  820. package/dist/util/notifications-token.js.map +1 -0
  821. package/dist/util/oauth-client-seed.d.ts +2 -0
  822. package/dist/util/oauth-client-seed.js +48 -0
  823. package/dist/util/oauth-client-seed.js.map +1 -0
  824. package/dist/util/oauth-redirect-uri.d.ts +2 -0
  825. package/dist/util/oauth-redirect-uri.js +55 -0
  826. package/dist/util/oauth-redirect-uri.js.map +1 -0
  827. package/dist/util/page-response.d.ts +113 -0
  828. package/dist/util/page-response.js +154 -0
  829. package/dist/util/page-response.js.map +1 -0
  830. package/dist/util/page-search-index.d.ts +19 -0
  831. package/dist/util/page-search-index.js +91 -0
  832. package/dist/util/page-search-index.js.map +1 -0
  833. package/dist/util/page-status-migration.d.ts +23 -0
  834. package/dist/util/page-status-migration.js +48 -0
  835. package/dist/util/page-status-migration.js.map +1 -0
  836. package/dist/util/path.d.ts +2 -0
  837. package/dist/util/path.js +12 -0
  838. package/dist/util/path.js.map +1 -0
  839. package/dist/util/pkce.d.ts +13 -0
  840. package/dist/util/pkce.js +30 -0
  841. package/dist/util/pkce.js.map +1 -0
  842. package/dist/util/presence-token.d.ts +21 -0
  843. package/dist/util/presence-token.js +120 -0
  844. package/dist/util/presence-token.js.map +1 -0
  845. package/dist/util/rate-limit.d.ts +67 -0
  846. package/dist/util/rate-limit.js +87 -0
  847. package/dist/util/rate-limit.js.map +1 -0
  848. package/dist/util/rebuild-backlink.d.ts +25 -0
  849. package/dist/util/rebuild-backlink.js +7 -0
  850. package/dist/util/rebuild-backlink.js.map +1 -0
  851. package/dist/util/rebuild-renderer.d.ts +31 -0
  852. package/dist/util/rebuild-renderer.js +7 -0
  853. package/dist/util/rebuild-renderer.js.map +1 -0
  854. package/dist/util/redis-opts.d.ts +17 -0
  855. package/dist/util/redis-opts.js +40 -0
  856. package/dist/util/redis-opts.js.map +1 -0
  857. package/dist/util/regex.d.ts +2 -0
  858. package/dist/util/regex.js +8 -0
  859. package/dist/util/regex.js.map +1 -0
  860. package/dist/util/search-rebuild.d.ts +18 -0
  861. package/dist/util/search-rebuild.js +28 -0
  862. package/dist/util/search-rebuild.js.map +1 -0
  863. package/dist/util/ssr.d.ts +3 -0
  864. package/dist/util/ssr.js +9 -0
  865. package/dist/util/ssr.js.map +1 -0
  866. package/dist/util/storage-copy.d.ts +40 -0
  867. package/dist/util/storage-copy.js +123 -0
  868. package/dist/util/storage-copy.js.map +1 -0
  869. package/dist/util/ts-rest-helpers.d.ts +110 -0
  870. package/dist/util/ts-rest-helpers.js +110 -0
  871. package/dist/util/ts-rest-helpers.js.map +1 -0
  872. package/dist/util/url.d.ts +1 -0
  873. package/dist/util/url.js +11 -0
  874. package/dist/util/url.js.map +1 -0
  875. package/dist/util/user-code.d.ts +10 -0
  876. package/dist/util/user-code.js +55 -0
  877. package/dist/util/user-code.js.map +1 -0
  878. package/dist/util/view.d.ts +10 -0
  879. package/dist/util/view.js +99 -0
  880. package/dist/util/view.js.map +1 -0
  881. package/dist/util/watcher-backfill.d.ts +30 -0
  882. package/dist/util/watcher-backfill.js +43 -0
  883. package/dist/util/watcher-backfill.js.map +1 -0
  884. package/dist/util/ws-token.d.ts +24 -0
  885. package/dist/util/ws-token.js +134 -0
  886. package/dist/util/ws-token.js.map +1 -0
  887. package/package.json +106 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pageToResponse = exports.computeRevisionRenderArtifactsAsync = exports.resolveRevisionMeta = exports.toRevisionResponse = exports.isPopulatedRevision = void 0;
4
+ const revision_1 = require("../models/revision");
5
+ const version_1 = require("../renderer/version");
6
+ const ts_rest_helpers_1 = require("./ts-rest-helpers");
7
+ /**
8
+ * Heuristic: a `revision` field is populated when it has the `_id` + `path`
9
+ * + `body` triplet. Plain `ObjectId` refs only carry `_id`.
10
+ */
11
+ const isPopulatedRevision = (value) => {
12
+ return typeof value === 'object' && value !== null && '_id' in value && 'path' in value && 'body' in value;
13
+ };
14
+ exports.isPopulatedRevision = isPopulatedRevision;
15
+ // Epoch fallback (not "now") so a document missing timestamps doesn't
16
+ // look like it was just created — schema only requires the field be set.
17
+ const EPOCH_ISO = new Date(0).toISOString();
18
+ const toRevisionResponse = (revision, options = {}) => ({
19
+ _id: revision._id.toString(),
20
+ path: revision.path,
21
+ body: revision.body,
22
+ format: revision.format || 'markdown',
23
+ author: revision.author ? (0, ts_rest_helpers_1.toPageUser)(revision.author) : null,
24
+ ...(revision.editVia !== undefined ? { editVia: revision.editVia } : {}),
25
+ createdAt: (0, ts_rest_helpers_1.toISOStringOrNull)(revision.createdAt) || EPOCH_ISO,
26
+ // Sync path: only emits stored meta + renderedAst. Detail endpoints
27
+ // (getPage, getRevision) compose with `computeRevisionRenderArtifactsAsync`
28
+ // afterwards to fold in the on-the-fly fallback for legacy revisions.
29
+ meta: (0, exports.resolveRevisionMeta)(revision.meta, options.withMeta),
30
+ ...(options.withRenderedAst ? { renderedAst: revision.renderedAst, rendererVersion: revision.rendererVersion } : {}),
31
+ });
32
+ exports.toRevisionResponse = toRevisionResponse;
33
+ const resolveRevisionMeta = (stored, emit) => {
34
+ if (!emit)
35
+ return undefined;
36
+ if (!stored)
37
+ return undefined;
38
+ const out = pickStoredMeta(stored);
39
+ return Object.keys(out).length > 0 ? out : undefined;
40
+ };
41
+ exports.resolveRevisionMeta = resolveRevisionMeta;
42
+ // Avoids leaking Mongoose internals (the document carries `$__` etc.)
43
+ // into the response shape.
44
+ function pickStoredMeta(stored) {
45
+ const out = {};
46
+ if (stored.toc !== undefined)
47
+ out.toc = stored.toc;
48
+ if (stored.wikiLinks !== undefined)
49
+ out.wikiLinks = stored.wikiLinks;
50
+ if (stored.mentions !== undefined)
51
+ out.mentions = stored.mentions;
52
+ if (stored.codeBlockLanguages !== undefined)
53
+ out.codeBlockLanguages = stored.codeBlockLanguages;
54
+ return out;
55
+ }
56
+ /**
57
+ * Async fallback compute for revision render artifacts (meta +
58
+ * renderedAst). Detail endpoints (getPage, getRevision) call this AFTER
59
+ * `pageToResponse` so the projection path stays sync; meta + AST get
60
+ * attached to the populated revision response in one go.
61
+ *
62
+ * Why one call instead of two: legacy revisions (Phase 1: only `toc`
63
+ * stored / Phase 2: meta but no `renderedAst`) would otherwise trigger
64
+ * back-to-back `runMetadata` + `runRender` invocations, each running a
65
+ * full parse+transform+shiki pipeline on the same body. `runRender`
66
+ * already produces both, so fold the calls into one and pull the
67
+ * needed pieces out.
68
+ *
69
+ * Stored values stay authoritative on merge: Phase 1's `toc` (the
70
+ * anchor ids the heading stamper aligns against) wins over recomputed
71
+ * ones, and a stored `renderedAst` is returned verbatim without
72
+ * re-rendering.
73
+ */
74
+ const computeRevisionRenderArtifactsAsync = async (crowi, storedMeta, storedAst, body, storedRendererVersion, pageId) => {
75
+ const fromStored = storedMeta ? pickStoredMeta(storedMeta) : {};
76
+ // Phase 2-written revisions persist all 4 meta fields (even empty
77
+ // arrays); the presence of these 3 is the marker that no fallback
78
+ // is needed for meta.
79
+ const metaIsComplete = fromStored.wikiLinks !== undefined && fromStored.mentions !== undefined && fromStored.codeBlockLanguages !== undefined;
80
+ const astIsStored = storedAst !== undefined;
81
+ // RFC-0002 round 3.1: a stored `rendererVersion` that does NOT match
82
+ // the running pipeline marks the AST as stale. A missing
83
+ // `rendererVersion` (revisions saved before this field landed) is
84
+ // treated as "trust the stored AST" — re-rendering every pre-existing
85
+ // revision on every read would be unaffordable, and the user-facing
86
+ // workaround (re-save the page) is already documented. Once
87
+ // `renderer:rebuild` lands (RFC-0008), operators can backfill.
88
+ const astIsFresh = astIsStored && (storedRendererVersion === undefined || storedRendererVersion === version_1.RENDERER_PIPELINE_VERSION);
89
+ if (metaIsComplete && astIsFresh) {
90
+ return {
91
+ meta: Object.keys(fromStored).length > 0 ? fromStored : undefined,
92
+ renderedAst: storedAst,
93
+ };
94
+ }
95
+ if (!body) {
96
+ return {
97
+ meta: metaIsComplete && Object.keys(fromStored).length > 0 ? fromStored : undefined,
98
+ renderedAst: astIsFresh ? storedAst : undefined,
99
+ };
100
+ }
101
+ // `pageId` threads through so the Phase 4+ plugin-dispatch transforms
102
+ // (embed-tag / url-inline-expand / code-block) can fire on the
103
+ // fallback path the same way they do at save time. Callers that
104
+ // genuinely don't know the page (unit tests, orphan revision bodies)
105
+ // can omit it — dispatch then degrades to no-op and the `code` /
106
+ // `@[tag](url)` nodes survive as plain text.
107
+ const { metadata, renderedAst } = await crowi.getRenderer().runRender(body, { mode: 'read', pageId });
108
+ const mergedMeta = { ...pickStoredMeta((0, revision_1.metadataToRevisionMeta)(metadata)), ...fromStored };
109
+ return {
110
+ meta: Object.keys(mergedMeta).length > 0 ? mergedMeta : undefined,
111
+ renderedAst: astIsFresh ? storedAst : renderedAst,
112
+ };
113
+ };
114
+ exports.computeRevisionRenderArtifactsAsync = computeRevisionRenderArtifactsAsync;
115
+ /**
116
+ * Project a populated Page document (or plain `PageLike`) into the contract
117
+ * Page shape. Unpopulated refs collapse safely:
118
+ * - revision: ObjectId-ref → undefined
119
+ * - creator / lastUpdateUser: ObjectId-ref → null
120
+ *
121
+ * Returns `any` because the runtime shape satisfies either `Page` or
122
+ * `PageWithRevision` depending on whether revision was populated; ts-rest
123
+ * contracts pin one or the other and each handler narrows at its return.
124
+ */
125
+ // biome-ignore lint/suspicious/noExplicitAny: see jsdoc
126
+ const pageToResponse = (page, options = {}) => {
127
+ const pageObj = typeof page.toObject === 'function' ? page.toObject() : page;
128
+ // likerCount / seenUsersCount are dynamic properties set by populatePageData
129
+ // on the Mongoose document; toObject() drops them, so read off the original.
130
+ const dynamic = page;
131
+ return {
132
+ _id: (0, ts_rest_helpers_1.toStringId)(pageObj._id),
133
+ path: pageObj.path,
134
+ revision: pageObj.revision && (0, exports.isPopulatedRevision)(pageObj.revision)
135
+ ? (0, exports.toRevisionResponse)(pageObj.revision, { withMeta: options.withMeta, withRenderedAst: options.withRenderedAst })
136
+ : undefined,
137
+ redirectTo: pageObj.redirectTo || null,
138
+ status: pageObj.status || undefined,
139
+ grant: pageObj.grant,
140
+ grantedUsers: pageObj.grantedUsers?.map(ts_rest_helpers_1.toStringId) || [],
141
+ creator: pageObj.creator && (0, ts_rest_helpers_1.isPopulatedUser)(pageObj.creator) ? (0, ts_rest_helpers_1.toPageUser)(pageObj.creator) : null,
142
+ lastUpdateUser: pageObj.lastUpdateUser && (0, ts_rest_helpers_1.isPopulatedUser)(pageObj.lastUpdateUser) ? (0, ts_rest_helpers_1.toPageUser)(pageObj.lastUpdateUser) : null,
143
+ liker: pageObj.liker?.map(ts_rest_helpers_1.toStringId) || [],
144
+ commentCount: pageObj.commentCount || 0,
145
+ extended: pageObj.extended,
146
+ createdAt: (0, ts_rest_helpers_1.toISOStringOrNull)(pageObj.createdAt) || EPOCH_ISO,
147
+ updatedAt: (0, ts_rest_helpers_1.toISOStringOrNull)(pageObj.updatedAt) || undefined,
148
+ latestRevision: pageObj.latestRevision ? (0, ts_rest_helpers_1.toStringId)(pageObj.latestRevision) : undefined,
149
+ likerCount: dynamic.likerCount,
150
+ seenUsersCount: dynamic.seenUsersCount,
151
+ };
152
+ };
153
+ exports.pageToResponse = pageToResponse;
154
+ //# sourceMappingURL=page-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-response.js","sourceRoot":"","sources":["../../src/util/page-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type Crowi from '../crowi';
2
+ import { type PageLike } from './page-response';
3
+ /**
4
+ * Push a page into the active search driver after a save / rename.
5
+ * Pages that have become redirects or `status='deleted'` are removed
6
+ * from the index instead — mirrors `shouldIndex()` in the ES driver's
7
+ * rebuild path.
8
+ *
9
+ * RFC-0004: `status='draft'` pages are likewise kept out of the index
10
+ * — a draft is visible only to its author, and search results have no
11
+ * per-viewer draft-author filter. When the author publishes (Phase 3),
12
+ * the resulting `update` event re-runs this helper with
13
+ * `status='published'` and the page is indexed normally.
14
+ *
15
+ * Fire-and-forget at the call site: the helper logs and swallows
16
+ * errors so a search-cluster outage never breaks page CRUD.
17
+ */
18
+ export declare function indexPageInSearch(crowi: Crowi, page: PageLike): Promise<void>;
19
+ export declare function removePageFromSearch(crowi: Crowi, page: PageLike): Promise<void>;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.indexPageInSearch = indexPageInSearch;
7
+ exports.removePageFromSearch = removePageFromSearch;
8
+ const page_1 = require("../models/page");
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const ts_rest_helpers_1 = require("./ts-rest-helpers");
11
+ const page_response_1 = require("./page-response");
12
+ const debug = (0, debug_1.default)('crowi:util:page-search-index');
13
+ /**
14
+ * Push a page into the active search driver after a save / rename.
15
+ * Pages that have become redirects or `status='deleted'` are removed
16
+ * from the index instead — mirrors `shouldIndex()` in the ES driver's
17
+ * rebuild path.
18
+ *
19
+ * RFC-0004: `status='draft'` pages are likewise kept out of the index
20
+ * — a draft is visible only to its author, and search results have no
21
+ * per-viewer draft-author filter. When the author publishes (Phase 3),
22
+ * the resulting `update` event re-runs this helper with
23
+ * `status='published'` and the page is indexed normally.
24
+ *
25
+ * Fire-and-forget at the call site: the helper logs and swallows
26
+ * errors so a search-cluster outage never breaks page CRUD.
27
+ */
28
+ async function indexPageInSearch(crowi, page) {
29
+ const searcher = crowi.getSearcher();
30
+ if (!searcher)
31
+ return;
32
+ const id = (0, ts_rest_helpers_1.toStringId)(page._id);
33
+ try {
34
+ if (page.redirectTo || page.status === page_1.STATUS_DELETED || page.status === page_1.STATUS_DRAFT) {
35
+ await searcher.remove(id);
36
+ return;
37
+ }
38
+ // The rename path emits 'update' with revision still as an
39
+ // ObjectId ref, so refetch when the payload isn't already
40
+ // carrying a populated revision body.
41
+ const target = (0, page_response_1.isPopulatedRevision)(page.revision) ? page : await refetchPopulated(crowi, id);
42
+ if (!target) {
43
+ await searcher.remove(id);
44
+ return;
45
+ }
46
+ if (target.redirectTo || target.status === page_1.STATUS_DELETED || target.status === page_1.STATUS_DRAFT) {
47
+ await searcher.remove(id);
48
+ return;
49
+ }
50
+ if (!(0, page_response_1.isPopulatedRevision)(target.revision) || !target.revision.body) {
51
+ debug('skip: no revision body for page %s', id);
52
+ return;
53
+ }
54
+ const creator = (0, ts_rest_helpers_1.isPopulatedUser)(target.creator) ? target.creator : null;
55
+ const doc = {
56
+ id,
57
+ path: target.path,
58
+ body: target.revision.body,
59
+ meta: {
60
+ username: creator?.username,
61
+ grant: target.grant,
62
+ granted_users: (target.grantedUsers ?? []).map(ts_rest_helpers_1.toStringId),
63
+ comment_count: target.commentCount ?? 0,
64
+ like_count: target.liker?.length ?? 0,
65
+ created_at: target.createdAt,
66
+ updated_at: target.updatedAt,
67
+ },
68
+ };
69
+ await searcher.index(doc);
70
+ }
71
+ catch (err) {
72
+ debug('search index failed for page %s: %s', id, err.message);
73
+ }
74
+ }
75
+ async function removePageFromSearch(crowi, page) {
76
+ const searcher = crowi.getSearcher();
77
+ if (!searcher)
78
+ return;
79
+ const id = (0, ts_rest_helpers_1.toStringId)(page._id);
80
+ try {
81
+ await searcher.remove(id);
82
+ }
83
+ catch (err) {
84
+ debug('search remove failed for page %s: %s', id, err.message);
85
+ }
86
+ }
87
+ async function refetchPopulated(crowi, id) {
88
+ const Page = crowi.model('Page');
89
+ return (await Page.findById(id).populate('revision').populate('creator'));
90
+ }
91
+ //# sourceMappingURL=page-search-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-search-index.js","sourceRoot":"","sources":["../../src/util/page-search-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type Crowi from '../crowi';
2
+ /**
3
+ * RFC-0004 backfill: stamp `status: 'published'` onto every legacy
4
+ * `Page` row that has no `status` (the field is missing, or stored as
5
+ * `null`).
6
+ *
7
+ * Why this is needed: RFC-0004 introduces a first-class `draft` state
8
+ * and the listing / search / backlink queries now branch on
9
+ * `Page.status`. Pages created before the `status` field existed read
10
+ * back as `null`; `Page.isPublished()` already treats `null` as
11
+ * published for back-compat, but the query-level `$or` filters and the
12
+ * collab draft gate are clearer — and future-proof against a stricter
13
+ * `required: true` — when every row carries an explicit value.
14
+ *
15
+ * Idempotent: the filter only matches rows that are still unset, so a
16
+ * second run touches nothing. Pages already `published` / `draft` /
17
+ * `deleted` / `deprecated` / `wip` are left exactly as they are — in
18
+ * particular this never rewrites a `draft` back to `published`, which
19
+ * would violate the one-way transition rule.
20
+ *
21
+ * Returns the number of rows updated, so the boot log can report it.
22
+ */
23
+ export declare function runPageStatusMigration(crowi: Crowi): Promise<number>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runPageStatusMigration = runPageStatusMigration;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const page_1 = require("../models/page");
9
+ const debug = (0, debug_1.default)('crowi:util:page-status-migration');
10
+ /**
11
+ * RFC-0004 backfill: stamp `status: 'published'` onto every legacy
12
+ * `Page` row that has no `status` (the field is missing, or stored as
13
+ * `null`).
14
+ *
15
+ * Why this is needed: RFC-0004 introduces a first-class `draft` state
16
+ * and the listing / search / backlink queries now branch on
17
+ * `Page.status`. Pages created before the `status` field existed read
18
+ * back as `null`; `Page.isPublished()` already treats `null` as
19
+ * published for back-compat, but the query-level `$or` filters and the
20
+ * collab draft gate are clearer — and future-proof against a stricter
21
+ * `required: true` — when every row carries an explicit value.
22
+ *
23
+ * Idempotent: the filter only matches rows that are still unset, so a
24
+ * second run touches nothing. Pages already `published` / `draft` /
25
+ * `deleted` / `deprecated` / `wip` are left exactly as they are — in
26
+ * particular this never rewrites a `draft` back to `published`, which
27
+ * would violate the one-way transition rule.
28
+ *
29
+ * Returns the number of rows updated, so the boot log can report it.
30
+ */
31
+ async function runPageStatusMigration(crowi) {
32
+ const Page = crowi.model('Page');
33
+ // `status: null` matches both an explicit null and a missing field
34
+ // in MongoDB query semantics, so a single condition covers every
35
+ // legacy shape.
36
+ const result = await Page.updateMany({ status: null }, { $set: { status: page_1.STATUS_PUBLISHED } });
37
+ // Mongoose's UpdateResult exposes `modifiedCount`; fall back to 0 for
38
+ // any driver shape that omits it.
39
+ const modified = result.modifiedCount ?? 0;
40
+ if (modified > 0) {
41
+ console.log(`[crowi] Backfilled status='published' on ${modified} legacy page row(s).`);
42
+ }
43
+ else {
44
+ debug('no legacy pages without status — nothing to migrate');
45
+ }
46
+ return modified;
47
+ }
48
+ //# sourceMappingURL=page-status-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-status-migration.js","sourceRoot":"","sources":["../../src/util/page-status-migration.ts"],"names":[],"mappings":";;;;;AA2BA,wDAiBC;AA5CD,kDAA0B;AAE1B,0CAAmD;AAEnD,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,kCAAkC,CAAC,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACI,KAAK,UAAU,sBAAsB,CAAC,KAAY;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEjC,mEAAmE;IACnE,iEAAiE;IACjE,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,uBAAgB,EAAE,EAAE,CAAC,CAAC;IAE/F,sEAAsE;IACtE,kCAAkC;IAClC,MAAM,QAAQ,GAAI,MAAqC,CAAC,aAAa,IAAI,CAAC,CAAC;IAC3E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4CAA4C,QAAQ,sBAAsB,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const encodeSpace: (s: any) => any;
2
+ export declare const decodeSpace: (s: any) => any;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.decodeSpace = exports.encodeSpace = void 0;
4
+ const encodeSpace = (s) => {
5
+ return s.replace(/ /g, '+');
6
+ };
7
+ exports.encodeSpace = encodeSpace;
8
+ const decodeSpace = (s) => {
9
+ return s.replace(/\+/g, ' ');
10
+ };
11
+ exports.decodeSpace = decodeSpace;
12
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/util/path.ts"],"names":[],"mappings":";;;AAAO,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC/B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB;AAEK,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC/B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * RFC 7636 PKCE — S256 code-challenge verification.
3
+ *
4
+ * The client sends `code_challenge = base64url(sha256(code_verifier))` at
5
+ * authorize time and the raw `code_verifier` at token time. We recompute
6
+ * the challenge from the verifier and compare. Only S256 is supported
7
+ * (RFC-0010 §Security — the `plain` method is rejected upstream so it is
8
+ * not handled here).
9
+ *
10
+ * The comparison is constant-time (`crypto.timingSafeEqual`) to avoid
11
+ * leaking how many leading bytes matched.
12
+ */
13
+ export declare function verifyPkceS256(codeVerifier: string, codeChallenge: string): boolean;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.verifyPkceS256 = verifyPkceS256;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ /**
9
+ * RFC 7636 PKCE — S256 code-challenge verification.
10
+ *
11
+ * The client sends `code_challenge = base64url(sha256(code_verifier))` at
12
+ * authorize time and the raw `code_verifier` at token time. We recompute
13
+ * the challenge from the verifier and compare. Only S256 is supported
14
+ * (RFC-0010 §Security — the `plain` method is rejected upstream so it is
15
+ * not handled here).
16
+ *
17
+ * The comparison is constant-time (`crypto.timingSafeEqual`) to avoid
18
+ * leaking how many leading bytes matched.
19
+ */
20
+ function verifyPkceS256(codeVerifier, codeChallenge) {
21
+ const computed = node_crypto_1.default.createHash('sha256').update(codeVerifier).digest('base64url');
22
+ const a = Buffer.from(computed);
23
+ const b = Buffer.from(codeChallenge);
24
+ // timingSafeEqual throws on length mismatch — a length difference is
25
+ // already a definitive non-match, so short-circuit.
26
+ if (a.length !== b.length)
27
+ return false;
28
+ return node_crypto_1.default.timingSafeEqual(a, b);
29
+ }
30
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/util/pkce.ts"],"names":[],"mappings":";;;;;AAcA,wCAQC;AAtBD,8DAAiC;AAEjC;;;;;;;;;;;GAWG;AACH,SAAgB,cAAc,CAAC,YAAoB,EAAE,aAAqB;IACxE,MAAM,QAAQ,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrC,qEAAqE;IACrE,oDAAoD;IACpD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,qBAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type PresenceTokenPayload } from '@crowi/api-contract';
2
+ /** Claims signed into a presence token. */
3
+ export interface PresenceTokenClaims {
4
+ userId: string;
5
+ pageId: string;
6
+ }
7
+ export interface SignPresenceTokenResult {
8
+ /** Compact JWT string presented by the browser on the WebSocket connect. */
9
+ token: string;
10
+ /** ISO 8601 expiry timestamp, mirrors `exp * 1000` as a Date. */
11
+ expiresAt: Date;
12
+ }
13
+ declare function buildPresenceTokenUtil(): {
14
+ signPresenceToken: (claims: PresenceTokenClaims) => SignPresenceTokenResult;
15
+ verifyPresenceToken: (token: string) => PresenceTokenPayload | null;
16
+ ttlSeconds: number;
17
+ issuer: string;
18
+ };
19
+ export type PresenceTokenUtil = ReturnType<typeof buildPresenceTokenUtil>;
20
+ export declare function createPresenceTokenUtil(): PresenceTokenUtil;
21
+ export {};
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createPresenceTokenUtil = createPresenceTokenUtil;
7
+ const node_crypto_1 = __importDefault(require("node:crypto"));
8
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
9
+ const api_contract_1 = require("@crowi/api-contract");
10
+ const debug_1 = __importDefault(require("debug"));
11
+ const debug = (0, debug_1.default)('crowi:util:presence-token');
12
+ /**
13
+ * Issuer claim used to sign / verify presence tokens (RFC-0005).
14
+ *
15
+ * Deliberately distinct from the collab wsToken issuer
16
+ * (`'crowi-collab'`, see `util/ws-token.ts`) and the HTTP access/refresh
17
+ * token issuer (`'crowi'`). A leaked presence token must never be
18
+ * replayable against the collab WebSocket — `/collab` carries write
19
+ * access to the Y.Doc, `/presence` is read-only viewer tracking — so
20
+ * the two channels verify against different `iss` claims even though
21
+ * they share the same `WS_TOKEN_SECRET` key material.
22
+ */
23
+ const PRESENCE_TOKEN_ISSUER = 'crowi-presence';
24
+ /**
25
+ * Lifetime of an issued presence token. Five minutes mirrors the
26
+ * collab wsToken TTL: short enough that a leaked token has limited
27
+ * blast radius, long enough to cover reconnect storms. The browser
28
+ * uses `expiresAt` to proactively re-fetch before the WebSocket would
29
+ * otherwise be dropped.
30
+ */
31
+ const PRESENCE_TOKEN_TTL_SECONDS = 300;
32
+ /**
33
+ * Resolve the signing secret once per util instance.
34
+ *
35
+ * Presence reuses `WS_TOKEN_SECRET` rather than introducing a new env:
36
+ * the two token kinds are isolated by their `iss` claim, so sharing the
37
+ * key material is safe and keeps operators from having to distribute a
38
+ * second secret. When `WS_TOKEN_SECRET` is unset we generate a random
39
+ * in-memory secret and warn — single-instance dev still works, but
40
+ * process restarts invalidate outstanding tokens and multi-instance
41
+ * deployments cannot cross-verify.
42
+ */
43
+ const resolvePresenceTokenSecret = () => {
44
+ const fromEnv = process.env.WS_TOKEN_SECRET;
45
+ if (fromEnv && fromEnv.length > 0) {
46
+ debug('presence token secret resolved from WS_TOKEN_SECRET');
47
+ return fromEnv;
48
+ }
49
+ const generated = node_crypto_1.default.randomBytes(32).toString('base64');
50
+ console.warn('[crowi] WS_TOKEN_SECRET is not set — generated a random in-memory secret for presence tokens. ' +
51
+ 'Process restarts will invalidate outstanding presence tokens, and multi-instance deployments ' +
52
+ 'will not be able to cross-verify them. Set WS_TOKEN_SECRET to a stable base64-encoded 32-byte ' +
53
+ 'value (`openssl rand -base64 32`) in production.');
54
+ return generated;
55
+ };
56
+ /**
57
+ * Build a sign / verify pair bound to a single resolved secret.
58
+ *
59
+ * Memoised for the same reason `createWsTokenUtil` is: when
60
+ * `WS_TOKEN_SECRET` is unset, `resolvePresenceTokenSecret` mints a
61
+ * fresh random secret per call. Two `createPresenceTokenUtil()` calls
62
+ * would otherwise close over different secrets and the HTTP-sign /
63
+ * WebSocket-verify pair would silently break in dev.
64
+ */
65
+ let cachedUtil = null;
66
+ function buildPresenceTokenUtil() {
67
+ const secret = resolvePresenceTokenSecret();
68
+ /**
69
+ * Sign a presence token for the given claims. Returns the compact
70
+ * JWT plus the absolute ISO expiry; the route serialises the
71
+ * timestamp into `PresenceTokenResponseSchema.expiresAt`.
72
+ */
73
+ function signPresenceToken(claims) {
74
+ // Pin `iat` ourselves so the response's `expiresAt` is exactly the
75
+ // same instant as the JWT's `exp` claim.
76
+ const iat = Math.floor(Date.now() / 1000);
77
+ const exp = iat + PRESENCE_TOKEN_TTL_SECONDS;
78
+ const token = jsonwebtoken_1.default.sign({ ...claims, iat, exp }, secret, {
79
+ issuer: PRESENCE_TOKEN_ISSUER,
80
+ algorithm: 'HS256',
81
+ });
82
+ return { token, expiresAt: new Date(exp * 1000) };
83
+ }
84
+ /**
85
+ * Verify a presence token. Returns the validated payload, or `null`
86
+ * for any failure (expired, bad signature, wrong issuer, malformed
87
+ * claims). Callers must treat `null` as "reject the connection".
88
+ */
89
+ function verifyPresenceToken(token) {
90
+ try {
91
+ const decoded = jsonwebtoken_1.default.verify(token, secret, {
92
+ issuer: PRESENCE_TOKEN_ISSUER,
93
+ algorithms: ['HS256'],
94
+ });
95
+ const parsed = api_contract_1.PresenceTokenPayloadSchema.safeParse(decoded);
96
+ if (!parsed.success) {
97
+ debug('presence token payload failed schema validation:', parsed.error.issues);
98
+ return null;
99
+ }
100
+ return parsed.data;
101
+ }
102
+ catch (err) {
103
+ debug('presence token verification failed:', err.message);
104
+ return null;
105
+ }
106
+ }
107
+ return {
108
+ signPresenceToken,
109
+ verifyPresenceToken,
110
+ ttlSeconds: PRESENCE_TOKEN_TTL_SECONDS,
111
+ issuer: PRESENCE_TOKEN_ISSUER,
112
+ };
113
+ }
114
+ function createPresenceTokenUtil() {
115
+ if (cachedUtil === null) {
116
+ cachedUtil = buildPresenceTokenUtil();
117
+ }
118
+ return cachedUtil;
119
+ }
120
+ //# sourceMappingURL=presence-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence-token.js","sourceRoot":"","sources":["../../src/util/presence-token.ts"],"names":[],"mappings":";;;;;AAqIA,0DAKC;AA1ID,8DAAiC;AACjC,gEAA+B;AAC/B,sDAA4F;AAC5F,kDAA0B;AAE1B,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,2BAA2B,CAAC,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAevC;;;;;;;;;;GAUG;AACH,MAAM,0BAA0B,GAAG,GAAW,EAAE;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,SAAS,GAAG,qBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CACV,gGAAgG;QAC9F,+FAA+F;QAC/F,gGAAgG;QAChG,kDAAkD,CACrD,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,IAAI,UAAU,GAAqD,IAAI,CAAC;AAExE,SAAS,sBAAsB;IAC7B,MAAM,MAAM,GAAG,0BAA0B,EAAE,CAAC;IAE5C;;;;OAIG;IACH,SAAS,iBAAiB,CAAC,MAA2B;QACpD,mEAAmE;QACnE,yCAAyC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,GAAG,0BAA0B,CAAC;QAC7C,MAAM,KAAK,GAAG,sBAAG,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE;YACtD,MAAM,EAAE,qBAAqB;YAC7B,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,SAAS,mBAAmB,CAAC,KAAa;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE;gBACxC,MAAM,EAAE,qBAAqB;gBAC7B,UAAU,EAAE,CAAC,OAAO,CAAC;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,yCAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,KAAK,CAAC,kDAAkD,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/E,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,qCAAqC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO;QACL,iBAAiB;QACjB,mBAAmB;QACnB,UAAU,EAAE,0BAA0B;QACtC,MAAM,EAAE,qBAAqB;KAC9B,CAAC;AACJ,CAAC;AAID,SAAgB,uBAAuB;IACrC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,UAAU,GAAG,sBAAsB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * RFC-0004 Phase 5 — generic per-user fixed-window rate limiter.
3
+ *
4
+ * Used by the autocomplete endpoints (60 req/min/user) and, from
5
+ * Phase 6, the attachment-upload endpoint (20 req/min/user). There was
6
+ * no shared rate-limit utility before RFC-0004, so this is new.
7
+ *
8
+ * Storage strategy:
9
+ * - When a Redis client is supplied (multi-instance api deployment),
10
+ * counters live in Redis so the limit is shared across replicas.
11
+ * A fixed window keyed by `floor(now / windowMs)` keeps the logic
12
+ * to one `INCR` + one `EXPIRE` — no Lua, no sorted sets.
13
+ * - When no Redis client is supplied (single-instance dev), an
14
+ * in-memory `Map` fallback applies the same fixed-window logic
15
+ * within the process. Stale windows are pruned lazily on access
16
+ * plus by a low-frequency sweep so the map cannot grow unbounded.
17
+ *
18
+ * Fail-open posture: if the Redis round-trip throws, the request is
19
+ * allowed. A rate limiter that hard-fails closed would turn a Redis
20
+ * blip into a full feature outage, which is worse than briefly losing
21
+ * the limit. The same posture is used by `editor-cap-counter.ts`.
22
+ */
23
+ /**
24
+ * Minimum surface of a node-redis v4 client this limiter leans on.
25
+ * Structurally compatible with `crowi.redis`; kept narrow so tests can
26
+ * supply a tiny fake.
27
+ */
28
+ export interface RateLimitRedisClient {
29
+ incr(key: string): Promise<number>;
30
+ pExpire(key: string, ms: number): Promise<unknown>;
31
+ }
32
+ export interface RateLimitOptions {
33
+ /** Logical bucket name, e.g. `'autocomplete'`. Namespaces the keys. */
34
+ name: string;
35
+ /** Max allowed requests per window. */
36
+ limit: number;
37
+ /** Window length in milliseconds. */
38
+ windowMs: number;
39
+ /** Shared Redis client; omit / pass `null` to use the in-memory fallback. */
40
+ redisClient?: RateLimitRedisClient | null;
41
+ }
42
+ export interface RateLimitResult {
43
+ /** Whether this request is within budget (and should proceed). */
44
+ allowed: boolean;
45
+ /** Requests already counted in the current window (including this one). */
46
+ count: number;
47
+ /** Configured limit, echoed for response headers. */
48
+ limit: number;
49
+ /**
50
+ * Seconds until the current window resets. Surfaced as `Retry-After`
51
+ * on a 429. Always ≥ 1.
52
+ */
53
+ retryAfterSeconds: number;
54
+ }
55
+ export interface RateLimiter {
56
+ /**
57
+ * Count one request for `userId` and report whether it is allowed.
58
+ * `userId` should be the stable user id; the limiter namespaces it
59
+ * with `name` and the window index internally.
60
+ */
61
+ hit(userId: string): Promise<RateLimitResult>;
62
+ }
63
+ /**
64
+ * Build a per-user rate limiter. Same API whether it is Redis-backed or
65
+ * in-memory, so callers never branch.
66
+ */
67
+ export declare function createRateLimiter(options: RateLimitOptions): RateLimiter;