@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.
- package/LICENSE +21 -0
- package/dist/app.d.ts +8 -0
- package/dist/app.js +65 -0
- package/dist/app.js.map +1 -0
- package/dist/collab/attach.d.ts +33 -0
- package/dist/collab/attach.js +341 -0
- package/dist/collab/attach.js.map +1 -0
- package/dist/collab/extension-redis.d.ts +25 -0
- package/dist/collab/extension-redis.js +133 -0
- package/dist/collab/extension-redis.js.map +1 -0
- package/dist/common/functions/path2name.d.ts +1 -0
- package/dist/common/functions/path2name.js +22 -0
- package/dist/common/functions/path2name.js.map +1 -0
- package/dist/common/functions/renderIcon.d.ts +1 -0
- package/dist/common/functions/renderIcon.js +9 -0
- package/dist/common/functions/renderIcon.js.map +1 -0
- package/dist/controllers/admin.d.ts +3 -0
- package/dist/controllers/admin.js +474 -0
- package/dist/controllers/admin.js.map +1 -0
- package/dist/controllers/attachment.d.ts +4 -0
- package/dist/controllers/attachment.js +200 -0
- package/dist/controllers/attachment.js.map +1 -0
- package/dist/controllers/backlink.d.ts +3 -0
- package/dist/controllers/backlink.js +42 -0
- package/dist/controllers/backlink.js.map +1 -0
- package/dist/controllers/bookmark.d.ts +3 -0
- package/dist/controllers/bookmark.js +100 -0
- package/dist/controllers/bookmark.js.map +1 -0
- package/dist/controllers/comment.d.ts +3 -0
- package/dist/controllers/comment.js +111 -0
- package/dist/controllers/comment.js.map +1 -0
- package/dist/controllers/index.d.ts +25 -0
- package/dist/controllers/index.js +44 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/installer.d.ts +3 -0
- package/dist/controllers/installer.js +48 -0
- package/dist/controllers/installer.js.map +1 -0
- package/dist/controllers/login.d.ts +4 -0
- package/dist/controllers/login.js +438 -0
- package/dist/controllers/login.js.map +1 -0
- package/dist/controllers/logout.d.ts +5 -0
- package/dist/controllers/logout.js +11 -0
- package/dist/controllers/logout.js.map +1 -0
- package/dist/controllers/me.d.ts +4 -0
- package/dist/controllers/me.js +369 -0
- package/dist/controllers/me.js.map +1 -0
- package/dist/controllers/notification.d.ts +3 -0
- package/dist/controllers/notification.js +88 -0
- package/dist/controllers/notification.js.map +1 -0
- package/dist/controllers/page.d.ts +3 -0
- package/dist/controllers/page.js +881 -0
- package/dist/controllers/page.js.map +1 -0
- package/dist/controllers/revision.d.ts +3 -0
- package/dist/controllers/revision.js +91 -0
- package/dist/controllers/revision.js.map +1 -0
- package/dist/controllers/search.d.ts +3 -0
- package/dist/controllers/search.js +93 -0
- package/dist/controllers/search.js.map +1 -0
- package/dist/controllers/share.d.ts +3 -0
- package/dist/controllers/share.js +207 -0
- package/dist/controllers/share.js.map +1 -0
- package/dist/controllers/shareAccess.d.ts +3 -0
- package/dist/controllers/shareAccess.js +28 -0
- package/dist/controllers/shareAccess.js.map +1 -0
- package/dist/controllers/slack.d.ts +3 -0
- package/dist/controllers/slack.js +87 -0
- package/dist/controllers/slack.js.map +1 -0
- package/dist/controllers/tokenAuth.d.ts +10 -0
- package/dist/controllers/tokenAuth.js +292 -0
- package/dist/controllers/tokenAuth.js.map +1 -0
- package/dist/controllers/user.d.ts +3 -0
- package/dist/controllers/user.js +67 -0
- package/dist/controllers/user.js.map +1 -0
- package/dist/controllers/version.d.ts +4 -0
- package/dist/controllers/version.js +19 -0
- package/dist/controllers/version.js.map +1 -0
- package/dist/crowi/express-init.d.ts +4 -0
- package/dist/crowi/express-init.js +101 -0
- package/dist/crowi/express-init.js.map +1 -0
- package/dist/crowi/index.d.ts +245 -0
- package/dist/crowi/index.js +726 -0
- package/dist/crowi/index.js.map +1 -0
- package/dist/events/activity.d.ts +7 -0
- package/dist/events/activity.js +15 -0
- package/dist/events/activity.js.map +1 -0
- package/dist/events/bookmark.d.ts +8 -0
- package/dist/events/bookmark.js +16 -0
- package/dist/events/bookmark.js.map +1 -0
- package/dist/events/comment.d.ts +6 -0
- package/dist/events/comment.js +14 -0
- package/dist/events/comment.js.map +1 -0
- package/dist/events/config.d.ts +6 -0
- package/dist/events/config.js +12 -0
- package/dist/events/config.js.map +1 -0
- package/dist/events/index.d.ts +17 -0
- package/dist/events/index.js +22 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/mention-dispatch.d.ts +44 -0
- package/dist/events/mention-dispatch.js +151 -0
- package/dist/events/mention-dispatch.js.map +1 -0
- package/dist/events/notification.d.ts +7 -0
- package/dist/events/notification.js +15 -0
- package/dist/events/notification.js.map +1 -0
- package/dist/events/page.d.ts +44 -0
- package/dist/events/page.js +134 -0
- package/dist/events/page.js.map +1 -0
- package/dist/events/render-cache.d.ts +24 -0
- package/dist/events/render-cache.js +63 -0
- package/dist/events/render-cache.js.map +1 -0
- package/dist/events/user.d.ts +9 -0
- package/dist/events/user.js +39 -0
- package/dist/events/user.js.map +1 -0
- package/dist/form/admin/app.d.ts +2 -0
- package/dist/form/admin/app.js +9 -0
- package/dist/form/admin/app.js.map +1 -0
- package/dist/form/admin/auth.d.ts +2 -0
- package/dist/form/admin/auth.js +9 -0
- package/dist/form/admin/auth.js.map +1 -0
- package/dist/form/admin/aws.d.ts +2 -0
- package/dist/form/admin/aws.js +13 -0
- package/dist/form/admin/aws.js.map +1 -0
- package/dist/form/admin/github.d.ts +2 -0
- package/dist/form/admin/github.js +15 -0
- package/dist/form/admin/github.js.map +1 -0
- package/dist/form/admin/google.d.ts +2 -0
- package/dist/form/admin/google.js +13 -0
- package/dist/form/admin/google.js.map +1 -0
- package/dist/form/admin/mail.d.ts +2 -0
- package/dist/form/admin/mail.js +13 -0
- package/dist/form/admin/mail.js.map +1 -0
- package/dist/form/admin/sec.d.ts +2 -0
- package/dist/form/admin/sec.js +10 -0
- package/dist/form/admin/sec.js.map +1 -0
- package/dist/form/admin/slackSetting.d.ts +2 -0
- package/dist/form/admin/slackSetting.js +13 -0
- package/dist/form/admin/slackSetting.js.map +1 -0
- package/dist/form/admin/userEdit.d.ts +2 -0
- package/dist/form/admin/userEdit.js +9 -0
- package/dist/form/admin/userEdit.js.map +1 -0
- package/dist/form/admin/userInvite.d.ts +2 -0
- package/dist/form/admin/userInvite.js +9 -0
- package/dist/form/admin/userInvite.js.map +1 -0
- package/dist/form/comment.d.ts +2 -0
- package/dist/form/comment.js +9 -0
- package/dist/form/comment.js.map +1 -0
- package/dist/form/index.d.ts +25 -0
- package/dist/form/index.js +48 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/invited.d.ts +2 -0
- package/dist/form/invited.js +13 -0
- package/dist/form/invited.js.map +1 -0
- package/dist/form/login.d.ts +2 -0
- package/dist/form/login.js +11 -0
- package/dist/form/login.js.map +1 -0
- package/dist/form/me/apiToken.d.ts +2 -0
- package/dist/form/me/apiToken.js +9 -0
- package/dist/form/me/apiToken.js.map +1 -0
- package/dist/form/me/password.d.ts +2 -0
- package/dist/form/me/password.js +11 -0
- package/dist/form/me/password.js.map +1 -0
- package/dist/form/me/user.d.ts +2 -0
- package/dist/form/me/user.js +9 -0
- package/dist/form/me/user.js.map +1 -0
- package/dist/form/register.d.ts +2 -0
- package/dist/form/register.js +13 -0
- package/dist/form/register.js.map +1 -0
- package/dist/form/revision.d.ts +2 -0
- package/dist/form/revision.js +13 -0
- package/dist/form/revision.js.map +1 -0
- package/dist/hono/app.d.ts +19 -0
- package/dist/hono/app.js +21 -0
- package/dist/hono/app.js.map +1 -0
- package/dist/hono/handlers/_helpers/errors.d.ts +61 -0
- package/dist/hono/handlers/_helpers/errors.js +51 -0
- package/dist/hono/handlers/_helpers/errors.js.map +1 -0
- package/dist/hono/handlers/_helpers/user-shape.d.ts +46 -0
- package/dist/hono/handlers/_helpers/user-shape.js +23 -0
- package/dist/hono/handlers/_helpers/user-shape.js.map +1 -0
- package/dist/hono/handlers/access-token.d.ts +221 -0
- package/dist/hono/handlers/access-token.js +113 -0
- package/dist/hono/handlers/access-token.js.map +1 -0
- package/dist/hono/handlers/activation.d.ts +117 -0
- package/dist/hono/handlers/activation.js +77 -0
- package/dist/hono/handlers/activation.js.map +1 -0
- package/dist/hono/handlers/admin/app.d.ts +123 -0
- package/dist/hono/handlers/admin/app.js +76 -0
- package/dist/hono/handlers/admin/app.js.map +1 -0
- package/dist/hono/handlers/admin/auth.d.ts +127 -0
- package/dist/hono/handlers/admin/auth.js +91 -0
- package/dist/hono/handlers/admin/auth.js.map +1 -0
- package/dist/hono/handlers/admin/mail.d.ts +168 -0
- package/dist/hono/handlers/admin/mail.js +76 -0
- package/dist/hono/handlers/admin/mail.js.map +1 -0
- package/dist/hono/handlers/admin/plugins.d.ts +409 -0
- package/dist/hono/handlers/admin/plugins.js +257 -0
- package/dist/hono/handlers/admin/plugins.js.map +1 -0
- package/dist/hono/handlers/admin/search.d.ts +57 -0
- package/dist/hono/handlers/admin/search.js +55 -0
- package/dist/hono/handlers/admin/search.js.map +1 -0
- package/dist/hono/handlers/admin/security.d.ts +112 -0
- package/dist/hono/handlers/admin/security.js +71 -0
- package/dist/hono/handlers/admin/security.js.map +1 -0
- package/dist/hono/handlers/admin/share.d.ts +106 -0
- package/dist/hono/handlers/admin/share.js +55 -0
- package/dist/hono/handlers/admin/share.js.map +1 -0
- package/dist/hono/handlers/admin/storage.d.ts +55 -0
- package/dist/hono/handlers/admin/storage.js +40 -0
- package/dist/hono/handlers/admin/storage.js.map +1 -0
- package/dist/hono/handlers/admin/users.d.ts +1230 -0
- package/dist/hono/handlers/admin/users.js +316 -0
- package/dist/hono/handlers/admin/users.js.map +1 -0
- package/dist/hono/handlers/adminCrypto.d.ts +110 -0
- package/dist/hono/handlers/adminCrypto.js +151 -0
- package/dist/hono/handlers/adminCrypto.js.map +1 -0
- package/dist/hono/handlers/app.d.ts +26 -0
- package/dist/hono/handlers/app.js +34 -0
- package/dist/hono/handlers/app.js.map +1 -0
- package/dist/hono/handlers/attachment-stream.d.ts +4 -0
- package/dist/hono/handlers/attachment-stream.js +211 -0
- package/dist/hono/handlers/attachment-stream.js.map +1 -0
- package/dist/hono/handlers/attachment.d.ts +687 -0
- package/dist/hono/handlers/attachment.js +566 -0
- package/dist/hono/handlers/attachment.js.map +1 -0
- package/dist/hono/handlers/autocomplete.d.ts +160 -0
- package/dist/hono/handlers/autocomplete.js +181 -0
- package/dist/hono/handlers/autocomplete.js.map +1 -0
- package/dist/hono/handlers/backlink.d.ts +78 -0
- package/dist/hono/handlers/backlink.js +93 -0
- package/dist/hono/handlers/backlink.js.map +1 -0
- package/dist/hono/handlers/bookmark.d.ts +558 -0
- package/dist/hono/handlers/bookmark.js +166 -0
- package/dist/hono/handlers/bookmark.js.map +1 -0
- package/dist/hono/handlers/comment.d.ts +231 -0
- package/dist/hono/handlers/comment.js +191 -0
- package/dist/hono/handlers/comment.js.map +1 -0
- package/dist/hono/handlers/draft.d.ts +136 -0
- package/dist/hono/handlers/draft.js +191 -0
- package/dist/hono/handlers/draft.js.map +1 -0
- package/dist/hono/handlers/emailChange.d.ts +124 -0
- package/dist/hono/handlers/emailChange.js +79 -0
- package/dist/hono/handlers/emailChange.js.map +1 -0
- package/dist/hono/handlers/installer.d.ts +94 -0
- package/dist/hono/handlers/installer.js +93 -0
- package/dist/hono/handlers/installer.js.map +1 -0
- package/dist/hono/handlers/inviteAccept.d.ts +180 -0
- package/dist/hono/handlers/inviteAccept.js +94 -0
- package/dist/hono/handlers/inviteAccept.js.map +1 -0
- package/dist/hono/handlers/me.d.ts +401 -0
- package/dist/hono/handlers/me.js +390 -0
- package/dist/hono/handlers/me.js.map +1 -0
- package/dist/hono/handlers/notification.d.ts +274 -0
- package/dist/hono/handlers/notification.js +224 -0
- package/dist/hono/handlers/notification.js.map +1 -0
- package/dist/hono/handlers/oauth.d.ts +299 -0
- package/dist/hono/handlers/oauth.js +443 -0
- package/dist/hono/handlers/oauth.js.map +1 -0
- package/dist/hono/handlers/page-collab.d.ts +79 -0
- package/dist/hono/handlers/page-collab.js +98 -0
- package/dist/hono/handlers/page-collab.js.map +1 -0
- package/dist/hono/handlers/page-preview.d.ts +48 -0
- package/dist/hono/handlers/page-preview.js +83 -0
- package/dist/hono/handlers/page-preview.js.map +1 -0
- package/dist/hono/handlers/page.d.ts +2059 -0
- package/dist/hono/handlers/page.js +793 -0
- package/dist/hono/handlers/page.js.map +1 -0
- package/dist/hono/handlers/passwordReset.d.ts +181 -0
- package/dist/hono/handlers/passwordReset.js +101 -0
- package/dist/hono/handlers/passwordReset.js.map +1 -0
- package/dist/hono/handlers/presence.d.ts +178 -0
- package/dist/hono/handlers/presence.js +163 -0
- package/dist/hono/handlers/presence.js.map +1 -0
- package/dist/hono/handlers/revision.d.ts +345 -0
- package/dist/hono/handlers/revision.js +202 -0
- package/dist/hono/handlers/revision.js.map +1 -0
- package/dist/hono/handlers/search.d.ts +208 -0
- package/dist/hono/handlers/search.js +152 -0
- package/dist/hono/handlers/search.js.map +1 -0
- package/dist/hono/handlers/tokenAuth.d.ts +369 -0
- package/dist/hono/handlers/tokenAuth.js +240 -0
- package/dist/hono/handlers/tokenAuth.js.map +1 -0
- package/dist/hono/handlers/user.d.ts +710 -0
- package/dist/hono/handlers/user.js +212 -0
- package/dist/hono/handlers/user.js.map +1 -0
- package/dist/hono/index.d.ts +289 -0
- package/dist/hono/index.js +240 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono/middleware/admin.d.ts +5 -0
- package/dist/hono/middleware/admin.js +34 -0
- package/dist/hono/middleware/admin.js.map +1 -0
- package/dist/hono/middleware/auth.d.ts +54 -0
- package/dist/hono/middleware/auth.js +142 -0
- package/dist/hono/middleware/auth.js.map +1 -0
- package/dist/hono/middleware/cors.d.ts +3 -0
- package/dist/hono/middleware/cors.js +86 -0
- package/dist/hono/middleware/cors.js.map +1 -0
- package/dist/hono/middleware/default-hook.d.ts +8 -0
- package/dist/hono/middleware/default-hook.js +17 -0
- package/dist/hono/middleware/default-hook.js.map +1 -0
- package/dist/hono/middleware/error-handler.d.ts +2 -0
- package/dist/hono/middleware/error-handler.js +20 -0
- package/dist/hono/middleware/error-handler.js.map +1 -0
- package/dist/hono/middleware/rate-limit.d.ts +57 -0
- package/dist/hono/middleware/rate-limit.js +42 -0
- package/dist/hono/middleware/rate-limit.js.map +1 -0
- package/dist/hono/middleware/require-scope.d.ts +50 -0
- package/dist/hono/middleware/require-scope.js +64 -0
- package/dist/hono/middleware/require-scope.js.map +1 -0
- package/dist/hono/path-rewrite.d.ts +15 -0
- package/dist/hono/path-rewrite.js +59 -0
- package/dist/hono/path-rewrite.js.map +1 -0
- package/dist/mail/i18n/en.d.ts +2 -0
- package/dist/mail/i18n/en.js +66 -0
- package/dist/mail/i18n/en.js.map +1 -0
- package/dist/mail/i18n/index.d.ts +46 -0
- package/dist/mail/i18n/index.js +31 -0
- package/dist/mail/i18n/index.js.map +1 -0
- package/dist/mail/i18n/ja.d.ts +2 -0
- package/dist/mail/i18n/ja.js +66 -0
- package/dist/mail/i18n/ja.js.map +1 -0
- package/dist/mcp/attach.d.ts +25 -0
- package/dist/mcp/attach.js +104 -0
- package/dist/mcp/attach.js.map +1 -0
- package/dist/mcp/dispatch.d.ts +59 -0
- package/dist/mcp/dispatch.js +70 -0
- package/dist/mcp/dispatch.js.map +1 -0
- package/dist/mcp/result.d.ts +40 -0
- package/dist/mcp/result.js +78 -0
- package/dist/mcp/result.js.map +1 -0
- package/dist/mcp/server.d.ts +67 -0
- package/dist/mcp/server.js +113 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/page.d.ts +2 -0
- package/dist/mcp/tools/page.js +256 -0
- package/dist/mcp/tools/page.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +2 -0
- package/dist/mcp/tools/search.js +36 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/middlewares/accessTokenParser.d.ts +4 -0
- package/dist/middlewares/accessTokenParser.js +29 -0
- package/dist/middlewares/accessTokenParser.js.map +1 -0
- package/dist/middlewares/adminRequired.d.ts +10 -0
- package/dist/middlewares/adminRequired.js +35 -0
- package/dist/middlewares/adminRequired.js.map +1 -0
- package/dist/middlewares/applicationInstalled.d.ts +3 -0
- package/dist/middlewares/applicationInstalled.js +20 -0
- package/dist/middlewares/applicationInstalled.js.map +1 -0
- package/dist/middlewares/applicationNotInstalled.d.ts +3 -0
- package/dist/middlewares/applicationNotInstalled.js +13 -0
- package/dist/middlewares/applicationNotInstalled.js.map +1 -0
- package/dist/middlewares/basicAuth.d.ts +4 -0
- package/dist/middlewares/basicAuth.js +23 -0
- package/dist/middlewares/basicAuth.js.map +1 -0
- package/dist/middlewares/csrfVerify.d.ts +4 -0
- package/dist/middlewares/csrfVerify.js +24 -0
- package/dist/middlewares/csrfVerify.js.map +1 -0
- package/dist/middlewares/encodeSpace.d.ts +3 -0
- package/dist/middlewares/encodeSpace.js +14 -0
- package/dist/middlewares/encodeSpace.js.map +1 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.d.ts +4 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.js +29 -0
- package/dist/middlewares/fileAccessRightOrLoginRequired.js.map +1 -0
- package/dist/middlewares/index.d.ts +16 -0
- package/dist/middlewares/index.js +30 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/jwtAdminRequired.d.ts +8 -0
- package/dist/middlewares/jwtAdminRequired.js +35 -0
- package/dist/middlewares/jwtAdminRequired.js.map +1 -0
- package/dist/middlewares/jwtAuth.d.ts +4 -0
- package/dist/middlewares/jwtAuth.js +104 -0
- package/dist/middlewares/jwtAuth.js.map +1 -0
- package/dist/middlewares/loginChecker.d.ts +4 -0
- package/dist/middlewares/loginChecker.js +32 -0
- package/dist/middlewares/loginChecker.js.map +1 -0
- package/dist/middlewares/loginRequired.d.ts +4 -0
- package/dist/middlewares/loginRequired.js +88 -0
- package/dist/middlewares/loginRequired.js.map +1 -0
- package/dist/migration/cli-api.d.ts +83 -0
- package/dist/migration/cli-api.js +128 -0
- package/dist/migration/cli-api.js.map +1 -0
- package/dist/migration/migrations/index.d.ts +12 -0
- package/dist/migration/migrations/index.js +24 -0
- package/dist/migration/migrations/index.js.map +1 -0
- package/dist/migration/migrations/page-status-default.d.ts +25 -0
- package/dist/migration/migrations/page-status-default.js +79 -0
- package/dist/migration/migrations/page-status-default.js.map +1 -0
- package/dist/migration/migrations/revisions-schema-unify.d.ts +33 -0
- package/dist/migration/migrations/revisions-schema-unify.js +88 -0
- package/dist/migration/migrations/revisions-schema-unify.js.map +1 -0
- package/dist/migration/migrations/user-unique-prepare.d.ts +1 -0
- package/dist/migration/migrations/user-unique-prepare.js +214 -0
- package/dist/migration/migrations/user-unique-prepare.js.map +1 -0
- package/dist/migration/migrations/wikilink-format.d.ts +97 -0
- package/dist/migration/migrations/wikilink-format.js +418 -0
- package/dist/migration/migrations/wikilink-format.js.map +1 -0
- package/dist/migration/rebuild-api.d.ts +50 -0
- package/dist/migration/rebuild-api.js +45 -0
- package/dist/migration/rebuild-api.js.map +1 -0
- package/dist/migration/rebuild-runner.d.ts +64 -0
- package/dist/migration/rebuild-runner.js +42 -0
- package/dist/migration/rebuild-runner.js.map +1 -0
- package/dist/migration/rebuilds/index.d.ts +26 -0
- package/dist/migration/rebuilds/index.js +69 -0
- package/dist/migration/rebuilds/index.js.map +1 -0
- package/dist/migration/registry.d.ts +15 -0
- package/dist/migration/registry.js +96 -0
- package/dist/migration/registry.js.map +1 -0
- package/dist/migration/run-boot-migrations.d.ts +31 -0
- package/dist/migration/run-boot-migrations.js +95 -0
- package/dist/migration/run-boot-migrations.js.map +1 -0
- package/dist/migration/runner.d.ts +120 -0
- package/dist/migration/runner.js +276 -0
- package/dist/migration/runner.js.map +1 -0
- package/dist/migration/types.d.ts +153 -0
- package/dist/migration/types.js +13 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/models/activity.d.ts +34 -0
- package/dist/models/activity.js +263 -0
- package/dist/models/activity.js.map +1 -0
- package/dist/models/attachment.d.ts +25 -0
- package/dist/models/attachment.js +82 -0
- package/dist/models/attachment.js.map +1 -0
- package/dist/models/backlink.d.ts +19 -0
- package/dist/models/backlink.js +138 -0
- package/dist/models/backlink.js.map +1 -0
- package/dist/models/bookmark.d.ts +28 -0
- package/dist/models/bookmark.js +136 -0
- package/dist/models/bookmark.js.map +1 -0
- package/dist/models/comment.d.ts +21 -0
- package/dist/models/comment.js +87 -0
- package/dist/models/comment.js.map +1 -0
- package/dist/models/config-sensitive.d.ts +21 -0
- package/dist/models/config-sensitive.js +71 -0
- package/dist/models/config-sensitive.js.map +1 -0
- package/dist/models/config.d.ts +34 -0
- package/dist/models/config.js +161 -0
- package/dist/models/config.js.map +1 -0
- package/dist/models/index.d.ts +30 -0
- package/dist/models/index.js +55 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/migration-application.d.ts +54 -0
- package/dist/models/migration-application.js +36 -0
- package/dist/models/migration-application.js.map +1 -0
- package/dist/models/notification.d.ts +28 -0
- package/dist/models/notification.js +285 -0
- package/dist/models/notification.js.map +1 -0
- package/dist/models/oauth-authorization-code.d.ts +34 -0
- package/dist/models/oauth-authorization-code.js +100 -0
- package/dist/models/oauth-authorization-code.js.map +1 -0
- package/dist/models/oauth-client.d.ts +36 -0
- package/dist/models/oauth-client.js +56 -0
- package/dist/models/oauth-client.js.map +1 -0
- package/dist/models/oauth-device-code.d.ts +55 -0
- package/dist/models/oauth-device-code.js +158 -0
- package/dist/models/oauth-device-code.js.map +1 -0
- package/dist/models/oauth-refresh-token.d.ts +31 -0
- package/dist/models/oauth-refresh-token.js +118 -0
- package/dist/models/oauth-refresh-token.js.map +1 -0
- package/dist/models/page-yjs-update.d.ts +35 -0
- package/dist/models/page-yjs-update.js +33 -0
- package/dist/models/page-yjs-update.js.map +1 -0
- package/dist/models/page.d.ts +200 -0
- package/dist/models/page.js +1117 -0
- package/dist/models/page.js.map +1 -0
- package/dist/models/personal-access-token.d.ts +30 -0
- package/dist/models/personal-access-token.js +107 -0
- package/dist/models/personal-access-token.js.map +1 -0
- package/dist/models/plugin-render-cache.d.ts +40 -0
- package/dist/models/plugin-render-cache.js +39 -0
- package/dist/models/plugin-render-cache.js.map +1 -0
- package/dist/models/revision.d.ts +145 -0
- package/dist/models/revision.js +241 -0
- package/dist/models/revision.js.map +1 -0
- package/dist/models/share.d.ts +38 -0
- package/dist/models/share.js +137 -0
- package/dist/models/share.js.map +1 -0
- package/dist/models/shareAccess.d.ts +20 -0
- package/dist/models/shareAccess.js +45 -0
- package/dist/models/shareAccess.js.map +1 -0
- package/dist/models/tracking.d.ts +14 -0
- package/dist/models/tracking.js +14 -0
- package/dist/models/tracking.js.map +1 -0
- package/dist/models/updatePost.d.ts +25 -0
- package/dist/models/updatePost.js +87 -0
- package/dist/models/updatePost.js.map +1 -0
- package/dist/models/user.d.ts +144 -0
- package/dist/models/user.js +681 -0
- package/dist/models/user.js.map +1 -0
- package/dist/models/watcher.d.ts +23 -0
- package/dist/models/watcher.js +75 -0
- package/dist/models/watcher.js.map +1 -0
- package/dist/notifications/attach.d.ts +63 -0
- package/dist/notifications/attach.js +426 -0
- package/dist/notifications/attach.js.map +1 -0
- package/dist/notifications/channel.d.ts +13 -0
- package/dist/notifications/channel.js +18 -0
- package/dist/notifications/channel.js.map +1 -0
- package/dist/plugin/index.d.ts +2 -0
- package/dist/plugin/index.js +6 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/plugin-context.d.ts +22 -0
- package/dist/plugin/plugin-context.js +126 -0
- package/dist/plugin/plugin-context.js.map +1 -0
- package/dist/plugin/plugin-manager.d.ts +164 -0
- package/dist/plugin/plugin-manager.js +328 -0
- package/dist/plugin/plugin-manager.js.map +1 -0
- package/dist/plugin/plugin-namespace.d.ts +28 -0
- package/dist/plugin/plugin-namespace.js +53 -0
- package/dist/plugin/plugin-namespace.js.map +1 -0
- package/dist/plugin/registries.d.ts +38 -0
- package/dist/plugin/registries.js +71 -0
- package/dist/plugin/registries.js.map +1 -0
- package/dist/plugin/schema-serializer.d.ts +34 -0
- package/dist/plugin/schema-serializer.js +122 -0
- package/dist/plugin/schema-serializer.js.map +1 -0
- package/dist/plugin/topo-sort.d.ts +15 -0
- package/dist/plugin/topo-sort.js +59 -0
- package/dist/plugin/topo-sort.js.map +1 -0
- package/dist/presence/attach.d.ts +36 -0
- package/dist/presence/attach.js +399 -0
- package/dist/presence/attach.js.map +1 -0
- package/dist/renderer/__fixtures__/echo-embed.d.ts +27 -0
- package/dist/renderer/__fixtures__/echo-embed.js +24 -0
- package/dist/renderer/__fixtures__/echo-embed.js.map +1 -0
- package/dist/renderer/cache/index.d.ts +60 -0
- package/dist/renderer/cache/index.js +219 -0
- package/dist/renderer/cache/index.js.map +1 -0
- package/dist/renderer/cache/mongodb-cache.d.ts +82 -0
- package/dist/renderer/cache/mongodb-cache.js +180 -0
- package/dist/renderer/cache/mongodb-cache.js.map +1 -0
- package/dist/renderer/cache/reservation.d.ts +20 -0
- package/dist/renderer/cache/reservation.js +115 -0
- package/dist/renderer/cache/reservation.js.map +1 -0
- package/dist/renderer/core/_mdast-walk.d.ts +35 -0
- package/dist/renderer/core/_mdast-walk.js +45 -0
- package/dist/renderer/core/_mdast-walk.js.map +1 -0
- package/dist/renderer/core/code-block-dispatch.d.ts +31 -0
- package/dist/renderer/core/code-block-dispatch.js +166 -0
- package/dist/renderer/core/code-block-dispatch.js.map +1 -0
- package/dist/renderer/core/code-blocks.d.ts +12 -0
- package/dist/renderer/core/code-blocks.js +32 -0
- package/dist/renderer/core/code-blocks.js.map +1 -0
- package/dist/renderer/core/embed-tags.d.ts +14 -0
- package/dist/renderer/core/embed-tags.js +154 -0
- package/dist/renderer/core/embed-tags.js.map +1 -0
- package/dist/renderer/core/headings.d.ts +16 -0
- package/dist/renderer/core/headings.js +31 -0
- package/dist/renderer/core/headings.js.map +1 -0
- package/dist/renderer/core/index.d.ts +65 -0
- package/dist/renderer/core/index.js +83 -0
- package/dist/renderer/core/index.js.map +1 -0
- package/dist/renderer/core/mention-resolve.d.ts +39 -0
- package/dist/renderer/core/mention-resolve.js +75 -0
- package/dist/renderer/core/mention-resolve.js.map +1 -0
- package/dist/renderer/core/mentions.d.ts +2 -0
- package/dist/renderer/core/mentions.js +83 -0
- package/dist/renderer/core/mentions.js.map +1 -0
- package/dist/renderer/core/syntax-highlight.d.ts +21 -0
- package/dist/renderer/core/syntax-highlight.js +64 -0
- package/dist/renderer/core/syntax-highlight.js.map +1 -0
- package/dist/renderer/core/url-inline-expand.d.ts +9 -0
- package/dist/renderer/core/url-inline-expand.js +157 -0
- package/dist/renderer/core/url-inline-expand.js.map +1 -0
- package/dist/renderer/core/wikilinks.d.ts +2 -0
- package/dist/renderer/core/wikilinks.js +118 -0
- package/dist/renderer/core/wikilinks.js.map +1 -0
- package/dist/renderer/index.d.ts +67 -0
- package/dist/renderer/index.js +99 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/pipeline.d.ts +134 -0
- package/dist/renderer/pipeline.js +203 -0
- package/dist/renderer/pipeline.js.map +1 -0
- package/dist/renderer/registry.d.ts +83 -0
- package/dist/renderer/registry.js +130 -0
- package/dist/renderer/registry.js.map +1 -0
- package/dist/renderer/serialize.d.ts +27 -0
- package/dist/renderer/serialize.js +46 -0
- package/dist/renderer/serialize.js.map +1 -0
- package/dist/renderer/version.d.ts +30 -0
- package/dist/renderer/version.js +34 -0
- package/dist/renderer/version.js.map +1 -0
- package/dist/routes/admin.d.ts +4 -0
- package/dist/routes/admin.js +17 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/api/admin.d.ts +4 -0
- package/dist/routes/api/admin.js +37 -0
- package/dist/routes/api/admin.js.map +1 -0
- package/dist/routes/api/attachment.d.ts +4 -0
- package/dist/routes/api/attachment.js +19 -0
- package/dist/routes/api/attachment.js.map +1 -0
- package/dist/routes/api/bookmark.d.ts +4 -0
- package/dist/routes/api/bookmark.js +15 -0
- package/dist/routes/api/bookmark.js.map +1 -0
- package/dist/routes/api/comment.d.ts +4 -0
- package/dist/routes/api/comment.js +14 -0
- package/dist/routes/api/comment.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +36 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/like.d.ts +4 -0
- package/dist/routes/api/like.js +13 -0
- package/dist/routes/api/like.js.map +1 -0
- package/dist/routes/api/notification.d.ts +4 -0
- package/dist/routes/api/notification.js +15 -0
- package/dist/routes/api/notification.js.map +1 -0
- package/dist/routes/api/page.d.ts +4 -0
- package/dist/routes/api/page.js +24 -0
- package/dist/routes/api/page.js.map +1 -0
- package/dist/routes/api/revision.d.ts +4 -0
- package/dist/routes/api/revision.js +14 -0
- package/dist/routes/api/revision.js.map +1 -0
- package/dist/routes/api/share.d.ts +4 -0
- package/dist/routes/api/share.js +16 -0
- package/dist/routes/api/share.js.map +1 -0
- package/dist/routes/api/version.d.ts +4 -0
- package/dist/routes/api/version.js +10 -0
- package/dist/routes/api/version.js.map +1 -0
- package/dist/routes/index.d.ts +4 -0
- package/dist/routes/index.js +71 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/login.d.ts +4 -0
- package/dist/routes/login.js +18 -0
- package/dist/routes/login.js.map +1 -0
- package/dist/routes/me.d.ts +4 -0
- package/dist/routes/me.js +24 -0
- package/dist/routes/me.js.map +1 -0
- package/dist/routes/ts-rest/admin/app.d.ts +4 -0
- package/dist/routes/ts-rest/admin/app.js +67 -0
- package/dist/routes/ts-rest/admin/app.js.map +1 -0
- package/dist/routes/ts-rest/admin/auth.d.ts +4 -0
- package/dist/routes/ts-rest/admin/auth.js +95 -0
- package/dist/routes/ts-rest/admin/auth.js.map +1 -0
- package/dist/routes/ts-rest/admin/index.d.ts +10 -0
- package/dist/routes/ts-rest/admin/index.js +35 -0
- package/dist/routes/ts-rest/admin/index.js.map +1 -0
- package/dist/routes/ts-rest/admin/mail.d.ts +4 -0
- package/dist/routes/ts-rest/admin/mail.js +156 -0
- package/dist/routes/ts-rest/admin/mail.js.map +1 -0
- package/dist/routes/ts-rest/admin/plugins.d.ts +4 -0
- package/dist/routes/ts-rest/admin/plugins.js +317 -0
- package/dist/routes/ts-rest/admin/plugins.js.map +1 -0
- package/dist/routes/ts-rest/admin/search.d.ts +4 -0
- package/dist/routes/ts-rest/admin/search.js +67 -0
- package/dist/routes/ts-rest/admin/search.js.map +1 -0
- package/dist/routes/ts-rest/admin/security.d.ts +4 -0
- package/dist/routes/ts-rest/admin/security.js +114 -0
- package/dist/routes/ts-rest/admin/security.js.map +1 -0
- package/dist/routes/ts-rest/admin/share.d.ts +4 -0
- package/dist/routes/ts-rest/admin/share.js +69 -0
- package/dist/routes/ts-rest/admin/share.js.map +1 -0
- package/dist/routes/ts-rest/admin/storage.d.ts +4 -0
- package/dist/routes/ts-rest/admin/storage.js +59 -0
- package/dist/routes/ts-rest/admin/storage.js.map +1 -0
- package/dist/routes/ts-rest/admin/users.d.ts +4 -0
- package/dist/routes/ts-rest/admin/users.js +215 -0
- package/dist/routes/ts-rest/admin/users.js.map +1 -0
- package/dist/routes/ts-rest/adminCrypto.d.ts +4 -0
- package/dist/routes/ts-rest/adminCrypto.js +111 -0
- package/dist/routes/ts-rest/adminCrypto.js.map +1 -0
- package/dist/routes/ts-rest/app.d.ts +4 -0
- package/dist/routes/ts-rest/app.js +23 -0
- package/dist/routes/ts-rest/app.js.map +1 -0
- package/dist/routes/ts-rest/attachment.d.ts +4 -0
- package/dist/routes/ts-rest/attachment.js +830 -0
- package/dist/routes/ts-rest/attachment.js.map +1 -0
- package/dist/routes/ts-rest/auth.d.ts +4 -0
- package/dist/routes/ts-rest/auth.js +70 -0
- package/dist/routes/ts-rest/auth.js.map +1 -0
- package/dist/routes/ts-rest/autocomplete.d.ts +30 -0
- package/dist/routes/ts-rest/autocomplete.js +189 -0
- package/dist/routes/ts-rest/autocomplete.js.map +1 -0
- package/dist/routes/ts-rest/backlink.d.ts +4 -0
- package/dist/routes/ts-rest/backlink.js +106 -0
- package/dist/routes/ts-rest/backlink.js.map +1 -0
- package/dist/routes/ts-rest/bookmark.d.ts +4 -0
- package/dist/routes/ts-rest/bookmark.js +189 -0
- package/dist/routes/ts-rest/bookmark.js.map +1 -0
- package/dist/routes/ts-rest/comment.d.ts +4 -0
- package/dist/routes/ts-rest/comment.js +217 -0
- package/dist/routes/ts-rest/comment.js.map +1 -0
- package/dist/routes/ts-rest/draft.d.ts +22 -0
- package/dist/routes/ts-rest/draft.js +200 -0
- package/dist/routes/ts-rest/draft.js.map +1 -0
- package/dist/routes/ts-rest/index.d.ts +4 -0
- package/dist/routes/ts-rest/index.js +103 -0
- package/dist/routes/ts-rest/index.js.map +1 -0
- package/dist/routes/ts-rest/installer.d.ts +4 -0
- package/dist/routes/ts-rest/installer.js +77 -0
- package/dist/routes/ts-rest/installer.js.map +1 -0
- package/dist/routes/ts-rest/me.d.ts +4 -0
- package/dist/routes/ts-rest/me.js +410 -0
- package/dist/routes/ts-rest/me.js.map +1 -0
- package/dist/routes/ts-rest/notification.d.ts +4 -0
- package/dist/routes/ts-rest/notification.js +241 -0
- package/dist/routes/ts-rest/notification.js.map +1 -0
- package/dist/routes/ts-rest/page-collab.d.ts +29 -0
- package/dist/routes/ts-rest/page-collab.js +90 -0
- package/dist/routes/ts-rest/page-collab.js.map +1 -0
- package/dist/routes/ts-rest/page-preview.d.ts +26 -0
- package/dist/routes/ts-rest/page-preview.js +80 -0
- package/dist/routes/ts-rest/page-preview.js.map +1 -0
- package/dist/routes/ts-rest/page.d.ts +4 -0
- package/dist/routes/ts-rest/page.js +676 -0
- package/dist/routes/ts-rest/page.js.map +1 -0
- package/dist/routes/ts-rest/presence.d.ts +30 -0
- package/dist/routes/ts-rest/presence.js +155 -0
- package/dist/routes/ts-rest/presence.js.map +1 -0
- package/dist/routes/ts-rest/revision.d.ts +4 -0
- package/dist/routes/ts-rest/revision.js +240 -0
- package/dist/routes/ts-rest/revision.js.map +1 -0
- package/dist/routes/ts-rest/search.d.ts +4 -0
- package/dist/routes/ts-rest/search.js +121 -0
- package/dist/routes/ts-rest/search.js.map +1 -0
- package/dist/routes/ts-rest/tokenAuth.d.ts +4 -0
- package/dist/routes/ts-rest/tokenAuth.js +94 -0
- package/dist/routes/ts-rest/tokenAuth.js.map +1 -0
- package/dist/routes/ts-rest/user.d.ts +4 -0
- package/dist/routes/ts-rest/user.js +307 -0
- package/dist/routes/ts-rest/user.js.map +1 -0
- package/dist/service/config.d.ts +50 -0
- package/dist/service/config.js +202 -0
- package/dist/service/config.js.map +1 -0
- package/dist/service/lru.d.ts +11 -0
- package/dist/service/lru.js +47 -0
- package/dist/service/lru.js.map +1 -0
- package/dist/service/mail.d.ts +107 -0
- package/dist/service/mail.js +220 -0
- package/dist/service/mail.js.map +1 -0
- package/dist/service/notification.d.ts +9 -0
- package/dist/service/notification.js +19 -0
- package/dist/service/notification.js.map +1 -0
- package/dist/service/presence.d.ts +219 -0
- package/dist/service/presence.js +602 -0
- package/dist/service/presence.js.map +1 -0
- package/dist/types/error.d.ts +13 -0
- package/dist/types/error.js +13 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/express.d.ts +34 -0
- package/dist/types/express.js +50 -0
- package/dist/types/express.js.map +1 -0
- package/dist/types/mongoose-extensions.d.ts +8 -0
- package/dist/types/mongoose-extensions.js +24 -0
- package/dist/types/mongoose-extensions.js.map +1 -0
- package/dist/util/accessTokenParser.d.ts +1 -0
- package/dist/util/accessTokenParser.js +34 -0
- package/dist/util/accessTokenParser.js.map +1 -0
- package/dist/util/activityDefine.d.ts +15 -0
- package/dist/util/activityDefine.js +52 -0
- package/dist/util/activityDefine.js.map +1 -0
- package/dist/util/admin-config.d.ts +57 -0
- package/dist/util/admin-config.js +99 -0
- package/dist/util/admin-config.js.map +1 -0
- package/dist/util/admin-pager.d.ts +24 -0
- package/dist/util/admin-pager.js +73 -0
- package/dist/util/admin-pager.js.map +1 -0
- package/dist/util/apiPaginate.d.ts +11 -0
- package/dist/util/apiPaginate.js +33 -0
- package/dist/util/apiPaginate.js.map +1 -0
- package/dist/util/apiResponse.d.ts +9 -0
- package/dist/util/apiResponse.js +23 -0
- package/dist/util/apiResponse.js.map +1 -0
- package/dist/util/auth.d.ts +11 -0
- package/dist/util/auth.js +48 -0
- package/dist/util/auth.js.map +1 -0
- package/dist/util/auto-watch.d.ts +35 -0
- package/dist/util/auto-watch.js +24 -0
- package/dist/util/auto-watch.js.map +1 -0
- package/dist/util/autocomplete-match.d.ts +44 -0
- package/dist/util/autocomplete-match.js +80 -0
- package/dist/util/autocomplete-match.js.map +1 -0
- package/dist/util/aws-config-migration.d.ts +11 -0
- package/dist/util/aws-config-migration.js +68 -0
- package/dist/util/aws-config-migration.js.map +1 -0
- package/dist/util/boot-reporter.d.ts +130 -0
- package/dist/util/boot-reporter.js +242 -0
- package/dist/util/boot-reporter.js.map +1 -0
- package/dist/util/collab-cap.d.ts +39 -0
- package/dist/util/collab-cap.js +90 -0
- package/dist/util/collab-cap.js.map +1 -0
- package/dist/util/crypto.d.ts +39 -0
- package/dist/util/crypto.js +105 -0
- package/dist/util/crypto.js.map +1 -0
- package/dist/util/dedup-users.d.ts +96 -0
- package/dist/util/dedup-users.js +149 -0
- package/dist/util/dedup-users.js.map +1 -0
- package/dist/util/editor-cap-counter.d.ts +90 -0
- package/dist/util/editor-cap-counter.js +175 -0
- package/dist/util/editor-cap-counter.js.map +1 -0
- package/dist/util/fileUploader.d.ts +55 -0
- package/dist/util/fileUploader.js +70 -0
- package/dist/util/fileUploader.js.map +1 -0
- package/dist/util/formUtil.d.ts +2 -0
- package/dist/util/formUtil.js +15 -0
- package/dist/util/formUtil.js.map +1 -0
- package/dist/util/githubAuth.d.ts +2 -0
- package/dist/util/githubAuth.js +82 -0
- package/dist/util/githubAuth.js.map +1 -0
- package/dist/util/googleAuth.d.ts +2 -0
- package/dist/util/googleAuth.js +85 -0
- package/dist/util/googleAuth.js.map +1 -0
- package/dist/util/jwt.d.ts +50 -0
- package/dist/util/jwt.js +127 -0
- package/dist/util/jwt.js.map +1 -0
- package/dist/util/linkDetector.d.ts +3 -0
- package/dist/util/linkDetector.js +91 -0
- package/dist/util/linkDetector.js.map +1 -0
- package/dist/util/mail-token.d.ts +24 -0
- package/dist/util/mail-token.js +117 -0
- package/dist/util/mail-token.js.map +1 -0
- package/dist/util/mailer.d.ts +7 -0
- package/dist/util/mailer.js +98 -0
- package/dist/util/mailer.js.map +1 -0
- package/dist/util/map-duplicate-key-error.d.ts +26 -0
- package/dist/util/map-duplicate-key-error.js +41 -0
- package/dist/util/map-duplicate-key-error.js.map +1 -0
- package/dist/util/mongoose-paginate.d.ts +10 -0
- package/dist/util/mongoose-paginate.js +23 -0
- package/dist/util/mongoose-paginate.js.map +1 -0
- package/dist/util/notifications-token.d.ts +35 -0
- package/dist/util/notifications-token.js +140 -0
- package/dist/util/notifications-token.js.map +1 -0
- package/dist/util/oauth-client-seed.d.ts +2 -0
- package/dist/util/oauth-client-seed.js +48 -0
- package/dist/util/oauth-client-seed.js.map +1 -0
- package/dist/util/oauth-redirect-uri.d.ts +2 -0
- package/dist/util/oauth-redirect-uri.js +55 -0
- package/dist/util/oauth-redirect-uri.js.map +1 -0
- package/dist/util/page-response.d.ts +113 -0
- package/dist/util/page-response.js +154 -0
- package/dist/util/page-response.js.map +1 -0
- package/dist/util/page-search-index.d.ts +19 -0
- package/dist/util/page-search-index.js +91 -0
- package/dist/util/page-search-index.js.map +1 -0
- package/dist/util/page-status-migration.d.ts +23 -0
- package/dist/util/page-status-migration.js +48 -0
- package/dist/util/page-status-migration.js.map +1 -0
- package/dist/util/path.d.ts +2 -0
- package/dist/util/path.js +12 -0
- package/dist/util/path.js.map +1 -0
- package/dist/util/pkce.d.ts +13 -0
- package/dist/util/pkce.js +30 -0
- package/dist/util/pkce.js.map +1 -0
- package/dist/util/presence-token.d.ts +21 -0
- package/dist/util/presence-token.js +120 -0
- package/dist/util/presence-token.js.map +1 -0
- package/dist/util/rate-limit.d.ts +67 -0
- package/dist/util/rate-limit.js +87 -0
- package/dist/util/rate-limit.js.map +1 -0
- package/dist/util/rebuild-backlink.d.ts +25 -0
- package/dist/util/rebuild-backlink.js +7 -0
- package/dist/util/rebuild-backlink.js.map +1 -0
- package/dist/util/rebuild-renderer.d.ts +31 -0
- package/dist/util/rebuild-renderer.js +7 -0
- package/dist/util/rebuild-renderer.js.map +1 -0
- package/dist/util/redis-opts.d.ts +17 -0
- package/dist/util/redis-opts.js +40 -0
- package/dist/util/redis-opts.js.map +1 -0
- package/dist/util/regex.d.ts +2 -0
- package/dist/util/regex.js +8 -0
- package/dist/util/regex.js.map +1 -0
- package/dist/util/search-rebuild.d.ts +18 -0
- package/dist/util/search-rebuild.js +28 -0
- package/dist/util/search-rebuild.js.map +1 -0
- package/dist/util/ssr.d.ts +3 -0
- package/dist/util/ssr.js +9 -0
- package/dist/util/ssr.js.map +1 -0
- package/dist/util/storage-copy.d.ts +40 -0
- package/dist/util/storage-copy.js +123 -0
- package/dist/util/storage-copy.js.map +1 -0
- package/dist/util/ts-rest-helpers.d.ts +110 -0
- package/dist/util/ts-rest-helpers.js +110 -0
- package/dist/util/ts-rest-helpers.js.map +1 -0
- package/dist/util/url.d.ts +1 -0
- package/dist/util/url.js +11 -0
- package/dist/util/url.js.map +1 -0
- package/dist/util/user-code.d.ts +10 -0
- package/dist/util/user-code.js +55 -0
- package/dist/util/user-code.js.map +1 -0
- package/dist/util/view.d.ts +10 -0
- package/dist/util/view.js +99 -0
- package/dist/util/view.js.map +1 -0
- package/dist/util/watcher-backfill.d.ts +30 -0
- package/dist/util/watcher-backfill.js +43 -0
- package/dist/util/watcher-backfill.js.map +1 -0
- package/dist/util/ws-token.d.ts +24 -0
- package/dist/util/ws-token.js +134 -0
- package/dist/util/ws-token.js.map +1 -0
- 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 {};
|