@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,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pageStatusDefault = void 0;
|
|
4
|
+
const page_1 = require("../../models/page");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
/**
|
|
7
|
+
* RFC-0008 §10.1 — `page-status-default` (boot layer).
|
|
8
|
+
*
|
|
9
|
+
* Ported from the former standalone `runPageStatusMigration`
|
|
10
|
+
* (`src/util/page-status-migration.ts`). RFC-0004 introduced a first-class
|
|
11
|
+
* `Page.status` field; pages created before it read back as `null`. This
|
|
12
|
+
* boot migration backfills `status='published'` onto every such legacy row.
|
|
13
|
+
*
|
|
14
|
+
* Why: `Page.isPublished()` already treats `null` as published for
|
|
15
|
+
* back-compat, but the query-level `$or` filters and the collab draft gate
|
|
16
|
+
* are clearer — and future-proof against a stricter `required: true` — when
|
|
17
|
+
* every row carries an explicit value.
|
|
18
|
+
*
|
|
19
|
+
* Behaviour preserved exactly from the old util:
|
|
20
|
+
* - `{ status: null }` matches both an explicit `null` and a missing field
|
|
21
|
+
* in MongoDB query semantics, so a single condition covers every legacy
|
|
22
|
+
* shape.
|
|
23
|
+
* - Idempotent: the filter only matches rows still unset, so a second run
|
|
24
|
+
* touches nothing.
|
|
25
|
+
* - Pages already `published` / `draft` / `deleted` / `deprecated` / `wip`
|
|
26
|
+
* are left exactly as they are — in particular this never rewrites a
|
|
27
|
+
* `draft` back to `published`, which would violate the one-way
|
|
28
|
+
* transition rule.
|
|
29
|
+
*/
|
|
30
|
+
exports.pageStatusDefault = (0, types_1.defineMigration)({
|
|
31
|
+
id: 'page-status-default',
|
|
32
|
+
fromVersion: '1.x',
|
|
33
|
+
toVersion: '2.0',
|
|
34
|
+
layer: 'boot',
|
|
35
|
+
description: 'Backfill page.status (RFC-0004)',
|
|
36
|
+
/**
|
|
37
|
+
* Cheap, index-backed probe: `Page.status` is declared `index: true`
|
|
38
|
+
* (models/page.ts), so a single `findOne({ status: null })` lookup is
|
|
39
|
+
* covered by that index and never scans the collection. Pending iff at
|
|
40
|
+
* least one legacy page is still missing a status.
|
|
41
|
+
*/
|
|
42
|
+
isPending: async (ctx) => {
|
|
43
|
+
const Page = ctx.crowi.model('Page');
|
|
44
|
+
const legacy = await Page.findOne({ status: null }).select('_id').lean().exec();
|
|
45
|
+
return legacy != null;
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
* Optional `plan` detail: count the remaining legacy rows. Not called at
|
|
49
|
+
* boot — only `isPending` runs there.
|
|
50
|
+
*/
|
|
51
|
+
detect: async (ctx) => {
|
|
52
|
+
const Page = ctx.crowi.model('Page');
|
|
53
|
+
const remaining = await Page.countDocuments({ status: null }).exec();
|
|
54
|
+
return {
|
|
55
|
+
summary: `${remaining} legacy page row(s) without status`,
|
|
56
|
+
counts: { remaining },
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
stages: [
|
|
60
|
+
{
|
|
61
|
+
name: 'backfill-status',
|
|
62
|
+
fn: async (ctx) => {
|
|
63
|
+
if (ctx.dryRun) {
|
|
64
|
+
return { name: 'backfill-status', transformed: 0 };
|
|
65
|
+
}
|
|
66
|
+
const Page = ctx.crowi.model('Page');
|
|
67
|
+
const result = await Page.updateMany({ status: null }, { $set: { status: page_1.STATUS_PUBLISHED } });
|
|
68
|
+
// Mongoose's UpdateResult exposes `modifiedCount`; fall back to 0 for
|
|
69
|
+
// any driver shape that omits it.
|
|
70
|
+
const modified = result.modifiedCount ?? 0;
|
|
71
|
+
if (modified > 0) {
|
|
72
|
+
ctx.logger.info(`page-status-default: backfilled status='published' on ${modified} legacy page row(s)`);
|
|
73
|
+
}
|
|
74
|
+
return { name: 'backfill-status', transformed: modified };
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=page-status-default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-status-default.js","sourceRoot":"","sources":["../../../src/migration/migrations/page-status-default.ts"],"names":[],"mappings":";;;AAAA,0CAAmD;AAEnD,oCAA2C;AAE3C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACU,QAAA,iBAAiB,GAAG,IAAA,uBAAe,EAAC;IAC/C,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,iCAAiC;IAE9C;;;;;OAKG;IACH,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAChF,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,GAAG,SAAS,oCAAoC;YACzD,MAAM,EAAE,EAAE,SAAS,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE;QACN;YACE,IAAI,EAAE,iBAAiB;YACvB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAChB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACf,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBACrD,CAAC;gBACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,uBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC/F,sEAAsE;gBACtE,kCAAkC;gBAClC,MAAM,QAAQ,GAAI,MAAqC,CAAC,aAAa,IAAI,CAAC,CAAC;gBAC3E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yDAAyD,QAAQ,qBAAqB,CAAC,CAAC;gBAC1G,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC5D,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC-0008 §10.3 step5 — `revisions-schema-unify`.
|
|
3
|
+
*
|
|
4
|
+
* Backfills `revision.type = 'snapshot'` onto v1.x revisions written before
|
|
5
|
+
* the field existed. `Revision.type` (`'snapshot' | 'incremental'`) was added
|
|
6
|
+
* by RFC-0003 and the read path already treats `undefined` as `'snapshot'`
|
|
7
|
+
* for back-compat. Phase 6 is therefore NOT a new-field addition — it is a
|
|
8
|
+
* one-time backfill of the existing field plus closing the write source so
|
|
9
|
+
* the value is always present going forward.
|
|
10
|
+
*
|
|
11
|
+
* Closing the write source: `models/revision.ts` now declares
|
|
12
|
+
* `type: { default: 'snapshot' }`, so every newly written revision — even on
|
|
13
|
+
* the HTTP API path (`Page.createPage` / `Page.updatePage`), which never
|
|
14
|
+
* passes an explicit `type` — lands with a concrete value. Without that
|
|
15
|
+
* default this migration would re-pend on every fresh revision and, as a boot
|
|
16
|
+
* migration, permanently block boot (the Phase 3 wikilink lesson).
|
|
17
|
+
*
|
|
18
|
+
* ── RFC LAYER DEVIATION ──────────────────────────────────────────────
|
|
19
|
+
* RFC-0008 §10.3 / Appendix A classify this as a `preflight` migration.
|
|
20
|
+
* We deliberately run it as `layer: 'boot'` instead: once the schema
|
|
21
|
+
* `default: 'snapshot'` closes the write source, the transform reduces to a
|
|
22
|
+
* single idempotent `updateMany({ type: null }, ...)` backfill — structurally
|
|
23
|
+
* identical to `page-status-default` (also boot). It is cheap, index-backed,
|
|
24
|
+
* and non-destructive, so boot-auto is the right fit. This deviation is noted
|
|
25
|
+
* in TODO.md as well.
|
|
26
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
27
|
+
*
|
|
28
|
+
* Scope: `type` ONLY. `contributors` is left untouched (v1.x has no `savedBy`
|
|
29
|
+
* either; we do not fabricate collaboration history, and the wire format
|
|
30
|
+
* already omits an undefined `contributors`). `renderedAst` is the
|
|
31
|
+
* `rebuild renderer` task's responsibility per RFC-0008.
|
|
32
|
+
*/
|
|
33
|
+
export declare const revisionsSchemaUnify: import("../types").MigrationDefinition;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.revisionsSchemaUnify = void 0;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
/**
|
|
6
|
+
* RFC-0008 §10.3 step5 — `revisions-schema-unify`.
|
|
7
|
+
*
|
|
8
|
+
* Backfills `revision.type = 'snapshot'` onto v1.x revisions written before
|
|
9
|
+
* the field existed. `Revision.type` (`'snapshot' | 'incremental'`) was added
|
|
10
|
+
* by RFC-0003 and the read path already treats `undefined` as `'snapshot'`
|
|
11
|
+
* for back-compat. Phase 6 is therefore NOT a new-field addition — it is a
|
|
12
|
+
* one-time backfill of the existing field plus closing the write source so
|
|
13
|
+
* the value is always present going forward.
|
|
14
|
+
*
|
|
15
|
+
* Closing the write source: `models/revision.ts` now declares
|
|
16
|
+
* `type: { default: 'snapshot' }`, so every newly written revision — even on
|
|
17
|
+
* the HTTP API path (`Page.createPage` / `Page.updatePage`), which never
|
|
18
|
+
* passes an explicit `type` — lands with a concrete value. Without that
|
|
19
|
+
* default this migration would re-pend on every fresh revision and, as a boot
|
|
20
|
+
* migration, permanently block boot (the Phase 3 wikilink lesson).
|
|
21
|
+
*
|
|
22
|
+
* ── RFC LAYER DEVIATION ──────────────────────────────────────────────
|
|
23
|
+
* RFC-0008 §10.3 / Appendix A classify this as a `preflight` migration.
|
|
24
|
+
* We deliberately run it as `layer: 'boot'` instead: once the schema
|
|
25
|
+
* `default: 'snapshot'` closes the write source, the transform reduces to a
|
|
26
|
+
* single idempotent `updateMany({ type: null }, ...)` backfill — structurally
|
|
27
|
+
* identical to `page-status-default` (also boot). It is cheap, index-backed,
|
|
28
|
+
* and non-destructive, so boot-auto is the right fit. This deviation is noted
|
|
29
|
+
* in TODO.md as well.
|
|
30
|
+
* ─────────────────────────────────────────────────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* Scope: `type` ONLY. `contributors` is left untouched (v1.x has no `savedBy`
|
|
33
|
+
* either; we do not fabricate collaboration history, and the wire format
|
|
34
|
+
* already omits an undefined `contributors`). `renderedAst` is the
|
|
35
|
+
* `rebuild renderer` task's responsibility per RFC-0008.
|
|
36
|
+
*/
|
|
37
|
+
exports.revisionsSchemaUnify = (0, types_1.defineMigration)({
|
|
38
|
+
id: 'revisions-schema-unify',
|
|
39
|
+
fromVersion: '2.0',
|
|
40
|
+
toVersion: '2.1',
|
|
41
|
+
layer: 'boot',
|
|
42
|
+
description: 'Unify revision schema (backfill type:snapshot)',
|
|
43
|
+
/**
|
|
44
|
+
* Cheap, index-backed probe: `Revision.type` is declared `index: true`
|
|
45
|
+
* (models/revision.ts), so `findOne({ type: null })` is covered by that
|
|
46
|
+
* index and never scans the collection. `{ type: null }` matches both a
|
|
47
|
+
* missing field and an explicit `null` in MongoDB query semantics, so a
|
|
48
|
+
* single condition covers every legacy shape. Pending iff at least one
|
|
49
|
+
* legacy revision is still missing a type. After apply (and because new
|
|
50
|
+
* revisions are filled by the schema `default`) this stays false — no
|
|
51
|
+
* permanent boot block.
|
|
52
|
+
*/
|
|
53
|
+
isPending: async (ctx) => {
|
|
54
|
+
const Revision = ctx.crowi.model('Revision');
|
|
55
|
+
const legacy = await Revision.findOne({ type: null }).select('_id').lean().exec();
|
|
56
|
+
return legacy != null;
|
|
57
|
+
},
|
|
58
|
+
/**
|
|
59
|
+
* Optional `plan` detail: count the remaining legacy rows. Not called at
|
|
60
|
+
* boot — only `isPending` runs there. Index-backed count on `type`.
|
|
61
|
+
*/
|
|
62
|
+
detect: async (ctx) => {
|
|
63
|
+
const Revision = ctx.crowi.model('Revision');
|
|
64
|
+
const remaining = await Revision.countDocuments({ type: null }).exec();
|
|
65
|
+
return {
|
|
66
|
+
summary: `${remaining} legacy revision row(s) without type`,
|
|
67
|
+
counts: { remaining },
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
stages: [
|
|
71
|
+
{
|
|
72
|
+
name: 'backfill-type',
|
|
73
|
+
fn: async (ctx) => {
|
|
74
|
+
if (ctx.dryRun) {
|
|
75
|
+
return { name: 'backfill-type', transformed: 0 };
|
|
76
|
+
}
|
|
77
|
+
const Revision = ctx.crowi.model('Revision');
|
|
78
|
+
const result = await Revision.updateMany({ type: null }, { $set: { type: 'snapshot' } });
|
|
79
|
+
const modified = result.modifiedCount ?? 0;
|
|
80
|
+
if (modified > 0) {
|
|
81
|
+
ctx.logger.info(`revisions-schema-unify: backfilled type='snapshot' on ${modified} legacy revision row(s)`);
|
|
82
|
+
}
|
|
83
|
+
return { name: 'backfill-type', transformed: modified };
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=revisions-schema-unify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revisions-schema-unify.js","sourceRoot":"","sources":["../../../src/migration/migrations/revisions-schema-unify.ts"],"names":[],"mappings":";;;AAEA,oCAA2C;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACU,QAAA,oBAAoB,GAAG,IAAA,uBAAe,EAAC;IAClD,EAAE,EAAE,wBAAwB;IAC5B,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,gDAAgD;IAE7D;;;;;;;;;OASG;IACH,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,GAAG,SAAS,sCAAsC;YAC3D,MAAM,EAAE,EAAE,SAAS,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE;QACN;YACE,IAAI,EAAE,eAAe;YACrB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAChB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;oBACf,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;gBACnD,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAkB,CAAC;gBAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gBACzF,MAAM,QAAQ,GAAI,MAAqC,CAAC,aAAa,IAAI,CAAC,CAAC;gBAC3E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yDAAyD,QAAQ,yBAAyB,CAAC,CAAC;gBAC9G,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC1D,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const userUniquePrepare: import("../types").MigrationDefinition;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.userUniquePrepare = void 0;
|
|
4
|
+
const dedup_users_1 = require("../../util/dedup-users");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
/**
|
|
7
|
+
* RFC-0008 §11 / feature-user-identity-uniqueness — `user-unique-prepare`
|
|
8
|
+
* (preflight layer).
|
|
9
|
+
*
|
|
10
|
+
* Prepares the `users` collection so the plain unique indexes on
|
|
11
|
+
* `username` / `email` (declared in `models/user.ts`, built by autoIndex on
|
|
12
|
+
* boot) can build without E11000:
|
|
13
|
+
*
|
|
14
|
+
* 1. `dedup-username` — merge living users that collide on a
|
|
15
|
+
* case-insensitive username, reassigning every ownership reference to the
|
|
16
|
+
* survivor (uniqueness spec §c) and deleting the losers.
|
|
17
|
+
* 2. `dedup-email` — same for email.
|
|
18
|
+
* 3. `tombstone-deleted` — rename any STATUS_DELETED user whose original
|
|
19
|
+
* username/email would collide with a living user (or another deleted
|
|
20
|
+
* user) to the per-id `deleted-<id>` tombstone, matching the runtime
|
|
21
|
+
* `statusDelete` behaviour. Without this, a legacy deleted row that kept
|
|
22
|
+
* its original identity would collide a living user on index build.
|
|
23
|
+
*
|
|
24
|
+
* Index BUILDING is not done here (§9): the schema declares the indexes and
|
|
25
|
+
* Mongoose autoIndex builds them. This migration only prepares the data.
|
|
26
|
+
*
|
|
27
|
+
* `isPending` is conservative (§6.2): it reports pending whenever a residual
|
|
28
|
+
* collision exists that would fail an index build, and once the stages run it
|
|
29
|
+
* flips to false (no permanent boot block — same lesson as Phase 3). The
|
|
30
|
+
* comparison folds case (matching the index collation `{ locale:'en',
|
|
31
|
+
* strength:2 }`) via `$toLower` in the aggregation.
|
|
32
|
+
*/
|
|
33
|
+
// STATUS_DELETED is `4` (models/user.ts). Re-declared locally rather than
|
|
34
|
+
// imported so this migration has no boot-order coupling to the User model
|
|
35
|
+
// factory; the value is part of the v1 data contract and does not change.
|
|
36
|
+
const STATUS_DELETED = 4;
|
|
37
|
+
/**
|
|
38
|
+
* Find living-user duplicate groups for `field` (`username` | `email`), folding
|
|
39
|
+
* case so `Sotarok` and `sotarok` collide (mirrors the index collation).
|
|
40
|
+
* STATUS_DELETED users are excluded — they are handled by `tombstone-deleted`,
|
|
41
|
+
* not merged. Rows missing the field (e.g. INVITED with no username) are
|
|
42
|
+
* excluded so the sparse index's exempt rows never form a group.
|
|
43
|
+
*/
|
|
44
|
+
async function findLivingDuplicateGroups(ctx, field) {
|
|
45
|
+
const users = ctx.db.collection('users');
|
|
46
|
+
const rows = await users
|
|
47
|
+
.aggregate([
|
|
48
|
+
{ $match: { status: { $ne: STATUS_DELETED }, [field]: { $type: 'string', $ne: '' } } },
|
|
49
|
+
{ $group: { _id: { $toLower: `$${field}` }, ids: { $push: '$_id' }, n: { $sum: 1 } } },
|
|
50
|
+
{ $match: { n: { $gt: 1 } } },
|
|
51
|
+
])
|
|
52
|
+
.toArray();
|
|
53
|
+
return rows.map((r) => ({ key: String(r._id), ids: r.ids }));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Find STATUS_DELETED users whose stored username/email is NOT already the
|
|
57
|
+
* tombstone form for their id — i.e. legacy deleted rows that still hold a real
|
|
58
|
+
* identity which could collide a living user on index build. Returns their ids.
|
|
59
|
+
*/
|
|
60
|
+
async function findUntombstonedDeleted(ctx) {
|
|
61
|
+
const users = ctx.db.collection('users');
|
|
62
|
+
const rows = await users.find({ status: STATUS_DELETED }).project({ _id: 1, username: 1, email: 1 }).toArray();
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const row of rows) {
|
|
65
|
+
const id = row._id;
|
|
66
|
+
const expectedEmail = `deleted-${id.toString()}@deleted.invalid`;
|
|
67
|
+
const expectedUsername = `deleted-${id.toString()}`;
|
|
68
|
+
const email = row.email;
|
|
69
|
+
const username = row.username;
|
|
70
|
+
if (email !== expectedEmail || (username != null && username !== expectedUsername)) {
|
|
71
|
+
out.push(id);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* True iff the not-yet-tombstoned deleted set collides (case-folded) with any
|
|
78
|
+
* living user — the only deleted-side condition that fails an index build. A
|
|
79
|
+
* deleted row whose identity is unique among living + other deleted rows would
|
|
80
|
+
* not fail the build, so we report pending only when a real collision exists
|
|
81
|
+
* (conservative but not over-eager).
|
|
82
|
+
*/
|
|
83
|
+
async function deletedCollidesWithLiving(ctx) {
|
|
84
|
+
const users = ctx.db.collection('users');
|
|
85
|
+
// For each field, group by lowercased value across ALL users (living +
|
|
86
|
+
// deleted) and look for a group that mixes a deleted row with a living one.
|
|
87
|
+
for (const field of ['email', 'username']) {
|
|
88
|
+
const rows = await users
|
|
89
|
+
.aggregate([
|
|
90
|
+
{ $match: { [field]: { $type: 'string', $ne: '' } } },
|
|
91
|
+
{
|
|
92
|
+
$group: {
|
|
93
|
+
_id: { $toLower: `$${field}` },
|
|
94
|
+
living: { $sum: { $cond: [{ $ne: ['$status', STATUS_DELETED] }, 1, 0] } },
|
|
95
|
+
deleted: { $sum: { $cond: [{ $eq: ['$status', STATUS_DELETED] }, 1, 0] } },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
{ $match: { living: { $gte: 1 }, deleted: { $gte: 1 } } },
|
|
99
|
+
{ $limit: 1 },
|
|
100
|
+
])
|
|
101
|
+
.toArray();
|
|
102
|
+
if (rows.length > 0)
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
exports.userUniquePrepare = (0, types_1.defineMigration)({
|
|
108
|
+
id: 'user-unique-prepare',
|
|
109
|
+
fromVersion: '1.x',
|
|
110
|
+
toVersion: '2.0',
|
|
111
|
+
layer: 'preflight',
|
|
112
|
+
description: 'Deduplicate users (unique index via autoIndex)',
|
|
113
|
+
/**
|
|
114
|
+
* Pending iff a plain unique index build would fail E11000. Two residual
|
|
115
|
+
* conditions (both folded to the index collation):
|
|
116
|
+
*
|
|
117
|
+
* - a living-vs-living duplicate on username or email, or
|
|
118
|
+
* - a not-yet-tombstoned DELETED user colliding with a living user.
|
|
119
|
+
*
|
|
120
|
+
* Conservative (§6.2): once `dedup-*` + `tombstone-deleted` run, every group
|
|
121
|
+
* is resolved and this returns false, so boot under preflight+block clears
|
|
122
|
+
* (no permanent block). Short-circuits at the first collision found.
|
|
123
|
+
*/
|
|
124
|
+
isPending: async (ctx) => {
|
|
125
|
+
const usernameDupes = await findLivingDuplicateGroups(ctx, 'username');
|
|
126
|
+
if (usernameDupes.length > 0)
|
|
127
|
+
return true;
|
|
128
|
+
const emailDupes = await findLivingDuplicateGroups(ctx, 'email');
|
|
129
|
+
if (emailDupes.length > 0)
|
|
130
|
+
return true;
|
|
131
|
+
return deletedCollidesWithLiving(ctx);
|
|
132
|
+
},
|
|
133
|
+
/** Full-scan report for `plan`: duplicate group counts + tombstone targets. */
|
|
134
|
+
detect: async (ctx) => {
|
|
135
|
+
const usernameDupes = await findLivingDuplicateGroups(ctx, 'username');
|
|
136
|
+
const emailDupes = await findLivingDuplicateGroups(ctx, 'email');
|
|
137
|
+
const tombstoneTargets = await findUntombstonedDeleted(ctx);
|
|
138
|
+
return {
|
|
139
|
+
summary: `${usernameDupes.length} duplicate username group(s), ${emailDupes.length} duplicate email group(s), ${tombstoneTargets.length} deleted user(s) to tombstone`,
|
|
140
|
+
counts: {
|
|
141
|
+
usernameGroups: usernameDupes.length,
|
|
142
|
+
emailGroups: emailDupes.length,
|
|
143
|
+
tombstoneTargets: tombstoneTargets.length,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
stages: [
|
|
148
|
+
{
|
|
149
|
+
name: 'dedup-username',
|
|
150
|
+
fn: async (ctx) => {
|
|
151
|
+
const groups = await findLivingDuplicateGroups(ctx, 'username');
|
|
152
|
+
const mergeGroups = [];
|
|
153
|
+
for (const group of groups) {
|
|
154
|
+
mergeGroups.push(await (0, dedup_users_1.chooseSurvivor)(ctx.db, group.ids));
|
|
155
|
+
}
|
|
156
|
+
ctx.progress.setTotal(mergeGroups.length);
|
|
157
|
+
const result = await (0, dedup_users_1.mergeUserGroups)(ctx.db, mergeGroups, { dryRun: ctx.dryRun, logger: ctx.logger });
|
|
158
|
+
if (!ctx.dryRun && result.usersRemoved > 0) {
|
|
159
|
+
ctx.logger.info(`user-unique-prepare: merged ${result.usersRemoved} duplicate-username user(s) across ${result.groupsMerged} group(s)`);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
name: 'dedup-username',
|
|
163
|
+
transformed: result.usersRemoved,
|
|
164
|
+
stats: { groups: result.groupsMerged, reassigned: result.reassigned, deletedConflicting: result.deletedConflicting },
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: 'dedup-email',
|
|
170
|
+
fn: async (ctx) => {
|
|
171
|
+
const groups = await findLivingDuplicateGroups(ctx, 'email');
|
|
172
|
+
const mergeGroups = [];
|
|
173
|
+
for (const group of groups) {
|
|
174
|
+
mergeGroups.push(await (0, dedup_users_1.chooseSurvivor)(ctx.db, group.ids));
|
|
175
|
+
}
|
|
176
|
+
ctx.progress.setTotal(mergeGroups.length);
|
|
177
|
+
const result = await (0, dedup_users_1.mergeUserGroups)(ctx.db, mergeGroups, { dryRun: ctx.dryRun, logger: ctx.logger });
|
|
178
|
+
if (!ctx.dryRun && result.usersRemoved > 0) {
|
|
179
|
+
ctx.logger.info(`user-unique-prepare: merged ${result.usersRemoved} duplicate-email user(s) across ${result.groupsMerged} group(s)`);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
name: 'dedup-email',
|
|
183
|
+
transformed: result.usersRemoved,
|
|
184
|
+
stats: { groups: result.groupsMerged, reassigned: result.reassigned, deletedConflicting: result.deletedConflicting },
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'tombstone-deleted',
|
|
190
|
+
fn: async (ctx) => {
|
|
191
|
+
const targets = await findUntombstonedDeleted(ctx);
|
|
192
|
+
if (ctx.dryRun) {
|
|
193
|
+
return { name: 'tombstone-deleted', transformed: 0, stats: { wouldTombstone: targets.length } };
|
|
194
|
+
}
|
|
195
|
+
const users = ctx.db.collection('users');
|
|
196
|
+
ctx.progress.setTotal(targets.length);
|
|
197
|
+
let tombstoned = 0;
|
|
198
|
+
for (const id of targets) {
|
|
199
|
+
// Same tombstone shape as runtime statusDelete / tombstoneIdentity.
|
|
200
|
+
await users.updateOne({ _id: id }, {
|
|
201
|
+
$set: { username: `deleted-${id.toString()}`, email: `deleted-${id.toString()}@deleted.invalid` },
|
|
202
|
+
});
|
|
203
|
+
tombstoned += 1;
|
|
204
|
+
ctx.progress.increment();
|
|
205
|
+
}
|
|
206
|
+
if (tombstoned > 0) {
|
|
207
|
+
ctx.logger.info(`user-unique-prepare: tombstoned ${tombstoned} legacy deleted user(s)`);
|
|
208
|
+
}
|
|
209
|
+
return { name: 'tombstone-deleted', transformed: tombstoned };
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=user-unique-prepare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-unique-prepare.js","sourceRoot":"","sources":["../../../src/migration/migrations/user-unique-prepare.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC-0008 §10.2 step 4 / §4.3.1 — `wikilink-format` (preflight layer).
|
|
3
|
+
*
|
|
4
|
+
* Ported from the former standalone `crowi-admin migrate --only=wikilink`
|
|
5
|
+
* (`packages/admin-cli/src/commands/migrate-wikilink.ts`). The migration
|
|
6
|
+
* rewrites v1 angle-bracket internal links (`</path>` / `</path|alias>`) to
|
|
7
|
+
* the v2 wikilink form (`[[path]]` / `[[path|alias]]`).
|
|
8
|
+
*
|
|
9
|
+
* Why this is a migration (not just a CLI command): the old command called
|
|
10
|
+
* `Revision.prepareRevision` + `Page.pushRevision` directly, bypassing
|
|
11
|
+
* `Page.updatePage`. That path never nulls `yjsState` / `yjsCheckpointAt`, so
|
|
12
|
+
* any user editing a rewritten page stayed pinned to a stale `Y.Doc` and could
|
|
13
|
+
* silently revert the migration on their next autosave (RFC-0008 §4.3.1
|
|
14
|
+
* "Motivating bug"). Routing every body rewrite through `ctx.rewritePageBody`
|
|
15
|
+
* (= the `updatePage`-equivalent path) repoints `currentRevision` and nulls the
|
|
16
|
+
* Yjs snapshot, so the next `onLoadDocument` rebuilds from the new body. As a
|
|
17
|
+
* preflight migration this is persistence-only (no live force-reload broadcast):
|
|
18
|
+
* preflight runs in a maintenance window with no connected editors (§4.3.1).
|
|
19
|
+
*
|
|
20
|
+
* The textual conversion logic below is moved verbatim from the old command so
|
|
21
|
+
* the rewrite output is byte-identical to the legacy migrator.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* HTML5 element name set used to reject `</foo>` matches whose first path
|
|
25
|
+
* segment is actually a closing HTML tag. Source:
|
|
26
|
+
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element — the full
|
|
27
|
+
* standard element list as of the HTML Living Standard.
|
|
28
|
+
*
|
|
29
|
+
* Kept as a top-level `Set<string>` so detection runs O(1) per match.
|
|
30
|
+
* `h1`..`h6` are listed explicitly because the regex captures `foo` for
|
|
31
|
+
* `</foo>` and we want both `</h1>` and `</h6>` to be rejected.
|
|
32
|
+
*/
|
|
33
|
+
export declare const KNOWN_HTML_ELEMENTS: ReadonlySet<string>;
|
|
34
|
+
/**
|
|
35
|
+
* v1 angle-bracket internal link form. The capture group grabs the path-style
|
|
36
|
+
* payload (starts with `/`, no whitespace, no `<` / `>` / `|` other than the
|
|
37
|
+
* optional `|alias` segment). See `packages/api/src/util/linkDetector.ts` — v1
|
|
38
|
+
* used `<(/[^>]+)>` for the same primitive; we tighten it here to:
|
|
39
|
+
*
|
|
40
|
+
* - leading `/` to keep this strictly path-style (not arbitrary text)
|
|
41
|
+
* - no whitespace inside the **path** (Crowi page paths cannot contain spaces)
|
|
42
|
+
* - no `<` / `>` until the closing `>` and no `|` until the optional alias
|
|
43
|
+
* - optional `|alias` (free-form text, no `<` / `>`)
|
|
44
|
+
*
|
|
45
|
+
* Detection only — see `shouldRewriteWikilink` for the HTML-element filter.
|
|
46
|
+
*/
|
|
47
|
+
export declare const WIKILINK_DETECTION_REGEX: RegExp;
|
|
48
|
+
/**
|
|
49
|
+
* True iff `body` contains at least one *genuine* legacy wikilink — i.e. a
|
|
50
|
+
* `</...>` match that survives the full `shouldRewriteWikilink` HTML-element
|
|
51
|
+
* filter. `</div>` and other close tags return false.
|
|
52
|
+
*
|
|
53
|
+
* `</` is used as a cheap prefilter so bodies that cannot possibly contain a
|
|
54
|
+
* legacy wikilink skip the regex entirely; the verdict itself is the full
|
|
55
|
+
* detection rule (not the substring), so a body whose only `</` occurrences are
|
|
56
|
+
* HTML close tags correctly reports false. Shared by `isPending` (current-
|
|
57
|
+
* revision verdict) and `collectRewritablePages` (full detect/stage scan) so
|
|
58
|
+
* the detection logic lives in one place.
|
|
59
|
+
*/
|
|
60
|
+
export declare function bodyHasRewritableWikilink(body: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Decide whether a detected `</...>` match is a v1 wikilink we should rewrite,
|
|
63
|
+
* or a coincidental HTML close tag we must leave alone.
|
|
64
|
+
*
|
|
65
|
+
* The rule: reject when the **first path segment** (everything between the
|
|
66
|
+
* leading `/` and the next `/`, `#`, or end-of-payload) is a known HTML element
|
|
67
|
+
* name (lowercased). Crowi page paths are case-sensitive, so `</Section>` is a
|
|
68
|
+
* wikilink (page `Section`) while `</section>` is the HTML element.
|
|
69
|
+
*/
|
|
70
|
+
export declare function shouldRewriteWikilink(innerPath: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Per-body detection result — `occurrences[].raw` preserves the original raw
|
|
73
|
+
* match (e.g. `</docs/api>`) so a dry-run report can print the exact textual
|
|
74
|
+
* substring being touched.
|
|
75
|
+
*/
|
|
76
|
+
export interface WikilinkOccurrence {
|
|
77
|
+
raw: string;
|
|
78
|
+
path: string;
|
|
79
|
+
alias?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Single-pass detect-and-rewrite. Returns the rewritten body together with the
|
|
83
|
+
* occurrence list so callers don't walk the regex twice. `body` is returned by
|
|
84
|
+
* reference when nothing changed, letting callers cheap-skip via
|
|
85
|
+
* `result.body === body`. Pure function — no side effects, no I/O.
|
|
86
|
+
*/
|
|
87
|
+
export declare function rewriteAndDetect(body: string): {
|
|
88
|
+
body: string;
|
|
89
|
+
occurrences: WikilinkOccurrence[];
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Convenience wrapper for tests / callers that only need the rewritten body.
|
|
93
|
+
* The migration hot path uses `rewriteAndDetect` to avoid walking the regex
|
|
94
|
+
* twice.
|
|
95
|
+
*/
|
|
96
|
+
export declare function rewriteWikilinks(body: string): string;
|
|
97
|
+
export declare const wikilinkFormat: import("../types").MigrationDefinition;
|