@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,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ARRAY_USER_REFS = exports.SCALAR_USER_REFS = void 0;
4
+ exports.reassignUserReferences = reassignUserReferences;
5
+ exports.mergeUserGroups = mergeUserGroups;
6
+ exports.chooseSurvivor = chooseSurvivor;
7
+ /**
8
+ * The full scalar reference set (uniqueness spec §c). `from` is matched by
9
+ * exact equality; reassigned to `to` via `$set`.
10
+ */
11
+ exports.SCALAR_USER_REFS = [
12
+ { collection: 'pages', field: 'creator' },
13
+ { collection: 'pages', field: 'lastUpdateUser' },
14
+ { collection: 'revisions', field: 'author' },
15
+ { collection: 'revisions', field: 'savedBy' },
16
+ { collection: 'comments', field: 'creator' },
17
+ // `bookmarks.user`: the compound-unique conflict (a page both users
18
+ // bookmarked) is resolved first by UNIQUE_PER_USER_REFS below; the remaining
19
+ // non-conflicting rows reassign here like any other scalar.
20
+ { collection: 'bookmarks', field: 'user' },
21
+ { collection: 'attachments', field: 'creator' },
22
+ { collection: 'shares', field: 'creator' },
23
+ { collection: 'watchers', field: 'user' },
24
+ { collection: 'activities', field: 'user' },
25
+ { collection: 'notifications', field: 'user' },
26
+ { collection: 'updateposts', field: 'creator' },
27
+ ];
28
+ /** The full array reference set (uniqueness spec §c). */
29
+ exports.ARRAY_USER_REFS = [
30
+ { collection: 'pages', field: 'grantedUsers' },
31
+ { collection: 'pages', field: 'liker' },
32
+ { collection: 'pages', field: 'seenUsers' },
33
+ { collection: 'revisions', field: 'contributors' },
34
+ ];
35
+ /**
36
+ * Collections with a unique `{ <pageField>, user }` index where reassigning a
37
+ * losing user's row onto the survivor could collide with an existing survivor
38
+ * row. Those losing rows are deleted before the generic scalar reassign so the
39
+ * `$set` never trips the compound unique index. `bookmarks` is the only such
40
+ * collection in the §c set.
41
+ */
42
+ const UNIQUE_PER_USER_REFS = [{ collection: 'bookmarks', userField: 'user' }];
43
+ /**
44
+ * Reassign every ownership reference from `from` to `to`. Does not touch the
45
+ * `users` collection itself (the caller deletes/keeps the user docs). Pure data
46
+ * movement — safe to call repeatedly (idempotent: a second run finds no `from`
47
+ * references left).
48
+ */
49
+ async function reassignUserReferences(db, from, to, logger) {
50
+ const reassigned = {};
51
+ let deletedConflicting = 0;
52
+ // 1. Resolve compound-unique collisions first (delete losing rows that would
53
+ // collide with an existing survivor row on reassign). For bookmarks the
54
+ // unique key is { page, user }: delete a `from` bookmark whose page the
55
+ // `to` user already bookmarks.
56
+ for (const { collection, userField } of UNIQUE_PER_USER_REFS) {
57
+ const col = db.collection(collection);
58
+ const fromRows = await col.find({ [userField]: from }).toArray();
59
+ for (const row of fromRows) {
60
+ const page = row.page;
61
+ const survivorHas = await col.findOne({ page, [userField]: to });
62
+ if (survivorHas) {
63
+ await col.deleteOne({ _id: row._id });
64
+ deletedConflicting += 1;
65
+ }
66
+ }
67
+ }
68
+ // 2. Scalar references: `$set` field = to where field = from.
69
+ for (const { collection, field } of exports.SCALAR_USER_REFS) {
70
+ const res = await db.collection(collection).updateMany({ [field]: from }, { $set: { [field]: to } });
71
+ const n = res.modifiedCount ?? 0;
72
+ if (n > 0)
73
+ reassigned[`${collection}.${field}`] = n;
74
+ }
75
+ // 3. Array references: add the survivor, then remove the loser. `$addToSet`
76
+ // keeps the survivor unique; doing it before `$pull` means a doc that had
77
+ // only `from` still ends up with `to`.
78
+ for (const { collection, field } of exports.ARRAY_USER_REFS) {
79
+ const col = db.collection(collection);
80
+ const added = await col.updateMany({ [field]: from }, { $addToSet: { [field]: to } });
81
+ const pulled = await col.updateMany({ [field]: from }, { $pull: { [field]: from } });
82
+ const n = Math.max(added.modifiedCount ?? 0, pulled.modifiedCount ?? 0);
83
+ if (n > 0)
84
+ reassigned[`${collection}.${field}`] = n;
85
+ }
86
+ logger?.debug(`reassignUserReferences: ${from} -> ${to}`, reassigned, { deletedConflicting });
87
+ return { reassigned, deletedConflicting };
88
+ }
89
+ /**
90
+ * Merge each group: reassign every removed user's references onto `keep`, then
91
+ * delete the removed user docs. `dryRun` reports the would-be effect without
92
+ * writing.
93
+ */
94
+ async function mergeUserGroups(db, groups, opts) {
95
+ const reassigned = {};
96
+ let usersRemoved = 0;
97
+ let deletedConflicting = 0;
98
+ let groupsMerged = 0;
99
+ for (const group of groups) {
100
+ if (group.remove.length === 0)
101
+ continue;
102
+ groupsMerged += 1;
103
+ if (opts.dryRun) {
104
+ usersRemoved += group.remove.length;
105
+ continue;
106
+ }
107
+ for (const from of group.remove) {
108
+ const result = await reassignUserReferences(db, from, group.keep, opts.logger);
109
+ for (const [key, n] of Object.entries(result.reassigned)) {
110
+ reassigned[key] = (reassigned[key] ?? 0) + n;
111
+ }
112
+ deletedConflicting += result.deletedConflicting;
113
+ await db.collection('users').deleteOne({ _id: from });
114
+ usersRemoved += 1;
115
+ }
116
+ }
117
+ return { groupsMerged, usersRemoved, reassigned, deletedConflicting };
118
+ }
119
+ /**
120
+ * The policy for choosing which user in a duplicate group survives
121
+ * (uniqueness spec §c): keep the one with the most content, breaking ties by
122
+ * oldest `createdAt`. "Content" is approximated by the number of pages the user
123
+ * created — the dominant signal in the incident and cheap to count.
124
+ *
125
+ * Returns the group with `keep` set to the winner and `remove` to the rest.
126
+ */
127
+ async function chooseSurvivor(db, candidateIds) {
128
+ if (candidateIds.length === 0)
129
+ throw new Error('chooseSurvivor: empty candidate set');
130
+ const users = await db
131
+ .collection('users')
132
+ .find({ _id: { $in: candidateIds } })
133
+ .toArray();
134
+ const pages = db.collection('pages');
135
+ const scored = await Promise.all(users.map(async (u) => {
136
+ const id = u._id;
137
+ const createdAt = u.createdAt ?? new Date(0);
138
+ const pageCount = await pages.countDocuments({ creator: id });
139
+ return { id, createdAt, pageCount };
140
+ }));
141
+ scored.sort((a, b) => {
142
+ if (b.pageCount !== a.pageCount)
143
+ return b.pageCount - a.pageCount; // most content first
144
+ return a.createdAt.getTime() - b.createdAt.getTime(); // then oldest first
145
+ });
146
+ const [winner, ...losers] = scored;
147
+ return { keep: winner.id, remove: losers.map((l) => l.id) };
148
+ }
149
+ //# sourceMappingURL=dedup-users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-users.js","sourceRoot":"","sources":["../../src/util/dedup-users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /** Default editor cap when `COLLAB_MAX_EDITORS_PER_PAGE` is unset / invalid. */
2
+ export declare const DEFAULT_MAX_EDITORS = 20;
3
+ /**
4
+ * Parse `COLLAB_MAX_EDITORS_PER_PAGE` (or any equivalent env string)
5
+ * defensively. Empty / non-numeric / non-positive values fall back to
6
+ * `DEFAULT_MAX_EDITORS` so callers never have to remember the
7
+ * "isFinite && > 0" dance.
8
+ */
9
+ export declare function parseCapEnv(value: string | undefined): number;
10
+ export interface TryAcquireResult {
11
+ acquired: boolean;
12
+ /** Post-acquire SCARD (or the SCARD observed when rejection happens). */
13
+ count: number;
14
+ cap: number;
15
+ }
16
+ export interface EditorCapCounter {
17
+ /** Soft maximum editors per page (`COLLAB_MAX_EDITORS_PER_PAGE`, default 20). */
18
+ readonly maxEditorsPerPage: number;
19
+ /**
20
+ * Read-only count check. Used by the wsToken endpoint so a 21st
21
+ * client gets a `readonly: true` token *before* the WebSocket
22
+ * connects, avoiding the "editable for a millisecond then forced
23
+ * readonly" UX bug.
24
+ */
25
+ peek(pageId: string): Promise<{
26
+ count: number;
27
+ cap: number;
28
+ }>;
29
+ /**
30
+ * SADD the `<userId>:<socketId>` entry **after** verifying the
31
+ * pre-acquire count is under the cap. Returns `acquired: false`
32
+ * when the entry is rejected so the caller can flip the readonly
33
+ * bit on the connection.
34
+ */
35
+ tryAcquire(pageId: string, userId: string, socketId: string): Promise<TryAcquireResult>;
36
+ /**
37
+ * SREM the entry. Best-effort: failures are warn-only (the entry
38
+ * eventually expires via the per-key TTL). No-op for entries that
39
+ * were never acquired (Redis SREM returns 0).
40
+ */
41
+ release(pageId: string, userId: string, socketId: string): Promise<void>;
42
+ /**
43
+ * Disconnect handler. Embedded collab shares `crowi.redis` so the
44
+ * disconnect call is a no-op (api owns the client lifecycle). The
45
+ * method stays on the interface so a future Phase 9 multi-instance
46
+ * extension that owns its own client can implement teardown
47
+ * symmetrically.
48
+ */
49
+ disconnect(): Promise<void>;
50
+ }
51
+ export interface CreateEditorCapCounterOptions {
52
+ /**
53
+ * Pre-built node-redis v4 client (typed structurally as
54
+ * `MinimalRedisClient`). Pass `crowi.redis` from the api boot.
55
+ * `null` / `undefined` → return a no-op counter (Redis not
56
+ * configured; cap disabled).
57
+ */
58
+ redisClient?: MinimalRedisClient | null;
59
+ /** Override the default 20-editor cap. */
60
+ maxEditorsPerPage?: number;
61
+ /**
62
+ * Test seam — inject a pre-built `RedisClientType`-shaped object.
63
+ * Kept distinct from `redisClient` so unit tests can drive a fake
64
+ * without the api passing a real client (the production wiring
65
+ * always uses `redisClient`; tests that mock the fake go through
66
+ * this seam).
67
+ */
68
+ __clientForTest?: MinimalRedisClient;
69
+ }
70
+ /**
71
+ * Minimum surface of node-redis v4 we lean on. Keeps the test mock
72
+ * surface narrow and gives us a single place to extend if Phase 9's
73
+ * multi-server work needs more commands.
74
+ */
75
+ export interface MinimalRedisClient {
76
+ isOpen: boolean;
77
+ connect(): Promise<unknown>;
78
+ disconnect(): Promise<unknown>;
79
+ sCard(key: string): Promise<number>;
80
+ sAdd(key: string, member: string): Promise<number>;
81
+ sRem(key: string, member: string): Promise<number>;
82
+ expire(key: string, seconds: number): Promise<unknown>;
83
+ }
84
+ /**
85
+ * Build an editor-cap counter against a shared Redis client.
86
+ *
87
+ * Returns a no-op counter when `redisClient` is null/undefined — the
88
+ * API surface is identical so callers don't have to branch.
89
+ */
90
+ export declare function createEditorCapCounter(opts?: CreateEditorCapCounterOptions): Promise<EditorCapCounter>;
@@ -0,0 +1,175 @@
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.DEFAULT_MAX_EDITORS = void 0;
7
+ exports.parseCapEnv = parseCapEnv;
8
+ exports.createEditorCapCounter = createEditorCapCounter;
9
+ const debug_1 = __importDefault(require("debug"));
10
+ const debug = (0, debug_1.default)('crowi:util:editor-cap-counter');
11
+ /**
12
+ * RFC-0003 Phase 6 — Redis-backed editor cap counter.
13
+ *
14
+ * Tracks the set of currently-connected editors per page so the
15
+ * wsToken issuance path (api HTTP handler) and the WebSocket
16
+ * `onAuthenticate` hook (in-process Hocuspocus engine; see
17
+ * `src/collab/attach.ts`) agree on a single cluster-wide count.
18
+ *
19
+ * Wire-level design:
20
+ *
21
+ * - Key: `crowi:collab:editors:<pageId>`
22
+ * - Value: a **Set** of `<userId>:<socketId>` entries (one entry
23
+ * per active WebSocket connection).
24
+ * - TTL: `EXPIRE 86400` (24 h) is re-applied on every successful
25
+ * `SADD` so an idle key naturally evaporates after a day
26
+ * of stillness. Stale entries left behind by abnormal
27
+ * disconnects are bounded by the same TTL — the spec
28
+ * (`defence in depth`) explicitly allows up to 24 h of
29
+ * overcount before Redis garbage-collects.
30
+ *
31
+ * Why a Set, not INCR/DECR?
32
+ *
33
+ * - INCR / DECR is asymmetric on abnormal close: a +1 that never
34
+ * gets the matching -1 climbs the counter until an operator
35
+ * manually resets it. SADD-with-EXPIRE self-heals.
36
+ * - SCARD is O(1) so the read cost matches GET-against-INCR.
37
+ * - The same `<userId>:<socketId>` can be SADD'd twice (handler
38
+ * retry, etc.) without inflating the count (Set idempotency).
39
+ *
40
+ * Race window:
41
+ *
42
+ * - SCARD + SADD is *not* atomic; a 21st client racing 20 acquirers
43
+ * can briefly observe `count = 20`, write its entry, then settle
44
+ * at 21. The spec accepts this — Phase 6 is "defence in depth",
45
+ * not "hard cap with Redis Lua". A `simplify` pass may add a Lua
46
+ * script if operations need stricter semantics.
47
+ *
48
+ * Fail-open posture:
49
+ *
50
+ * - `redisClient` null/undefined (= REDIS_URL unset) → return a
51
+ * no-op counter: `peek` is always 0, `tryAcquire` is always
52
+ * `{acquired: true}`, `release` is a no-op. The cap is a soft
53
+ * limit by design.
54
+ *
55
+ * Phase 9 (same-process attach) signature change: the previous
56
+ * `redisOpts` argument is replaced with a pre-built `redisClient`
57
+ * (typed structurally as `MinimalRedisClient`). The api boot opens
58
+ * exactly one Redis client per process (`crowi.redis`); embedded
59
+ * collab now shares it instead of opening a second connection — see
60
+ * `.feature-state/specs/feature-collab-embed-into-api.md` §"Redis
61
+ * client 共有".
62
+ */
63
+ const KEY_PREFIX = 'crowi:collab:editors:';
64
+ /** Default editor cap when `COLLAB_MAX_EDITORS_PER_PAGE` is unset / invalid. */
65
+ exports.DEFAULT_MAX_EDITORS = 20;
66
+ const TTL_SECONDS = 86400; // 24h sliding window via re-EXPIRE on SADD
67
+ const keyFor = (pageId) => `${KEY_PREFIX}${pageId}`;
68
+ const entryFor = (userId, socketId) => `${userId}:${socketId}`;
69
+ /**
70
+ * Parse `COLLAB_MAX_EDITORS_PER_PAGE` (or any equivalent env string)
71
+ * defensively. Empty / non-numeric / non-positive values fall back to
72
+ * `DEFAULT_MAX_EDITORS` so callers never have to remember the
73
+ * "isFinite && > 0" dance.
74
+ */
75
+ function parseCapEnv(value) {
76
+ const n = parseInt(value ?? '', 10);
77
+ return Number.isFinite(n) && n > 0 ? n : exports.DEFAULT_MAX_EDITORS;
78
+ }
79
+ const makeNoopCounter = (maxEditorsPerPage) => ({
80
+ maxEditorsPerPage,
81
+ async peek() {
82
+ return { count: 0, cap: maxEditorsPerPage };
83
+ },
84
+ async tryAcquire() {
85
+ return { acquired: true, count: 0, cap: maxEditorsPerPage };
86
+ },
87
+ async release() {
88
+ /* nothing */
89
+ },
90
+ async disconnect() {
91
+ /* nothing */
92
+ },
93
+ });
94
+ /**
95
+ * Build an editor-cap counter against a shared Redis client.
96
+ *
97
+ * Returns a no-op counter when `redisClient` is null/undefined — the
98
+ * API surface is identical so callers don't have to branch.
99
+ */
100
+ async function createEditorCapCounter(opts = {}) {
101
+ const maxEditorsPerPage = opts.maxEditorsPerPage ?? exports.DEFAULT_MAX_EDITORS;
102
+ if (opts.__clientForTest) {
103
+ return wrapClient(opts.__clientForTest, maxEditorsPerPage);
104
+ }
105
+ if (!opts.redisClient) {
106
+ debug('redis client not provided — editor cap counter disabled (fail-open)');
107
+ return makeNoopCounter(maxEditorsPerPage);
108
+ }
109
+ debug('editor cap counter ready (max=%d, key prefix=%s)', maxEditorsPerPage, KEY_PREFIX);
110
+ return wrapClient(opts.redisClient, maxEditorsPerPage);
111
+ }
112
+ function wrapClient(client, maxEditorsPerPage) {
113
+ return {
114
+ maxEditorsPerPage,
115
+ async peek(pageId) {
116
+ try {
117
+ const count = await client.sCard(keyFor(pageId));
118
+ return { count, cap: maxEditorsPerPage };
119
+ }
120
+ catch (err) {
121
+ console.warn(`[crowi:editor-cap-counter] peek failed for ${pageId} — treating as 0:`, err.message);
122
+ return { count: 0, cap: maxEditorsPerPage };
123
+ }
124
+ },
125
+ async tryAcquire(pageId, userId, socketId) {
126
+ const key = keyFor(pageId);
127
+ const entry = entryFor(userId, socketId);
128
+ let preCount;
129
+ try {
130
+ preCount = await client.sCard(key);
131
+ }
132
+ catch (err) {
133
+ console.warn(`[crowi:editor-cap-counter] tryAcquire SCARD failed for ${pageId} — fail-open:`, err.message);
134
+ return { acquired: true, count: 0, cap: maxEditorsPerPage };
135
+ }
136
+ if (preCount >= maxEditorsPerPage) {
137
+ debug('cap exceeded for page %s (count=%d max=%d)', pageId, preCount, maxEditorsPerPage);
138
+ return { acquired: false, count: preCount, cap: maxEditorsPerPage };
139
+ }
140
+ try {
141
+ const added = await client.sAdd(key, entry);
142
+ await client.expire(key, TTL_SECONDS);
143
+ // `added === 0` means the entry already existed in the set;
144
+ // treat it as a successful acquire so a handler retry is
145
+ // idempotent. The count reported is `preCount` (unchanged)
146
+ // when the entry was already present.
147
+ const count = preCount + (added > 0 ? 1 : 0);
148
+ debug('acquired page=%s entry=%s count=%d', pageId, entry, count);
149
+ return { acquired: true, count, cap: maxEditorsPerPage };
150
+ }
151
+ catch (err) {
152
+ console.warn(`[crowi:editor-cap-counter] tryAcquire SADD failed for ${pageId} — fail-open:`, err.message);
153
+ return { acquired: true, count: preCount, cap: maxEditorsPerPage };
154
+ }
155
+ },
156
+ async release(pageId, userId, socketId) {
157
+ try {
158
+ await client.sRem(keyFor(pageId), entryFor(userId, socketId));
159
+ debug('released page=%s user=%s socket=%s', pageId, userId, socketId);
160
+ }
161
+ catch (err) {
162
+ console.warn(`[crowi:editor-cap-counter] release failed for ${pageId}:`, err.message);
163
+ }
164
+ },
165
+ async disconnect() {
166
+ // Shared client lifecycle is owned by Crowi (api boot). The
167
+ // counter doesn't `disconnect()` the underlying client here —
168
+ // doing so would tear down session storage / config pub-sub /
169
+ // page-event pubsub too. Phase 9 multi-instance extensions
170
+ // that *do* own a private client can override this.
171
+ debug('disconnect() noop — shared client lifetime owned by Crowi');
172
+ },
173
+ };
174
+ }
175
+ //# sourceMappingURL=editor-cap-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-cap-counter.js","sourceRoot":"","sources":["../../src/util/editor-cap-counter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { Readable } from 'node:stream';
2
+ import type Crowi from '../crowi';
3
+ import type { StorageDriver } from '@crowi/plugin-api';
4
+ /**
5
+ * Look up a storage driver by its registered name. Throws with the list
6
+ * of available drivers when no match — used by the `crowi-admin storage
7
+ * copy` CLI which addresses non-active drivers by name.
8
+ */
9
+ export declare function getStorageDriverByName(crowi: Crowi, name: string): StorageDriver;
10
+ export interface FileUploader {
11
+ /**
12
+ * Upload a file from a local path or a Readable stream. Used by the
13
+ * attachment / profile-picture controllers.
14
+ *
15
+ * `filePath` is the storage key (forwarded verbatim to the driver).
16
+ * `type` is the MIME content type. `fileStream` may be a Readable or
17
+ * the path of a temp file on disk (legacy callers pass either).
18
+ */
19
+ uploadFile(filePath: string, type: string, fileStream: Readable | string, options?: Record<string, unknown>): Promise<{
20
+ key: string;
21
+ }>;
22
+ /** Stream a stored file back to the caller. */
23
+ findDeliveryFile(attachmentId: unknown, filePath: string): Promise<Readable>;
24
+ /** Delete a stored file. Idempotent. */
25
+ deleteFile(attachmentId: unknown, filePath: string): Promise<void>;
26
+ /**
27
+ * Build a URL the browser can fetch. Drivers that support
28
+ * `signedUrl` (e.g. S3) return a time-limited URL; drivers that
29
+ * don't fall back to the API streaming endpoint.
30
+ *
31
+ * NOTE: For values that get *persisted* (e.g. `user.image`) use
32
+ * {@link persistentUrl} instead — a signed URL expires and would
33
+ * 403 once stored.
34
+ */
35
+ generateUrl(filePath: string, expiresInSec?: number): Promise<string>;
36
+ /**
37
+ * Stable, non-expiring URL for a `user/`-prefixed key, suitable for
38
+ * storing in the DB (`user.image`). Always the `by-key` streaming
39
+ * proxy (`/api/v2/attachments/by-key/:key`), never a time-limited
40
+ * signed URL — regardless of the active driver. The proxy streams
41
+ * from whichever driver is active (local or S3) and is reachable from
42
+ * an `<img src>` via the access-token cookie, so avatars survive past
43
+ * any signed-URL TTL.
44
+ */
45
+ persistentUrl(filePath: string): string;
46
+ }
47
+ declare const _default: (crowi: Crowi) => FileUploader;
48
+ export default _default;
49
+ /**
50
+ * Path prefix used by `generateUrl()` when a driver has no `signedUrl`.
51
+ * Hoisted so the storage-copy migration can recognise the same shape
52
+ * when extracting keys from `User.image` URLs without re-encoding the
53
+ * route knowledge in two places.
54
+ */
55
+ export declare const BY_KEY_URL_PREFIX = "/api/v2/attachments/by-key/";
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BY_KEY_URL_PREFIX = void 0;
4
+ exports.getStorageDriverByName = getStorageDriverByName;
5
+ const node_fs_1 = require("node:fs");
6
+ // Resolved per call (not cached at module init) because the
7
+ // PluginManager bootstraps after this module is required.
8
+ function activeDriver(crowi) {
9
+ const driver = crowi.getPlugins().active.storage;
10
+ if (!driver) {
11
+ throw new Error('Storage driver not registered. Install @crowi/plugin-storage-local (default) or @crowi/plugin-storage-aws-s3.');
12
+ }
13
+ return driver;
14
+ }
15
+ /**
16
+ * Look up a storage driver by its registered name. Throws with the list
17
+ * of available drivers when no match — used by the `crowi-admin storage
18
+ * copy` CLI which addresses non-active drivers by name.
19
+ */
20
+ function getStorageDriverByName(crowi, name) {
21
+ const driver = crowi.getPlugins().storage.get(name);
22
+ if (driver)
23
+ return driver;
24
+ const available = crowi
25
+ .getPlugins()
26
+ .storage.list()
27
+ .map((d) => d.driverName)
28
+ .join(', ');
29
+ throw new Error(`Storage driver '${name}' is not registered. Available drivers: ${available || '(none)'}.`);
30
+ }
31
+ exports.default = (crowi) => ({
32
+ async uploadFile(filePath, type, fileStream, _options) {
33
+ const driver = activeDriver(crowi);
34
+ const stream = typeof fileStream === 'string' ? (0, node_fs_1.createReadStream)(fileStream) : fileStream;
35
+ return driver.put(filePath, stream, { contentType: type });
36
+ },
37
+ async findDeliveryFile(_attachmentId, filePath) {
38
+ const driver = activeDriver(crowi);
39
+ return driver.get(filePath);
40
+ },
41
+ async deleteFile(_attachmentId, filePath) {
42
+ const driver = activeDriver(crowi);
43
+ await driver.delete(filePath);
44
+ },
45
+ async generateUrl(filePath, expiresInSec = 60 * 5) {
46
+ const driver = activeDriver(crowi);
47
+ if (driver.signedUrl) {
48
+ return driver.signedUrl(filePath, expiresInSec);
49
+ }
50
+ // Drivers without signedUrl (e.g. local) fall back to the ts-rest
51
+ // streaming endpoint mounted at `/api/v2/attachments/by-key/:key`.
52
+ // The `by-key` route only accepts keys under the `user/` prefix
53
+ // (profile pictures); attachment-row-backed files use the
54
+ // `/api/v2/attachments/:id` route via `Attachment.fileUrl`.
55
+ return `${exports.BY_KEY_URL_PREFIX}${encodeURIComponent(filePath)}`;
56
+ },
57
+ persistentUrl(filePath) {
58
+ // Always the stable proxy — never a signed URL — because the value
59
+ // is persisted (e.g. user.image). See the interface doc.
60
+ return `${exports.BY_KEY_URL_PREFIX}${encodeURIComponent(filePath)}`;
61
+ },
62
+ });
63
+ /**
64
+ * Path prefix used by `generateUrl()` when a driver has no `signedUrl`.
65
+ * Hoisted so the storage-copy migration can recognise the same shape
66
+ * when extracting keys from `User.image` URLs without re-encoding the
67
+ * route knowledge in two places.
68
+ */
69
+ exports.BY_KEY_URL_PREFIX = '/api/v2/attachments/by-key/';
70
+ //# sourceMappingURL=fileUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUploader.js","sourceRoot":"","sources":["../../src/util/fileUploader.ts"],"names":[],"mappings":";;;AAoBA,wDASC;AA7BD,qCAA2C;AAK3C,4DAA4D;AAC5D,0DAA0D;AAC1D,SAAS,YAAY,CAAC,KAAY;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,+GAA+G,CAAC,CAAC;IACnI,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,KAAY,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK;SACpB,UAAU,EAAE;SACZ,OAAO,CAAC,IAAI,EAAE;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,2CAA2C,SAAS,IAAI,QAAQ,GAAG,CAAC,CAAC;AAC9G,CAAC;AA0CD,kBAAe,CAAC,KAAY,EAAgB,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ;QACnD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAa,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACpG,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ;QAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ;QACtC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,EAAE,GAAG,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClD,CAAC;QACD,kEAAkE;QAClE,mEAAmE;QACnE,gEAAgE;QAChE,0DAA0D;QAC1D,4DAA4D;QAC5D,OAAO,GAAG,yBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,aAAa,CAAC,QAAQ;QACpB,mEAAmE;QACnE,yDAAyD;QACzD,OAAO,GAAG,yBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,CAAC;CACF,CAAC,CAAC;AAEH;;;;;GAKG;AACU,QAAA,iBAAiB,GAAG,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const normalizeCRLFFilter: (value: any) => any;
2
+ export declare const stringToArrayFilter: (value: any) => any;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stringToArrayFilter = exports.normalizeCRLFFilter = void 0;
4
+ const normalizeCRLFFilter = (value) => {
5
+ return value.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
6
+ };
7
+ exports.normalizeCRLFFilter = normalizeCRLFFilter;
8
+ const stringToArrayFilter = (value) => {
9
+ if (!value || value === '') {
10
+ return [];
11
+ }
12
+ return value.split('\n');
13
+ };
14
+ exports.stringToArrayFilter = stringToArrayFilter;
15
+ //# sourceMappingURL=formUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formUtil.js","sourceRoot":"","sources":["../../src/util/formUtil.ts"],"names":[],"mappings":";;;AAAO,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAEK,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,EAAE;IAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B"}
@@ -0,0 +1,2 @@
1
+ declare const _default: (config: any) => any;
2
+ export default _default;