@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,242 @@
1
+ "use strict";
2
+ /**
3
+ * TTY-aware boot reporter (feature-boot-progress-ui, Part 1).
4
+ *
5
+ * Wraps the existing `step()` boot sequence in `crowi/index.ts` and groups
6
+ * the 13 init steps + the server start steps into four layers
7
+ * (core / config / services / server). Each layer is shown as:
8
+ *
9
+ * - TTY: a live spinner that resolves to `✓ <layer> (Nms)` and a final
10
+ * `🚀 API ready <url>` banner.
11
+ * - non-TTY: a structured, grep-able one-line log per layer
12
+ * (`[boot] core ok (412ms)`), no cursor control / re-draw.
13
+ *
14
+ * In both modes a machine-readable marker is emitted on exactly one line at
15
+ * the end of boot: `@@crowi:ready api <url>` on success, or
16
+ * `@@crowi:fail api <reason>` when boot aborts (e.g. the database is
17
+ * unreachable). These two markers are the only contract `scripts/dev.mjs`
18
+ * depends on — kept separate from the human-facing banner so wording can
19
+ * change freely. On the fail marker the dev launcher tears the whole tree
20
+ * (api · web · deps) down instead of leaving web up against a dead api.
21
+ *
22
+ * The reporter is intentionally `debug`-independent: it writes to stdout
23
+ * directly so operators see boot progress without `DEBUG=crowi:*`. When
24
+ * `DEBUG` is set we degrade to plain mode (see {@link createBootReporter}) so
25
+ * spinner re-draws never interleave with debug output.
26
+ *
27
+ * Pure helpers (marker formatting/parsing, plain-line formatting, duration
28
+ * formatting, spinner frame, ANSI escapes) are exported so they can be
29
+ * unit-tested without a real TTY.
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.FAIL_MARKER_PREFIX = exports.ANSI = exports.READY_MARKER_PREFIX = void 0;
33
+ exports.formatDuration = formatDuration;
34
+ exports.spinnerFrame = spinnerFrame;
35
+ exports.formatReadyMarker = formatReadyMarker;
36
+ exports.parseReadyMarker = parseReadyMarker;
37
+ exports.formatFailMarker = formatFailMarker;
38
+ exports.parseFailMarker = parseFailMarker;
39
+ exports.formatPlainLayerLine = formatPlainLayerLine;
40
+ exports.formatPlainReadyLine = formatPlainReadyLine;
41
+ exports.createBootReporter = createBootReporter;
42
+ /** Stable, machine-readable readiness marker prefix. Shared contract with `scripts/dev.mjs`. */
43
+ exports.READY_MARKER_PREFIX = '@@crowi:ready';
44
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
45
+ const SPINNER_INTERVAL_MS = 80;
46
+ const LAYER_LABELS = {
47
+ core: 'core (encryption · database · models · redis)',
48
+ config: 'config (load · migrations · oauth seed)',
49
+ services: 'services (renderer · plugins · mailer · slack)',
50
+ server: 'server (build · attach · listen)',
51
+ };
52
+ // ── pure helpers (unit-tested) ──────────────────────────────────────────────
53
+ /** ANSI escape fragments — bundled so tests can assert on exact bytes. */
54
+ exports.ANSI = {
55
+ hideCursor: '\x1b[?25l',
56
+ showCursor: '\x1b[?25h',
57
+ clearLine: '\x1b[2K',
58
+ cursorStart: '\r',
59
+ dim: '\x1b[2m',
60
+ green: '\x1b[32m',
61
+ cyan: '\x1b[36m',
62
+ bold: '\x1b[1m',
63
+ reset: '\x1b[0m',
64
+ };
65
+ /** Format a duration as a compact `(Nms)` / `(N.Ns)` token. */
66
+ function formatDuration(ms) {
67
+ if (ms < 1000)
68
+ return `${Math.round(ms)}ms`;
69
+ return `${(ms / 1000).toFixed(1)}s`;
70
+ }
71
+ /** Spinner frame for a given tick (wraps around the frame list). */
72
+ function spinnerFrame(tick) {
73
+ return SPINNER_FRAMES[tick % SPINNER_FRAMES.length];
74
+ }
75
+ /** Build the `@@crowi:ready <service> <url>` marker line (no trailing newline). */
76
+ function formatReadyMarker(service, url) {
77
+ return `${exports.READY_MARKER_PREFIX} ${service} ${url}`;
78
+ }
79
+ /**
80
+ * Parse a `@@crowi:ready <service> <url>` marker out of an arbitrary output
81
+ * line (it may be prefixed by turbo's `api:dev: ` etc.). Returns null when the
82
+ * line carries no marker. Shared logic mirrored in `scripts/dev.mjs`.
83
+ */
84
+ function parseReadyMarker(line) {
85
+ const idx = line.indexOf(exports.READY_MARKER_PREFIX);
86
+ if (idx === -1)
87
+ return null;
88
+ const rest = line.slice(idx + exports.READY_MARKER_PREFIX.length).trim();
89
+ const [service, url] = rest.split(/\s+/);
90
+ if (!service || !url)
91
+ return null;
92
+ return { service, url };
93
+ }
94
+ /** Stable, machine-readable boot-failure marker prefix. Shared contract with `scripts/dev.mjs`. */
95
+ exports.FAIL_MARKER_PREFIX = '@@crowi:fail';
96
+ /**
97
+ * Build the `@@crowi:fail <service> <reason>` marker line (no trailing newline).
98
+ * The reason is collapsed to a single line so the marker is always parseable
99
+ * off one output line.
100
+ */
101
+ function formatFailMarker(service, reason) {
102
+ return `${exports.FAIL_MARKER_PREFIX} ${service} ${reason.replace(/\s+/g, ' ').trim()}`;
103
+ }
104
+ /**
105
+ * Parse a `@@crowi:fail <service> <reason…>` marker out of an arbitrary output
106
+ * line (it may be prefixed by turbo's `api:dev: `). `service` is the first
107
+ * token; `reason` is the remainder (may be empty). Returns null when the line
108
+ * carries no marker. Mirrored in `scripts/dev.mjs` so the dev launcher can tear
109
+ * the whole tree down instead of leaving web up against a dead api.
110
+ */
111
+ function parseFailMarker(line) {
112
+ const idx = line.indexOf(exports.FAIL_MARKER_PREFIX);
113
+ if (idx === -1)
114
+ return null;
115
+ const rest = line.slice(idx + exports.FAIL_MARKER_PREFIX.length).trim();
116
+ if (!rest)
117
+ return null;
118
+ const sp = rest.indexOf(' ');
119
+ if (sp === -1)
120
+ return { service: rest, reason: '' };
121
+ return { service: rest.slice(0, sp), reason: rest.slice(sp + 1).trim() };
122
+ }
123
+ /** Non-TTY structured layer line: `[boot] core ok (412ms)`. */
124
+ function formatPlainLayerLine(layer, ms) {
125
+ return `[boot] ${layer} ok (${formatDuration(ms)})`;
126
+ }
127
+ /** Non-TTY final line: `[boot] ready in 1.2s` (total boot time). */
128
+ function formatPlainReadyLine(totalMs) {
129
+ return `[boot] ready in ${formatDuration(totalMs)}`;
130
+ }
131
+ /**
132
+ * Construct the boot reporter. In TTY mode it animates a spinner per layer; in
133
+ * plain mode (non-TTY, or `DEBUG` set) it emits one structured line per layer.
134
+ */
135
+ function createBootReporter(options = {}) {
136
+ const stream = options.stream ?? process.stdout;
137
+ const quiet = options.quiet ?? false;
138
+ const debugEnabled = options.debugEnabled ?? Boolean(process.env.DEBUG);
139
+ // Graceful degrade: spinner only when we own a real TTY *and* DEBUG isn't
140
+ // flooding the same stream. In quiet mode force plain (no spinner timer) —
141
+ // `write` is a no-op anyway, this just avoids arming a useless interval.
142
+ const tty = !quiet && (options.isTTY ?? Boolean(stream.isTTY)) && !debugEnabled;
143
+ const bootStart = Date.now();
144
+ let layerStart = 0;
145
+ let activeLayer = null;
146
+ let tick = 0;
147
+ let timer = null;
148
+ const write = (s) => {
149
+ if (quiet)
150
+ return;
151
+ stream.write(s);
152
+ };
153
+ const drawSpinner = () => {
154
+ if (!activeLayer)
155
+ return;
156
+ write(`${exports.ANSI.cursorStart}${exports.ANSI.clearLine}${exports.ANSI.cyan}${spinnerFrame(tick)}${exports.ANSI.reset} ${LAYER_LABELS[activeLayer]}`);
157
+ tick += 1;
158
+ };
159
+ const stopSpinner = () => {
160
+ if (timer) {
161
+ clearInterval(timer);
162
+ timer = null;
163
+ }
164
+ };
165
+ // Hide the cursor, draw the first frame, and arm the redraw interval for the
166
+ // current `activeLayer`. Shared by `beginLayer` (initial) and `note` (re-arm
167
+ // after temporarily clearing the line to print a message).
168
+ const startSpinner = () => {
169
+ write(exports.ANSI.hideCursor);
170
+ drawSpinner();
171
+ timer = setInterval(drawSpinner, SPINNER_INTERVAL_MS);
172
+ };
173
+ const beginLayer = (layer) => {
174
+ activeLayer = layer;
175
+ layerStart = Date.now();
176
+ tick = 0;
177
+ if (tty)
178
+ startSpinner();
179
+ };
180
+ const endLayer = () => {
181
+ if (!activeLayer)
182
+ return;
183
+ const elapsed = Date.now() - layerStart;
184
+ if (tty) {
185
+ stopSpinner();
186
+ write(`${exports.ANSI.cursorStart}${exports.ANSI.clearLine}${exports.ANSI.green}✓${exports.ANSI.reset} ${LAYER_LABELS[activeLayer]} ${exports.ANSI.dim}(${formatDuration(elapsed)})${exports.ANSI.reset}\n`);
187
+ write(exports.ANSI.showCursor);
188
+ }
189
+ else {
190
+ write(`${formatPlainLayerLine(activeLayer, elapsed)}\n`);
191
+ }
192
+ activeLayer = null;
193
+ };
194
+ const note = (writeFn) => {
195
+ if (tty && timer) {
196
+ stopSpinner();
197
+ write(`${exports.ANSI.cursorStart}${exports.ANSI.clearLine}`);
198
+ write(exports.ANSI.showCursor);
199
+ writeFn();
200
+ // Re-arm the spinner for the still-running layer.
201
+ startSpinner();
202
+ }
203
+ else {
204
+ writeFn();
205
+ }
206
+ };
207
+ const finish = (service, url) => {
208
+ // Defensive: make sure no spinner is left running.
209
+ if (activeLayer)
210
+ endLayer();
211
+ stopSpinner();
212
+ const total = Date.now() - bootStart;
213
+ if (tty) {
214
+ write(`${exports.ANSI.bold}${exports.ANSI.green}🚀 API ready${exports.ANSI.reset} ${exports.ANSI.cyan}${url}${exports.ANSI.reset} ${exports.ANSI.dim}(${formatDuration(total)})${exports.ANSI.reset}\n`);
215
+ }
216
+ else {
217
+ write(`${formatPlainReadyLine(total)}\n`);
218
+ }
219
+ // Machine-readable marker — always on its own line, TTY or not.
220
+ write(`${formatReadyMarker(service, url)}\n`);
221
+ };
222
+ let disposed = false;
223
+ const dispose = () => {
224
+ // Idempotent: a try/finally around the boot steps *and* `exitOnError` may
225
+ // both call this. After the first run there's no spinner/cursor state left
226
+ // to clean up, so subsequent calls are no-ops (and never re-emit ANSI).
227
+ if (disposed)
228
+ return;
229
+ disposed = true;
230
+ const spinning = timer !== null;
231
+ stopSpinner();
232
+ if (tty && spinning) {
233
+ // Wipe the half-drawn spinner line so a following console.error stack
234
+ // starts clean, and restore the cursor we hid in startSpinner().
235
+ write(`${exports.ANSI.cursorStart}${exports.ANSI.clearLine}`);
236
+ write(exports.ANSI.showCursor);
237
+ }
238
+ activeLayer = null;
239
+ };
240
+ return { beginLayer, endLayer, note, finish, dispose };
241
+ }
242
+ //# sourceMappingURL=boot-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-reporter.js","sourceRoot":"","sources":["../../src/util/boot-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type Crowi from '../crowi';
2
+ import { type EditorCapCounter } from './editor-cap-counter';
3
+ /**
4
+ * Resolve (and cache) the process-wide editor cap counter. Lazy so
5
+ * the api process can boot without an immediate Redis round-trip;
6
+ * the counter materialises on the first call (= first yjs-token
7
+ * issuance or first WebSocket attach, whichever comes first).
8
+ *
9
+ * Concurrent-first-caller dedup: the cache stores the in-flight
10
+ * `Promise<EditorCapCounter>`, not the resolved counter. Any
11
+ * concurrent caller observes the cached promise and races onto the
12
+ * same counter rather than each opening their own.
13
+ *
14
+ * Exported so the embedded Hocuspocus engine (`collab/attach.ts`)
15
+ * and the wsToken HTTP handler share **one** counter instance — same
16
+ * Redis keys, same in-process cache, same future Lua-atomic upgrade
17
+ * path.
18
+ */
19
+ export declare function getEditorCapCounter(crowi: Crowi): Promise<EditorCapCounter>;
20
+ /**
21
+ * Probe the editor cap for the given page. Returns `{ readonly: true }`
22
+ * when the current Redis-tracked editor count is at or above the cap.
23
+ *
24
+ * Phase 9 signature change: now takes a `Crowi` instance so the
25
+ * counter can be built against the shared `crowi.redis` client. The
26
+ * collab attach helper builds its own counter independently with
27
+ * the same client, but both wrappers eventually flow through the
28
+ * same Redis keys.
29
+ */
30
+ export declare const checkEditorCap: (crowi: Crowi, pageId: string) => Promise<{
31
+ readonly: boolean;
32
+ }>;
33
+ /**
34
+ * Test helper — set the cached counter or reset to lazy. Pass a
35
+ * pre-built fake to exercise the cap-reached path without Redis; pass
36
+ * `null` to clear the cache so a fresh env is honoured on the next
37
+ * call.
38
+ */
39
+ export declare const _setEditorCapCounterForTesting: (counter: EditorCapCounter | null) => void;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._setEditorCapCounterForTesting = exports.checkEditorCap = void 0;
4
+ exports.getEditorCapCounter = getEditorCapCounter;
5
+ const editor_cap_counter_1 = require("./editor-cap-counter");
6
+ /**
7
+ * Editor cap check used by the wsToken issuance endpoint
8
+ * (`GET /api/v2/pages/:id/yjs-token`, Phase 2). RFC-0003 Phase 6
9
+ * promotes the Phase 2 stub to a Redis-backed check via the shared
10
+ * `editor-cap-counter` util.
11
+ *
12
+ * Why a thin wrapper here instead of using the counter directly in
13
+ * the route handler? The wsToken handler shouldn't know about Redis
14
+ * — it asks a domain-shaped question ("is this connection at cap?")
15
+ * and gets a boolean back. Keeping the swap-point isolated in this
16
+ * file means the Phase 9 same-process attach work touches:
17
+ *
18
+ * - `util/editor-cap-counter.ts` (signature: `redisOpts` → `redisClient`)
19
+ * - `util/collab-cap.ts` (this — reads `crowi.redis`)
20
+ *
21
+ * The route handler (`routes/ts-rest/page-collab.ts`) is unchanged
22
+ * apart from passing `crowi` into the call.
23
+ *
24
+ * `peek` (read-only) is used here on purpose: a `tryAcquire` would
25
+ * SADD a token-issuance attempt that may never actually connect
26
+ * (browser tab closed before the WebSocket handshake), inflating the
27
+ * count. The real acquire happens later in `onAuthenticate` (Phase 6
28
+ * defence-in-depth on the embedded Hocuspocus side; see
29
+ * `src/collab/attach.ts`), where the WebSocket has already opened
30
+ * and we have a real `socketId` to scope the SADD entry to.
31
+ *
32
+ * Fail-open posture: if `crowi.redis` is null (REDIS_URL unset) the
33
+ * underlying counter returns 0 from `peek` and this helper falls
34
+ * through to `{ readonly: false }`. The cap is a soft limit by
35
+ * design (spec §Phase 6); a Redis outage must not lock out *all*
36
+ * editors.
37
+ */
38
+ let cachedCounter = null;
39
+ /**
40
+ * Resolve (and cache) the process-wide editor cap counter. Lazy so
41
+ * the api process can boot without an immediate Redis round-trip;
42
+ * the counter materialises on the first call (= first yjs-token
43
+ * issuance or first WebSocket attach, whichever comes first).
44
+ *
45
+ * Concurrent-first-caller dedup: the cache stores the in-flight
46
+ * `Promise<EditorCapCounter>`, not the resolved counter. Any
47
+ * concurrent caller observes the cached promise and races onto the
48
+ * same counter rather than each opening their own.
49
+ *
50
+ * Exported so the embedded Hocuspocus engine (`collab/attach.ts`)
51
+ * and the wsToken HTTP handler share **one** counter instance — same
52
+ * Redis keys, same in-process cache, same future Lua-atomic upgrade
53
+ * path.
54
+ */
55
+ function getEditorCapCounter(crowi) {
56
+ if (cachedCounter)
57
+ return cachedCounter;
58
+ cachedCounter = (0, editor_cap_counter_1.createEditorCapCounter)({
59
+ redisClient: crowi.redis ?? null,
60
+ maxEditorsPerPage: (0, editor_cap_counter_1.parseCapEnv)(process.env.COLLAB_MAX_EDITORS_PER_PAGE),
61
+ });
62
+ return cachedCounter;
63
+ }
64
+ /**
65
+ * Probe the editor cap for the given page. Returns `{ readonly: true }`
66
+ * when the current Redis-tracked editor count is at or above the cap.
67
+ *
68
+ * Phase 9 signature change: now takes a `Crowi` instance so the
69
+ * counter can be built against the shared `crowi.redis` client. The
70
+ * collab attach helper builds its own counter independently with
71
+ * the same client, but both wrappers eventually flow through the
72
+ * same Redis keys.
73
+ */
74
+ const checkEditorCap = async (crowi, pageId) => {
75
+ const counter = await getEditorCapCounter(crowi);
76
+ const { count, cap } = await counter.peek(pageId);
77
+ return { readonly: count >= cap };
78
+ };
79
+ exports.checkEditorCap = checkEditorCap;
80
+ /**
81
+ * Test helper — set the cached counter or reset to lazy. Pass a
82
+ * pre-built fake to exercise the cap-reached path without Redis; pass
83
+ * `null` to clear the cache so a fresh env is honoured on the next
84
+ * call.
85
+ */
86
+ const _setEditorCapCounterForTesting = (counter) => {
87
+ cachedCounter = counter == null ? null : Promise.resolve(counter);
88
+ };
89
+ exports._setEditorCapCounterForTesting = _setEditorCapCounterForTesting;
90
+ //# sourceMappingURL=collab-cap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collab-cap.js","sourceRoot":"","sources":["../../src/util/collab-cap.ts"],"names":[],"mappings":";;;AAsDA,kDAOC;AA5DD,6DAAkG;AAElG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,IAAI,aAAa,GAAqC,IAAI,CAAC;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,mBAAmB,CAAC,KAAY;IAC9C,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,aAAa,GAAG,IAAA,2CAAsB,EAAC;QACrC,WAAW,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;QAChC,iBAAiB,EAAE,IAAA,gCAAW,EAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;KACxE,CAAC,CAAC;IACH,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;;;GASG;AACI,MAAM,cAAc,GAAG,KAAK,EAAE,KAAY,EAAE,MAAc,EAAkC,EAAE;IACnG,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,GAAG,EAAE,CAAC;AACpC,CAAC,CAAC;AAJW,QAAA,cAAc,kBAIzB;AAEF;;;;;GAKG;AACI,MAAM,8BAA8B,GAAG,CAAC,OAAgC,EAAQ,EAAE;IACvF,aAAa,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC;AAFW,QAAA,8BAA8B,kCAEzC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Provides the master key used to encrypt / decrypt sensitive values at rest.
3
+ * Default implementation reads `CROWI_ENCRYPTION_KEY` (base64-encoded 32 bytes).
4
+ * Phase 3 will add KMS-backed providers (AWS / GCP) using the same interface.
5
+ */
6
+ export interface KeyProvider {
7
+ /** Throws when the key is not configured or malformed. */
8
+ getKey(): Buffer;
9
+ }
10
+ /** Swap the active key provider. Test-only or for Phase 3 KMS plumbing. */
11
+ export declare function setKeyProvider(provider: KeyProvider): void;
12
+ /** Reset to the default env-based provider. Test helper. */
13
+ export declare function resetKeyProvider(): void;
14
+ /**
15
+ * Whether the current provider can produce a usable key. Service-layer code
16
+ * should treat encryption as best-effort: if false, fall back to plaintext
17
+ * (= legacy behaviour) so a missing key never crashes the app.
18
+ */
19
+ export declare function isEncryptionConfigured(): boolean;
20
+ /** True when the value carries our envelope prefix. */
21
+ export declare function isEncrypted(value: unknown): value is string;
22
+ /**
23
+ * Encrypt a UTF-8 string with AES-256-GCM. Format:
24
+ * enc:v1:<base64(iv)>:<base64(authTag)>:<base64(ciphertext)>
25
+ * IV is regenerated per call so the same plaintext yields different ciphertexts
26
+ * (= non-deterministic, not suitable for equality lookups).
27
+ */
28
+ export declare function encrypt(plain: string): string;
29
+ /**
30
+ * Decrypt a value produced by `encrypt()`. Values without the `enc:v1:` prefix
31
+ * are returned untouched so legacy plaintext rows keep working until they are
32
+ * migrated by the admin re-encryption flow.
33
+ *
34
+ * Throws on tag/IV mismatch (= tampering or wrong key) so callers can distinguish
35
+ * a real auth failure from a legacy passthrough.
36
+ */
37
+ export declare function decrypt(value: string): string;
38
+ /** Generate a fresh 32-byte master key, base64-encoded. CLI helper. */
39
+ export declare function generateKey(): string;
@@ -0,0 +1,105 @@
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.setKeyProvider = setKeyProvider;
7
+ exports.resetKeyProvider = resetKeyProvider;
8
+ exports.isEncryptionConfigured = isEncryptionConfigured;
9
+ exports.isEncrypted = isEncrypted;
10
+ exports.encrypt = encrypt;
11
+ exports.decrypt = decrypt;
12
+ exports.generateKey = generateKey;
13
+ const crypto_1 = __importDefault(require("crypto"));
14
+ const ALGORITHM = 'aes-256-gcm';
15
+ const PREFIX = 'enc:v1:';
16
+ const KEY_BYTES = 32;
17
+ const IV_BYTES = 12;
18
+ class EnvKeyProvider {
19
+ cachedKey = null;
20
+ getKey() {
21
+ if (this.cachedKey)
22
+ return this.cachedKey;
23
+ const raw = process.env.CROWI_ENCRYPTION_KEY;
24
+ if (!raw) {
25
+ throw new Error('CROWI_ENCRYPTION_KEY is not configured. Generate one with `openssl rand -base64 32`.');
26
+ }
27
+ const buf = Buffer.from(raw, 'base64');
28
+ if (buf.length !== KEY_BYTES) {
29
+ throw new Error(`CROWI_ENCRYPTION_KEY must decode to ${KEY_BYTES} bytes (got ${buf.length})`);
30
+ }
31
+ this.cachedKey = buf;
32
+ return buf;
33
+ }
34
+ }
35
+ let keyProvider = new EnvKeyProvider();
36
+ /** Swap the active key provider. Test-only or for Phase 3 KMS plumbing. */
37
+ function setKeyProvider(provider) {
38
+ keyProvider = provider;
39
+ }
40
+ /** Reset to the default env-based provider. Test helper. */
41
+ function resetKeyProvider() {
42
+ keyProvider = new EnvKeyProvider();
43
+ }
44
+ /**
45
+ * Whether the current provider can produce a usable key. Service-layer code
46
+ * should treat encryption as best-effort: if false, fall back to plaintext
47
+ * (= legacy behaviour) so a missing key never crashes the app.
48
+ */
49
+ function isEncryptionConfigured() {
50
+ try {
51
+ keyProvider.getKey();
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /** True when the value carries our envelope prefix. */
59
+ function isEncrypted(value) {
60
+ return typeof value === 'string' && value.startsWith(PREFIX);
61
+ }
62
+ /**
63
+ * Encrypt a UTF-8 string with AES-256-GCM. Format:
64
+ * enc:v1:<base64(iv)>:<base64(authTag)>:<base64(ciphertext)>
65
+ * IV is regenerated per call so the same plaintext yields different ciphertexts
66
+ * (= non-deterministic, not suitable for equality lookups).
67
+ */
68
+ function encrypt(plain) {
69
+ if (typeof plain !== 'string') {
70
+ throw new TypeError('encrypt() expects a string');
71
+ }
72
+ const iv = crypto_1.default.randomBytes(IV_BYTES);
73
+ const cipher = crypto_1.default.createCipheriv(ALGORITHM, keyProvider.getKey(), iv);
74
+ const ct = Buffer.concat([cipher.update(plain, 'utf8'), cipher.final()]);
75
+ const tag = cipher.getAuthTag();
76
+ return `${PREFIX}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;
77
+ }
78
+ /**
79
+ * Decrypt a value produced by `encrypt()`. Values without the `enc:v1:` prefix
80
+ * are returned untouched so legacy plaintext rows keep working until they are
81
+ * migrated by the admin re-encryption flow.
82
+ *
83
+ * Throws on tag/IV mismatch (= tampering or wrong key) so callers can distinguish
84
+ * a real auth failure from a legacy passthrough.
85
+ */
86
+ function decrypt(value) {
87
+ if (!isEncrypted(value)) {
88
+ return value;
89
+ }
90
+ const body = value.slice(PREFIX.length);
91
+ const parts = body.split(':');
92
+ if (parts.length !== 3) {
93
+ throw new Error('Malformed encrypted value: expected enc:v1:<iv>:<tag>:<ct>');
94
+ }
95
+ const [ivB64, tagB64, ctB64] = parts;
96
+ const decipher = crypto_1.default.createDecipheriv(ALGORITHM, keyProvider.getKey(), Buffer.from(ivB64, 'base64'));
97
+ decipher.setAuthTag(Buffer.from(tagB64, 'base64'));
98
+ const pt = Buffer.concat([decipher.update(Buffer.from(ctB64, 'base64')), decipher.final()]);
99
+ return pt.toString('utf8');
100
+ }
101
+ /** Generate a fresh 32-byte master key, base64-encoded. CLI helper. */
102
+ function generateKey() {
103
+ return crypto_1.default.randomBytes(KEY_BYTES).toString('base64');
104
+ }
105
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/util/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * feature-user-identity-uniqueness §c / §e — minimal user merge + reference
3
+ * reassign, used by the `user-unique-prepare` preflight migration to resolve
4
+ * existing duplicate users before the plain unique indexes are built.
5
+ *
6
+ * This is the *minimal* merge (uniqueness spec §2 "案2A"): just enough to
7
+ * reassign every ownership reference from a losing duplicate onto the surviving
8
+ * one and delete the loser. The full operator-facing `crowi-admin user merge`
9
+ * tool (uniqueness spec §e) is a separate task and not built here, but the
10
+ * reference-reassign set is the same so this routine is the shared core.
11
+ *
12
+ * The reassign set is the full collection/field set that had to be fixed by
13
+ * hand during the 2026-05 incident (uniqueness spec §c):
14
+ *
15
+ * pages.creator, pages.lastUpdateUser (scalar)
16
+ * pages.grantedUsers[], pages.liker[], pages.seenUsers[] (array)
17
+ * revisions.author, revisions.savedBy (scalar)
18
+ * revisions.contributors[] (array)
19
+ * comments.creator, bookmarks.user, attachments.creator,
20
+ * shares.creator, watchers.user, activities.user,
21
+ * notifications.user, updateposts.creator (scalar)
22
+ *
23
+ * Array fields use `$addToSet(to)` then `$pull(from)` so the surviving id
24
+ * appears at most once. `bookmarks` carries a unique `{ page, user }` index, so
25
+ * a losing user's bookmark of a page the survivor already bookmarked would
26
+ * collide on reassign — those losing rows are deleted first.
27
+ *
28
+ * Operations run on the raw mongo driver (`db.collection(...)`) rather than
29
+ * Mongoose models so this works uniformly across every collection (some of
30
+ * which aren't registered as models in every context) and stays close to the
31
+ * shape a future PostgreSQL port would take.
32
+ */
33
+ import type { mongo } from 'mongoose';
34
+ import type { MigrationLogger } from '../migration/types';
35
+ type Db = mongo.Db;
36
+ type ObjectId = mongo.ObjectId;
37
+ /** A scalar (`$set`) reference: one field on one collection holding a single user id. */
38
+ interface ScalarRef {
39
+ collection: string;
40
+ field: string;
41
+ }
42
+ /** An array (`$addToSet`/`$pull`) reference: a field holding a list of user ids. */
43
+ interface ArrayRef {
44
+ collection: string;
45
+ field: string;
46
+ }
47
+ /**
48
+ * The full scalar reference set (uniqueness spec §c). `from` is matched by
49
+ * exact equality; reassigned to `to` via `$set`.
50
+ */
51
+ export declare const SCALAR_USER_REFS: readonly ScalarRef[];
52
+ /** The full array reference set (uniqueness spec §c). */
53
+ export declare const ARRAY_USER_REFS: readonly ArrayRef[];
54
+ export interface ReassignResult {
55
+ /** Per-collection.field count of documents updated (scalar + array). */
56
+ reassigned: Record<string, number>;
57
+ /** Rows deleted to avoid a compound-unique collision (e.g. duplicate bookmarks). */
58
+ deletedConflicting: number;
59
+ }
60
+ /**
61
+ * Reassign every ownership reference from `from` to `to`. Does not touch the
62
+ * `users` collection itself (the caller deletes/keeps the user docs). Pure data
63
+ * movement — safe to call repeatedly (idempotent: a second run finds no `from`
64
+ * references left).
65
+ */
66
+ export declare function reassignUserReferences(db: Db, from: ObjectId, to: ObjectId, logger?: MigrationLogger): Promise<ReassignResult>;
67
+ /** A single duplicate group: the user kept plus the users merged away. */
68
+ export interface MergeGroup {
69
+ keep: ObjectId;
70
+ remove: ObjectId[];
71
+ }
72
+ export interface DedupResult {
73
+ groupsMerged: number;
74
+ usersRemoved: number;
75
+ reassigned: Record<string, number>;
76
+ deletedConflicting: number;
77
+ }
78
+ /**
79
+ * Merge each group: reassign every removed user's references onto `keep`, then
80
+ * delete the removed user docs. `dryRun` reports the would-be effect without
81
+ * writing.
82
+ */
83
+ export declare function mergeUserGroups(db: Db, groups: readonly MergeGroup[], opts: {
84
+ dryRun: boolean;
85
+ logger?: MigrationLogger;
86
+ }): Promise<DedupResult>;
87
+ /**
88
+ * The policy for choosing which user in a duplicate group survives
89
+ * (uniqueness spec §c): keep the one with the most content, breaking ties by
90
+ * oldest `createdAt`. "Content" is approximated by the number of pages the user
91
+ * created — the dominant signal in the incident and cheap to count.
92
+ *
93
+ * Returns the group with `keep` set to the winner and `remove` to the rest.
94
+ */
95
+ export declare function chooseSurvivor(db: Db, candidateIds: readonly ObjectId[]): Promise<MergeGroup>;
96
+ export {};