@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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test-only fixture plugin for Phase 4 e2e tests. Provides a single
|
|
3
|
+
* embed-tag `@[echo](payload)` that renders the trivial
|
|
4
|
+
* `<div class="echo">payload</div>` so we can validate the parse →
|
|
5
|
+
* cache miss → render → cache set → re-read flow end-to-end without
|
|
6
|
+
* a real I/O plugin.
|
|
7
|
+
*
|
|
8
|
+
* **MUST NOT be imported from production code paths.** This file lives
|
|
9
|
+
* under `__fixtures__/` to make the boundary visible to humans /
|
|
10
|
+
* code reviewers. The `render()` function additionally probes
|
|
11
|
+
* `process.env.NODE_ENV` and throws when invoked outside of `test`
|
|
12
|
+
* so an accidental production import surfaces immediately on first
|
|
13
|
+
* call (rather than silently shipping a debug-only renderer).
|
|
14
|
+
*
|
|
15
|
+
* Will be removed once Phase 6/7 ships a real plugin (PlantUML /
|
|
16
|
+
* KaTeX / Mermaid / GitHub Embed).
|
|
17
|
+
*/
|
|
18
|
+
import type { EmbedRenderer } from '@crowi/plugin-api';
|
|
19
|
+
export declare const ECHO_TAG = "echo";
|
|
20
|
+
/** Bump if the fixture's output shape changes; not exercised but kept for parity with real plugins. */
|
|
21
|
+
export declare const ECHO_CACHE_VERSION = 1;
|
|
22
|
+
/**
|
|
23
|
+
* Simple `@[echo](payload)` → `<div class="echo">payload</div>` renderer.
|
|
24
|
+
* The output html is HTML-escape-free on purpose — payloads in tests
|
|
25
|
+
* are controlled and the assertion targets the verbatim string.
|
|
26
|
+
*/
|
|
27
|
+
export declare const echoEmbedRenderer: EmbedRenderer;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.echoEmbedRenderer = exports.ECHO_CACHE_VERSION = exports.ECHO_TAG = void 0;
|
|
4
|
+
exports.ECHO_TAG = 'echo';
|
|
5
|
+
/** Bump if the fixture's output shape changes; not exercised but kept for parity with real plugins. */
|
|
6
|
+
exports.ECHO_CACHE_VERSION = 1;
|
|
7
|
+
/**
|
|
8
|
+
* Simple `@[echo](payload)` → `<div class="echo">payload</div>` renderer.
|
|
9
|
+
* The output html is HTML-escape-free on purpose — payloads in tests
|
|
10
|
+
* are controlled and the assertion targets the verbatim string.
|
|
11
|
+
*/
|
|
12
|
+
exports.echoEmbedRenderer = {
|
|
13
|
+
cacheVersion: exports.ECHO_CACHE_VERSION,
|
|
14
|
+
render: async (input) => {
|
|
15
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
16
|
+
throw new Error('[crowi:renderer:__fixtures__/echo-embed] This fixture plugin is for tests only. Do not register it from production code.');
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
html: `<div class="echo">${input.url}</div>`,
|
|
20
|
+
ttlSec: 300,
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=echo-embed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"echo-embed.js","sourceRoot":"","sources":["../../../src/renderer/__fixtures__/echo-embed.ts"],"names":[],"mappings":";;;AAmBa,QAAA,QAAQ,GAAG,MAAM,CAAC;AAE/B,uGAAuG;AAC1F,QAAA,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;;;GAIG;AACU,QAAA,iBAAiB,GAAkB;IAC9C,YAAY,EAAE,0BAAkB;IAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACtB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0HAA0H,CAAC,CAAC;QAC9I,CAAC;QACD,OAAO;YACL,IAAI,EAAE,qBAAqB,KAAK,CAAC,GAAG,QAAQ;YAC5C,MAAM,EAAE,GAAG;SACZ,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { CacheStorage, EmbedInput, EmbedRenderer, RenderContext, RenderError, RenderResult, ScopedCacheStorage } from '@crowi/plugin-api';
|
|
2
|
+
import { MongoCacheStorage } from './mongodb-cache';
|
|
3
|
+
export { MongoCacheStorage, createMongoCacheStorage } from './mongodb-cache';
|
|
4
|
+
export { errorPlaceholder, sizeLimitPlaceholder, renderReservation } from './reservation';
|
|
5
|
+
export type { CacheSetReject } from './mongodb-cache';
|
|
6
|
+
/**
|
|
7
|
+
* Default fresh-TTL when `RenderResult.ttlSec` is unset. RFC §"Stale-
|
|
8
|
+
* while-revalidate".
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_FRESH_TTL_SEC: number;
|
|
11
|
+
/**
|
|
12
|
+
* Default `staleAfterSec` multiplier — entries stay revalidate-in-
|
|
13
|
+
* background until `ttlSec * 4`, after which a read blocks on the
|
|
14
|
+
* re-render.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DEFAULT_STALE_MULTIPLIER = 4;
|
|
17
|
+
/**
|
|
18
|
+
* Per-code TTLs for cached error responses (RFC §"Error caching").
|
|
19
|
+
* `rate_limit` is overridable per-call via `RenderError.retryAfterSec`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const RENDER_ERROR_TTL: Readonly<Record<RenderError['code'], number>>;
|
|
22
|
+
/**
|
|
23
|
+
* Compute the cache embed-key for an input. Default
|
|
24
|
+
* `sha256(JSON.stringify(input))` keeps callers honest about input
|
|
25
|
+
* stability; plugins can override via `EmbedRenderer.computeEmbedKey`
|
|
26
|
+
* to canonicalise query strings, ignore tracking params, etc.
|
|
27
|
+
*/
|
|
28
|
+
export declare function defaultEmbedKey(input: EmbedInput): string;
|
|
29
|
+
/**
|
|
30
|
+
* Wrap a `CacheStorage` in a per-plugin view that auto-stamps
|
|
31
|
+
* `pluginName` on every key. Plugins receive this on
|
|
32
|
+
* `RenderContext.cache` and never see other plugins' entries.
|
|
33
|
+
*/
|
|
34
|
+
export declare function scopeForPlugin(storage: CacheStorage, pluginName: string): ScopedCacheStorage;
|
|
35
|
+
/** What `cachedRender` may return — html plus a freshness hint for SSR layers. */
|
|
36
|
+
export interface CachedRenderResult {
|
|
37
|
+
html: string;
|
|
38
|
+
/** 'fresh' | 'stale' so a caller can emit `data-stale="true"` if desired. */
|
|
39
|
+
freshness: 'fresh' | 'stale';
|
|
40
|
+
/** The full `RenderResult` (errors included) for downstream telemetry. */
|
|
41
|
+
result: RenderResult;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Stale-while-revalidate wrapper for a single embed render. Resolves
|
|
45
|
+
* the four cases:
|
|
46
|
+
*
|
|
47
|
+
* - **miss**: render now, cache, return fresh.
|
|
48
|
+
* - **hit + fresh** (`now < expiresAt`): return cached, no re-render.
|
|
49
|
+
* - **hit + stale-within-window** (`expiresAt < now < expiresAt + (stale*ttl)`):
|
|
50
|
+
* return cached, fire background re-render.
|
|
51
|
+
* - **hit + expired**: block on re-render, cache, return.
|
|
52
|
+
*
|
|
53
|
+
* Errors from `render()` (both thrown and `RenderResult.error`) cache
|
|
54
|
+
* with `RENDER_ERROR_TTL[code]` and surface an error placeholder.
|
|
55
|
+
*
|
|
56
|
+
* NOTE: this is the **internal** wrapper used by Phase 4 core plugins
|
|
57
|
+
* (`embed-tags.ts`, `url-inline-expand.ts`). Plugins do not call it
|
|
58
|
+
* directly; they call `EmbedRenderer.render()` and the core wraps.
|
|
59
|
+
*/
|
|
60
|
+
export declare function cachedRender(storage: MongoCacheStorage, pluginName: string, renderer: EmbedRenderer, input: EmbedInput, ctx: RenderContext): Promise<CachedRenderResult>;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RENDER_ERROR_TTL = exports.DEFAULT_STALE_MULTIPLIER = exports.DEFAULT_FRESH_TTL_SEC = exports.renderReservation = exports.sizeLimitPlaceholder = exports.errorPlaceholder = exports.createMongoCacheStorage = exports.MongoCacheStorage = void 0;
|
|
4
|
+
exports.defaultEmbedKey = defaultEmbedKey;
|
|
5
|
+
exports.scopeForPlugin = scopeForPlugin;
|
|
6
|
+
exports.cachedRender = cachedRender;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const reservation_1 = require("./reservation");
|
|
9
|
+
var mongodb_cache_1 = require("./mongodb-cache");
|
|
10
|
+
Object.defineProperty(exports, "MongoCacheStorage", { enumerable: true, get: function () { return mongodb_cache_1.MongoCacheStorage; } });
|
|
11
|
+
Object.defineProperty(exports, "createMongoCacheStorage", { enumerable: true, get: function () { return mongodb_cache_1.createMongoCacheStorage; } });
|
|
12
|
+
var reservation_2 = require("./reservation");
|
|
13
|
+
Object.defineProperty(exports, "errorPlaceholder", { enumerable: true, get: function () { return reservation_2.errorPlaceholder; } });
|
|
14
|
+
Object.defineProperty(exports, "sizeLimitPlaceholder", { enumerable: true, get: function () { return reservation_2.sizeLimitPlaceholder; } });
|
|
15
|
+
Object.defineProperty(exports, "renderReservation", { enumerable: true, get: function () { return reservation_2.renderReservation; } });
|
|
16
|
+
/**
|
|
17
|
+
* Default fresh-TTL when `RenderResult.ttlSec` is unset. RFC §"Stale-
|
|
18
|
+
* while-revalidate".
|
|
19
|
+
*/
|
|
20
|
+
exports.DEFAULT_FRESH_TTL_SEC = 5 * 60; // 5min
|
|
21
|
+
/**
|
|
22
|
+
* Default `staleAfterSec` multiplier — entries stay revalidate-in-
|
|
23
|
+
* background until `ttlSec * 4`, after which a read blocks on the
|
|
24
|
+
* re-render.
|
|
25
|
+
*/
|
|
26
|
+
exports.DEFAULT_STALE_MULTIPLIER = 4;
|
|
27
|
+
/**
|
|
28
|
+
* Per-code TTLs for cached error responses (RFC §"Error caching").
|
|
29
|
+
* `rate_limit` is overridable per-call via `RenderError.retryAfterSec`.
|
|
30
|
+
*/
|
|
31
|
+
exports.RENDER_ERROR_TTL = {
|
|
32
|
+
auth: 60,
|
|
33
|
+
rate_limit: 5 * 60,
|
|
34
|
+
not_found: 60 * 60,
|
|
35
|
+
network: 5 * 60,
|
|
36
|
+
timeout: 5 * 60,
|
|
37
|
+
unknown: 5 * 60,
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Compute the cache embed-key for an input. Default
|
|
41
|
+
* `sha256(JSON.stringify(input))` keeps callers honest about input
|
|
42
|
+
* stability; plugins can override via `EmbedRenderer.computeEmbedKey`
|
|
43
|
+
* to canonicalise query strings, ignore tracking params, etc.
|
|
44
|
+
*/
|
|
45
|
+
function defaultEmbedKey(input) {
|
|
46
|
+
const json = JSON.stringify({ tag: input.tag, url: input.url });
|
|
47
|
+
return (0, node_crypto_1.createHash)('sha256').update(json).digest('hex');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wrap a `CacheStorage` in a per-plugin view that auto-stamps
|
|
51
|
+
* `pluginName` on every key. Plugins receive this on
|
|
52
|
+
* `RenderContext.cache` and never see other plugins' entries.
|
|
53
|
+
*/
|
|
54
|
+
function scopeForPlugin(storage, pluginName) {
|
|
55
|
+
return {
|
|
56
|
+
async get(key) {
|
|
57
|
+
return storage.get({ ...key, pluginName });
|
|
58
|
+
},
|
|
59
|
+
async set(key, entry) {
|
|
60
|
+
await storage.set({ ...key, pluginName }, entry);
|
|
61
|
+
},
|
|
62
|
+
async invalidatePage(pageId) {
|
|
63
|
+
// Pull only this plugin's entries on this page. The underlying
|
|
64
|
+
// storage's `invalidatePlugin` would nuke other pages too, so we
|
|
65
|
+
// intentionally do not expose it through the scoped view.
|
|
66
|
+
return storage.invalidatePage(pageId);
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Process-wide in-flight tracker — collapses concurrent renders for the
|
|
71
|
+
// same cache key into a single upstream call. Without this, K viewers
|
|
72
|
+
// of a page entering the stale window each kick off a background
|
|
73
|
+
// `renderAndStore`, multiplying load against the plugin's upstream
|
|
74
|
+
// (`addEmbedTag` is typically a GitHub / Slack / KaTeX / Mermaid call).
|
|
75
|
+
const inFlightRender = new Map();
|
|
76
|
+
function cacheKeyString(key) {
|
|
77
|
+
return `${key.pluginName}${key.pluginCacheVersion}${key.pageId}${key.embedKey}`;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Stale-while-revalidate wrapper for a single embed render. Resolves
|
|
81
|
+
* the four cases:
|
|
82
|
+
*
|
|
83
|
+
* - **miss**: render now, cache, return fresh.
|
|
84
|
+
* - **hit + fresh** (`now < expiresAt`): return cached, no re-render.
|
|
85
|
+
* - **hit + stale-within-window** (`expiresAt < now < expiresAt + (stale*ttl)`):
|
|
86
|
+
* return cached, fire background re-render.
|
|
87
|
+
* - **hit + expired**: block on re-render, cache, return.
|
|
88
|
+
*
|
|
89
|
+
* Errors from `render()` (both thrown and `RenderResult.error`) cache
|
|
90
|
+
* with `RENDER_ERROR_TTL[code]` and surface an error placeholder.
|
|
91
|
+
*
|
|
92
|
+
* NOTE: this is the **internal** wrapper used by Phase 4 core plugins
|
|
93
|
+
* (`embed-tags.ts`, `url-inline-expand.ts`). Plugins do not call it
|
|
94
|
+
* directly; they call `EmbedRenderer.render()` and the core wraps.
|
|
95
|
+
*/
|
|
96
|
+
async function cachedRender(storage, pluginName, renderer, input, ctx) {
|
|
97
|
+
const embedKey = renderer.computeEmbedKey ? renderer.computeEmbedKey(input) : defaultEmbedKey(input);
|
|
98
|
+
const key = {
|
|
99
|
+
pluginName,
|
|
100
|
+
pluginCacheVersion: renderer.cacheVersion,
|
|
101
|
+
pageId: input.pageId,
|
|
102
|
+
embedKey,
|
|
103
|
+
};
|
|
104
|
+
const cached = await storage.get(key);
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
if (cached) {
|
|
107
|
+
const expiresMs = cached.expiresAt.getTime();
|
|
108
|
+
const ttlMs = expiresMs - cached.fetchedAt.getTime();
|
|
109
|
+
const staleWindowMs = ttlMs * exports.DEFAULT_STALE_MULTIPLIER;
|
|
110
|
+
const isFresh = now < expiresMs;
|
|
111
|
+
const isWithinStaleWindow = !isFresh && now < expiresMs + staleWindowMs;
|
|
112
|
+
if (isFresh) {
|
|
113
|
+
return { html: cached.html, freshness: 'fresh', result: cached.result };
|
|
114
|
+
}
|
|
115
|
+
if (isWithinStaleWindow) {
|
|
116
|
+
// Skip the background fire if a re-render is already in flight
|
|
117
|
+
// for this cache key — otherwise K concurrent viewers each kick
|
|
118
|
+
// off a parallel `render()` and amplify upstream load by K.
|
|
119
|
+
const ks = cacheKeyString(key);
|
|
120
|
+
if (!inFlightRender.has(ks)) {
|
|
121
|
+
// `setImmediate` rather than `Promise.resolve().then` so it
|
|
122
|
+
// lands at the start of the next event loop tick (lower priority
|
|
123
|
+
// than the in-flight request).
|
|
124
|
+
setImmediate(() => {
|
|
125
|
+
void dedupedRenderAndStore(ks, storage, key, renderer, input, ctx).catch((err) => {
|
|
126
|
+
ctx.log.warn(`[plugin-render-cache] background re-render failed for plugin=${pluginName} pageId=${input.pageId}: ${stringifyError(err)}`);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return { html: cached.html, freshness: 'stale', result: cached.result };
|
|
131
|
+
}
|
|
132
|
+
// expired beyond stale window — block on re-render.
|
|
133
|
+
}
|
|
134
|
+
// miss or expired: render now (de-duped against any concurrent miss
|
|
135
|
+
// for the same key — second viewer awaits the first viewer's render).
|
|
136
|
+
const ks = cacheKeyString(key);
|
|
137
|
+
const result = await dedupedRenderAndStore(ks, storage, key, renderer, input, ctx);
|
|
138
|
+
return { html: result.html, freshness: 'fresh', result: result.result };
|
|
139
|
+
}
|
|
140
|
+
function dedupedRenderAndStore(ks, storage, key, renderer, input, ctx) {
|
|
141
|
+
const existing = inFlightRender.get(ks);
|
|
142
|
+
if (existing)
|
|
143
|
+
return existing;
|
|
144
|
+
const p = renderAndStore(storage, key, renderer, input, ctx).finally(() => {
|
|
145
|
+
inFlightRender.delete(ks);
|
|
146
|
+
});
|
|
147
|
+
inFlightRender.set(ks, p);
|
|
148
|
+
return p;
|
|
149
|
+
}
|
|
150
|
+
async function renderAndStore(storage, key, renderer, input, ctx) {
|
|
151
|
+
let result;
|
|
152
|
+
try {
|
|
153
|
+
result = await renderer.render(input, ctx);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
// Thrown error → treat as `unknown` and cache.
|
|
157
|
+
result = {
|
|
158
|
+
html: '',
|
|
159
|
+
error: {
|
|
160
|
+
code: 'unknown',
|
|
161
|
+
message: stringifyError(err),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const now = new Date();
|
|
166
|
+
const ttlSec = pickTtl(result);
|
|
167
|
+
const expiresAt = new Date(now.getTime() + ttlSec * 1000);
|
|
168
|
+
// Error responses get a fixed placeholder regardless of what the
|
|
169
|
+
// plugin returned in `html`. We still cache the plugin's error meta
|
|
170
|
+
// so admin telemetry has context.
|
|
171
|
+
const html = result.error ? (0, reservation_1.errorPlaceholder)(result.error.code, renderer.reservation) : result.html;
|
|
172
|
+
const cachedHtml = html;
|
|
173
|
+
const cacheEntry = {
|
|
174
|
+
html: cachedHtml,
|
|
175
|
+
result: { ...result, html: cachedHtml },
|
|
176
|
+
fetchedAt: now,
|
|
177
|
+
expiresAt,
|
|
178
|
+
};
|
|
179
|
+
const rejection = await storage.setOrReject(key, cacheEntry);
|
|
180
|
+
if (rejection) {
|
|
181
|
+
// Size-limit reject → fall back to a placeholder for THIS render
|
|
182
|
+
// call. We don't write the placeholder to the cache (it would
|
|
183
|
+
// pollute the slot if the plugin shrinks its output later); the
|
|
184
|
+
// next read just sees a miss and re-renders.
|
|
185
|
+
return {
|
|
186
|
+
html: (0, reservation_1.sizeLimitPlaceholder)(rejection, renderer.reservation),
|
|
187
|
+
result: cacheEntry.result,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return { html: cachedHtml, result: cacheEntry.result };
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Resolve the effective fresh-TTL for a render result. Error responses
|
|
194
|
+
* use the per-code default table (with `retryAfterSec` override for
|
|
195
|
+
* rate-limit); successful responses honour `RenderResult.ttlSec` or
|
|
196
|
+
* fall back to `DEFAULT_FRESH_TTL_SEC`.
|
|
197
|
+
*/
|
|
198
|
+
function pickTtl(result) {
|
|
199
|
+
if (result.error) {
|
|
200
|
+
if (result.error.code === 'rate_limit' && typeof result.error.retryAfterSec === 'number') {
|
|
201
|
+
return Math.max(1, result.error.retryAfterSec);
|
|
202
|
+
}
|
|
203
|
+
return exports.RENDER_ERROR_TTL[result.error.code];
|
|
204
|
+
}
|
|
205
|
+
return result.ttlSec ?? exports.DEFAULT_FRESH_TTL_SEC;
|
|
206
|
+
}
|
|
207
|
+
function stringifyError(err) {
|
|
208
|
+
if (err instanceof Error)
|
|
209
|
+
return err.message;
|
|
210
|
+
if (typeof err === 'string')
|
|
211
|
+
return err;
|
|
212
|
+
try {
|
|
213
|
+
return JSON.stringify(err);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return String(err);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer/cache/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { CacheEntry, CacheKey, CacheStorage } from '@crowi/plugin-api';
|
|
2
|
+
import type Crowi from '../../crowi';
|
|
3
|
+
import type { PluginRenderCacheModel } from '../../models/plugin-render-cache';
|
|
4
|
+
/**
|
|
5
|
+
* Per-entry warn threshold. Logged but not rejected.
|
|
6
|
+
* RFC §"Size limits" — 50KB warn, 100KB reject.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SINGLE_ENTRY_WARN_BYTES: number;
|
|
9
|
+
/** Per-entry reject threshold. Above this we drop the write and let the caller fall back to a placeholder. */
|
|
10
|
+
export declare const SINGLE_ENTRY_REJECT_BYTES: number;
|
|
11
|
+
/** Per-page cumulative reject threshold. */
|
|
12
|
+
export declare const PER_PAGE_REJECT_BYTES: number;
|
|
13
|
+
/** Why a `set()` call rejected the entry. Surfaced to the SWR wrapper for placeholder fallback. */
|
|
14
|
+
export type CacheSetReject = 'entry-too-large' | 'page-quota-exceeded';
|
|
15
|
+
export interface MongoCacheStorageDeps {
|
|
16
|
+
PluginRenderCache: PluginRenderCacheModel;
|
|
17
|
+
/** Logger for size-limit warnings. The cache itself is plugin-agnostic. */
|
|
18
|
+
log: {
|
|
19
|
+
warn(msg: string, ...args: unknown[]): void;
|
|
20
|
+
debug(msg: string, ...args: unknown[]): void;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* MongoDB-backed implementation of `CacheStorage`. The schema +
|
|
25
|
+
* indexes live in `models/plugin-render-cache.ts`; this class is the
|
|
26
|
+
* thin query layer.
|
|
27
|
+
*
|
|
28
|
+
* Behaviour quirks worth noting:
|
|
29
|
+
*
|
|
30
|
+
* - **TTL defence-in-depth.** MongoDB's TTL monitor sweeps every
|
|
31
|
+
* ~60s, so a row whose `expiresAt` just elapsed may still be on
|
|
32
|
+
* disk. `get()` checks `expiresAt < now` and treats the hit as a
|
|
33
|
+
* miss + deletes the row so the next read is fast.
|
|
34
|
+
*
|
|
35
|
+
* - **`pluginCacheVersion` mismatch = miss.** Plugins bump their
|
|
36
|
+
* `cacheVersion` to invalidate every cached entry without an
|
|
37
|
+
* operator action. We don't actively delete stale-version rows
|
|
38
|
+
* (the TTL eventually does); we just refuse to return them.
|
|
39
|
+
*
|
|
40
|
+
* - **Size limits.** `set()` rejects entries `> 100KB` and entries
|
|
41
|
+
* that would push the page over 10MB. Both rejections log a warn
|
|
42
|
+
* with `pluginName` + `pageId` and surface a `CacheSetReject`
|
|
43
|
+
* code via the `setOrReject` helper used by the SWR wrapper.
|
|
44
|
+
* Entries `> 50KB` but `< 100KB` warn but write.
|
|
45
|
+
*/
|
|
46
|
+
export declare class MongoCacheStorage implements CacheStorage {
|
|
47
|
+
private readonly deps;
|
|
48
|
+
constructor(deps: MongoCacheStorageDeps);
|
|
49
|
+
/**
|
|
50
|
+
* Read an entry. Returns null only when:
|
|
51
|
+
* - row absent
|
|
52
|
+
* - `pluginCacheVersion` mismatch (version bump is a logical miss)
|
|
53
|
+
*
|
|
54
|
+
* **`expiresAt < now` is NOT treated as a miss here.** The SWR
|
|
55
|
+
* wrapper (`cachedRender`) needs to see expired-but-within-stale-
|
|
56
|
+
* window entries to serve them while a background re-render runs.
|
|
57
|
+
* Entries past the SWR window are evicted by the wrapper itself
|
|
58
|
+
* after the blocking re-render; MongoDB's TTL sweep is the
|
|
59
|
+
* disk-reclaim safety net (RFC §"TTL index of operational note").
|
|
60
|
+
*/
|
|
61
|
+
get(key: CacheKey): Promise<CacheEntry | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Write an entry, replacing any existing row with the same compound
|
|
64
|
+
* key. Use `setOrReject` instead when callers need to know whether
|
|
65
|
+
* the write was rejected by size limits.
|
|
66
|
+
*/
|
|
67
|
+
set(key: CacheKey, entry: CacheEntry): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Like `set` but returns the rejection reason instead of silently
|
|
70
|
+
* dropping. Used by the SWR wrapper to fall back to a placeholder
|
|
71
|
+
* when an oversized payload would otherwise vanish from the cache.
|
|
72
|
+
*/
|
|
73
|
+
setOrReject(key: CacheKey, entry: CacheEntry): Promise<CacheSetReject | null>;
|
|
74
|
+
/** Drop every cached entry for a page. Returns the number of deleted rows. */
|
|
75
|
+
invalidatePage(pageId: string): Promise<number>;
|
|
76
|
+
/** Drop every cached entry written by a single plugin. Returns the number of deleted rows. */
|
|
77
|
+
invalidatePlugin(pluginName: string): Promise<number>;
|
|
78
|
+
/** Drop every cached entry. Returns the number of deleted rows. */
|
|
79
|
+
invalidateAll(): Promise<number>;
|
|
80
|
+
}
|
|
81
|
+
/** Convenience factory that pulls the model + a logger from a Crowi instance. */
|
|
82
|
+
export declare function createMongoCacheStorage(crowi: Crowi): MongoCacheStorage;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MongoCacheStorage = exports.PER_PAGE_REJECT_BYTES = exports.SINGLE_ENTRY_REJECT_BYTES = exports.SINGLE_ENTRY_WARN_BYTES = void 0;
|
|
4
|
+
exports.createMongoCacheStorage = createMongoCacheStorage;
|
|
5
|
+
const mongoose_1 = require("mongoose");
|
|
6
|
+
/**
|
|
7
|
+
* Per-entry warn threshold. Logged but not rejected.
|
|
8
|
+
* RFC §"Size limits" — 50KB warn, 100KB reject.
|
|
9
|
+
*/
|
|
10
|
+
exports.SINGLE_ENTRY_WARN_BYTES = 50 * 1024;
|
|
11
|
+
/** Per-entry reject threshold. Above this we drop the write and let the caller fall back to a placeholder. */
|
|
12
|
+
exports.SINGLE_ENTRY_REJECT_BYTES = 100 * 1024;
|
|
13
|
+
/** Per-page cumulative reject threshold. */
|
|
14
|
+
exports.PER_PAGE_REJECT_BYTES = 10 * 1024 * 1024;
|
|
15
|
+
/**
|
|
16
|
+
* MongoDB-backed implementation of `CacheStorage`. The schema +
|
|
17
|
+
* indexes live in `models/plugin-render-cache.ts`; this class is the
|
|
18
|
+
* thin query layer.
|
|
19
|
+
*
|
|
20
|
+
* Behaviour quirks worth noting:
|
|
21
|
+
*
|
|
22
|
+
* - **TTL defence-in-depth.** MongoDB's TTL monitor sweeps every
|
|
23
|
+
* ~60s, so a row whose `expiresAt` just elapsed may still be on
|
|
24
|
+
* disk. `get()` checks `expiresAt < now` and treats the hit as a
|
|
25
|
+
* miss + deletes the row so the next read is fast.
|
|
26
|
+
*
|
|
27
|
+
* - **`pluginCacheVersion` mismatch = miss.** Plugins bump their
|
|
28
|
+
* `cacheVersion` to invalidate every cached entry without an
|
|
29
|
+
* operator action. We don't actively delete stale-version rows
|
|
30
|
+
* (the TTL eventually does); we just refuse to return them.
|
|
31
|
+
*
|
|
32
|
+
* - **Size limits.** `set()` rejects entries `> 100KB` and entries
|
|
33
|
+
* that would push the page over 10MB. Both rejections log a warn
|
|
34
|
+
* with `pluginName` + `pageId` and surface a `CacheSetReject`
|
|
35
|
+
* code via the `setOrReject` helper used by the SWR wrapper.
|
|
36
|
+
* Entries `> 50KB` but `< 100KB` warn but write.
|
|
37
|
+
*/
|
|
38
|
+
class MongoCacheStorage {
|
|
39
|
+
deps;
|
|
40
|
+
constructor(deps) {
|
|
41
|
+
this.deps = deps;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read an entry. Returns null only when:
|
|
45
|
+
* - row absent
|
|
46
|
+
* - `pluginCacheVersion` mismatch (version bump is a logical miss)
|
|
47
|
+
*
|
|
48
|
+
* **`expiresAt < now` is NOT treated as a miss here.** The SWR
|
|
49
|
+
* wrapper (`cachedRender`) needs to see expired-but-within-stale-
|
|
50
|
+
* window entries to serve them while a background re-render runs.
|
|
51
|
+
* Entries past the SWR window are evicted by the wrapper itself
|
|
52
|
+
* after the blocking re-render; MongoDB's TTL sweep is the
|
|
53
|
+
* disk-reclaim safety net (RFC §"TTL index of operational note").
|
|
54
|
+
*/
|
|
55
|
+
async get(key) {
|
|
56
|
+
const filter = {
|
|
57
|
+
pageId: new mongoose_1.Types.ObjectId(key.pageId),
|
|
58
|
+
pluginName: key.pluginName,
|
|
59
|
+
embedKey: key.embedKey,
|
|
60
|
+
pluginCacheVersion: key.pluginCacheVersion,
|
|
61
|
+
};
|
|
62
|
+
const doc = await this.deps.PluginRenderCache.findOne(filter).lean().exec();
|
|
63
|
+
if (!doc)
|
|
64
|
+
return null;
|
|
65
|
+
return {
|
|
66
|
+
html: doc.html,
|
|
67
|
+
result: doc.result,
|
|
68
|
+
fetchedAt: doc.fetchedAt,
|
|
69
|
+
expiresAt: doc.expiresAt,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Write an entry, replacing any existing row with the same compound
|
|
74
|
+
* key. Use `setOrReject` instead when callers need to know whether
|
|
75
|
+
* the write was rejected by size limits.
|
|
76
|
+
*/
|
|
77
|
+
async set(key, entry) {
|
|
78
|
+
await this.setOrReject(key, entry);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Like `set` but returns the rejection reason instead of silently
|
|
82
|
+
* dropping. Used by the SWR wrapper to fall back to a placeholder
|
|
83
|
+
* when an oversized payload would otherwise vanish from the cache.
|
|
84
|
+
*/
|
|
85
|
+
async setOrReject(key, entry) {
|
|
86
|
+
const html = entry.html;
|
|
87
|
+
const htmlBytes = Buffer.byteLength(html, 'utf8');
|
|
88
|
+
if (htmlBytes > exports.SINGLE_ENTRY_REJECT_BYTES) {
|
|
89
|
+
this.deps.log.warn(`[plugin-render-cache] entry too large; refusing to write. pluginName=${key.pluginName} pageId=${key.pageId} bytes=${htmlBytes} (limit=${exports.SINGLE_ENTRY_REJECT_BYTES})`);
|
|
90
|
+
return 'entry-too-large';
|
|
91
|
+
}
|
|
92
|
+
if (htmlBytes > exports.SINGLE_ENTRY_WARN_BYTES) {
|
|
93
|
+
this.deps.log.warn(`[plugin-render-cache] entry exceeds warn threshold; writing anyway. pluginName=${key.pluginName} pageId=${key.pageId} bytes=${htmlBytes} (warn=${exports.SINGLE_ENTRY_WARN_BYTES})`);
|
|
94
|
+
}
|
|
95
|
+
// Per-page cumulative check. One aggregate computes the page-wide
|
|
96
|
+
// total and the existing-entry-for-this-key bytes simultaneously,
|
|
97
|
+
// so the projected total after the upsert can be checked in one
|
|
98
|
+
// round-trip (plus the upsert itself). `htmlBytes` is denormalised
|
|
99
|
+
// on the doc so the sum is a cheap `$sum: '$htmlBytes'` rather
|
|
100
|
+
// than `$strLenBytes` over every cached HTML string.
|
|
101
|
+
const pageId = new mongoose_1.Types.ObjectId(key.pageId);
|
|
102
|
+
const cumulative = await this.deps.PluginRenderCache.aggregate([
|
|
103
|
+
{ $match: { pageId } },
|
|
104
|
+
{
|
|
105
|
+
$group: {
|
|
106
|
+
_id: null,
|
|
107
|
+
totalBytes: { $sum: '$htmlBytes' },
|
|
108
|
+
existingBytes: {
|
|
109
|
+
$sum: {
|
|
110
|
+
$cond: [
|
|
111
|
+
{
|
|
112
|
+
$and: [
|
|
113
|
+
{ $eq: ['$pluginName', key.pluginName] },
|
|
114
|
+
{ $eq: ['$embedKey', key.embedKey] },
|
|
115
|
+
{ $eq: ['$pluginCacheVersion', key.pluginCacheVersion] },
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
'$htmlBytes',
|
|
119
|
+
0,
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
]).exec();
|
|
126
|
+
const { totalBytes = 0, existingBytes = 0 } = cumulative[0] ?? {};
|
|
127
|
+
const projected = totalBytes - existingBytes + htmlBytes;
|
|
128
|
+
if (projected > exports.PER_PAGE_REJECT_BYTES) {
|
|
129
|
+
this.deps.log.warn(`[plugin-render-cache] page would exceed cumulative quota; refusing to write. pluginName=${key.pluginName} pageId=${key.pageId} projectedBytes=${projected} (limit=${exports.PER_PAGE_REJECT_BYTES})`);
|
|
130
|
+
return 'page-quota-exceeded';
|
|
131
|
+
}
|
|
132
|
+
await this.deps.PluginRenderCache.updateOne({
|
|
133
|
+
pageId,
|
|
134
|
+
pluginName: key.pluginName,
|
|
135
|
+
embedKey: key.embedKey,
|
|
136
|
+
pluginCacheVersion: key.pluginCacheVersion,
|
|
137
|
+
}, {
|
|
138
|
+
$set: {
|
|
139
|
+
pageId,
|
|
140
|
+
pluginName: key.pluginName,
|
|
141
|
+
embedKey: key.embedKey,
|
|
142
|
+
pluginCacheVersion: key.pluginCacheVersion,
|
|
143
|
+
html,
|
|
144
|
+
htmlBytes,
|
|
145
|
+
fetchedAt: entry.fetchedAt,
|
|
146
|
+
expiresAt: entry.expiresAt,
|
|
147
|
+
result: entry.result,
|
|
148
|
+
},
|
|
149
|
+
}, { upsert: true }).exec();
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/** Drop every cached entry for a page. Returns the number of deleted rows. */
|
|
153
|
+
async invalidatePage(pageId) {
|
|
154
|
+
const res = await this.deps.PluginRenderCache.deleteMany({ pageId: new mongoose_1.Types.ObjectId(pageId) }).exec();
|
|
155
|
+
return res.deletedCount ?? 0;
|
|
156
|
+
}
|
|
157
|
+
/** Drop every cached entry written by a single plugin. Returns the number of deleted rows. */
|
|
158
|
+
async invalidatePlugin(pluginName) {
|
|
159
|
+
const res = await this.deps.PluginRenderCache.deleteMany({ pluginName }).exec();
|
|
160
|
+
return res.deletedCount ?? 0;
|
|
161
|
+
}
|
|
162
|
+
/** Drop every cached entry. Returns the number of deleted rows. */
|
|
163
|
+
async invalidateAll() {
|
|
164
|
+
const res = await this.deps.PluginRenderCache.deleteMany({}).exec();
|
|
165
|
+
return res.deletedCount ?? 0;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
exports.MongoCacheStorage = MongoCacheStorage;
|
|
169
|
+
/** Convenience factory that pulls the model + a logger from a Crowi instance. */
|
|
170
|
+
function createMongoCacheStorage(crowi) {
|
|
171
|
+
const PluginRenderCache = crowi.model('PluginRenderCache');
|
|
172
|
+
return new MongoCacheStorage({
|
|
173
|
+
PluginRenderCache,
|
|
174
|
+
log: {
|
|
175
|
+
warn: (msg, ...args) => console.warn(msg, ...args),
|
|
176
|
+
debug: () => undefined,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=mongodb-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb-cache.js","sourceRoot":"","sources":["../../../src/renderer/cache/mongodb-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RenderError, Reservation } from '@crowi/plugin-api';
|
|
2
|
+
import type { CacheSetReject } from './mongodb-cache';
|
|
3
|
+
/**
|
|
4
|
+
* Build the placeholder HTML for a given `Reservation`. Numeric
|
|
5
|
+
* values are coerced to integers via `Math.max(0, Math.round(n))` so
|
|
6
|
+
* a bogus float / negative declaration never produces malformed
|
|
7
|
+
* style attributes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderReservation(reservation: Reservation): string;
|
|
10
|
+
/**
|
|
11
|
+
* Placeholder HTML for a render error. The user-facing message comes
|
|
12
|
+
* from a fixed table per error code; plugin-supplied `error.message`
|
|
13
|
+
* never reaches the HTML (potential PII / API-key leak).
|
|
14
|
+
*/
|
|
15
|
+
export declare function errorPlaceholder(code: RenderError['code'], reservation: Reservation | undefined): string;
|
|
16
|
+
/**
|
|
17
|
+
* Placeholder for a size-limit reject. We distinguish the two
|
|
18
|
+
* sub-cases so admin telemetry / e2e tests can tell them apart.
|
|
19
|
+
*/
|
|
20
|
+
export declare function sizeLimitPlaceholder(reason: CacheSetReject, reservation: Reservation | undefined): string;
|