summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-03-04 15:56:43 +0900
committertamaina <tamaina@hotmail.co.jp>2022-03-04 15:56:43 +0900
commita4de5aa94b9b318b1a286d36406e11e0e7f27590 (patch)
tree6c0cd908b7e8f68fc300b9cb102f69b8ec2f5adc /packages
parentMerge branch 'develop' into pizzax-indexeddb (diff)
parentfix federation chart pubsub (diff)
downloadmisskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.tar.gz
misskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.tar.bz2
misskey-a4de5aa94b9b318b1a286d36406e11e0e7f27590.zip
Merge branch 'develop' into pizzax-indexeddb
Diffstat (limited to '')
-rw-r--r--packages/backend/.mocharc.json5
-rw-r--r--packages/backend/@types/langmap.d.ts10
-rw-r--r--packages/backend/migration/1000000000000-Init.js7
-rw-r--r--packages/backend/migration/1556348509290-Pages.js7
-rw-r--r--packages/backend/migration/1556746559567-UserProfile.js7
-rw-r--r--packages/backend/migration/1557476068003-PinnedUsers.js7
-rw-r--r--packages/backend/migration/1557761316509-AddSomeUrls.js7
-rw-r--r--packages/backend/migration/1557932705754-ObjectStorageSetting.js7
-rw-r--r--packages/backend/migration/1558072954435-PageLike.js7
-rw-r--r--packages/backend/migration/1558103093633-UserGroup.js7
-rw-r--r--packages/backend/migration/1558257926829-UserGroupInvite.js7
-rw-r--r--packages/backend/migration/1558266512381-UserListJoining.js7
-rw-r--r--packages/backend/migration/1561706992953-webauthn.js7
-rw-r--r--packages/backend/migration/1561873850023-ChartIndexes.js7
-rw-r--r--packages/backend/migration/1562422242907-PasswordLessLogin.js7
-rw-r--r--packages/backend/migration/1562444565093-PinnedPage.js7
-rw-r--r--packages/backend/migration/1562448332510-PageTitleHideOption.js7
-rw-r--r--packages/backend/migration/1562869971568-ModerationLog.js7
-rw-r--r--packages/backend/migration/1563757595828-UsedUsername.js7
-rw-r--r--packages/backend/migration/1565634203341-room.js7
-rw-r--r--packages/backend/migration/1571220798684-CustomEmojiCategory.js7
-rw-r--r--packages/backend/migration/1572760203493-nodeinfo.js7
-rw-r--r--packages/backend/migration/1576269851876-TalkFederationId.js7
-rw-r--r--packages/backend/migration/1576869585998-ProxyRemoteFiles.js7
-rw-r--r--packages/backend/migration/1579267006611-v12.js7
-rw-r--r--packages/backend/migration/1579270193251-v12-2.js7
-rw-r--r--packages/backend/migration/1579282808087-v12-3.js7
-rw-r--r--packages/backend/migration/1579544426412-v12-4.js7
-rw-r--r--packages/backend/migration/1579977526288-v12-5.js7
-rw-r--r--packages/backend/migration/1579993013959-v12-6.js7
-rw-r--r--packages/backend/migration/1580069531114-v12-7.js7
-rw-r--r--packages/backend/migration/1580148575182-v12-8.js7
-rw-r--r--packages/backend/migration/1580154400017-v12-9.js7
-rw-r--r--packages/backend/migration/1580276619901-v12-10.js7
-rw-r--r--packages/backend/migration/1580331224276-v12-11.js7
-rw-r--r--packages/backend/migration/1580508795118-v12-12.js7
-rw-r--r--packages/backend/migration/1580543501339-v12-13.js7
-rw-r--r--packages/backend/migration/1580864313253-v12-14.js7
-rw-r--r--packages/backend/migration/1581526429287-user-group-invitation.js7
-rw-r--r--packages/backend/migration/1581695816408-user-group-antenna.js7
-rw-r--r--packages/backend/migration/1581708415836-drive-user-folder-id-index.js7
-rw-r--r--packages/backend/migration/1581979837262-promo.js7
-rw-r--r--packages/backend/migration/1582019042083-featured-injecttion.js7
-rw-r--r--packages/backend/migration/1582210532752-antenna-exclude.js7
-rw-r--r--packages/backend/migration/1582875306439-note-reaction-length.js7
-rw-r--r--packages/backend/migration/1585361548360-miauth.js7
-rw-r--r--packages/backend/migration/1585385921215-custom-notification.js7
-rw-r--r--packages/backend/migration/1585772678853-ap-url.js7
-rw-r--r--packages/backend/migration/1586624197029-AddObjectStorageUseProxy.js7
-rw-r--r--packages/backend/migration/1586641139527-remote-reaction.js7
-rw-r--r--packages/backend/migration/1586708940386-pageAiScript.js7
-rw-r--r--packages/backend/migration/1588044505511-hCaptcha.js7
-rw-r--r--packages/backend/migration/1589023282116-pubRelay.js7
-rw-r--r--packages/backend/migration/1595075960584-blurhash.js7
-rw-r--r--packages/backend/migration/1595077605646-blurhash-for-avatar-banner.js7
-rw-r--r--packages/backend/migration/1595676934834-instance-icon-url.js7
-rw-r--r--packages/backend/migration/1595771249699-word-mute.js7
-rw-r--r--packages/backend/migration/1595782306083-word-mute2.js7
-rw-r--r--packages/backend/migration/1596548170836-channel.js7
-rw-r--r--packages/backend/migration/1596786425167-channel2.js7
-rw-r--r--packages/backend/migration/1597230137744-objectStorageSetPublicRead.js7
-rw-r--r--packages/backend/migration/1597236229720-IncludingNotificationTypes.js7
-rw-r--r--packages/backend/migration/1597385880794-add-sensitive-index.js7
-rw-r--r--packages/backend/migration/1597459042300-channel-unread.js7
-rw-r--r--packages/backend/migration/1597893996136-ChannelNoteIdDescIndex.js7
-rw-r--r--packages/backend/migration/1600353287890-mutingNotificationTypes.js7
-rw-r--r--packages/backend/migration/1603094348345-refine-abuse-user-report.js7
-rw-r--r--packages/backend/migration/1603095701770-refine-abuse-user-report2.js7
-rw-r--r--packages/backend/migration/1603776877564-instance-theme-color.js7
-rw-r--r--packages/backend/migration/1603781553011-instance-favicon.js7
-rw-r--r--packages/backend/migration/1604821689616-delete-auto-watch.js7
-rw-r--r--packages/backend/migration/1605408848373-clip-description.js7
-rw-r--r--packages/backend/migration/1605408971051-comments.js7
-rw-r--r--packages/backend/migration/1605585339718-instance-pinned-pages.js7
-rw-r--r--packages/backend/migration/1605965516823-instance-images.js7
-rw-r--r--packages/backend/migration/1606191203881-no-crawle.js7
-rw-r--r--packages/backend/migration/1607151207216-instance-pinned-clip.js7
-rw-r--r--packages/backend/migration/1607353487793-isExplorable.js7
-rw-r--r--packages/backend/migration/1610277136869-registry.js7
-rw-r--r--packages/backend/migration/1610277585759-registry2.js7
-rw-r--r--packages/backend/migration/1610283021566-registry3.js7
-rw-r--r--packages/backend/migration/1611354329133-followersUri.js7
-rw-r--r--packages/backend/migration/1611397665007-gallery.js7
-rw-r--r--packages/backend/migration/1611547387175-objectStorageS3ForcePathStyle.js7
-rw-r--r--packages/backend/migration/1612619156584-announcement-email.js7
-rw-r--r--packages/backend/migration/1613155914446-emailNotificationTypes.js7
-rw-r--r--packages/backend/migration/1613181457597-user-lang.js7
-rw-r--r--packages/backend/migration/1613503367223-use-bigint-for-driveUsage.js7
-rw-r--r--packages/backend/migration/1615965918224-chart-v2.js7
-rw-r--r--packages/backend/migration/1615966519402-chart-v2-2.js7
-rw-r--r--packages/backend/migration/1618637372000-user-last-active-date.js7
-rw-r--r--packages/backend/migration/1618639857000-user-hide-online-status.js7
-rw-r--r--packages/backend/migration/1619942102890-password-reset.js7
-rw-r--r--packages/backend/migration/1620019354680-ad.js7
-rw-r--r--packages/backend/migration/1620364649428-ad2.js7
-rw-r--r--packages/backend/migration/1621479946000-add-note-indexes.js7
-rw-r--r--packages/backend/migration/1622679304522-user-profile-description-length.js7
-rw-r--r--packages/backend/migration/1622681548499-log-message-length.js7
-rw-r--r--packages/backend/migration/1626509500668-fix-remote-file-proxy.js22
-rw-r--r--packages/backend/migration/1629004542760-chart-reindex.js7
-rw-r--r--packages/backend/migration/1629024377804-deepl-integration.js7
-rw-r--r--packages/backend/migration/1629288472000-fix-channel-userId.js7
-rw-r--r--packages/backend/migration/1629512953000-user-is-deleted.js7
-rw-r--r--packages/backend/migration/1629778475000-deepl-integration2.js7
-rw-r--r--packages/backend/migration/1629833361000-AddShowTLReplies.js14
-rw-r--r--packages/backend/migration/1629968054000_userInstanceBlocks.js7
-rw-r--r--packages/backend/migration/1633068642000-email-required-for-signup.js7
-rw-r--r--packages/backend/migration/1633071909016-user-pending.js7
-rw-r--r--packages/backend/migration/1634486652000-user-public-reactions.js7
-rw-r--r--packages/backend/migration/1634902659689-delete-log.js7
-rw-r--r--packages/backend/migration/1635500777168-note-thread-mute.js7
-rw-r--r--packages/backend/migration/1636197624383-ff-visibility.js7
-rw-r--r--packages/backend/migration/1636697408073-remove-via-mobile.js4
-rw-r--r--packages/backend/migration/1637320813000-forwarded-report.js4
-rw-r--r--packages/backend/migration/1639325650583-chart-v3.js4
-rw-r--r--packages/backend/migration/1642611822809-emoji-url.js4
-rw-r--r--packages/backend/migration/1642613870898-drive-file-webpublic-type.js4
-rw-r--r--packages/backend/migration/1643963705770-chart-v4.js63
-rw-r--r--packages/backend/migration/1643966656277-chart-v5.js27
-rw-r--r--packages/backend/migration/1643967331284-chart-v6.js343
-rw-r--r--packages/backend/migration/1644010796173-convert-hard-mutes.js65
-rw-r--r--packages/backend/migration/1644058404077-chart-v7.js501
-rw-r--r--packages/backend/migration/1644059847460-chart-v8.js25
-rw-r--r--packages/backend/migration/1644060125705-chart-v9.js25
-rw-r--r--packages/backend/migration/1644073149413-chart-v10.js35
-rw-r--r--packages/backend/migration/1644095659741-chart-v11.js91
-rw-r--r--packages/backend/migration/1644328606241-chart-v12.js27
-rw-r--r--packages/backend/migration/1644331238153-chart-v13.js19
-rw-r--r--packages/backend/migration/1644344266289-chart-v14.js47
-rw-r--r--packages/backend/migration/1644395759931-instance-theme-color.js13
-rw-r--r--packages/backend/migration/1644481657998-chart-v15.js31
-rw-r--r--packages/backend/migration/1644551208096-following-indexes.js15
-rw-r--r--packages/backend/migration/1645340161439-remove-max-note-text-length.js13
-rw-r--r--packages/backend/migration/1645599900873-federation-chart-pubsub.js15
-rw-r--r--packages/backend/migration/1646143552768-instance-default-theme.js13
-rw-r--r--packages/backend/ormconfig.js6
-rw-r--r--packages/backend/package.json79
-rw-r--r--packages/backend/src/@types/hcaptcha.d.ts (renamed from packages/backend/@types/hcaptcha.d.ts)0
-rw-r--r--packages/backend/src/@types/http-signature.d.ts (renamed from packages/backend/@types/http-signature.d.ts)0
-rw-r--r--packages/backend/src/@types/jsrsasign.d.ts (renamed from packages/backend/@types/jsrsasign.d.ts)0
-rw-r--r--packages/backend/src/@types/koa-json-body.d.ts (renamed from packages/backend/@types/koa-json-body.d.ts)0
-rw-r--r--packages/backend/src/@types/koa-slow.d.ts (renamed from packages/backend/@types/koa-slow.d.ts)0
-rw-r--r--packages/backend/src/@types/os-utils.d.ts (renamed from packages/backend/@types/os-utils.d.ts)0
-rw-r--r--packages/backend/src/@types/package.json.d.ts (renamed from packages/backend/@types/package.json.d.ts)0
-rw-r--r--packages/backend/src/@types/probe-image-size.d.ts (renamed from packages/backend/@types/probe-image-size.d.ts)2
-rw-r--r--packages/backend/src/boot/index.ts16
-rw-r--r--packages/backend/src/boot/master.ts52
-rw-r--r--packages/backend/src/boot/worker.ts8
-rw-r--r--packages/backend/src/config/index.ts2
-rw-r--r--packages/backend/src/config/load.ts11
-rw-r--r--packages/backend/src/config/types.ts1
-rw-r--r--packages/backend/src/const.ts2
-rw-r--r--packages/backend/src/daemons/janitor.ts2
-rw-r--r--packages/backend/src/daemons/queue-stats.ts6
-rw-r--r--packages/backend/src/daemons/server-stats.ts14
-rw-r--r--packages/backend/src/db/elasticsearch.ts2
-rw-r--r--packages/backend/src/db/logger.ts2
-rw-r--r--packages/backend/src/db/postgre.ts136
-rw-r--r--packages/backend/src/db/redis.ts2
-rw-r--r--packages/backend/src/index.ts12
-rw-r--r--packages/backend/src/mfm/from-html.ts8
-rw-r--r--packages/backend/src/mfm/to-html.ts6
-rw-r--r--packages/backend/src/misc/acct.ts14
-rw-r--r--packages/backend/src/misc/antenna-cache.ts6
-rw-r--r--packages/backend/src/misc/app-lock.ts6
-rw-r--r--packages/backend/src/misc/before-shutdown.ts14
-rw-r--r--packages/backend/src/misc/captcha.ts6
-rw-r--r--packages/backend/src/misc/check-hit-antenna.ts14
-rw-r--r--packages/backend/src/misc/check-word-mute.ts37
-rw-r--r--packages/backend/src/misc/content-disposition.ts2
-rw-r--r--packages/backend/src/misc/convert-host.ts6
-rw-r--r--packages/backend/src/misc/count-same-renotes.ts2
-rw-r--r--packages/backend/src/misc/detect-url-mime.ts6
-rw-r--r--packages/backend/src/misc/download-text-file.ts10
-rw-r--r--packages/backend/src/misc/download-url.ts22
-rw-r--r--packages/backend/src/misc/emoji-regex.ts3
-rw-r--r--packages/backend/src/misc/extract-custom-emojis-from-mfm.ts2
-rw-r--r--packages/backend/src/misc/extract-hashtags.ts2
-rw-r--r--packages/backend/src/misc/fetch-meta.ts2
-rw-r--r--packages/backend/src/misc/fetch-proxy-account.ts6
-rw-r--r--packages/backend/src/misc/fetch.ts4
-rw-r--r--packages/backend/src/misc/gen-id.ts10
-rw-r--r--packages/backend/src/misc/gen-identicon.ts6
-rw-r--r--packages/backend/src/misc/gen-key-pair.ts4
-rw-r--r--packages/backend/src/misc/get-file-info.ts14
-rw-r--r--packages/backend/src/misc/get-note-summary.ts2
-rw-r--r--packages/backend/src/misc/id/aid.ts2
-rw-r--r--packages/backend/src/misc/is-duplicate-key-value-error.ts4
-rw-r--r--packages/backend/src/misc/is-instance-muted.ts2
-rw-r--r--packages/backend/src/misc/is-quote.ts2
-rw-r--r--packages/backend/src/misc/keypair-store.ts8
-rw-r--r--packages/backend/src/misc/langmap.ts666
-rw-r--r--packages/backend/src/misc/populate-emojis.ts16
-rw-r--r--packages/backend/src/misc/reaction-lib.ts8
-rw-r--r--packages/backend/src/misc/schema.ts127
-rw-r--r--packages/backend/src/misc/secure-rndstr.ts2
-rw-r--r--packages/backend/src/misc/show-machine-info.ts6
-rw-r--r--packages/backend/src/models/entities/abuse-user-report.ts4
-rw-r--r--packages/backend/src/models/entities/access-token.ts6
-rw-r--r--packages/backend/src/models/entities/ad.ts2
-rw-r--r--packages/backend/src/models/entities/announcement-read.ts6
-rw-r--r--packages/backend/src/models/entities/announcement.ts2
-rw-r--r--packages/backend/src/models/entities/antenna-note.ts6
-rw-r--r--packages/backend/src/models/entities/antenna.ts8
-rw-r--r--packages/backend/src/models/entities/app.ts4
-rw-r--r--packages/backend/src/models/entities/attestation-challenge.ts4
-rw-r--r--packages/backend/src/models/entities/auth-session.ts6
-rw-r--r--packages/backend/src/models/entities/blocking.ts4
-rw-r--r--packages/backend/src/models/entities/channel-following.ts6
-rw-r--r--packages/backend/src/models/entities/channel-note-pining.ts6
-rw-r--r--packages/backend/src/models/entities/channel.ts6
-rw-r--r--packages/backend/src/models/entities/clip-note.ts6
-rw-r--r--packages/backend/src/models/entities/clip.ts4
-rw-r--r--packages/backend/src/models/entities/drive-file.ts6
-rw-r--r--packages/backend/src/models/entities/drive-folder.ts4
-rw-r--r--packages/backend/src/models/entities/emoji.ts2
-rw-r--r--packages/backend/src/models/entities/follow-request.ts4
-rw-r--r--packages/backend/src/models/entities/following.ts6
-rw-r--r--packages/backend/src/models/entities/gallery-like.ts6
-rw-r--r--packages/backend/src/models/entities/gallery-post.ts6
-rw-r--r--packages/backend/src/models/entities/hashtag.ts4
-rw-r--r--packages/backend/src/models/entities/instance.ts2
-rw-r--r--packages/backend/src/models/entities/messaging-message.ts8
-rw-r--r--packages/backend/src/models/entities/meta.ts37
-rw-r--r--packages/backend/src/models/entities/moderation-log.ts4
-rw-r--r--packages/backend/src/models/entities/muted-note.ts8
-rw-r--r--packages/backend/src/models/entities/muting.ts4
-rw-r--r--packages/backend/src/models/entities/note-favorite.ts6
-rw-r--r--packages/backend/src/models/entities/note-reaction.ts6
-rw-r--r--packages/backend/src/models/entities/note-thread-muting.ts6
-rw-r--r--packages/backend/src/models/entities/note-unread.ts8
-rw-r--r--packages/backend/src/models/entities/note-watching.ts6
-rw-r--r--packages/backend/src/models/entities/note.ts10
-rw-r--r--packages/backend/src/models/entities/notification.ts14
-rw-r--r--packages/backend/src/models/entities/page-like.ts6
-rw-r--r--packages/backend/src/models/entities/page.ts6
-rw-r--r--packages/backend/src/models/entities/password-reset-request.ts4
-rw-r--r--packages/backend/src/models/entities/poll-vote.ts6
-rw-r--r--packages/backend/src/models/entities/poll.ts8
-rw-r--r--packages/backend/src/models/entities/promo-note.ts6
-rw-r--r--packages/backend/src/models/entities/promo-read.ts6
-rw-r--r--packages/backend/src/models/entities/registration-tickets.ts2
-rw-r--r--packages/backend/src/models/entities/registry-item.ts4
-rw-r--r--packages/backend/src/models/entities/relay.ts2
-rw-r--r--packages/backend/src/models/entities/signin.ts4
-rw-r--r--packages/backend/src/models/entities/sw-subscription.ts4
-rw-r--r--packages/backend/src/models/entities/user-group-invitation.ts6
-rw-r--r--packages/backend/src/models/entities/user-group-joining.ts6
-rw-r--r--packages/backend/src/models/entities/user-group.ts4
-rw-r--r--packages/backend/src/models/entities/user-keypair.ts4
-rw-r--r--packages/backend/src/models/entities/user-list-joining.ts6
-rw-r--r--packages/backend/src/models/entities/user-list.ts4
-rw-r--r--packages/backend/src/models/entities/user-note-pining.ts6
-rw-r--r--packages/backend/src/models/entities/user-pending.ts2
-rw-r--r--packages/backend/src/models/entities/user-profile.ts8
-rw-r--r--packages/backend/src/models/entities/user-publickey.ts4
-rw-r--r--packages/backend/src/models/entities/user-security-key.ts4
-rw-r--r--packages/backend/src/models/entities/user.ts30
-rw-r--r--packages/backend/src/models/index.ts127
-rw-r--r--packages/backend/src/models/repositories/abuse-user-report.ts8
-rw-r--r--packages/backend/src/models/repositories/antenna.ts6
-rw-r--r--packages/backend/src/models/repositories/app.ts10
-rw-r--r--packages/backend/src/models/repositories/auth-session.ts8
-rw-r--r--packages/backend/src/models/repositories/blocking.ts10
-rw-r--r--packages/backend/src/models/repositories/channel.ts8
-rw-r--r--packages/backend/src/models/repositories/clip.ts8
-rw-r--r--packages/backend/src/models/repositories/drive-file.ts28
-rw-r--r--packages/backend/src/models/repositories/drive-folder.ts15
-rw-r--r--packages/backend/src/models/repositories/emoji.ts4
-rw-r--r--packages/backend/src/models/repositories/federation-instance.ts2
-rw-r--r--packages/backend/src/models/repositories/follow-request.ts6
-rw-r--r--packages/backend/src/models/repositories/following.ts10
-rw-r--r--packages/backend/src/models/repositories/gallery-like.ts4
-rw-r--r--packages/backend/src/models/repositories/gallery-post.ts10
-rw-r--r--packages/backend/src/models/repositories/hashtag.ts4
-rw-r--r--packages/backend/src/models/repositories/instance.ts39
-rw-r--r--packages/backend/src/models/repositories/messaging-message.ts12
-rw-r--r--packages/backend/src/models/repositories/moderation-logs.ts8
-rw-r--r--packages/backend/src/models/repositories/muting.ts10
-rw-r--r--packages/backend/src/models/repositories/note-favorite.ts8
-rw-r--r--packages/backend/src/models/repositories/note-reaction.ts14
-rw-r--r--packages/backend/src/models/repositories/note.ts28
-rw-r--r--packages/backend/src/models/repositories/notification.ts18
-rw-r--r--packages/backend/src/models/repositories/page-like.ts6
-rw-r--r--packages/backend/src/models/repositories/page.ts12
-rw-r--r--packages/backend/src/models/repositories/relay.ts2
-rw-r--r--packages/backend/src/models/repositories/signin.ts2
-rw-r--r--packages/backend/src/models/repositories/user-group-invitation.ts4
-rw-r--r--packages/backend/src/models/repositories/user-group.ts6
-rw-r--r--packages/backend/src/models/repositories/user-list.ts6
-rw-r--r--packages/backend/src/models/repositories/user.ts76
-rw-r--r--packages/backend/src/models/schema/federation-instance.ts10
-rw-r--r--packages/backend/src/models/schema/notification.ts2
-rw-r--r--packages/backend/src/prelude/array.ts2
-rw-r--r--packages/backend/src/queue/get-job-info.ts2
-rw-r--r--packages/backend/src/queue/index.ts41
-rw-r--r--packages/backend/src/queue/initialize.ts4
-rw-r--r--packages/backend/src/queue/logger.ts2
-rw-r--r--packages/backend/src/queue/processors/db/delete-account.ts20
-rw-r--r--packages/backend/src/queue/processors/db/delete-drive-files.ts10
-rw-r--r--packages/backend/src/queue/processors/db/export-blocking.ts18
-rw-r--r--packages/backend/src/queue/processors/db/export-custom-emojis.ts26
-rw-r--r--packages/backend/src/queue/processors/db/export-following.ts22
-rw-r--r--packages/backend/src/queue/processors/db/export-mute.ts18
-rw-r--r--packages/backend/src/queue/processors/db/export-notes.ts22
-rw-r--r--packages/backend/src/queue/processors/db/export-user-lists.ts18
-rw-r--r--packages/backend/src/queue/processors/db/import-blocking.ts18
-rw-r--r--packages/backend/src/queue/processors/db/import-custom-emojis.ts22
-rw-r--r--packages/backend/src/queue/processors/db/import-following.ts18
-rw-r--r--packages/backend/src/queue/processors/db/import-muting.ts20
-rw-r--r--packages/backend/src/queue/processors/db/import-user-lists.ts25
-rw-r--r--packages/backend/src/queue/processors/db/index.ts30
-rw-r--r--packages/backend/src/queue/processors/deliver.ts32
-rw-r--r--packages/backend/src/queue/processors/inbox.ts44
-rw-r--r--packages/backend/src/queue/processors/object-storage/clean-remote-files.ts8
-rw-r--r--packages/backend/src/queue/processors/object-storage/delete-file.ts6
-rw-r--r--packages/backend/src/queue/processors/object-storage/index.ts8
-rw-r--r--packages/backend/src/queue/processors/system/clean-charts.ts28
-rw-r--r--packages/backend/src/queue/processors/system/index.ts8
-rw-r--r--packages/backend/src/queue/processors/system/resync-charts.ts6
-rw-r--r--packages/backend/src/queue/processors/system/tick-charts.ts28
-rw-r--r--packages/backend/src/queue/queues.ts6
-rw-r--r--packages/backend/src/queue/types.ts8
-rw-r--r--packages/backend/src/remote/activitypub/ap-request.ts4
-rw-r--r--packages/backend/src/remote/activitypub/audience.ts12
-rw-r--r--packages/backend/src/remote/activitypub/db-resolver.ts18
-rw-r--r--packages/backend/src/remote/activitypub/deliver-manager.ts6
-rw-r--r--packages/backend/src/remote/activitypub/kernel/accept/follow.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/accept/index.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/add/index.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/announce/index.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/announce/note.ts33
-rw-r--r--packages/backend/src/remote/activitypub/kernel/block/index.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/create/index.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/create/note.ts14
-rw-r--r--packages/backend/src/remote/activitypub/kernel/delete/actor.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/delete/index.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/delete/note.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/flag/index.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/follow.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/index.ts44
-rw-r--r--packages/backend/src/remote/activitypub/kernel/like.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/read.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/reject/follow.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/reject/index.ts10
-rw-r--r--packages/backend/src/remote/activitypub/kernel/remove/index.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/accept.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/announce.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/block.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/follow.ts12
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/index.ts18
-rw-r--r--packages/backend/src/remote/activitypub/kernel/undo/like.ts8
-rw-r--r--packages/backend/src/remote/activitypub/kernel/update/index.ts12
-rw-r--r--packages/backend/src/remote/activitypub/logger.ts2
-rw-r--r--packages/backend/src/remote/activitypub/misc/get-note-html.ts4
-rw-r--r--packages/backend/src/remote/activitypub/misc/html-to-mfm.ts6
-rw-r--r--packages/backend/src/remote/activitypub/misc/ld-signature.ts10
-rw-r--r--packages/backend/src/remote/activitypub/models/image.ts18
-rw-r--r--packages/backend/src/remote/activitypub/models/mention.ts12
-rw-r--r--packages/backend/src/remote/activitypub/models/note.ts56
-rw-r--r--packages/backend/src/remote/activitypub/models/person.ts87
-rw-r--r--packages/backend/src/remote/activitypub/models/question.ts12
-rw-r--r--packages/backend/src/remote/activitypub/models/tag.ts4
-rw-r--r--packages/backend/src/remote/activitypub/perform.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/accept.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/add.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/announce.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/block.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/create.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/delete.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/document.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/emoji.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/flag.ts8
-rw-r--r--packages/backend/src/remote/activitypub/renderer/follow-relay.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/follow-user.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/follow.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/hashtag.ts2
-rw-r--r--packages/backend/src/remote/activitypub/renderer/image.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/index.ts10
-rw-r--r--packages/backend/src/remote/activitypub/renderer/key.ts8
-rw-r--r--packages/backend/src/remote/activitypub/renderer/like.ts10
-rw-r--r--packages/backend/src/remote/activitypub/renderer/mention.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/note.ts24
-rw-r--r--packages/backend/src/remote/activitypub/renderer/ordered-collection.ts9
-rw-r--r--packages/backend/src/remote/activitypub/renderer/person.ts24
-rw-r--r--packages/backend/src/remote/activitypub/renderer/question.ts8
-rw-r--r--packages/backend/src/remote/activitypub/renderer/read.ts6
-rw-r--r--packages/backend/src/remote/activitypub/renderer/reject.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/remove.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/undo.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/update.ts4
-rw-r--r--packages/backend/src/remote/activitypub/renderer/vote.ts10
-rw-r--r--packages/backend/src/remote/activitypub/request.ts10
-rw-r--r--packages/backend/src/remote/activitypub/resolver.ts16
-rw-r--r--packages/backend/src/remote/logger.ts2
-rw-r--r--packages/backend/src/remote/resolve-user.ts20
-rw-r--r--packages/backend/src/remote/webfinger.ts6
-rw-r--r--packages/backend/src/server/activitypub.ts36
-rw-r--r--packages/backend/src/server/activitypub/featured.ts16
-rw-r--r--packages/backend/src/server/activitypub/followers.ts24
-rw-r--r--packages/backend/src/server/activitypub/following.ts26
-rw-r--r--packages/backend/src/server/activitypub/outbox.ts36
-rw-r--r--packages/backend/src/server/api/2fa.ts4
-rw-r--r--packages/backend/src/server/api/api-handler.ts14
-rw-r--r--packages/backend/src/server/api/authenticate.ts8
-rw-r--r--packages/backend/src/server/api/call.ts40
-rw-r--r--packages/backend/src/server/api/common/generate-block-query.ts4
-rw-r--r--packages/backend/src/server/api/common/generate-channel-query.ts4
-rw-r--r--packages/backend/src/server/api/common/generate-muted-instance-query.ts6
-rw-r--r--packages/backend/src/server/api/common/generate-muted-note-query.ts4
-rw-r--r--packages/backend/src/server/api/common/generate-muted-note-thread-query.ts4
-rw-r--r--packages/backend/src/server/api/common/generate-muted-user-query.ts4
-rw-r--r--packages/backend/src/server/api/common/generate-native-user-token.ts2
-rw-r--r--packages/backend/src/server/api/common/generate-replies-query.ts6
-rw-r--r--packages/backend/src/server/api/common/generate-visibility-query.ts4
-rw-r--r--packages/backend/src/server/api/common/getters.ts8
-rw-r--r--packages/backend/src/server/api/common/inject-featured.ts10
-rw-r--r--packages/backend/src/server/api/common/inject-promo.ts6
-rw-r--r--packages/backend/src/server/api/common/read-messaging-message.ts26
-rw-r--r--packages/backend/src/server/api/common/read-notification.ts8
-rw-r--r--packages/backend/src/server/api/common/signin.ts12
-rw-r--r--packages/backend/src/server/api/common/signup.ts26
-rw-r--r--packages/backend/src/server/api/define.ts81
-rw-r--r--packages/backend/src/server/api/endpoints.ts641
-rw-r--r--packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts69
-rw-r--r--packages/backend/src/server/api/endpoints/admin/accounts/create.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/admin/accounts/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/create.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/list.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/admin/ad/update.ts52
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/create.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/announcements/update.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/files.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/show-file.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/add.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/copy.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts51
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/list.ts49
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/admin/emoji/update.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/get-index-stats.ts11
-rw-r--r--packages/backend/src/server/api/endpoints/admin/get-table-stats.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/admin/invite.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/admin/moderators/add.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/moderators/remove.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/promo/create.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/clear.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/jobs.ts82
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/stats.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/add.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/list.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/admin/relays/remove.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/admin/reset-password.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resync-chart.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/admin/send-email.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/admin/server-info.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-user.ts160
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-users.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/admin/silence-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/suspend-user.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/admin/unsilence-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-meta.ts399
-rw-r--r--packages/backend/src/server/api/endpoints/admin/vacuum.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/announcements.ts49
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/create.ts88
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/notes.ts68
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/antennas/update.ts91
-rw-r--r--packages/backend/src/server/api/endpoints/ap/get.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/ap/show.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/app/create.ts46
-rw-r--r--packages/backend/src/server/api/endpoints/app/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/auth/accept.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/generate.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/show.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/auth/session/userkey.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/create.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/blocking/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/create.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/channels/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/channels/follow.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/channels/followed.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/owned.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/channels/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/channels/timeline.ts64
-rw-r--r--packages/backend/src/server/api/endpoints/channels/unfollow.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/channels/update.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/charts/active-users.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/ap-request.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/charts/drive.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/federation.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/hashtag.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/charts/instance.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/charts/network.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/charts/notes.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/drive.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/following.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/notes.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/reactions.ts41
-rw-r--r--packages/backend/src/server/api/endpoints/charts/users.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/clips/add-note.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/clips/create.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/clips/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/clips/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/clips/notes.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/clips/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/clips/update.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/drive.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/check-existence.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/create.ts62
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/find.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/show.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/update.ts59
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/create.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/find.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/drive/folders/update.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/drive/stream.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/email-address/available.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/endpoint.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/endpoints.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/export-custom-emojis.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/federation/followers.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/federation/following.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/federation/instances.ts76
-rw-r--r--packages/backend/src/server/api/endpoints/federation/show-instance.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/federation/update-remote-user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/federation/users.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/following/create.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/following/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/following/invalidate.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/accept.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/cancel.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/following/requests/reject.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/popular.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/create.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/like.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/gallery/posts/update.ts51
-rw-r--r--packages/backend/src/server/api/endpoints/get-online-users-count.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/list.ts60
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/search.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/show.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/trend.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/hashtags/users.ts62
-rw-r--r--packages/backend/src/server/api/endpoints/i.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/done.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/key-done.ts46
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/password-less.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register-key.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/register.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/i/2fa/unregister.ts19
-rw-r--r--packages/backend/src/server/api/endpoints/i/apps.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/i/authorized-apps.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/i/change-password.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/i/delete-account.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-blocking.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-following.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-mute.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-notes.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/export-user-lists.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/i/favorites.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/gallery/likes.ts65
-rw-r--r--packages/backend/src/server/api/endpoints/i/gallery/posts.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-blocking.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-following.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-muting.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/import-user-lists.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/notifications.ts85
-rw-r--r--packages/backend/src/server/api/endpoints/i/page-likes.ts66
-rw-r--r--packages/backend/src/server/api/endpoints/i/pages.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/i/pin.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts15
-rw-r--r--packages/backend/src/server/api/endpoints/i/read-announcement.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/i/regenerate-token.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-all.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get-detail.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/get.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/keys.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/remove.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/scopes.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/i/registry/set.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/i/revoke-token.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/signin-history.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/i/unpin.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/i/update-email.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts222
-rw-r--r--packages/backend/src/server/api/endpoints/i/user-group-invites.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/history.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages.ts61
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/create.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/messaging/messages/read.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/meta.ts48
-rw-r--r--packages/backend/src/server/api/endpoints/miauth/gen-token.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/mute/create.ts32
-rw-r--r--packages/backend/src/server/api/endpoints/mute/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/mute/list.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/my/apps.ts71
-rw-r--r--packages/backend/src/server/api/endpoints/notes.ts70
-rw-r--r--packages/backend/src/server/api/endpoints/notes/children.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/notes/clips.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/conversation.ts42
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts153
-rw-r--r--packages/backend/src/server/api/endpoints/notes/delete.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/create.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/featured.ts40
-rw-r--r--packages/backend/src/server/api/endpoints/notes/global-timeline.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts98
-rw-r--r--packages/backend/src/server/api/endpoints/notes/local-timeline.ts93
-rw-r--r--packages/backend/src/server/api/endpoints/notes/mentions.ts66
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/vote.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions/create.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/renotes.ts60
-rw-r--r--packages/backend/src/server/api/endpoints/notes/replies.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search-by-tag.ts92
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search.ts81
-rw-r--r--packages/backend/src/server/api/endpoints/notes/show.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/state.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts94
-rw-r--r--packages/backend/src/server/api/endpoints/notes/translate.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/notes/unrenote.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts89
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/create.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/delete.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/create.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts14
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/read.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/page-push.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/pages/create.ts80
-rw-r--r--packages/backend/src/server/api/endpoints/pages/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/pages/featured.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/pages/like.ts26
-rw-r--r--packages/backend/src/server/api/endpoints/pages/show.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/pages/unlike.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/pages/update.ts78
-rw-r--r--packages/backend/src/server/api/endpoints/ping.ts13
-rw-r--r--packages/backend/src/server/api/endpoints/pinned-users.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/promo/read.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/request-reset-password.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/reset-db.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/reset-password.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/server-info.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/stats.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/sw/register.ts43
-rw-r--r--packages/backend/src/server/api/endpoints/sw/unregister.ts17
-rw-r--r--packages/backend/src/server/api/endpoints/test.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/username/available.ts21
-rw-r--r--packages/backend/src/server/api/endpoints/users.ts68
-rw-r--r--packages/backend/src/server/api/endpoints/users/clips.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/followers.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/following.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/gallery/posts.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts36
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/create.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invite.ts37
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/joined.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/leave.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/owned.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/pull.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/transfer.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/update.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/create.ts25
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/delete.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/list.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/pull.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/push.ts33
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/show.ts24
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/update.ts29
-rw-r--r--packages/backend/src/server/api/endpoints/users/notes.ts103
-rw-r--r--packages/backend/src/server/api/endpoints/users/pages.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/users/reactions.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/recommendation.ts34
-rw-r--r--packages/backend/src/server/api/endpoints/users/relation.ts30
-rw-r--r--packages/backend/src/server/api/endpoints/users/report-abuse.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts56
-rw-r--r--packages/backend/src/server/api/endpoints/users/search.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/users/show.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/users/stats.ts24
-rw-r--r--packages/backend/src/server/api/index.ts30
-rw-r--r--packages/backend/src/server/api/limiter.ts12
-rw-r--r--packages/backend/src/server/api/logger.ts2
-rw-r--r--packages/backend/src/server/api/openapi/gen-spec.ts69
-rw-r--r--packages/backend/src/server/api/openapi/schemas.ts4
-rw-r--r--packages/backend/src/server/api/private/signin.ts18
-rw-r--r--packages/backend/src/server/api/private/signup-pending.ts8
-rw-r--r--packages/backend/src/server/api/private/signup.ts24
-rw-r--r--packages/backend/src/server/api/service/discord.ts28
-rw-r--r--packages/backend/src/server/api/service/github.ts28
-rw-r--r--packages/backend/src/server/api/service/twitter.ts28
-rw-r--r--packages/backend/src/server/api/stream/channel.ts2
-rw-r--r--packages/backend/src/server/api/stream/channels/admin.ts4
-rw-r--r--packages/backend/src/server/api/stream/channels/antenna.ts19
-rw-r--r--packages/backend/src/server/api/stream/channels/channel.ts25
-rw-r--r--packages/backend/src/server/api/stream/channels/drive.ts4
-rw-r--r--packages/backend/src/server/api/stream/channels/global-timeline.ts27
-rw-r--r--packages/backend/src/server/api/stream/channels/hashtag.ts21
-rw-r--r--packages/backend/src/server/api/stream/channels/home-timeline.ts25
-rw-r--r--packages/backend/src/server/api/stream/channels/hybrid-timeline.ts27
-rw-r--r--packages/backend/src/server/api/stream/channels/index.ts30
-rw-r--r--packages/backend/src/server/api/stream/channels/local-timeline.ts25
-rw-r--r--packages/backend/src/server/api/stream/channels/main.ts8
-rw-r--r--packages/backend/src/server/api/stream/channels/messaging-index.ts4
-rw-r--r--packages/backend/src/server/api/stream/channels/messaging.ts25
-rw-r--r--packages/backend/src/server/api/stream/channels/queue-stats.ts17
-rw-r--r--packages/backend/src/server/api/stream/channels/server-stats.ts17
-rw-r--r--packages/backend/src/server/api/stream/channels/user-list.ts23
-rw-r--r--packages/backend/src/server/api/stream/index.ts65
-rw-r--r--packages/backend/src/server/api/stream/types.ts36
-rw-r--r--packages/backend/src/server/api/streaming.ts12
-rw-r--r--packages/backend/src/server/file/index.ts21
-rw-r--r--packages/backend/src/server/file/send-drive-file.ts33
-rw-r--r--packages/backend/src/server/index.ts80
-rw-r--r--packages/backend/src/server/nodeinfo.ts23
-rw-r--r--packages/backend/src/server/proxy/index.ts12
-rw-r--r--packages/backend/src/server/proxy/proxy-media.ts23
-rw-r--r--packages/backend/src/server/web/feed.ts6
-rw-r--r--packages/backend/src/server/web/index.ts48
-rw-r--r--packages/backend/src/server/web/manifest.ts9
-rw-r--r--packages/backend/src/server/web/url-preview.ts44
-rw-r--r--packages/backend/src/server/web/views/base.pug13
-rw-r--r--packages/backend/src/server/web/views/channel.pug3
-rw-r--r--packages/backend/src/server/web/views/clip.pug2
-rw-r--r--packages/backend/src/server/web/views/gallery-post.pug2
-rw-r--r--packages/backend/src/server/web/views/note.pug4
-rw-r--r--packages/backend/src/server/web/views/page.pug2
-rw-r--r--packages/backend/src/server/web/views/user.pug2
-rw-r--r--packages/backend/src/server/well-known.ts14
-rw-r--r--packages/backend/src/services/add-note-to-antenna.ts14
-rw-r--r--packages/backend/src/services/blocking/create.ts24
-rw-r--r--packages/backend/src/services/blocking/delete.ts14
-rw-r--r--packages/backend/src/services/chart/charts/active-users.ts55
-rw-r--r--packages/backend/src/services/chart/charts/ap-request.ts38
-rw-r--r--packages/backend/src/services/chart/charts/drive.ts97
-rw-r--r--packages/backend/src/services/chart/charts/entities/active-users.ts41
-rw-r--r--packages/backend/src/services/chart/charts/entities/ap-request.ts11
-rw-r--r--packages/backend/src/services/chart/charts/entities/drive.ts76
-rw-r--r--packages/backend/src/services/chart/charts/entities/federation.ts32
-rw-r--r--packages/backend/src/services/chart/charts/entities/hashtag.ts34
-rw-r--r--packages/backend/src/services/chart/charts/entities/instance.ts178
-rw-r--r--packages/backend/src/services/chart/charts/entities/network.ts32
-rw-r--r--packages/backend/src/services/chart/charts/entities/notes.ts70
-rw-r--r--packages/backend/src/services/chart/charts/entities/per-user-drive.ts61
-rw-r--r--packages/backend/src/services/chart/charts/entities/per-user-following.ts98
-rw-r--r--packages/backend/src/services/chart/charts/entities/per-user-notes.ts50
-rw-r--r--packages/backend/src/services/chart/charts/entities/per-user-reactions.ts30
-rw-r--r--packages/backend/src/services/chart/charts/entities/test-grouped.ts31
-rw-r--r--packages/backend/src/services/chart/charts/entities/test-intersection.ts11
-rw-r--r--packages/backend/src/services/chart/charts/entities/test-unique.ts17
-rw-r--r--packages/backend/src/services/chart/charts/entities/test.ts31
-rw-r--r--packages/backend/src/services/chart/charts/entities/users.ts50
-rw-r--r--packages/backend/src/services/chart/charts/federation.ts82
-rw-r--r--packages/backend/src/services/chart/charts/hashtag.ts42
-rw-r--r--packages/backend/src/services/chart/charts/instance.ts216
-rw-r--r--packages/backend/src/services/chart/charts/network.ts49
-rw-r--r--packages/backend/src/services/chart/charts/notes.ts98
-rw-r--r--packages/backend/src/services/chart/charts/per-user-drive.ts68
-rw-r--r--packages/backend/src/services/chart/charts/per-user-following.ts117
-rw-r--r--packages/backend/src/services/chart/charts/per-user-notes.ts75
-rw-r--r--packages/backend/src/services/chart/charts/per-user-reactions.ts40
-rw-r--r--packages/backend/src/services/chart/charts/test-grouped.ts47
-rw-r--r--packages/backend/src/services/chart/charts/test-intersection.ts32
-rw-r--r--packages/backend/src/services/chart/charts/test-unique.ts26
-rw-r--r--packages/backend/src/services/chart/charts/test.ts57
-rw-r--r--packages/backend/src/services/chart/charts/users.ts73
-rw-r--r--packages/backend/src/services/chart/core.ts498
-rw-r--r--packages/backend/src/services/chart/entities.ts26
-rw-r--r--packages/backend/src/services/chart/index.ts30
-rw-r--r--packages/backend/src/services/create-notification.ts14
-rw-r--r--packages/backend/src/services/create-system-user.ts20
-rw-r--r--packages/backend/src/services/drive/add-file.ts64
-rw-r--r--packages/backend/src/services/drive/delete-file.ts14
-rw-r--r--packages/backend/src/services/drive/generate-video-thumbnail.ts4
-rw-r--r--packages/backend/src/services/drive/image-processor.ts2
-rw-r--r--packages/backend/src/services/drive/internal-storage.ts13
-rw-r--r--packages/backend/src/services/drive/logger.ts2
-rw-r--r--packages/backend/src/services/drive/s3.ts8
-rw-r--r--packages/backend/src/services/drive/upload-from-url.ts18
-rw-r--r--packages/backend/src/services/fetch-instance-metadata.ts30
-rw-r--r--packages/backend/src/services/following/create.ts34
-rw-r--r--packages/backend/src/services/following/delete.ts22
-rw-r--r--packages/backend/src/services/following/reject.ts16
-rw-r--r--packages/backend/src/services/following/requests/accept-all.ts6
-rw-r--r--packages/backend/src/services/following/requests/accept.ts18
-rw-r--r--packages/backend/src/services/following/requests/cancel.ts16
-rw-r--r--packages/backend/src/services/following/requests/create.ts16
-rw-r--r--packages/backend/src/services/i/pin.ts24
-rw-r--r--packages/backend/src/services/i/update.ts14
-rw-r--r--packages/backend/src/services/insert-moderation-log.ts6
-rw-r--r--packages/backend/src/services/instance-actor.ts8
-rw-r--r--packages/backend/src/services/logger.ts17
-rw-r--r--packages/backend/src/services/messages/create.ts28
-rw-r--r--packages/backend/src/services/messages/delete.ts16
-rw-r--r--packages/backend/src/services/note/create.ts85
-rw-r--r--packages/backend/src/services/note/delete.ts32
-rw-r--r--packages/backend/src/services/note/polls/update.ts14
-rw-r--r--packages/backend/src/services/note/polls/vote.ts12
-rw-r--r--packages/backend/src/services/note/reaction/create.ts32
-rw-r--r--packages/backend/src/services/note/reaction/delete.ts20
-rw-r--r--packages/backend/src/services/note/read.ts20
-rw-r--r--packages/backend/src/services/note/unread.ts10
-rw-r--r--packages/backend/src/services/note/unwatch.ts6
-rw-r--r--packages/backend/src/services/note/watch.ts10
-rw-r--r--packages/backend/src/services/push-notification.ts12
-rw-r--r--packages/backend/src/services/register-or-fetch-instance-doc.ts13
-rw-r--r--packages/backend/src/services/relay.ts16
-rw-r--r--packages/backend/src/services/send-email-notification.ts17
-rw-r--r--packages/backend/src/services/send-email.ts14
-rw-r--r--packages/backend/src/services/stream.ts20
-rw-r--r--packages/backend/src/services/suspend-user.ts12
-rw-r--r--packages/backend/src/services/unsuspend-user.ts14
-rw-r--r--packages/backend/src/services/update-hashtag.ts12
-rw-r--r--packages/backend/src/services/user-list/push.ts16
-rw-r--r--packages/backend/src/services/validate-email-for-account.ts2
-rw-r--r--packages/backend/src/tools/accept-migration.ts2
-rw-r--r--packages/backend/src/tools/demote-admin.ts2
-rw-r--r--packages/backend/src/tools/mark-admin.ts2
-rw-r--r--packages/backend/src/tools/refresh-question.ts2
-rw-r--r--packages/backend/src/tools/resync-remote-user.ts4
-rw-r--r--packages/backend/src/tools/show-signin-history.ts2
-rw-r--r--packages/backend/test/activitypub.ts14
-rw-r--r--packages/backend/test/ap-request.ts6
-rw-r--r--packages/backend/test/api-visibility.ts2
-rw-r--r--packages/backend/test/api.ts971
-rw-r--r--packages/backend/test/block.ts2
-rw-r--r--packages/backend/test/chart.ts66
-rw-r--r--packages/backend/test/endpoints.ts865
-rw-r--r--packages/backend/test/extract-mentions.ts2
-rw-r--r--packages/backend/test/fetch-resource.ts2
-rw-r--r--packages/backend/test/ff-visibility.ts2
-rw-r--r--packages/backend/test/get-file-info.ts4
-rw-r--r--packages/backend/test/loader.js37
-rw-r--r--packages/backend/test/mfm.ts4
-rw-r--r--packages/backend/test/misc/mock-resolver.ts4
-rw-r--r--packages/backend/test/mute.ts2
-rw-r--r--packages/backend/test/note.ts4
-rw-r--r--packages/backend/test/prelude/maybe.ts2
-rw-r--r--packages/backend/test/prelude/url.ts2
-rw-r--r--packages/backend/test/reaction-lib.ts2
-rw-r--r--packages/backend/test/streaming.ts4
-rw-r--r--packages/backend/test/thread-mute.ts2
-rw-r--r--packages/backend/test/tsconfig.json2
-rw-r--r--packages/backend/test/user-notes.ts2
-rw-r--r--packages/backend/test/utils.ts8
-rw-r--r--packages/backend/tsconfig.json4
-rw-r--r--packages/backend/yarn.lock1448
-rw-r--r--packages/client/.eslintrc.js2
-rw-r--r--packages/client/package.json66
-rw-r--r--packages/client/src/components/autocomplete.vue31
-rw-r--r--packages/client/src/components/captcha.vue2
-rw-r--r--packages/client/src/components/chart-tooltip.vue51
-rw-r--r--packages/client/src/components/chart.vue298
-rw-r--r--packages/client/src/components/date-separated-list.vue4
-rw-r--r--packages/client/src/components/emoji-picker.vue36
-rw-r--r--packages/client/src/components/form/range.vue2
-rw-r--r--packages/client/src/components/form/switch.vue54
-rw-r--r--packages/client/src/components/global/a.vue5
-rw-r--r--packages/client/src/components/global/spacer.vue3
-rw-r--r--packages/client/src/components/google.vue2
-rw-r--r--packages/client/src/components/instance-stats.vue8
-rw-r--r--packages/client/src/components/instance-ticker.vue18
-rw-r--r--packages/client/src/components/launch-pad.vue113
-rw-r--r--packages/client/src/components/mfm.ts2
-rw-r--r--packages/client/src/components/note-detailed.vue23
-rw-r--r--packages/client/src/components/note.vue23
-rw-r--r--packages/client/src/components/notification-toast.vue41
-rw-r--r--packages/client/src/components/notification.vue2
-rw-r--r--packages/client/src/components/post-form.vue32
-rw-r--r--packages/client/src/components/reaction-tooltip.vue6
-rw-r--r--packages/client/src/components/reactions-viewer.details.vue6
-rw-r--r--packages/client/src/components/reactions-viewer.reaction.vue2
-rw-r--r--packages/client/src/components/renote-button.vue2
-rw-r--r--packages/client/src/components/renote.details.vue6
-rw-r--r--packages/client/src/components/toast.vue4
-rw-r--r--packages/client/src/components/ui/context-menu.vue113
-rw-r--r--packages/client/src/components/ui/menu.vue167
-rw-r--r--packages/client/src/components/ui/modal.vue29
-rw-r--r--packages/client/src/components/ui/popup-menu.vue48
-rw-r--r--packages/client/src/components/ui/tooltip.vue240
-rw-r--r--packages/client/src/components/url-preview.vue2
-rw-r--r--packages/client/src/components/widgets.vue7
-rw-r--r--packages/client/src/directives/get-size.ts61
-rw-r--r--packages/client/src/directives/size.ts137
-rw-r--r--packages/client/src/directives/tooltip.ts6
-rw-r--r--packages/client/src/init.ts22
-rw-r--r--packages/client/src/os.ts12
-rw-r--r--packages/client/src/pages/about-misskey.vue1
-rw-r--r--packages/client/src/pages/about.vue27
-rw-r--r--packages/client/src/pages/admin/files.vue123
-rw-r--r--packages/client/src/pages/admin/settings.vue41
-rw-r--r--packages/client/src/pages/admin/users.vue152
-rw-r--r--packages/client/src/pages/federation.vue7
-rw-r--r--packages/client/src/pages/instance-info.vue11
-rw-r--r--packages/client/src/pages/mfm-cheat-sheet.vue2
-rw-r--r--packages/client/src/pages/note.vue2
-rw-r--r--packages/client/src/pages/settings/drive.vue13
-rw-r--r--packages/client/src/pages/settings/general.vue13
-rw-r--r--packages/client/src/pages/settings/privacy.vue2
-rw-r--r--packages/client/src/pages/settings/profile.vue134
-rw-r--r--packages/client/src/pages/settings/reaction.vue14
-rw-r--r--packages/client/src/pages/settings/theme.vue12
-rw-r--r--packages/client/src/pages/settings/word-mute.vue57
-rw-r--r--packages/client/src/pages/timeline.vue23
-rw-r--r--packages/client/src/pages/user/index.activity.vue4
-rw-r--r--packages/client/src/pages/welcome.setup.vue14
-rw-r--r--packages/client/src/pages/welcome.vue32
-rw-r--r--packages/client/src/scripts/check-word-mute.ts35
-rw-r--r--packages/client/src/scripts/device-kind.ts10
-rw-r--r--packages/client/src/scripts/is-mobile.ts2
-rw-r--r--packages/client/src/scripts/langmap.ts666
-rw-r--r--packages/client/src/scripts/select-file.ts9
-rw-r--r--packages/client/src/scripts/theme.ts4
-rw-r--r--packages/client/src/scripts/use-note-capture.ts33
-rw-r--r--packages/client/src/store.ts18
-rw-r--r--packages/client/src/themes/d-cherry.json520
-rw-r--r--packages/client/src/themes/d-ice.json513
-rw-r--r--packages/client/src/themes/l-cherry.json521
-rw-r--r--packages/client/src/themes/l-coffee.json521
-rw-r--r--packages/client/src/types/menu.ts20
-rw-r--r--packages/client/src/ui/_common_/common.vue37
-rw-r--r--packages/client/src/ui/_common_/sidebar.vue82
-rw-r--r--packages/client/src/ui/classic.header.vue6
-rw-r--r--packages/client/src/ui/classic.side.vue154
-rw-r--r--packages/client/src/ui/classic.sidebar.vue1
-rw-r--r--packages/client/src/ui/deck.vue2
-rw-r--r--packages/client/src/ui/universal.vue229
-rw-r--r--packages/client/src/widgets/federation.vue8
-rw-r--r--packages/client/yarn.lock1483
-rw-r--r--packages/shared/.eslintrc.js3
979 files changed, 15850 insertions, 15403 deletions
diff --git a/packages/backend/.mocharc.json b/packages/backend/.mocharc.json
index 278a5b310a..26628066eb 100644
--- a/packages/backend/.mocharc.json
+++ b/packages/backend/.mocharc.json
@@ -1,6 +1,9 @@
{
"extension": ["ts","js","cjs","mjs"],
- "require": ["ts-node/register", "tsconfig-paths/register"],
+ "node-option": [
+ "experimental-specifier-resolution=node",
+ "loader=./test/loader.js"
+ ],
"slow": 1000,
"timeout": 35000,
"exit": true
diff --git a/packages/backend/@types/langmap.d.ts b/packages/backend/@types/langmap.d.ts
deleted file mode 100644
index a0f99028ab..0000000000
--- a/packages/backend/@types/langmap.d.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-declare module 'langmap' {
- type Lang = {
- nativeName: string;
- englishName: string;
- };
-
- const langmap: { [lang: string]: Lang };
-
- export = langmap;
-}
diff --git a/packages/backend/migration/1000000000000-Init.js b/packages/backend/migration/1000000000000-Init.js
index 19b2166003..1140be7e84 100644
--- a/packages/backend/migration/1000000000000-Init.js
+++ b/packages/backend/migration/1000000000000-Init.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class Init1000000000000 {
+
+
+export class Init1000000000000 {
async up(queryRunner) {
await queryRunner.query(`CREATE TYPE "log_level_enum" AS ENUM('error', 'warning', 'info', 'success', 'debug')`);
await queryRunner.query(`CREATE TABLE "log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "domain" character varying(64) array NOT NULL DEFAULT '{}'::varchar[], "level" "log_level_enum" NOT NULL, "worker" character varying(8) NOT NULL, "machine" character varying(128) NOT NULL, "message" character varying(1024) NOT NULL, "data" jsonb NOT NULL DEFAULT '{}', CONSTRAINT "PK_350604cbdf991d5930d9e618fbd" PRIMARY KEY ("id"))`);
@@ -480,4 +480,3 @@ class Init1000000000000 {
await queryRunner.query(`DROP TYPE "log_level_enum"`);
}
}
-exports.Init1000000000000 = Init1000000000000;
diff --git a/packages/backend/migration/1556348509290-Pages.js b/packages/backend/migration/1556348509290-Pages.js
index d69d172587..50caa2ce91 100644
--- a/packages/backend/migration/1556348509290-Pages.js
+++ b/packages/backend/migration/1556348509290-Pages.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class Pages1556348509290 {
+
+
+export class Pages1556348509290 {
async up(queryRunner) {
await queryRunner.query(`CREATE TYPE "page_visibility_enum" AS ENUM('public', 'followers', 'specified')`);
await queryRunner.query(`CREATE TABLE "page" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "title" character varying(256) NOT NULL, "name" character varying(256) NOT NULL, "summary" character varying(256), "alignCenter" boolean NOT NULL, "font" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "eyeCatchingImageId" character varying(32), "content" jsonb NOT NULL DEFAULT '[]', "variables" jsonb NOT NULL DEFAULT '[]', "visibility" "page_visibility_enum" NOT NULL, "visibleUserIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_742f4117e065c5b6ad21b37ba1f" PRIMARY KEY ("id"))`);
@@ -26,4 +26,3 @@ class Pages1556348509290 {
await queryRunner.query(`DROP TYPE "page_visibility_enum"`);
}
}
-exports.Pages1556348509290 = Pages1556348509290;
diff --git a/packages/backend/migration/1556746559567-UserProfile.js b/packages/backend/migration/1556746559567-UserProfile.js
index 3a082b882d..50a9d1a8be 100644
--- a/packages/backend/migration/1556746559567-UserProfile.js
+++ b/packages/backend/migration/1556746559567-UserProfile.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class UserProfile1556746559567 {
+
+
+export class UserProfile1556746559567 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "githubId" TYPE VARCHAR(64) USING "githubId"::VARCHAR(64)`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE VARCHAR(64) USING "discordExpiresDate"::VARCHAR(64)`);
@@ -11,4 +11,3 @@ class UserProfile1556746559567 {
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "discordExpiresDate" TYPE INTEGER USING NULL`);
}
}
-exports.UserProfile1556746559567 = UserProfile1556746559567;
diff --git a/packages/backend/migration/1557476068003-PinnedUsers.js b/packages/backend/migration/1557476068003-PinnedUsers.js
index c5e7fe748f..d9cce25435 100644
--- a/packages/backend/migration/1557476068003-PinnedUsers.js
+++ b/packages/backend/migration/1557476068003-PinnedUsers.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class PinnedUsers1557476068003 {
+
+
+export class PinnedUsers1557476068003 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedUsers" character varying(256) array NOT NULL DEFAULT '{}'::varchar[]`);
}
@@ -8,4 +8,3 @@ class PinnedUsers1557476068003 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedUsers"`);
}
}
-exports.PinnedUsers1557476068003 = PinnedUsers1557476068003;
diff --git a/packages/backend/migration/1557761316509-AddSomeUrls.js b/packages/backend/migration/1557761316509-AddSomeUrls.js
index f6a7b409c2..ab8736f7cc 100644
--- a/packages/backend/migration/1557761316509-AddSomeUrls.js
+++ b/packages/backend/migration/1557761316509-AddSomeUrls.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class AddSomeUrls1557761316509 {
+
+
+export class AddSomeUrls1557761316509 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/misskey-dev/misskey'`);
@@ -12,4 +12,3 @@ class AddSomeUrls1557761316509 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "ToSUrl"`);
}
}
-exports.AddSomeUrls1557761316509 = AddSomeUrls1557761316509;
diff --git a/packages/backend/migration/1557932705754-ObjectStorageSetting.js b/packages/backend/migration/1557932705754-ObjectStorageSetting.js
index d798ac5ca6..19a0b9d5cd 100644
--- a/packages/backend/migration/1557932705754-ObjectStorageSetting.js
+++ b/packages/backend/migration/1557932705754-ObjectStorageSetting.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ObjectStorageSetting1557932705754 {
+
+
+export class ObjectStorageSetting1557932705754 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "useObjectStorage" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "objectStorageBucket" character varying(512)`);
@@ -26,4 +26,3 @@ class ObjectStorageSetting1557932705754 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "useObjectStorage"`);
}
}
-exports.ObjectStorageSetting1557932705754 = ObjectStorageSetting1557932705754;
diff --git a/packages/backend/migration/1558072954435-PageLike.js b/packages/backend/migration/1558072954435-PageLike.js
index 7038434971..31b08418a9 100644
--- a/packages/backend/migration/1558072954435-PageLike.js
+++ b/packages/backend/migration/1558072954435-PageLike.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class PageLike1558072954435 {
+
+
+export class PageLike1558072954435 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "page_like" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "pageId" character varying(32) NOT NULL, CONSTRAINT "PK_813f034843af992d3ae0f43c64c" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_0e61efab7f88dbb79c9166dbb4" ON "page_like" ("userId") `);
@@ -18,4 +18,3 @@ class PageLike1558072954435 {
await queryRunner.query(`DROP TABLE "page_like"`);
}
}
-exports.PageLike1558072954435 = PageLike1558072954435;
diff --git a/packages/backend/migration/1558103093633-UserGroup.js b/packages/backend/migration/1558103093633-UserGroup.js
index 9c1e511286..b670b31c3d 100644
--- a/packages/backend/migration/1558103093633-UserGroup.js
+++ b/packages/backend/migration/1558103093633-UserGroup.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class UserGroup1558103093633 {
+
+
+export class UserGroup1558103093633 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "user_group" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "name" character varying(256) NOT NULL, "userId" character varying(32) NOT NULL, "isPrivate" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_3c29fba6fe013ec8724378ce7c9" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_20e30aa35180e317e133d75316" ON "user_group" ("createdAt") `);
@@ -36,4 +36,3 @@ class UserGroup1558103093633 {
await queryRunner.query(`DROP TABLE "user_group"`);
}
}
-exports.UserGroup1558103093633 = UserGroup1558103093633;
diff --git a/packages/backend/migration/1558257926829-UserGroupInvite.js b/packages/backend/migration/1558257926829-UserGroupInvite.js
index e8a575e74f..e48bd3a7ff 100644
--- a/packages/backend/migration/1558257926829-UserGroupInvite.js
+++ b/packages/backend/migration/1558257926829-UserGroupInvite.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class UserGroupInvite1558257926829 {
+
+
+export class UserGroupInvite1558257926829 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "user_group_invite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_3893884af0d3a5f4d01e7921a97" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_1039988afa3bf991185b277fe0" ON "user_group_invite" ("userId") `);
@@ -20,4 +20,3 @@ class UserGroupInvite1558257926829 {
await queryRunner.query(`DROP TABLE "user_group_invite"`);
}
}
-exports.UserGroupInvite1558257926829 = UserGroupInvite1558257926829;
diff --git a/packages/backend/migration/1558266512381-UserListJoining.js b/packages/backend/migration/1558266512381-UserListJoining.js
index b31f7bd3d1..3398aed139 100644
--- a/packages/backend/migration/1558266512381-UserListJoining.js
+++ b/packages/backend/migration/1558266512381-UserListJoining.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class UserListJoining1558266512381 {
+
+
+export class UserListJoining1558266512381 {
async up(queryRunner) {
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_90f7da835e4c10aca6853621e1" ON "user_list_joining" ("userId", "userListId") `);
}
@@ -8,4 +8,3 @@ class UserListJoining1558266512381 {
await queryRunner.query(`DROP INDEX "IDX_90f7da835e4c10aca6853621e1"`);
}
}
-exports.UserListJoining1558266512381 = UserListJoining1558266512381;
diff --git a/packages/backend/migration/1561706992953-webauthn.js b/packages/backend/migration/1561706992953-webauthn.js
index f05054f553..b007ffef14 100644
--- a/packages/backend/migration/1561706992953-webauthn.js
+++ b/packages/backend/migration/1561706992953-webauthn.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class webauthn1561706992953 {
+
+
+export class webauthn1561706992953 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "attestation_challenge" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "challenge" character varying(64) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "registrationChallenge" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_d0ba6786e093f1bcb497572a6b5" PRIMARY KEY ("id", "userId"))`);
await queryRunner.query(`CREATE INDEX "IDX_f1a461a618fa1755692d0e0d59" ON "attestation_challenge" ("userId") `);
@@ -24,4 +24,3 @@ class webauthn1561706992953 {
await queryRunner.query(`DROP TABLE "attestation_challenge"`);
}
}
-exports.webauthn1561706992953 = webauthn1561706992953;
diff --git a/packages/backend/migration/1561873850023-ChartIndexes.js b/packages/backend/migration/1561873850023-ChartIndexes.js
index 559cb70cb3..3ce53567fc 100644
--- a/packages/backend/migration/1561873850023-ChartIndexes.js
+++ b/packages/backend/migration/1561873850023-ChartIndexes.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ChartIndexes1561873850023 {
+
+
+export class ChartIndexes1561873850023 {
async up(queryRunner) {
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `);
@@ -196,4 +196,3 @@ class ChartIndexes1561873850023 {
await queryRunner.query(`DROP INDEX "IDX_8cb40cfc8f3c28261e6f887b03"`);
}
}
-exports.ChartIndexes1561873850023 = ChartIndexes1561873850023;
diff --git a/packages/backend/migration/1562422242907-PasswordLessLogin.js b/packages/backend/migration/1562422242907-PasswordLessLogin.js
index bed879ade1..b73c7db4d3 100644
--- a/packages/backend/migration/1562422242907-PasswordLessLogin.js
+++ b/packages/backend/migration/1562422242907-PasswordLessLogin.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class PasswordLessLogin1562422242907 {
+
+
+export class PasswordLessLogin1562422242907 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD COLUMN "usePasswordLessLogin" boolean DEFAULT false NOT NULL`);
}
@@ -8,4 +8,3 @@ class PasswordLessLogin1562422242907 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "usePasswordLessLogin"`);
}
}
-exports.PasswordLessLogin1562422242907 = PasswordLessLogin1562422242907;
diff --git a/packages/backend/migration/1562444565093-PinnedPage.js b/packages/backend/migration/1562444565093-PinnedPage.js
index f0aac3a4b3..9a999a9150 100644
--- a/packages/backend/migration/1562444565093-PinnedPage.js
+++ b/packages/backend/migration/1562444565093-PinnedPage.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class PinnedPage1562444565093 {
+
+
+export class PinnedPage1562444565093 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "pinnedPageId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "user_profile" ADD CONSTRAINT "UQ_6dc44f1ceb65b1e72bacef2ca27" UNIQUE ("pinnedPageId")`);
@@ -12,4 +12,3 @@ class PinnedPage1562444565093 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "pinnedPageId"`);
}
}
-exports.PinnedPage1562444565093 = PinnedPage1562444565093;
diff --git a/packages/backend/migration/1562448332510-PageTitleHideOption.js b/packages/backend/migration/1562448332510-PageTitleHideOption.js
index 238b742262..8fc78d202f 100644
--- a/packages/backend/migration/1562448332510-PageTitleHideOption.js
+++ b/packages/backend/migration/1562448332510-PageTitleHideOption.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class PageTitleHideOption1562448332510 {
+
+
+export class PageTitleHideOption1562448332510 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "page" ADD "hideTitleWhenPinned" boolean NOT NULL DEFAULT false`);
}
@@ -8,4 +8,3 @@ class PageTitleHideOption1562448332510 {
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "hideTitleWhenPinned"`);
}
}
-exports.PageTitleHideOption1562448332510 = PageTitleHideOption1562448332510;
diff --git a/packages/backend/migration/1562869971568-ModerationLog.js b/packages/backend/migration/1562869971568-ModerationLog.js
index c8953c513e..dd66d16eec 100644
--- a/packages/backend/migration/1562869971568-ModerationLog.js
+++ b/packages/backend/migration/1562869971568-ModerationLog.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ModerationLog1562869971568 {
+
+
+export class ModerationLog1562869971568 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "moderation_log" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "type" character varying(128) NOT NULL, "info" jsonb NOT NULL, CONSTRAINT "PK_d0adca6ecfd068db83e4526cc26" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_a08ad074601d204e0f69da9a95" ON "moderation_log" ("userId") `);
@@ -12,4 +12,3 @@ class ModerationLog1562869971568 {
await queryRunner.query(`DROP TABLE "moderation_log"`);
}
}
-exports.ModerationLog1562869971568 = ModerationLog1562869971568;
diff --git a/packages/backend/migration/1563757595828-UsedUsername.js b/packages/backend/migration/1563757595828-UsedUsername.js
index 0e59fdd45b..8972df297d 100644
--- a/packages/backend/migration/1563757595828-UsedUsername.js
+++ b/packages/backend/migration/1563757595828-UsedUsername.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class UsedUsername1563757595828 {
+
+
+export class UsedUsername1563757595828 {
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "used_username" ("username" character varying(128) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, CONSTRAINT "PK_78fd79d2d24c6ac2f4cc9a31a5d" PRIMARY KEY ("username"))`);
}
@@ -8,4 +8,3 @@ class UsedUsername1563757595828 {
await queryRunner.query(`DROP TABLE "used_username"`);
}
}
-exports.UsedUsername1563757595828 = UsedUsername1563757595828;
diff --git a/packages/backend/migration/1565634203341-room.js b/packages/backend/migration/1565634203341-room.js
index 49ca5ea502..679940f244 100644
--- a/packages/backend/migration/1565634203341-room.js
+++ b/packages/backend/migration/1565634203341-room.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class room1565634203341 {
+
+
+export class room1565634203341 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "room" jsonb NOT NULL DEFAULT '{}'`);
}
@@ -8,4 +8,3 @@ class room1565634203341 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "room"`);
}
}
-exports.room1565634203341 = room1565634203341;
diff --git a/packages/backend/migration/1571220798684-CustomEmojiCategory.js b/packages/backend/migration/1571220798684-CustomEmojiCategory.js
index c67c437dec..37c07366e1 100644
--- a/packages/backend/migration/1571220798684-CustomEmojiCategory.js
+++ b/packages/backend/migration/1571220798684-CustomEmojiCategory.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class CustomEmojiCategory1571220798684 {
+
+
+export class CustomEmojiCategory1571220798684 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "emoji" ADD "category" character varying(128)`, undefined);
}
@@ -8,4 +8,3 @@ class CustomEmojiCategory1571220798684 {
await queryRunner.query(`ALTER TABLE "emoji" DROP COLUMN "category"`, undefined);
}
}
-exports.CustomEmojiCategory1571220798684 = CustomEmojiCategory1571220798684;
diff --git a/packages/backend/migration/1572760203493-nodeinfo.js b/packages/backend/migration/1572760203493-nodeinfo.js
index a3ca5d7180..54d5f914a4 100644
--- a/packages/backend/migration/1572760203493-nodeinfo.js
+++ b/packages/backend/migration/1572760203493-nodeinfo.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class nodeinfo1572760203493 {
+
+
+export class nodeinfo1572760203493 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "system"`, undefined);
await queryRunner.query(`ALTER TABLE "instance" ADD "softwareName" character varying(64) DEFAULT null`, undefined);
@@ -24,4 +24,3 @@ class nodeinfo1572760203493 {
await queryRunner.query(`ALTER TABLE "instance" ADD "system" character varying(64)`, undefined);
}
}
-exports.nodeinfo1572760203493 = nodeinfo1572760203493;
diff --git a/packages/backend/migration/1576269851876-TalkFederationId.js b/packages/backend/migration/1576269851876-TalkFederationId.js
index 63a8f8a9a3..35861d571f 100644
--- a/packages/backend/migration/1576269851876-TalkFederationId.js
+++ b/packages/backend/migration/1576269851876-TalkFederationId.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class TalkFederationId1576269851876 {
+
+
+export class TalkFederationId1576269851876 {
constructor() {
this.name = 'TalkFederationId1576269851876';
}
@@ -11,4 +11,3 @@ class TalkFederationId1576269851876 {
await queryRunner.query(`ALTER TABLE "messaging_message" DROP COLUMN "uri"`, undefined);
}
}
-exports.TalkFederationId1576269851876 = TalkFederationId1576269851876;
diff --git a/packages/backend/migration/1576869585998-ProxyRemoteFiles.js b/packages/backend/migration/1576869585998-ProxyRemoteFiles.js
index 867ae3d6e7..d6d134be40 100644
--- a/packages/backend/migration/1576869585998-ProxyRemoteFiles.js
+++ b/packages/backend/migration/1576869585998-ProxyRemoteFiles.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ProxyRemoteFiles1576869585998 {
+
+
+export class ProxyRemoteFiles1576869585998 {
constructor() {
this.name = 'ProxyRemoteFiles1576869585998';
}
@@ -11,4 +11,3 @@ class ProxyRemoteFiles1576869585998 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyRemoteFiles"`, undefined);
}
}
-exports.ProxyRemoteFiles1576869585998 = ProxyRemoteFiles1576869585998;
diff --git a/packages/backend/migration/1579267006611-v12.js b/packages/backend/migration/1579267006611-v12.js
index ccc5247736..7f6318a192 100644
--- a/packages/backend/migration/1579267006611-v12.js
+++ b/packages/backend/migration/1579267006611-v12.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v121579267006611 {
+
+
+export class v121579267006611 {
constructor() {
this.name = 'v121579267006611';
}
@@ -31,4 +31,3 @@ class v121579267006611 {
await queryRunner.query(`DROP TABLE "announcement"`, undefined);
}
}
-exports.v121579267006611 = v121579267006611;
diff --git a/packages/backend/migration/1579270193251-v12-2.js b/packages/backend/migration/1579270193251-v12-2.js
index 7f67645aaf..c51ce63066 100644
--- a/packages/backend/migration/1579270193251-v12-2.js
+++ b/packages/backend/migration/1579270193251-v12-2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1221579270193251 {
+
+
+export class v1221579270193251 {
constructor() {
this.name = 'v1221579270193251';
}
@@ -11,4 +11,3 @@ class v1221579270193251 {
await queryRunner.query(`ALTER TABLE "announcement_read" DROP COLUMN "createdAt"`, undefined);
}
}
-exports.v1221579270193251 = v1221579270193251;
diff --git a/packages/backend/migration/1579282808087-v12-3.js b/packages/backend/migration/1579282808087-v12-3.js
index 80fa234a54..aeb4f5a873 100644
--- a/packages/backend/migration/1579282808087-v12-3.js
+++ b/packages/backend/migration/1579282808087-v12-3.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1231579282808087 {
+
+
+export class v1231579282808087 {
constructor() {
this.name = 'v1231579282808087';
}
@@ -11,4 +11,3 @@ class v1231579282808087 {
await queryRunner.query(`ALTER TABLE "announcement" DROP COLUMN "updatedAt"`, undefined);
}
}
-exports.v1231579282808087 = v1231579282808087;
diff --git a/packages/backend/migration/1579544426412-v12-4.js b/packages/backend/migration/1579544426412-v12-4.js
index ef2b804f58..f1e093413e 100644
--- a/packages/backend/migration/1579544426412-v12-4.js
+++ b/packages/backend/migration/1579544426412-v12-4.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1241579544426412 {
+
+
+export class v1241579544426412 {
constructor() {
this.name = 'v1241579544426412';
}
@@ -13,4 +13,3 @@ class v1241579544426412 {
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "followRequestId"`, undefined);
}
}
-exports.v1241579544426412 = v1241579544426412;
diff --git a/packages/backend/migration/1579977526288-v12-5.js b/packages/backend/migration/1579977526288-v12-5.js
index 1d2ed09664..6d2b5c584a 100644
--- a/packages/backend/migration/1579977526288-v12-5.js
+++ b/packages/backend/migration/1579977526288-v12-5.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1251579977526288 {
+
+
+export class v1251579977526288 {
constructor() {
this.name = 'v1251579977526288';
}
@@ -51,4 +51,3 @@ class v1251579977526288 {
await queryRunner.query(`DROP TABLE "clip"`, undefined);
}
}
-exports.v1251579977526288 = v1251579977526288;
diff --git a/packages/backend/migration/1579993013959-v12-6.js b/packages/backend/migration/1579993013959-v12-6.js
index e6c3a40a34..3941c1391d 100644
--- a/packages/backend/migration/1579993013959-v12-6.js
+++ b/packages/backend/migration/1579993013959-v12-6.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1261579993013959 {
+
+
+export class v1261579993013959 {
constructor() {
this.name = 'v1261579993013959';
}
@@ -15,4 +15,3 @@ class v1261579993013959 {
await queryRunner.query(`ALTER TABLE "antenna" ADD "hasNewNote" boolean NOT NULL DEFAULT false`, undefined);
}
}
-exports.v1261579993013959 = v1261579993013959;
diff --git a/packages/backend/migration/1580069531114-v12-7.js b/packages/backend/migration/1580069531114-v12-7.js
index 7915603b8f..4b4790cb7d 100644
--- a/packages/backend/migration/1580069531114-v12-7.js
+++ b/packages/backend/migration/1580069531114-v12-7.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1271580069531114 {
+
+
+export class v1271580069531114 {
constructor() {
this.name = 'v1271580069531114';
}
@@ -21,4 +21,3 @@ class v1271580069531114 {
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "users"`, undefined);
}
}
-exports.v1271580069531114 = v1271580069531114;
diff --git a/packages/backend/migration/1580148575182-v12-8.js b/packages/backend/migration/1580148575182-v12-8.js
index 43fbc70e4b..cc30200c14 100644
--- a/packages/backend/migration/1580148575182-v12-8.js
+++ b/packages/backend/migration/1580148575182-v12-8.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1281580148575182 {
+
+
+export class v1281580148575182 {
constructor() {
this.name = 'v1281580148575182';
}
@@ -13,4 +13,3 @@ class v1281580148575182 {
await queryRunner.query(`ALTER TABLE "note" ADD CONSTRAINT "FK_ec5c201576192ba8904c345c5cc" FOREIGN KEY ("appId") REFERENCES "app"("id") ON DELETE SET NULL ON UPDATE NO ACTION`, undefined);
}
}
-exports.v1281580148575182 = v1281580148575182;
diff --git a/packages/backend/migration/1580154400017-v12-9.js b/packages/backend/migration/1580154400017-v12-9.js
index f47611868f..3715798f19 100644
--- a/packages/backend/migration/1580154400017-v12-9.js
+++ b/packages/backend/migration/1580154400017-v12-9.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v1291580154400017 {
+
+
+export class v1291580154400017 {
constructor() {
this.name = 'v1291580154400017';
}
@@ -11,4 +11,3 @@ class v1291580154400017 {
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "withReplies"`, undefined);
}
}
-exports.v1291580154400017 = v1291580154400017;
diff --git a/packages/backend/migration/1580276619901-v12-10.js b/packages/backend/migration/1580276619901-v12-10.js
index 301d0ceb91..d5decb882e 100644
--- a/packages/backend/migration/1580276619901-v12-10.js
+++ b/packages/backend/migration/1580276619901-v12-10.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v12101580276619901 {
+
+
+export class v12101580276619901 {
constructor() {
this.name = 'v12101580276619901';
}
@@ -16,4 +16,3 @@ class v12101580276619901 {
await queryRunner.query(`ALTER TABLE "notification" ADD "type" character varying(32) NOT NULL`, undefined);
}
}
-exports.v12101580276619901 = v12101580276619901;
diff --git a/packages/backend/migration/1580331224276-v12-11.js b/packages/backend/migration/1580331224276-v12-11.js
index fb5124baa5..129720adbf 100644
--- a/packages/backend/migration/1580331224276-v12-11.js
+++ b/packages/backend/migration/1580331224276-v12-11.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v12111580331224276 {
+
+
+export class v12111580331224276 {
constructor() {
this.name = 'v12111580331224276';
}
@@ -15,4 +15,3 @@ class v12111580331224276 {
await queryRunner.query(`ALTER TABLE "instance" ADD "isMarkedAsClosed" boolean NOT NULL DEFAULT false`, undefined);
}
}
-exports.v12111580331224276 = v12111580331224276;
diff --git a/packages/backend/migration/1580508795118-v12-12.js b/packages/backend/migration/1580508795118-v12-12.js
index eb70ba3cef..c5cec23a36 100644
--- a/packages/backend/migration/1580508795118-v12-12.js
+++ b/packages/backend/migration/1580508795118-v12-12.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v12121580508795118 {
+
+
+export class v12121580508795118 {
constructor() {
this.name = 'v12121580508795118';
}
@@ -43,4 +43,3 @@ class v12121580508795118 {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "twitter" boolean NOT NULL DEFAULT false`, undefined);
}
}
-exports.v12121580508795118 = v12121580508795118;
diff --git a/packages/backend/migration/1580543501339-v12-13.js b/packages/backend/migration/1580543501339-v12-13.js
index 7dae7178b1..2fa490392d 100644
--- a/packages/backend/migration/1580543501339-v12-13.js
+++ b/packages/backend/migration/1580543501339-v12-13.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v12131580543501339 {
+
+
+export class v12131580543501339 {
constructor() {
this.name = 'v12131580543501339';
}
@@ -11,4 +11,3 @@ class v12131580543501339 {
await queryRunner.query(`DROP INDEX "IDX_NOTE_TAGS"`, undefined);
}
}
-exports.v12131580543501339 = v12131580543501339;
diff --git a/packages/backend/migration/1580864313253-v12-14.js b/packages/backend/migration/1580864313253-v12-14.js
index b1939c51b5..a3756ad029 100644
--- a/packages/backend/migration/1580864313253-v12-14.js
+++ b/packages/backend/migration/1580864313253-v12-14.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class v12141580864313253 {
+
+
+export class v12141580864313253 {
constructor() {
this.name = 'v12141580864313253';
}
@@ -17,4 +17,3 @@ class v12141580864313253 {
await queryRunner.query(`ALTER TABLE "meta" RENAME COLUMN "proxyAccountId" TO "proxyAccount"`, undefined);
}
}
-exports.v12141580864313253 = v12141580864313253;
diff --git a/packages/backend/migration/1581526429287-user-group-invitation.js b/packages/backend/migration/1581526429287-user-group-invitation.js
index 80946c94ac..181b0aba86 100644
--- a/packages/backend/migration/1581526429287-user-group-invitation.js
+++ b/packages/backend/migration/1581526429287-user-group-invitation.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userGroupInvitation1581526429287 {
+
+
+export class userGroupInvitation1581526429287 {
constructor() {
this.name = 'userGroupInvitation1581526429287';
}
@@ -35,4 +35,3 @@ class userGroupInvitation1581526429287 {
await queryRunner.query(`DROP TABLE "user_group_invitation"`, undefined);
}
}
-exports.userGroupInvitation1581526429287 = userGroupInvitation1581526429287;
diff --git a/packages/backend/migration/1581695816408-user-group-antenna.js b/packages/backend/migration/1581695816408-user-group-antenna.js
index 307b5b0579..267b58cd9b 100644
--- a/packages/backend/migration/1581695816408-user-group-antenna.js
+++ b/packages/backend/migration/1581695816408-user-group-antenna.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userGroupAntenna1581695816408 {
+
+
+export class userGroupAntenna1581695816408 {
constructor() {
this.name = 'userGroupAntenna1581695816408';
}
@@ -25,4 +25,3 @@ class userGroupAntenna1581695816408 {
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "userGroupJoiningId"`, undefined);
}
}
-exports.userGroupAntenna1581695816408 = userGroupAntenna1581695816408;
diff --git a/packages/backend/migration/1581708415836-drive-user-folder-id-index.js b/packages/backend/migration/1581708415836-drive-user-folder-id-index.js
index 8029ef1399..43c2ce6cee 100644
--- a/packages/backend/migration/1581708415836-drive-user-folder-id-index.js
+++ b/packages/backend/migration/1581708415836-drive-user-folder-id-index.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class driveUserFolderIdIndex1581708415836 {
+
+
+export class driveUserFolderIdIndex1581708415836 {
constructor() {
this.name = 'driveUserFolderIdIndex1581708415836';
}
@@ -11,4 +11,3 @@ class driveUserFolderIdIndex1581708415836 {
await queryRunner.query(`DROP INDEX "IDX_55720b33a61a7c806a8215b825"`, undefined);
}
}
-exports.driveUserFolderIdIndex1581708415836 = driveUserFolderIdIndex1581708415836;
diff --git a/packages/backend/migration/1581979837262-promo.js b/packages/backend/migration/1581979837262-promo.js
index d2c5bac17d..4813a5f480 100644
--- a/packages/backend/migration/1581979837262-promo.js
+++ b/packages/backend/migration/1581979837262-promo.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class promo1581979837262 {
+
+
+export class promo1581979837262 {
constructor() {
this.name = 'promo1581979837262';
}
@@ -25,4 +25,3 @@ class promo1581979837262 {
await queryRunner.query(`DROP TABLE "promo_note"`, undefined);
}
}
-exports.promo1581979837262 = promo1581979837262;
diff --git a/packages/backend/migration/1582019042083-featured-injecttion.js b/packages/backend/migration/1582019042083-featured-injecttion.js
index 9779e2a08f..7f8790b01b 100644
--- a/packages/backend/migration/1582019042083-featured-injecttion.js
+++ b/packages/backend/migration/1582019042083-featured-injecttion.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class featuredInjecttion1582019042083 {
+
+
+export class featuredInjecttion1582019042083 {
constructor() {
this.name = 'featuredInjecttion1582019042083';
}
@@ -11,4 +11,3 @@ class featuredInjecttion1582019042083 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "injectFeaturedNote"`, undefined);
}
}
-exports.featuredInjecttion1582019042083 = featuredInjecttion1582019042083;
diff --git a/packages/backend/migration/1582210532752-antenna-exclude.js b/packages/backend/migration/1582210532752-antenna-exclude.js
index cc095b4b59..ff8d7b80d8 100644
--- a/packages/backend/migration/1582210532752-antenna-exclude.js
+++ b/packages/backend/migration/1582210532752-antenna-exclude.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class antennaExclude1582210532752 {
+
+
+export class antennaExclude1582210532752 {
constructor() {
this.name = 'antennaExclude1582210532752';
}
@@ -11,4 +11,3 @@ class antennaExclude1582210532752 {
await queryRunner.query(`ALTER TABLE "antenna" DROP COLUMN "excludeKeywords"`, undefined);
}
}
-exports.antennaExclude1582210532752 = antennaExclude1582210532752;
diff --git a/packages/backend/migration/1582875306439-note-reaction-length.js b/packages/backend/migration/1582875306439-note-reaction-length.js
index bdee1ef14f..e99501f012 100644
--- a/packages/backend/migration/1582875306439-note-reaction-length.js
+++ b/packages/backend/migration/1582875306439-note-reaction-length.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class noteReactionLength1582875306439 {
+
+
+export class noteReactionLength1582875306439 {
constructor() {
this.name = 'noteReactionLength1582875306439';
}
@@ -11,4 +11,3 @@ class noteReactionLength1582875306439 {
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(128)`, undefined);
}
}
-exports.noteReactionLength1582875306439 = noteReactionLength1582875306439;
diff --git a/packages/backend/migration/1585361548360-miauth.js b/packages/backend/migration/1585361548360-miauth.js
index c1a695dd27..e59aa3b6ef 100644
--- a/packages/backend/migration/1585361548360-miauth.js
+++ b/packages/backend/migration/1585361548360-miauth.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class miauth1585361548360 {
+
+
+export class miauth1585361548360 {
constructor() {
this.name = 'miauth1585361548360';
}
@@ -33,4 +33,3 @@ class miauth1585361548360 {
await queryRunner.query(`ALTER TABLE "access_token" DROP COLUMN "lastUsedAt"`, undefined);
}
}
-exports.miauth1585361548360 = miauth1585361548360;
diff --git a/packages/backend/migration/1585385921215-custom-notification.js b/packages/backend/migration/1585385921215-custom-notification.js
index 7f94c741a5..c3ddb2be17 100644
--- a/packages/backend/migration/1585385921215-custom-notification.js
+++ b/packages/backend/migration/1585385921215-custom-notification.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class customNotification1585385921215 {
+
+
+export class customNotification1585385921215 {
constructor() {
this.name = 'customNotification1585385921215';
}
@@ -45,4 +45,3 @@ class customNotification1585385921215 {
await queryRunner.query(`ALTER TABLE "notification" DROP COLUMN "customBody"`, undefined);
}
}
-exports.customNotification1585385921215 = customNotification1585385921215;
diff --git a/packages/backend/migration/1585772678853-ap-url.js b/packages/backend/migration/1585772678853-ap-url.js
index f7c1f87b80..5fb809ff53 100644
--- a/packages/backend/migration/1585772678853-ap-url.js
+++ b/packages/backend/migration/1585772678853-ap-url.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class apUrl1585772678853 {
+
+
+export class apUrl1585772678853 {
constructor() {
this.name = 'apUrl1585772678853';
}
@@ -11,4 +11,3 @@ class apUrl1585772678853 {
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "url"`, undefined);
}
}
-exports.apUrl1585772678853 = apUrl1585772678853;
diff --git a/packages/backend/migration/1586624197029-AddObjectStorageUseProxy.js b/packages/backend/migration/1586624197029-AddObjectStorageUseProxy.js
index 9fcef0c90d..e13bb217e3 100644
--- a/packages/backend/migration/1586624197029-AddObjectStorageUseProxy.js
+++ b/packages/backend/migration/1586624197029-AddObjectStorageUseProxy.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class AddObjectStorageUseProxy1586624197029 {
+
+
+export class AddObjectStorageUseProxy1586624197029 {
constructor() {
this.name = 'AddObjectStorageUseProxy1586624197029';
}
@@ -11,4 +11,3 @@ class AddObjectStorageUseProxy1586624197029 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageUseProxy"`, undefined);
}
}
-exports.AddObjectStorageUseProxy1586624197029 = AddObjectStorageUseProxy1586624197029;
diff --git a/packages/backend/migration/1586641139527-remote-reaction.js b/packages/backend/migration/1586641139527-remote-reaction.js
index a9d362474b..5b23103a17 100644
--- a/packages/backend/migration/1586641139527-remote-reaction.js
+++ b/packages/backend/migration/1586641139527-remote-reaction.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class remoteReaction1586641139527 {
+
+
+export class remoteReaction1586641139527 {
constructor() {
this.name = 'remoteReaction1586641139527';
}
@@ -11,4 +11,3 @@ class remoteReaction1586641139527 {
await queryRunner.query(`ALTER TABLE "note_reaction" ALTER COLUMN "reaction" TYPE character varying(130)`, undefined);
}
}
-exports.remoteReaction1586641139527 = remoteReaction1586641139527;
diff --git a/packages/backend/migration/1586708940386-pageAiScript.js b/packages/backend/migration/1586708940386-pageAiScript.js
index 089ff6e27a..eed616c111 100644
--- a/packages/backend/migration/1586708940386-pageAiScript.js
+++ b/packages/backend/migration/1586708940386-pageAiScript.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class pageAiScript1586708940386 {
+
+
+export class pageAiScript1586708940386 {
constructor() {
this.name = 'pageAiScript1586708940386';
}
@@ -11,4 +11,3 @@ class pageAiScript1586708940386 {
await queryRunner.query(`ALTER TABLE "page" DROP COLUMN "script"`, undefined);
}
}
-exports.pageAiScript1586708940386 = pageAiScript1586708940386;
diff --git a/packages/backend/migration/1588044505511-hCaptcha.js b/packages/backend/migration/1588044505511-hCaptcha.js
index 9b2524afba..a33dbd7133 100644
--- a/packages/backend/migration/1588044505511-hCaptcha.js
+++ b/packages/backend/migration/1588044505511-hCaptcha.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class hCaptcha1588044505511 {
+
+
+export class hCaptcha1588044505511 {
constructor() {
this.name = 'hCaptcha1588044505511';
}
@@ -15,4 +15,3 @@ class hCaptcha1588044505511 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableHcaptcha"`, undefined);
}
}
-exports.hCaptcha1588044505511 = hCaptcha1588044505511;
diff --git a/packages/backend/migration/1589023282116-pubRelay.js b/packages/backend/migration/1589023282116-pubRelay.js
index f03384a51a..48a1028d39 100644
--- a/packages/backend/migration/1589023282116-pubRelay.js
+++ b/packages/backend/migration/1589023282116-pubRelay.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class pubRelay1589023282116 {
+
+
+export class pubRelay1589023282116 {
constructor() {
this.name = 'pubRelay1589023282116';
}
@@ -15,4 +15,3 @@ class pubRelay1589023282116 {
await queryRunner.query(`DROP TYPE "relay_status_enum"`, undefined);
}
}
-exports.pubRelay1589023282116 = pubRelay1589023282116;
diff --git a/packages/backend/migration/1595075960584-blurhash.js b/packages/backend/migration/1595075960584-blurhash.js
index 3bd9c46f13..f24d3722cf 100644
--- a/packages/backend/migration/1595075960584-blurhash.js
+++ b/packages/backend/migration/1595075960584-blurhash.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class blurhash1595075960584 {
+
+
+export class blurhash1595075960584 {
constructor() {
this.name = 'blurhash1595075960584';
}
@@ -11,4 +11,3 @@ class blurhash1595075960584 {
await queryRunner.query(`ALTER TABLE "drive_file" DROP COLUMN "blurhash"`);
}
}
-exports.blurhash1595075960584 = blurhash1595075960584;
diff --git a/packages/backend/migration/1595077605646-blurhash-for-avatar-banner.js b/packages/backend/migration/1595077605646-blurhash-for-avatar-banner.js
index c2a9c97561..f18f6f972a 100644
--- a/packages/backend/migration/1595077605646-blurhash-for-avatar-banner.js
+++ b/packages/backend/migration/1595077605646-blurhash-for-avatar-banner.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class blurhashForAvatarBanner1595077605646 {
+
+
+export class blurhashForAvatarBanner1595077605646 {
constructor() {
this.name = 'blurhashForAvatarBanner1595077605646';
}
@@ -17,4 +17,3 @@ class blurhashForAvatarBanner1595077605646 {
await queryRunner.query(`ALTER TABLE "user" ADD "avatarColor" character varying(32)`);
}
}
-exports.blurhashForAvatarBanner1595077605646 = blurhashForAvatarBanner1595077605646;
diff --git a/packages/backend/migration/1595676934834-instance-icon-url.js b/packages/backend/migration/1595676934834-instance-icon-url.js
index 21ae26c55d..df9d8199bd 100644
--- a/packages/backend/migration/1595676934834-instance-icon-url.js
+++ b/packages/backend/migration/1595676934834-instance-icon-url.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instanceIconUrl1595676934834 {
+
+
+export class instanceIconUrl1595676934834 {
constructor() {
this.name = 'instanceIconUrl1595676934834';
}
@@ -11,4 +11,3 @@ class instanceIconUrl1595676934834 {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "iconUrl"`);
}
}
-exports.instanceIconUrl1595676934834 = instanceIconUrl1595676934834;
diff --git a/packages/backend/migration/1595771249699-word-mute.js b/packages/backend/migration/1595771249699-word-mute.js
index 0dd3a55565..e8e4ac838b 100644
--- a/packages/backend/migration/1595771249699-word-mute.js
+++ b/packages/backend/migration/1595771249699-word-mute.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class wordMute1595771249699 {
+
+
+export class wordMute1595771249699 {
constructor() {
this.name = 'wordMute1595771249699';
}
@@ -27,4 +27,3 @@ class wordMute1595771249699 {
await queryRunner.query(`DROP TABLE "muted_note"`);
}
}
-exports.wordMute1595771249699 = wordMute1595771249699;
diff --git a/packages/backend/migration/1595782306083-word-mute2.js b/packages/backend/migration/1595782306083-word-mute2.js
index 29c707e952..ab1e40a041 100644
--- a/packages/backend/migration/1595782306083-word-mute2.js
+++ b/packages/backend/migration/1595782306083-word-mute2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class wordMute21595782306083 {
+
+
+export class wordMute21595782306083 {
constructor() {
this.name = 'wordMute21595782306083';
}
@@ -15,4 +15,3 @@ class wordMute21595782306083 {
await queryRunner.query(`DROP TYPE "muted_note_reason_enum"`);
}
}
-exports.wordMute21595782306083 = wordMute21595782306083;
diff --git a/packages/backend/migration/1596548170836-channel.js b/packages/backend/migration/1596548170836-channel.js
index bce812d5e3..242db7d45a 100644
--- a/packages/backend/migration/1596548170836-channel.js
+++ b/packages/backend/migration/1596548170836-channel.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class channel1596548170836 {
+
+
+export class channel1596548170836 {
constructor() {
this.name = 'channel1596548170836';
}
@@ -55,4 +55,3 @@ class channel1596548170836 {
await queryRunner.query(`DROP TABLE "channel"`);
}
}
-exports.channel1596548170836 = channel1596548170836;
diff --git a/packages/backend/migration/1596786425167-channel2.js b/packages/backend/migration/1596786425167-channel2.js
index 160c73b06c..4b17048fef 100644
--- a/packages/backend/migration/1596786425167-channel2.js
+++ b/packages/backend/migration/1596786425167-channel2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class channel21596786425167 {
+
+
+export class channel21596786425167 {
constructor() {
this.name = 'channel21596786425167';
}
@@ -11,4 +11,3 @@ class channel21596786425167 {
await queryRunner.query(`ALTER TABLE "channel_following" DROP COLUMN "readCursor"`);
}
}
-exports.channel21596786425167 = channel21596786425167;
diff --git a/packages/backend/migration/1597230137744-objectStorageSetPublicRead.js b/packages/backend/migration/1597230137744-objectStorageSetPublicRead.js
index d208c425ec..07283e31df 100644
--- a/packages/backend/migration/1597230137744-objectStorageSetPublicRead.js
+++ b/packages/backend/migration/1597230137744-objectStorageSetPublicRead.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class objectStorageSetPublicRead1597230137744 {
+
+
+export class objectStorageSetPublicRead1597230137744 {
constructor() {
this.name = 'objectStorageSetPublicRead1597230137744';
}
@@ -11,4 +11,3 @@ class objectStorageSetPublicRead1597230137744 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageSetPublicRead"`);
}
}
-exports.objectStorageSetPublicRead1597230137744 = objectStorageSetPublicRead1597230137744;
diff --git a/packages/backend/migration/1597236229720-IncludingNotificationTypes.js b/packages/backend/migration/1597236229720-IncludingNotificationTypes.js
index 0efbf2fe5a..f498fa7d9a 100644
--- a/packages/backend/migration/1597236229720-IncludingNotificationTypes.js
+++ b/packages/backend/migration/1597236229720-IncludingNotificationTypes.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class IncludingNotificationTypes1597236229720 {
+
+
+export class IncludingNotificationTypes1597236229720 {
constructor() {
this.name = 'IncludingNotificationTypes1597236229720';
}
@@ -13,4 +13,3 @@ class IncludingNotificationTypes1597236229720 {
await queryRunner.query(`DROP TYPE "user_profile_includingnotificationtypes_enum"`);
}
}
-exports.IncludingNotificationTypes1597236229720 = IncludingNotificationTypes1597236229720;
diff --git a/packages/backend/migration/1597385880794-add-sensitive-index.js b/packages/backend/migration/1597385880794-add-sensitive-index.js
index 69fd394b03..8c5c040ba0 100644
--- a/packages/backend/migration/1597385880794-add-sensitive-index.js
+++ b/packages/backend/migration/1597385880794-add-sensitive-index.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class addSensitiveIndex1597385880794 {
+
+
+export class addSensitiveIndex1597385880794 {
constructor() {
this.name = 'addSensitiveIndex1597385880794';
}
@@ -11,4 +11,3 @@ class addSensitiveIndex1597385880794 {
await queryRunner.query(`DROP INDEX "IDX_a7eba67f8b3fa27271e85d2e26"`);
}
}
-exports.addSensitiveIndex1597385880794 = addSensitiveIndex1597385880794;
diff --git a/packages/backend/migration/1597459042300-channel-unread.js b/packages/backend/migration/1597459042300-channel-unread.js
index 629aa6009d..3157ab7793 100644
--- a/packages/backend/migration/1597459042300-channel-unread.js
+++ b/packages/backend/migration/1597459042300-channel-unread.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class channelUnread1597459042300 {
+
+
+export class channelUnread1597459042300 {
constructor() {
this.name = 'channelUnread1597459042300';
}
@@ -24,4 +24,3 @@ class channelUnread1597459042300 {
await queryRunner.query(`ALTER TABLE "channel_following" ADD "readCursor" TIMESTAMP WITH TIME ZONE NOT NULL`);
}
}
-exports.channelUnread1597459042300 = channelUnread1597459042300;
diff --git a/packages/backend/migration/1597893996136-ChannelNoteIdDescIndex.js b/packages/backend/migration/1597893996136-ChannelNoteIdDescIndex.js
index 770ac1887e..2bd8aee358 100644
--- a/packages/backend/migration/1597893996136-ChannelNoteIdDescIndex.js
+++ b/packages/backend/migration/1597893996136-ChannelNoteIdDescIndex.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ChannelNoteIdDescIndex1597893996136 {
+
+
+export class ChannelNoteIdDescIndex1597893996136 {
constructor() {
this.name = 'ChannelNoteIdDescIndex1597893996136';
}
@@ -13,4 +13,3 @@ class ChannelNoteIdDescIndex1597893996136 {
await queryRunner.query(`CREATE INDEX "IDX_f22169eb10657bded6d875ac8f" ON "note" ("channelId") `);
}
}
-exports.ChannelNoteIdDescIndex1597893996136 = ChannelNoteIdDescIndex1597893996136;
diff --git a/packages/backend/migration/1600353287890-mutingNotificationTypes.js b/packages/backend/migration/1600353287890-mutingNotificationTypes.js
index d39a6f2e44..ed3eb7d146 100644
--- a/packages/backend/migration/1600353287890-mutingNotificationTypes.js
+++ b/packages/backend/migration/1600353287890-mutingNotificationTypes.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class mutingNotificationTypes1600353287890 {
+
+
+export class mutingNotificationTypes1600353287890 {
constructor() {
this.name = 'mutingNotificationTypes1600353287890';
}
@@ -17,4 +17,3 @@ class mutingNotificationTypes1600353287890 {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "includingNotificationTypes" "user_profile_includingnotificationtypes_enum" array`);
}
}
-exports.mutingNotificationTypes1600353287890 = mutingNotificationTypes1600353287890;
diff --git a/packages/backend/migration/1603094348345-refine-abuse-user-report.js b/packages/backend/migration/1603094348345-refine-abuse-user-report.js
index b01a5d80aa..4918032a2b 100644
--- a/packages/backend/migration/1603094348345-refine-abuse-user-report.js
+++ b/packages/backend/migration/1603094348345-refine-abuse-user-report.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class refineAbuseUserReport1603094348345 {
+
+
+export class refineAbuseUserReport1603094348345 {
constructor() {
this.name = 'refineAbuseUserReport1603094348345';
}
@@ -29,4 +29,3 @@ class refineAbuseUserReport1603094348345 {
await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
}
-exports.refineAbuseUserReport1603094348345 = refineAbuseUserReport1603094348345;
diff --git a/packages/backend/migration/1603095701770-refine-abuse-user-report2.js b/packages/backend/migration/1603095701770-refine-abuse-user-report2.js
index 32b4e0bd21..64e92672f2 100644
--- a/packages/backend/migration/1603095701770-refine-abuse-user-report2.js
+++ b/packages/backend/migration/1603095701770-refine-abuse-user-report2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class refineAbuseUserReport21603095701770 {
+
+
+export class refineAbuseUserReport21603095701770 {
constructor() {
this.name = 'refineAbuseUserReport21603095701770';
}
@@ -17,4 +17,3 @@ class refineAbuseUserReport21603095701770 {
await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "targetUserHost"`);
}
}
-exports.refineAbuseUserReport21603095701770 = refineAbuseUserReport21603095701770;
diff --git a/packages/backend/migration/1603776877564-instance-theme-color.js b/packages/backend/migration/1603776877564-instance-theme-color.js
index 315305f531..92440d3f64 100644
--- a/packages/backend/migration/1603776877564-instance-theme-color.js
+++ b/packages/backend/migration/1603776877564-instance-theme-color.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instanceThemeColor1603776877564 {
+
+
+export class instanceThemeColor1603776877564 {
constructor() {
this.name = 'instanceThemeColor1603776877564';
}
@@ -11,4 +11,3 @@ class instanceThemeColor1603776877564 {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "themeColor"`);
}
}
-exports.instanceThemeColor1603776877564 = instanceThemeColor1603776877564;
diff --git a/packages/backend/migration/1603781553011-instance-favicon.js b/packages/backend/migration/1603781553011-instance-favicon.js
index 451989f91d..f607c49ffb 100644
--- a/packages/backend/migration/1603781553011-instance-favicon.js
+++ b/packages/backend/migration/1603781553011-instance-favicon.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instanceFavicon1603781553011 {
+
+
+export class instanceFavicon1603781553011 {
constructor() {
this.name = 'instanceFavicon1603781553011';
}
@@ -11,4 +11,3 @@ class instanceFavicon1603781553011 {
await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "faviconUrl"`);
}
}
-exports.instanceFavicon1603781553011 = instanceFavicon1603781553011;
diff --git a/packages/backend/migration/1604821689616-delete-auto-watch.js b/packages/backend/migration/1604821689616-delete-auto-watch.js
index 9d972dd3f5..4706e8bae9 100644
--- a/packages/backend/migration/1604821689616-delete-auto-watch.js
+++ b/packages/backend/migration/1604821689616-delete-auto-watch.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class deleteAutoWatch1604821689616 {
+
+
+export class deleteAutoWatch1604821689616 {
constructor() {
this.name = 'deleteAutoWatch1604821689616';
}
@@ -11,4 +11,3 @@ class deleteAutoWatch1604821689616 {
await queryRunner.query(`ALTER TABLE "user_profile" ADD "autoWatch" boolean NOT NULL DEFAULT false`);
}
}
-exports.deleteAutoWatch1604821689616 = deleteAutoWatch1604821689616;
diff --git a/packages/backend/migration/1605408848373-clip-description.js b/packages/backend/migration/1605408848373-clip-description.js
index acbe2b0c8d..edd5505b30 100644
--- a/packages/backend/migration/1605408848373-clip-description.js
+++ b/packages/backend/migration/1605408848373-clip-description.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class clipDescription1605408848373 {
+
+
+export class clipDescription1605408848373 {
constructor() {
this.name = 'clipDescription1605408848373';
}
@@ -11,4 +11,3 @@ class clipDescription1605408848373 {
await queryRunner.query(`ALTER TABLE "clip" DROP COLUMN "description"`);
}
}
-exports.clipDescription1605408848373 = clipDescription1605408848373;
diff --git a/packages/backend/migration/1605408971051-comments.js b/packages/backend/migration/1605408971051-comments.js
index 6e5dacbb64..400efd5e70 100644
--- a/packages/backend/migration/1605408971051-comments.js
+++ b/packages/backend/migration/1605408971051-comments.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class comments1605408971051 {
+
+
+export class comments1605408971051 {
constructor() {
this.name = 'comments1605408971051';
}
@@ -431,4 +431,3 @@ class comments1605408971051 {
await queryRunner.query(`COMMENT ON COLUMN "log"."createdAt" IS NULL`);
}
}
-exports.comments1605408971051 = comments1605408971051;
diff --git a/packages/backend/migration/1605585339718-instance-pinned-pages.js b/packages/backend/migration/1605585339718-instance-pinned-pages.js
index 8d23572762..56ccd44c8e 100644
--- a/packages/backend/migration/1605585339718-instance-pinned-pages.js
+++ b/packages/backend/migration/1605585339718-instance-pinned-pages.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instancePinnedPages1605585339718 {
+
+
+export class instancePinnedPages1605585339718 {
constructor() {
this.name = 'instancePinnedPages1605585339718';
}
@@ -11,4 +11,3 @@ class instancePinnedPages1605585339718 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedPages"`);
}
}
-exports.instancePinnedPages1605585339718 = instancePinnedPages1605585339718;
diff --git a/packages/backend/migration/1605965516823-instance-images.js b/packages/backend/migration/1605965516823-instance-images.js
index f078428bad..710c75981d 100644
--- a/packages/backend/migration/1605965516823-instance-images.js
+++ b/packages/backend/migration/1605965516823-instance-images.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instanceImages1605965516823 {
+
+
+export class instanceImages1605965516823 {
constructor() {
this.name = 'instanceImages1605965516823';
}
@@ -13,4 +13,3 @@ class instanceImages1605965516823 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "backgroundImageUrl"`);
}
}
-exports.instanceImages1605965516823 = instanceImages1605965516823;
diff --git a/packages/backend/migration/1606191203881-no-crawle.js b/packages/backend/migration/1606191203881-no-crawle.js
index 2c5fdaed21..b9ada4354e 100644
--- a/packages/backend/migration/1606191203881-no-crawle.js
+++ b/packages/backend/migration/1606191203881-no-crawle.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class noCrawle1606191203881 {
+
+
+export class noCrawle1606191203881 {
constructor() {
this.name = 'noCrawle1606191203881';
}
@@ -13,4 +13,3 @@ class noCrawle1606191203881 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "noCrawle"`);
}
}
-exports.noCrawle1606191203881 = noCrawle1606191203881;
diff --git a/packages/backend/migration/1607151207216-instance-pinned-clip.js b/packages/backend/migration/1607151207216-instance-pinned-clip.js
index 3bd4792964..9a4195e74c 100644
--- a/packages/backend/migration/1607151207216-instance-pinned-clip.js
+++ b/packages/backend/migration/1607151207216-instance-pinned-clip.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class instancePinnedClip1607151207216 {
+
+
+export class instancePinnedClip1607151207216 {
constructor() {
this.name = 'instancePinnedClip1607151207216';
}
@@ -11,4 +11,3 @@ class instancePinnedClip1607151207216 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedClipId"`);
}
}
-exports.instancePinnedClip1607151207216 = instancePinnedClip1607151207216;
diff --git a/packages/backend/migration/1607353487793-isExplorable.js b/packages/backend/migration/1607353487793-isExplorable.js
index 3ddd0cb32f..d9f1ff4c69 100644
--- a/packages/backend/migration/1607353487793-isExplorable.js
+++ b/packages/backend/migration/1607353487793-isExplorable.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class isExplorable1607353487793 {
+
+
+export class isExplorable1607353487793 {
constructor() {
this.name = 'isExplorable1607353487793';
}
@@ -15,4 +15,3 @@ class isExplorable1607353487793 {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isExplorable"`);
}
}
-exports.isExplorable1607353487793 = isExplorable1607353487793;
diff --git a/packages/backend/migration/1610277136869-registry.js b/packages/backend/migration/1610277136869-registry.js
index a7b5af84b6..184c062ddb 100644
--- a/packages/backend/migration/1610277136869-registry.js
+++ b/packages/backend/migration/1610277136869-registry.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class registry1610277136869 {
+
+
+export class registry1610277136869 {
constructor() {
this.name = 'registry1610277136869';
}
@@ -19,4 +19,3 @@ class registry1610277136869 {
await queryRunner.query(`DROP TABLE "registry_item"`);
}
}
-exports.registry1610277136869 = registry1610277136869;
diff --git a/packages/backend/migration/1610277585759-registry2.js b/packages/backend/migration/1610277585759-registry2.js
index aa1417e186..591bafae31 100644
--- a/packages/backend/migration/1610277585759-registry2.js
+++ b/packages/backend/migration/1610277585759-registry2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class registry21610277585759 {
+
+
+export class registry21610277585759 {
constructor() {
this.name = 'registry21610277585759';
}
@@ -13,4 +13,3 @@ class registry21610277585759 {
await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "value"`);
}
}
-exports.registry21610277585759 = registry21610277585759;
diff --git a/packages/backend/migration/1610283021566-registry3.js b/packages/backend/migration/1610283021566-registry3.js
index 7089cee1f2..e0289f17ee 100644
--- a/packages/backend/migration/1610283021566-registry3.js
+++ b/packages/backend/migration/1610283021566-registry3.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class registry31610283021566 {
+
+
+export class registry31610283021566 {
constructor() {
this.name = 'registry31610283021566';
}
@@ -11,4 +11,3 @@ class registry31610283021566 {
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "value" SET NOT NULL`);
}
}
-exports.registry31610283021566 = registry31610283021566;
diff --git a/packages/backend/migration/1611354329133-followersUri.js b/packages/backend/migration/1611354329133-followersUri.js
index e944da73ab..669ddb480e 100644
--- a/packages/backend/migration/1611354329133-followersUri.js
+++ b/packages/backend/migration/1611354329133-followersUri.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class followersUri1611354329133 {
+
+
+export class followersUri1611354329133 {
constructor() {
this.name = 'followersUri1611354329133';
}
@@ -13,4 +13,3 @@ class followersUri1611354329133 {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "followersUri"`);
}
}
-exports.followersUri1611354329133 = followersUri1611354329133;
diff --git a/packages/backend/migration/1611397665007-gallery.js b/packages/backend/migration/1611397665007-gallery.js
index 9cf73cbcf3..f49b2df468 100644
--- a/packages/backend/migration/1611397665007-gallery.js
+++ b/packages/backend/migration/1611397665007-gallery.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class gallery1611397665007 {
+
+
+export class gallery1611397665007 {
constructor() {
this.name = 'gallery1611397665007';
}
@@ -37,4 +37,3 @@ class gallery1611397665007 {
await queryRunner.query(`DROP TABLE "gallery_post"`);
}
}
-exports.gallery1611397665007 = gallery1611397665007;
diff --git a/packages/backend/migration/1611547387175-objectStorageS3ForcePathStyle.js b/packages/backend/migration/1611547387175-objectStorageS3ForcePathStyle.js
index 50a6189948..e4d3c0e8ec 100644
--- a/packages/backend/migration/1611547387175-objectStorageS3ForcePathStyle.js
+++ b/packages/backend/migration/1611547387175-objectStorageS3ForcePathStyle.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class objectStorageS3ForcePathStyle1611547387175 {
+
+
+export class objectStorageS3ForcePathStyle1611547387175 {
constructor() {
this.name = 'objectStorageS3ForcePathStyle1611547387175';
}
@@ -11,4 +11,3 @@ class objectStorageS3ForcePathStyle1611547387175 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "objectStorageS3ForcePathStyle"`);
}
}
-exports.objectStorageS3ForcePathStyle1611547387175 = objectStorageS3ForcePathStyle1611547387175;
diff --git a/packages/backend/migration/1612619156584-announcement-email.js b/packages/backend/migration/1612619156584-announcement-email.js
index bbd04679bb..bcc718d1c2 100644
--- a/packages/backend/migration/1612619156584-announcement-email.js
+++ b/packages/backend/migration/1612619156584-announcement-email.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class announcementEmail1612619156584 {
+
+
+export class announcementEmail1612619156584 {
constructor() {
this.name = 'announcementEmail1612619156584';
}
@@ -11,4 +11,3 @@ class announcementEmail1612619156584 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "receiveAnnouncementEmail"`);
}
}
-exports.announcementEmail1612619156584 = announcementEmail1612619156584;
diff --git a/packages/backend/migration/1613155914446-emailNotificationTypes.js b/packages/backend/migration/1613155914446-emailNotificationTypes.js
index 30fa4924b5..cd49924d2d 100644
--- a/packages/backend/migration/1613155914446-emailNotificationTypes.js
+++ b/packages/backend/migration/1613155914446-emailNotificationTypes.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class emailNotificationTypes1613155914446 {
+
+
+export class emailNotificationTypes1613155914446 {
constructor() {
this.name = 'emailNotificationTypes1613155914446';
}
@@ -11,4 +11,3 @@ class emailNotificationTypes1613155914446 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "emailNotificationTypes"`);
}
}
-exports.emailNotificationTypes1613155914446 = emailNotificationTypes1613155914446;
diff --git a/packages/backend/migration/1613181457597-user-lang.js b/packages/backend/migration/1613181457597-user-lang.js
index f6be7cdab9..d2cd06848e 100644
--- a/packages/backend/migration/1613181457597-user-lang.js
+++ b/packages/backend/migration/1613181457597-user-lang.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userLang1613181457597 {
+
+
+export class userLang1613181457597 {
constructor() {
this.name = 'userLang1613181457597';
}
@@ -11,4 +11,3 @@ class userLang1613181457597 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "lang"`);
}
}
-exports.userLang1613181457597 = userLang1613181457597;
diff --git a/packages/backend/migration/1613503367223-use-bigint-for-driveUsage.js b/packages/backend/migration/1613503367223-use-bigint-for-driveUsage.js
index 91956ad786..f2e2c5d357 100644
--- a/packages/backend/migration/1613503367223-use-bigint-for-driveUsage.js
+++ b/packages/backend/migration/1613503367223-use-bigint-for-driveUsage.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class useBigintForDriveUsage1613503367223 {
+
+
+export class useBigintForDriveUsage1613503367223 {
constructor() {
this.name = 'useBigintForDriveUsage1613503367223';
}
@@ -12,4 +12,3 @@ class useBigintForDriveUsage1613503367223 {
await queryRunner.query(`ALTER TABLE "instance" ADD "driveUsage" integer NOT NULL DEFAULT 0`);
}
}
-exports.useBigintForDriveUsage1613503367223 = useBigintForDriveUsage1613503367223;
diff --git a/packages/backend/migration/1615965918224-chart-v2.js b/packages/backend/migration/1615965918224-chart-v2.js
index 95f44879b9..86fa5b0c00 100644
--- a/packages/backend/migration/1615965918224-chart-v2.js
+++ b/packages/backend/migration/1615965918224-chart-v2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class chartV21615965918224 {
+
+
+export class chartV21615965918224 {
constructor() {
this.name = 'chartV21615965918224';
}
@@ -214,4 +214,3 @@ class chartV21615965918224 {
await queryRunner.query(`CREATE INDEX "IDX_15e91a03aeeac9dbccdf43fc06" ON "__chart__active_users" ("span") `);
}
}
-exports.chartV21615965918224 = chartV21615965918224;
diff --git a/packages/backend/migration/1615966519402-chart-v2-2.js b/packages/backend/migration/1615966519402-chart-v2-2.js
index 85a83df1a2..c62f1b875c 100644
--- a/packages/backend/migration/1615966519402-chart-v2-2.js
+++ b/packages/backend/migration/1615966519402-chart-v2-2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class chartV221615966519402 {
+
+
+export class chartV221615966519402 {
constructor() {
this.name = 'chartV221615966519402';
}
@@ -19,4 +19,3 @@ class chartV221615966519402 {
await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`);
}
}
-exports.chartV221615966519402 = chartV221615966519402;
diff --git a/packages/backend/migration/1618637372000-user-last-active-date.js b/packages/backend/migration/1618637372000-user-last-active-date.js
index 03fc011e4d..6c77ace467 100644
--- a/packages/backend/migration/1618637372000-user-last-active-date.js
+++ b/packages/backend/migration/1618637372000-user-last-active-date.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userLastActiveDate1618637372000 {
+
+
+export class userLastActiveDate1618637372000 {
constructor() {
this.name = 'userLastActiveDate1618637372000';
}
@@ -13,4 +13,3 @@ class userLastActiveDate1618637372000 {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "lastActiveDate"`);
}
}
-exports.userLastActiveDate1618637372000 = userLastActiveDate1618637372000;
diff --git a/packages/backend/migration/1618639857000-user-hide-online-status.js b/packages/backend/migration/1618639857000-user-hide-online-status.js
index 0b1e341005..e63c8ae11f 100644
--- a/packages/backend/migration/1618639857000-user-hide-online-status.js
+++ b/packages/backend/migration/1618639857000-user-hide-online-status.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userHideOnlineStatus1618639857000 {
+
+
+export class userHideOnlineStatus1618639857000 {
constructor() {
this.name = 'userHideOnlineStatus1618639857000';
}
@@ -11,4 +11,3 @@ class userHideOnlineStatus1618639857000 {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "hideOnlineStatus"`);
}
}
-exports.userHideOnlineStatus1618639857000 = userHideOnlineStatus1618639857000;
diff --git a/packages/backend/migration/1619942102890-password-reset.js b/packages/backend/migration/1619942102890-password-reset.js
index 9505be4b84..922d225dc9 100644
--- a/packages/backend/migration/1619942102890-password-reset.js
+++ b/packages/backend/migration/1619942102890-password-reset.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class passwordReset1619942102890 {
+
+
+export class passwordReset1619942102890 {
constructor() {
this.name = 'passwordReset1619942102890';
}
@@ -17,4 +17,3 @@ class passwordReset1619942102890 {
await queryRunner.query(`DROP TABLE "password_reset_request"`);
}
}
-exports.passwordReset1619942102890 = passwordReset1619942102890;
diff --git a/packages/backend/migration/1620019354680-ad.js b/packages/backend/migration/1620019354680-ad.js
index 655629bc3b..c96d2bfb33 100644
--- a/packages/backend/migration/1620019354680-ad.js
+++ b/packages/backend/migration/1620019354680-ad.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ad1620019354680 {
+
+
+export class ad1620019354680 {
constructor() {
this.name = 'ad1620019354680';
}
@@ -15,4 +15,3 @@ class ad1620019354680 {
await queryRunner.query(`DROP TABLE "ad"`);
}
}
-exports.ad1620019354680 = ad1620019354680;
diff --git a/packages/backend/migration/1620364649428-ad2.js b/packages/backend/migration/1620364649428-ad2.js
index 7f2213f6a6..db1c3e1de1 100644
--- a/packages/backend/migration/1620364649428-ad2.js
+++ b/packages/backend/migration/1620364649428-ad2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ad21620364649428 {
+
+
+export class ad21620364649428 {
constructor() {
this.name = 'ad21620364649428';
}
@@ -11,4 +11,3 @@ class ad21620364649428 {
await queryRunner.query(`ALTER TABLE "ad" DROP COLUMN "ratio"`);
}
}
-exports.ad21620364649428 = ad21620364649428;
diff --git a/packages/backend/migration/1621479946000-add-note-indexes.js b/packages/backend/migration/1621479946000-add-note-indexes.js
index 1bf9827f6f..dcf97fa4dc 100644
--- a/packages/backend/migration/1621479946000-add-note-indexes.js
+++ b/packages/backend/migration/1621479946000-add-note-indexes.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class addNoteIndexes1621479946000 {
+
+
+export class addNoteIndexes1621479946000 {
constructor() {
this.name = 'addNoteIndexes1621479946000';
}
@@ -13,4 +13,3 @@ class addNoteIndexes1621479946000 {
await queryRunner.query(`DROP INDEX "IDX_NOTE_VISIBLE_USER_IDS"`, undefined);
}
}
-exports.addNoteIndexes1621479946000 = addNoteIndexes1621479946000;
diff --git a/packages/backend/migration/1622679304522-user-profile-description-length.js b/packages/backend/migration/1622679304522-user-profile-description-length.js
index 237870d6c6..22f6c1c5d9 100644
--- a/packages/backend/migration/1622679304522-user-profile-description-length.js
+++ b/packages/backend/migration/1622679304522-user-profile-description-length.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userProfileDescriptionLength1622679304522 {
+
+
+export class userProfileDescriptionLength1622679304522 {
constructor() {
this.name = 'userProfileDescriptionLength1622679304522';
}
@@ -11,4 +11,3 @@ class userProfileDescriptionLength1622679304522 {
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "description" TYPE character varying(1024)`, undefined);
}
}
-exports.userProfileDescriptionLength1622679304522 = userProfileDescriptionLength1622679304522;
diff --git a/packages/backend/migration/1622681548499-log-message-length.js b/packages/backend/migration/1622681548499-log-message-length.js
index cb2ad288ba..ac16c0e1ba 100644
--- a/packages/backend/migration/1622681548499-log-message-length.js
+++ b/packages/backend/migration/1622681548499-log-message-length.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class logMessageLength1622681548499 {
+
+
+export class logMessageLength1622681548499 {
constructor() {
this.name = 'logMessageLength1622681548499';
}
@@ -11,4 +11,3 @@ class logMessageLength1622681548499 {
await queryRunner.query(`ALTER TABLE "log" ALTER COLUMN "message" TYPE character varying(1024)`, undefined);
}
}
-exports.logMessageLength1622681548499 = logMessageLength1622681548499;
diff --git a/packages/backend/migration/1626509500668-fix-remote-file-proxy.js b/packages/backend/migration/1626509500668-fix-remote-file-proxy.js
new file mode 100644
index 0000000000..30c562007b
--- /dev/null
+++ b/packages/backend/migration/1626509500668-fix-remote-file-proxy.js
@@ -0,0 +1,22 @@
+
+
+export class fixRemoteFileProxy1626509500668 {
+ constructor() {
+ this.name = 'fixRemoteFileProxy1626509500668';
+ }
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "avatarUrl"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "bannerUrl"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "avatarBlurhash"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "bannerBlurhash"`);
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "proxyRemoteFiles"`);
+ }
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "proxyRemoteFiles" boolean NOT NULL DEFAULT false`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "bannerBlurhash" character varying(128)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "avatarBlurhash" character varying(128)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "bannerUrl" character varying(512)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "avatarUrl" character varying(512)`);
+ }
+}
+
diff --git a/packages/backend/migration/1629004542760-chart-reindex.js b/packages/backend/migration/1629004542760-chart-reindex.js
index 927ea312e0..a7d459276d 100644
--- a/packages/backend/migration/1629004542760-chart-reindex.js
+++ b/packages/backend/migration/1629004542760-chart-reindex.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class chartReindex1629004542760 {
+
+
+export class chartReindex1629004542760 {
constructor() {
this.name = 'chartReindex1629004542760';
}
@@ -179,4 +179,3 @@ class chartReindex1629004542760 {
await queryRunner.query(`CREATE INDEX "IDX_0ad37b7ef50f4ddc84363d7ccc" ON "__chart__active_users" ("date") `);
}
}
-exports.chartReindex1629004542760 = chartReindex1629004542760;
diff --git a/packages/backend/migration/1629024377804-deepl-integration.js b/packages/backend/migration/1629024377804-deepl-integration.js
index a2bd3b1885..19c49ffcde 100644
--- a/packages/backend/migration/1629024377804-deepl-integration.js
+++ b/packages/backend/migration/1629024377804-deepl-integration.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class deeplIntegration1629024377804 {
+
+
+export class deeplIntegration1629024377804 {
constructor() {
this.name = 'deeplIntegration1629024377804';
}
@@ -11,4 +11,3 @@ class deeplIntegration1629024377804 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplAuthKey"`);
}
}
-exports.deeplIntegration1629024377804 = deeplIntegration1629024377804;
diff --git a/packages/backend/migration/1629288472000-fix-channel-userId.js b/packages/backend/migration/1629288472000-fix-channel-userId.js
index d0e8baa06c..02a1199b09 100644
--- a/packages/backend/migration/1629288472000-fix-channel-userId.js
+++ b/packages/backend/migration/1629288472000-fix-channel-userId.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class fixChannelUserId1629288472000 {
+
+
+export class fixChannelUserId1629288472000 {
constructor() {
this.name = 'fixChannelUserId1629288472000';
}
@@ -11,4 +11,3 @@ class fixChannelUserId1629288472000 {
await queryRunner.query(`ALTER TABLE "channel" ALTER COLUMN "userId" SET NOT NULL;`);
}
}
-exports.fixChannelUserId1629288472000 = fixChannelUserId1629288472000;
diff --git a/packages/backend/migration/1629512953000-user-is-deleted.js b/packages/backend/migration/1629512953000-user-is-deleted.js
index 0083907192..a7848d5690 100644
--- a/packages/backend/migration/1629512953000-user-is-deleted.js
+++ b/packages/backend/migration/1629512953000-user-is-deleted.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class isUserDeleted1629512953000 {
+
+
+export class isUserDeleted1629512953000 {
constructor() {
this.name = 'isUserDeleted1629512953000';
}
@@ -12,4 +12,3 @@ class isUserDeleted1629512953000 {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isDeleted"`);
}
}
-exports.isUserDeleted1629512953000 = isUserDeleted1629512953000;
diff --git a/packages/backend/migration/1629778475000-deepl-integration2.js b/packages/backend/migration/1629778475000-deepl-integration2.js
index 50365f4bb5..699f06c768 100644
--- a/packages/backend/migration/1629778475000-deepl-integration2.js
+++ b/packages/backend/migration/1629778475000-deepl-integration2.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class deeplIntegration21629778475000 {
+
+
+export class deeplIntegration21629778475000 {
constructor() {
this.name = 'deeplIntegration21629778475000';
}
@@ -11,4 +11,3 @@ class deeplIntegration21629778475000 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplIsPro"`);
}
}
-exports.deeplIntegration21629778475000 = deeplIntegration21629778475000;
diff --git a/packages/backend/migration/1629833361000-AddShowTLReplies.js b/packages/backend/migration/1629833361000-AddShowTLReplies.js
new file mode 100644
index 0000000000..5d4c938a7b
--- /dev/null
+++ b/packages/backend/migration/1629833361000-AddShowTLReplies.js
@@ -0,0 +1,14 @@
+
+
+export class addShowTLReplies1629833361000 {
+ constructor() {
+ this.name = 'addShowTLReplies1629833361000';
+ }
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "showTimelineReplies" boolean NOT NULL DEFAULT false`);
+ await queryRunner.query(`COMMENT ON COLUMN "user"."showTimelineReplies" IS 'Whether to show users replying to other users in the timeline.'`);
+ }
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "showTimelineReplies"`);
+ }
+}
diff --git a/packages/backend/migration/1629968054000_userInstanceBlocks.js b/packages/backend/migration/1629968054000_userInstanceBlocks.js
index 5703ff0b00..1f202d9f66 100644
--- a/packages/backend/migration/1629968054000_userInstanceBlocks.js
+++ b/packages/backend/migration/1629968054000_userInstanceBlocks.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userInstanceBlocks1629968054000 {
+
+
+export class userInstanceBlocks1629968054000 {
constructor() {
this.name = 'userInstanceBlocks1629968054000';
}
@@ -12,4 +12,3 @@ class userInstanceBlocks1629968054000 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "mutedInstances"`);
}
}
-exports.userInstanceBlocks1629968054000 = userInstanceBlocks1629968054000;
diff --git a/packages/backend/migration/1633068642000-email-required-for-signup.js b/packages/backend/migration/1633068642000-email-required-for-signup.js
index 9793cac00a..d592f3ca21 100644
--- a/packages/backend/migration/1633068642000-email-required-for-signup.js
+++ b/packages/backend/migration/1633068642000-email-required-for-signup.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class emailRequiredForSignup1633068642000 {
+
+
+export class emailRequiredForSignup1633068642000 {
constructor() {
this.name = 'emailRequiredForSignup1633068642000';
}
@@ -11,4 +11,3 @@ class emailRequiredForSignup1633068642000 {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "emailRequiredForSignup"`);
}
}
-exports.emailRequiredForSignup1633068642000 = emailRequiredForSignup1633068642000;
diff --git a/packages/backend/migration/1633071909016-user-pending.js b/packages/backend/migration/1633071909016-user-pending.js
index 92a5139944..17cf5c11be 100644
--- a/packages/backend/migration/1633071909016-user-pending.js
+++ b/packages/backend/migration/1633071909016-user-pending.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userPending1633071909016 {
+
+
+export class userPending1633071909016 {
constructor() {
this.name = 'userPending1633071909016';
}
@@ -13,4 +13,3 @@ class userPending1633071909016 {
await queryRunner.query(`DROP TABLE "user_pending"`);
}
}
-exports.userPending1633071909016 = userPending1633071909016;
diff --git a/packages/backend/migration/1634486652000-user-public-reactions.js b/packages/backend/migration/1634486652000-user-public-reactions.js
index 1447abe6a1..e741122491 100644
--- a/packages/backend/migration/1634486652000-user-public-reactions.js
+++ b/packages/backend/migration/1634486652000-user-public-reactions.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class userPublicReactions1634486652000 {
+
+
+export class userPublicReactions1634486652000 {
constructor() {
this.name = 'userPublicReactions1634486652000';
}
@@ -11,4 +11,3 @@ class userPublicReactions1634486652000 {
await queryRunner.query(`ALTER TABLE "user_profile" DROP COLUMN "publicReactions"`);
}
}
-exports.userPublicReactions1634486652000 = userPublicReactions1634486652000;
diff --git a/packages/backend/migration/1634902659689-delete-log.js b/packages/backend/migration/1634902659689-delete-log.js
index b2162519f6..555a0020c3 100644
--- a/packages/backend/migration/1634902659689-delete-log.js
+++ b/packages/backend/migration/1634902659689-delete-log.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class deleteLog1634902659689 {
+
+
+export class deleteLog1634902659689 {
constructor() {
this.name = 'deleteLog1634902659689';
}
@@ -10,4 +10,3 @@ class deleteLog1634902659689 {
async down(queryRunner) {
}
}
-exports.deleteLog1634902659689 = deleteLog1634902659689;
diff --git a/packages/backend/migration/1635500777168-note-thread-mute.js b/packages/backend/migration/1635500777168-note-thread-mute.js
index 1e01952748..a790cace33 100644
--- a/packages/backend/migration/1635500777168-note-thread-mute.js
+++ b/packages/backend/migration/1635500777168-note-thread-mute.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class noteThreadMute1635500777168 {
+
+
+export class noteThreadMute1635500777168 {
constructor() {
this.name = 'noteThreadMute1635500777168';
}
@@ -23,4 +23,3 @@ class noteThreadMute1635500777168 {
await queryRunner.query(`DROP TABLE "note_thread_muting"`);
}
}
-exports.noteThreadMute1635500777168 = noteThreadMute1635500777168;
diff --git a/packages/backend/migration/1636197624383-ff-visibility.js b/packages/backend/migration/1636197624383-ff-visibility.js
index 9e8d5a3dc8..89028f3c22 100644
--- a/packages/backend/migration/1636197624383-ff-visibility.js
+++ b/packages/backend/migration/1636197624383-ff-visibility.js
@@ -1,6 +1,6 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-class ffVisibility1636197624383 {
+
+
+export class ffVisibility1636197624383 {
constructor() {
this.name = 'ffVisibility1636197624383';
}
@@ -13,4 +13,3 @@ class ffVisibility1636197624383 {
await queryRunner.query(`DROP TYPE "public"."user_profile_ffvisibility_enum"`);
}
}
-exports.ffVisibility1636197624383 = ffVisibility1636197624383;
diff --git a/packages/backend/migration/1636697408073-remove-via-mobile.js b/packages/backend/migration/1636697408073-remove-via-mobile.js
index bb5157cf1d..36e96fd21e 100644
--- a/packages/backend/migration/1636697408073-remove-via-mobile.js
+++ b/packages/backend/migration/1636697408073-remove-via-mobile.js
@@ -1,6 +1,6 @@
-const { MigrationInterface, QueryRunner } = require("typeorm");
-module.exports = class removeViaMobile1636697408073 {
+
+export class removeViaMobile1636697408073 {
name = 'removeViaMobile1636697408073'
async up(queryRunner) {
diff --git a/packages/backend/migration/1637320813000-forwarded-report.js b/packages/backend/migration/1637320813000-forwarded-report.js
index 4056f7b5f4..1e39bd5c3f 100644
--- a/packages/backend/migration/1637320813000-forwarded-report.js
+++ b/packages/backend/migration/1637320813000-forwarded-report.js
@@ -1,6 +1,6 @@
-const { QueryRunner } = require('typeorm');
-module.exports = class forwardedReport1637320813000 {
+
+export class forwardedReport1637320813000 {
name = 'forwardedReport1637320813000';
async up(queryRunner) {
diff --git a/packages/backend/migration/1639325650583-chart-v3.js b/packages/backend/migration/1639325650583-chart-v3.js
index b9d8814c69..e2a4e920c9 100644
--- a/packages/backend/migration/1639325650583-chart-v3.js
+++ b/packages/backend/migration/1639325650583-chart-v3.js
@@ -1,6 +1,6 @@
-const { MigrationInterface, QueryRunner } = require("typeorm");
-module.exports = class chartV31639325650583 {
+
+export class chartV31639325650583 {
name = 'chartV31639325650583'
async up(queryRunner) {
diff --git a/packages/backend/migration/1642611822809-emoji-url.js b/packages/backend/migration/1642611822809-emoji-url.js
index f229c403f4..d38f8cc08c 100644
--- a/packages/backend/migration/1642611822809-emoji-url.js
+++ b/packages/backend/migration/1642611822809-emoji-url.js
@@ -1,6 +1,6 @@
-const { MigrationInterface, QueryRunner } = require("typeorm");
-module.exports = class emojiUrl1642611822809 {
+
+export class emojiUrl1642611822809 {
name = 'emojiUrl1642611822809'
async up(queryRunner) {
diff --git a/packages/backend/migration/1642613870898-drive-file-webpublic-type.js b/packages/backend/migration/1642613870898-drive-file-webpublic-type.js
index e10c2ac2d2..15434f7d0c 100644
--- a/packages/backend/migration/1642613870898-drive-file-webpublic-type.js
+++ b/packages/backend/migration/1642613870898-drive-file-webpublic-type.js
@@ -1,6 +1,6 @@
-const { MigrationInterface, QueryRunner } = require("typeorm");
-module.exports = class driveFileWebpublicType1642613870898 {
+
+export class driveFileWebpublicType1642613870898 {
name = 'driveFileWebpublicType1642613870898'
async up(queryRunner) {
diff --git a/packages/backend/migration/1643963705770-chart-v4.js b/packages/backend/migration/1643963705770-chart-v4.js
new file mode 100644
index 0000000000..8b320c2b41
--- /dev/null
+++ b/packages/backend/migration/1643963705770-chart-v4.js
@@ -0,0 +1,63 @@
+
+
+export class chartV41643963705770 {
+ name = 'chartV41643963705770'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___drive_totalUsage"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___drive_totalUsage"`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalCount"`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___local_totalSize"`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalCount"`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" DROP COLUMN "___remote_totalSize"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalCount"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___local_totalSize"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalCount"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" DROP COLUMN "___remote_totalSize"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" bigint NOT NULL DEFAULT 0`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" bigint NOT NULL DEFAULT 0`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___remote_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "___local_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___remote_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "___local_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" character varying array NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalSize" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___remote_totalCount" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalSize" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ADD "___local_totalCount" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalSize" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___remote_totalCount" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalSize" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ADD "___local_totalCount" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___drive_totalUsage" bigint NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___drive_totalUsage" bigint NOT NULL`);
+ }
+}
diff --git a/packages/backend/migration/1643966656277-chart-v5.js b/packages/backend/migration/1643966656277-chart-v5.js
new file mode 100644
index 0000000000..df84002f78
--- /dev/null
+++ b/packages/backend/migration/1643966656277-chart-v5.js
@@ -0,0 +1,27 @@
+
+
+export class chartV51643966656277 {
+ name = 'chartV51643966656277'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" DROP COLUMN "unique_temp___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" DROP COLUMN "unique_temp___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`);
+ }
+}
diff --git a/packages/backend/migration/1643967331284-chart-v6.js b/packages/backend/migration/1643967331284-chart-v6.js
new file mode 100644
index 0000000000..119198f4a5
--- /dev/null
+++ b/packages/backend/migration/1643967331284-chart-v6.js
@@ -0,0 +1,343 @@
+
+
+export class chartV61643967331284 {
+ name = 'chartV61643967331284'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" SET DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" SET DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" DROP DEFAULT`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" DROP DEFAULT`);
+ }
+}
diff --git a/packages/backend/migration/1644010796173-convert-hard-mutes.js b/packages/backend/migration/1644010796173-convert-hard-mutes.js
new file mode 100644
index 0000000000..207a759b8e
--- /dev/null
+++ b/packages/backend/migration/1644010796173-convert-hard-mutes.js
@@ -0,0 +1,65 @@
+import RE2 from 're2';
+
+
+export class convertHardMutes1644010796173 {
+ name = 'convertHardMutes1644010796173'
+
+ async up(queryRunner) {
+ let entries = await queryRunner.query(`SELECT "userId", "mutedWords" FROM "user_profile" WHERE "userHost" IS NULL`);
+ for(let i = 0; i < entries.length; i++) {
+ let words = entries[i].mutedWords
+ .map(line => {
+ if (typeof line === 'string') return [];
+ const regexp = line.join(" ").match(/^\/(.+)\/(.*)$/);
+ if (regexp) {
+ // convert regexp's
+ try {
+ new RE2(regexp[1], regexp[2]);
+ return `/${regexp[1]}/${regexp[2]}`;
+ } catch (err) {
+ // invalid regex, ignore it
+ return [];
+ }
+ } else {
+ // remove empty segments
+ return line.filter(x => x !== '');
+ }
+ })
+ // remove empty lines
+ .filter(x => !(Array.isArray(x) && x.length === 0));
+
+ await queryRunner.connection.createQueryBuilder()
+ .update('user_profile')
+ .set({
+ mutedWords: words
+ })
+ .where('userId = :id', { id: entries[i].userId })
+ .execute();
+ }
+ }
+
+ async down(queryRunner) {
+ let entries = await queryRunner.query(`SELECT "userId", "mutedWords" FROM "user_profile"`);
+ for(let i = 0; i < entries.length; i++) {
+ let words = entries[i].mutedWords
+ .map(line => {
+ if (Array.isArray(line)) {
+ return line;
+ } else {
+ // do not split regex at spaces again
+ return [line];
+ }
+ })
+ // remove empty lines
+ .filter(x => !(Array.isArray(x) && x.length === 0));
+
+ await queryRunner.connection.createQueryBuilder()
+ .update('user_profile')
+ .set({
+ mutedWords: words
+ })
+ .where('userId = :id', { id: entries[i].userId })
+ .execute();
+ }
+ }
+}
diff --git a/packages/backend/migration/1644058404077-chart-v7.js b/packages/backend/migration/1644058404077-chart-v7.js
new file mode 100644
index 0000000000..f05ad003db
--- /dev/null
+++ b/packages/backend/migration/1644058404077-chart-v7.js
@@ -0,0 +1,501 @@
+
+
+export class chartV71644058404077 {
+ name = 'chartV71644058404077'
+
+ async up(queryRunner) {
+ await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_total"=2147483647 WHERE "___instance_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_inc"=32767 WHERE "___instance_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__federation" SET "___instance_dec"=32767 WHERE "___instance_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_inc"=2147483647 WHERE "___local_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_dec"=2147483647 WHERE "___local_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_normal"=2147483647 WHERE "___local_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_reply"=2147483647 WHERE "___local_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___local_diffs_renote"=2147483647 WHERE "___local_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_inc"=2147483647 WHERE "___remote_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_dec"=2147483647 WHERE "___remote_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_normal"=2147483647 WHERE "___remote_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_reply"=2147483647 WHERE "___remote_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__notes" SET "___remote_diffs_renote"=2147483647 WHERE "___remote_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_total"=2147483647 WHERE "___local_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_inc"=32767 WHERE "___local_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___local_dec"=32767 WHERE "___local_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_total"=2147483647 WHERE "___remote_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_inc"=32767 WHERE "___remote_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__users" SET "___remote_dec"=32767 WHERE "___remote_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingRequests"=2147483647 WHERE "___incomingRequests" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingRequests"=2147483647 WHERE "___outgoingRequests" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__network" SET "___totalTime"=2147483647 WHERE "___totalTime" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__network" SET "___incomingBytes"=2147483647 WHERE "___incomingBytes" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__network" SET "___outgoingBytes"=2147483647 WHERE "___outgoingBytes" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_failed"=32767 WHERE "___requests_failed" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_succeeded"=32767 WHERE "___requests_succeeded" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___requests_received"=32767 WHERE "___requests_received" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_total"=2147483647 WHERE "___notes_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_inc"=2147483647 WHERE "___notes_inc" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_dec"=2147483647 WHERE "___notes_dec" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_normal"=2147483647 WHERE "___notes_diffs_normal" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_reply"=2147483647 WHERE "___notes_diffs_reply" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___notes_diffs_renote"=2147483647 WHERE "___notes_diffs_renote" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_total"=2147483647 WHERE "___users_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_inc"=32767 WHERE "___users_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___users_dec"=32767 WHERE "___users_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_total"=2147483647 WHERE "___following_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_inc"=32767 WHERE "___following_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___following_dec"=32767 WHERE "___following_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_total"=2147483647 WHERE "___followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_inc"=32767 WHERE "___followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___followers_dec"=32767 WHERE "___followers_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_totalFiles"=2147483647 WHERE "___drive_totalFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incFiles"=2147483647 WHERE "___drive_incFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decFiles"=2147483647 WHERE "___drive_decFiles" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_incUsage"=2147483647 WHERE "___drive_incUsage" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__instance" SET "___drive_decUsage"=2147483647 WHERE "___drive_decUsage" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___total"=2147483647 WHERE "___total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___inc"=32767 WHERE "___inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___dec"=32767 WHERE "___dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_normal"=32767 WHERE "___diffs_normal" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_reply"=32767 WHERE "___diffs_reply" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_notes" SET "___diffs_renote"=32767 WHERE "___diffs_renote" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incCount"=2147483647 WHERE "___local_incCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_incSize"=2147483647 WHERE "___local_incSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decCount"=2147483647 WHERE "___local_decCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___local_decSize"=2147483647 WHERE "___local_decSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incCount"=2147483647 WHERE "___remote_incCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_incSize"=2147483647 WHERE "___remote_incSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decCount"=2147483647 WHERE "___remote_decCount" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__drive" SET "___remote_decSize"=2147483647 WHERE "___remote_decSize" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___local_count"=32767 WHERE "___local_count" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_reaction" SET "___remote_count"=32767 WHERE "___remote_count" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_total"=2147483647 WHERE "___local_followings_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_inc"=32767 WHERE "___local_followings_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followings_dec"=32767 WHERE "___local_followings_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_total"=2147483647 WHERE "___local_followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_inc"=32767 WHERE "___local_followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___local_followers_dec"=32767 WHERE "___local_followers_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_total"=2147483647 WHERE "___remote_followings_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_inc"=32767 WHERE "___remote_followings_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followings_dec"=32767 WHERE "___remote_followings_dec" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_total"=2147483647 WHERE "___remote_followers_total" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_inc"=32767 WHERE "___remote_followers_inc" > 32767`);
+ await queryRunner.query(`UPDATE "__chart_day__per_user_following" SET "___remote_followers_dec"=32767 WHERE "___remote_followers_dec" > 32767`);
+ await queryRunner.query(`TRUNCATE TABLE "__chart__per_user_drive"`);
+ await queryRunner.query(`TRUNCATE TABLE "__chart_day__per_user_drive"`);
+
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE integer USING "___instance_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE smallint USING "___instance_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE smallint USING "___instance_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE integer USING "___local_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE integer USING "___local_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE integer USING "___local_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE integer USING "___local_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE integer USING "___local_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE integer USING "___remote_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE integer USING "___remote_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE integer USING "___remote_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE integer USING "___remote_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE integer USING "___remote_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE integer USING "___local_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE smallint USING "___local_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE smallint USING "___local_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE integer USING "___remote_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE smallint USING "___remote_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE smallint USING "___remote_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE integer USING "___incomingRequests"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE integer USING "___outgoingRequests"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE integer USING "___totalTime"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE integer USING "___incomingBytes"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE integer USING "___outgoingBytes"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE smallint USING "___requests_failed"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE smallint USING "___requests_succeeded"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE smallint USING "___requests_received"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE integer USING "___notes_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE integer USING "___notes_inc"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE integer USING "___notes_dec"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE integer USING "___notes_diffs_normal"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE integer USING "___notes_diffs_reply"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE integer USING "___notes_diffs_renote"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE integer USING "___users_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE smallint USING "___users_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE smallint USING "___users_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE integer USING "___following_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE smallint USING "___following_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE smallint USING "___following_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE integer USING "___followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE smallint USING "___followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE smallint USING "___followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE integer USING "___drive_totalFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE integer USING "___drive_incFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE integer USING "___drive_decFiles"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE integer USING "___drive_incUsage"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE integer USING "___drive_decUsage"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE integer USING "___total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE smallint USING "___inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE smallint USING "___dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE smallint USING "___diffs_normal"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE smallint USING "___diffs_reply"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE smallint USING "___diffs_renote"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE integer USING "___local_incCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE integer USING "___local_incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE integer USING "___local_decCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE integer USING "___local_decSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE integer USING "___remote_incCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE integer USING "___remote_incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE integer USING "___remote_decCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE integer USING "___remote_decSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE smallint USING "___local_count"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE smallint USING "___remote_count"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE integer USING "___local_followings_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE smallint USING "___local_followings_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE smallint USING "___local_followings_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE integer USING "___local_followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE smallint USING "___local_followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE smallint USING "___local_followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE integer USING "___remote_followings_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE smallint USING "___remote_followings_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE smallint USING "___remote_followings_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE integer USING "___remote_followers_total"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE smallint USING "___remote_followers_inc"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE smallint USING "___remote_followers_dec"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE integer USING "___totalCount"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE integer USING "___totalSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE smallint USING "___incCount"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE integer USING "___incSize"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE smallint USING "___decCount"::smallint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE integer USING "___decSize"::integer`);
+ }
+
+ async down(queryRunner) {
+
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_total" TYPE bigint USING "___instance_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_inc" TYPE bigint USING "___instance_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ALTER COLUMN "___instance_dec" TYPE bigint USING "___instance_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_normal" TYPE bigint USING "___local_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_reply" TYPE bigint USING "___local_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___local_diffs_renote" TYPE bigint USING "___local_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_normal" TYPE bigint USING "___remote_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_reply" TYPE bigint USING "___remote_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ALTER COLUMN "___remote_diffs_renote" TYPE bigint USING "___remote_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_total" TYPE bigint USING "___local_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_inc" TYPE bigint USING "___local_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___local_dec" TYPE bigint USING "___local_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_total" TYPE bigint USING "___remote_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_inc" TYPE bigint USING "___remote_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__users" ALTER COLUMN "___remote_dec" TYPE bigint USING "___remote_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingRequests" TYPE bigint USING "___incomingRequests"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingRequests" TYPE bigint USING "___outgoingRequests"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___totalTime" TYPE bigint USING "___totalTime"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___incomingBytes" TYPE bigint USING "___incomingBytes"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__network" ALTER COLUMN "___outgoingBytes" TYPE bigint USING "___outgoingBytes"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_failed" TYPE bigint USING "___requests_failed"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_succeeded" TYPE bigint USING "___requests_succeeded"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___requests_received" TYPE bigint USING "___requests_received"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_total" TYPE bigint USING "___notes_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_inc" TYPE bigint USING "___notes_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_dec" TYPE bigint USING "___notes_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_normal" TYPE bigint USING "___notes_diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_reply" TYPE bigint USING "___notes_diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___notes_diffs_renote" TYPE bigint USING "___notes_diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_total" TYPE bigint USING "___users_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_inc" TYPE bigint USING "___users_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___users_dec" TYPE bigint USING "___users_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_total" TYPE bigint USING "___following_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_inc" TYPE bigint USING "___following_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___following_dec" TYPE bigint USING "___following_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_total" TYPE bigint USING "___followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_inc" TYPE bigint USING "___followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___followers_dec" TYPE bigint USING "___followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_totalFiles" TYPE bigint USING "___drive_totalFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incFiles" TYPE bigint USING "___drive_incFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decFiles" TYPE bigint USING "___drive_decFiles"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_incUsage" TYPE bigint USING "___drive_incUsage"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ALTER COLUMN "___drive_decUsage" TYPE bigint USING "___drive_decUsage"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___total" TYPE bigint USING "___total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___inc" TYPE bigint USING "___inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___dec" TYPE bigint USING "___dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_normal" TYPE bigint USING "___diffs_normal"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_reply" TYPE bigint USING "___diffs_reply"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ALTER COLUMN "___diffs_renote" TYPE bigint USING "___diffs_renote"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incCount" TYPE bigint USING "___local_incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_incSize" TYPE bigint USING "___local_incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decCount" TYPE bigint USING "___local_decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___local_decSize" TYPE bigint USING "___local_decSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incCount" TYPE bigint USING "___remote_incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_incSize" TYPE bigint USING "___remote_incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decCount" TYPE bigint USING "___remote_decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__drive" ALTER COLUMN "___remote_decSize" TYPE bigint USING "___remote_decSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___local_count" TYPE bigint USING "___local_count"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_reaction" ALTER COLUMN "___remote_count" TYPE bigint USING "___remote_count"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_total" TYPE bigint USING "___local_followings_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_inc" TYPE bigint USING "___local_followings_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followings_dec" TYPE bigint USING "___local_followings_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_total" TYPE bigint USING "___local_followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_inc" TYPE bigint USING "___local_followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___local_followers_dec" TYPE bigint USING "___local_followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_total" TYPE bigint USING "___remote_followings_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_inc" TYPE bigint USING "___remote_followings_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followings_dec" TYPE bigint USING "___remote_followings_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_total" TYPE bigint USING "___remote_followers_total"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_inc" TYPE bigint USING "___remote_followers_inc"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_following" ALTER COLUMN "___remote_followers_dec" TYPE bigint USING "___remote_followers_dec"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalCount" TYPE bigint USING "___totalCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___totalSize" TYPE bigint USING "___totalSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incCount" TYPE bigint USING "___incCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___incSize" TYPE bigint USING "___incSize"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decCount" TYPE bigint USING "___decCount"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_drive" ALTER COLUMN "___decSize" TYPE bigint USING "___decSize"::bigint`);
+ }
+}
diff --git a/packages/backend/migration/1644059847460-chart-v8.js b/packages/backend/migration/1644059847460-chart-v8.js
new file mode 100644
index 0000000000..a5339c0ebd
--- /dev/null
+++ b/packages/backend/migration/1644059847460-chart-v8.js
@@ -0,0 +1,25 @@
+
+
+export class chartV81644059847460 {
+ name = 'chartV81644059847460'
+
+ async up(queryRunner) {
+ await queryRunner.query(`UPDATE "__chart__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__active_users" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`);
+
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`);
+ }
+
+ async down(queryRunner) {
+
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`);
+ }
+}
diff --git a/packages/backend/migration/1644060125705-chart-v9.js b/packages/backend/migration/1644060125705-chart-v9.js
new file mode 100644
index 0000000000..da35d42315
--- /dev/null
+++ b/packages/backend/migration/1644060125705-chart-v9.js
@@ -0,0 +1,25 @@
+
+
+export class chartV91644060125705 {
+ name = 'chartV91644060125705'
+
+ async up(queryRunner) {
+ await queryRunner.query(`UPDATE "__chart__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___local_users"=2147483647 WHERE "___local_users" > 2147483647`);
+ await queryRunner.query(`UPDATE "__chart_day__hashtag" SET "___remote_users"=2147483647 WHERE "___remote_users" > 2147483647`);
+
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE integer USING "___local_users"::integer`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE integer USING "___remote_users"::integer`);
+ }
+
+ async down(queryRunner) {
+
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___local_users" TYPE bigint USING "___local_users"::bigint`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__hashtag" ALTER COLUMN "___remote_users" TYPE bigint USING "___remote_users"::bigint`);
+ }
+}
diff --git a/packages/backend/migration/1644073149413-chart-v10.js b/packages/backend/migration/1644073149413-chart-v10.js
new file mode 100644
index 0000000000..7260bbeca4
--- /dev/null
+++ b/packages/backend/migration/1644073149413-chart-v10.js
@@ -0,0 +1,35 @@
+
+
+export class chartV101644073149413 {
+ name = 'chartV101644073149413'
+
+ async up(queryRunner) {
+ await queryRunner.query(`CREATE TABLE "__chart__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_e56f4beac5746d44bc3e19c80d0" UNIQUE ("date"), CONSTRAINT "PK_56a25cd447c7ee08876b3baf8d8" PRIMARY KEY ("id"))`);
+ await queryRunner.query(`CREATE UNIQUE INDEX "IDX_e56f4beac5746d44bc3e19c80d" ON "__chart__ap_request" ("date") `);
+ await queryRunner.query(`CREATE TABLE "__chart_day__ap_request" ("id" SERIAL NOT NULL, "date" integer NOT NULL, "___deliverFailed" integer NOT NULL DEFAULT '0', "___deliverSucceeded" integer NOT NULL DEFAULT '0', "___inboxReceived" integer NOT NULL DEFAULT '0', CONSTRAINT "UQ_a848f66d6cec11980a5dd595822" UNIQUE ("date"), CONSTRAINT "PK_9318b49daee320194e23f712e69" PRIMARY KEY ("id"))`);
+ await queryRunner.query(`CREATE UNIQUE INDEX "IDX_a848f66d6cec11980a5dd59582" ON "__chart_day__ap_request" ("date") `);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___deliveredInstances" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___deliveredInstances" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___inboxInstances" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___inboxInstances" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___inboxInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___inboxInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___deliveredInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___deliveredInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___inboxInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___inboxInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___deliveredInstances"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___deliveredInstances"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_a848f66d6cec11980a5dd59582"`);
+ await queryRunner.query(`DROP TABLE "__chart_day__ap_request"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_e56f4beac5746d44bc3e19c80d"`);
+ await queryRunner.query(`DROP TABLE "__chart__ap_request"`);
+ }
+}
diff --git a/packages/backend/migration/1644095659741-chart-v11.js b/packages/backend/migration/1644095659741-chart-v11.js
new file mode 100644
index 0000000000..309fff1d9a
--- /dev/null
+++ b/packages/backend/migration/1644095659741-chart-v11.js
@@ -0,0 +1,91 @@
+
+
+export class chartV111644095659741 {
+ name = 'chartV111644095659741'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___local_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___remote_users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinWeek" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinWeek" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinMonth" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinMonth" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredWithinYear" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredWithinYear" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideWeek" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideWeek" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideMonth" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideMonth" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___registeredOutsideYear" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___registeredOutsideYear" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredOutsideWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___registeredWithinWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredOutsideWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredOutsideWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinYear"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinMonth"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___registeredWithinWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___registeredWithinWeek"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___remote_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___local_users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___remote_users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___local_users" integer NOT NULL DEFAULT '0'`);
+ }
+}
diff --git a/packages/backend/migration/1644328606241-chart-v12.js b/packages/backend/migration/1644328606241-chart-v12.js
new file mode 100644
index 0000000000..c3c7e44f95
--- /dev/null
+++ b/packages/backend/migration/1644328606241-chart-v12.js
@@ -0,0 +1,27 @@
+
+
+export class chartV121644328606241 {
+ name = 'chartV121644328606241'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___local_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" ADD "___remote_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" ADD "___notes_diffs_withFile" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" ADD "___diffs_withFile" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__per_user_notes" DROP COLUMN "___diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart__per_user_notes" DROP COLUMN "___diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__instance" DROP COLUMN "___notes_diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart__instance" DROP COLUMN "___notes_diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___remote_diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__notes" DROP COLUMN "___local_diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___remote_diffs_withFile"`);
+ await queryRunner.query(`ALTER TABLE "__chart__notes" DROP COLUMN "___local_diffs_withFile"`);
+ }
+}
diff --git a/packages/backend/migration/1644331238153-chart-v13.js b/packages/backend/migration/1644331238153-chart-v13.js
new file mode 100644
index 0000000000..639f7b4e20
--- /dev/null
+++ b/packages/backend/migration/1644331238153-chart-v13.js
@@ -0,0 +1,19 @@
+
+
+export class chartV131644331238153 {
+ name = 'chartV131644331238153'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___stalled"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___stalled"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___stalled"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___stalled"`);
+ }
+}
diff --git a/packages/backend/migration/1644344266289-chart-v14.js b/packages/backend/migration/1644344266289-chart-v14.js
new file mode 100644
index 0000000000..a0d9cfc38c
--- /dev/null
+++ b/packages/backend/migration/1644344266289-chart-v14.js
@@ -0,0 +1,47 @@
+
+
+export class chartV141644344266289 {
+ name = 'chartV141644344266289'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___users"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___notedUsers"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___readWrite" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___read" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___read" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___write" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___write" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___write"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___write"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___read"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "unique_temp___read"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" DROP COLUMN "___readWrite"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___write"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___write"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___read"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "unique_temp___read"`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" DROP COLUMN "___readWrite"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___notedUsers" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___notedUsers" character varying array NOT NULL DEFAULT '{}'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "___users" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__active_users" ADD "unique_temp___users" character varying array NOT NULL DEFAULT '{}'`);
+ }
+}
diff --git a/packages/backend/migration/1644395759931-instance-theme-color.js b/packages/backend/migration/1644395759931-instance-theme-color.js
new file mode 100644
index 0000000000..8f335ad210
--- /dev/null
+++ b/packages/backend/migration/1644395759931-instance-theme-color.js
@@ -0,0 +1,13 @@
+
+
+export class instanceThemeColor1644395759931 {
+ name = 'instanceThemeColor1644395759931'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "themeColor" character varying(512)`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "themeColor"`);
+ }
+}
diff --git a/packages/backend/migration/1644481657998-chart-v15.js b/packages/backend/migration/1644481657998-chart-v15.js
new file mode 100644
index 0000000000..b50ca87c40
--- /dev/null
+++ b/packages/backend/migration/1644481657998-chart-v15.js
@@ -0,0 +1,31 @@
+
+
+export class chartV151644481657998 {
+ name = 'chartV151644481657998'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___instance_total"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___instance_inc"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___instance_dec"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___instance_total"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___instance_inc"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___instance_dec"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___sub" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___pub" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___sub" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___pub" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___pub"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___sub"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___pub"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___sub"`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___instance_dec" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___instance_inc" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___instance_total" integer NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___instance_dec" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___instance_inc" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___instance_total" integer NOT NULL DEFAULT '0'`);
+ }
+}
diff --git a/packages/backend/migration/1644551208096-following-indexes.js b/packages/backend/migration/1644551208096-following-indexes.js
new file mode 100644
index 0000000000..276473ff6c
--- /dev/null
+++ b/packages/backend/migration/1644551208096-following-indexes.js
@@ -0,0 +1,15 @@
+
+
+export class followingIndexes1644551208096 {
+ name = 'followingIndexes1644551208096'
+
+ async up(queryRunner) {
+ await queryRunner.query(`CREATE INDEX "IDX_4ccd2239268ebbd1b35e318754" ON "following" ("followerHost") `);
+ await queryRunner.query(`CREATE INDEX "IDX_fcdafee716dfe9c3b5fde90f30" ON "following" ("followeeHost") `);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`DROP INDEX "public"."IDX_fcdafee716dfe9c3b5fde90f30"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_4ccd2239268ebbd1b35e318754"`);
+ }
+}
diff --git a/packages/backend/migration/1645340161439-remove-max-note-text-length.js b/packages/backend/migration/1645340161439-remove-max-note-text-length.js
new file mode 100644
index 0000000000..c88cb70bfb
--- /dev/null
+++ b/packages/backend/migration/1645340161439-remove-max-note-text-length.js
@@ -0,0 +1,13 @@
+
+
+export class removeMaxNoteTextLength1645340161439 {
+ name = 'removeMaxNoteTextLength1645340161439'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "maxNoteTextLength"`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "maxNoteTextLength" integer NOT NULL DEFAULT '500'`);
+ }
+}
diff --git a/packages/backend/migration/1645599900873-federation-chart-pubsub.js b/packages/backend/migration/1645599900873-federation-chart-pubsub.js
new file mode 100644
index 0000000000..fd7cb6d5a1
--- /dev/null
+++ b/packages/backend/migration/1645599900873-federation-chart-pubsub.js
@@ -0,0 +1,15 @@
+
+
+export class federationChartPubsub1645599900873 {
+ name = 'federationChartPubsub1645599900873'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___pubsub" smallint NOT NULL DEFAULT '0'`);
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___pubsub" smallint NOT NULL DEFAULT '0'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___pubsub"`);
+ await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___pubsub"`);
+ }
+}
diff --git a/packages/backend/migration/1646143552768-instance-default-theme.js b/packages/backend/migration/1646143552768-instance-default-theme.js
new file mode 100644
index 0000000000..029354fd92
--- /dev/null
+++ b/packages/backend/migration/1646143552768-instance-default-theme.js
@@ -0,0 +1,13 @@
+export class instanceDefaultTheme1646143552768 {
+ name = 'instanceDefaultTheme1646143552768'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "defaultLightTheme" character varying(8192)`);
+ await queryRunner.query(`ALTER TABLE "meta" ADD "defaultDarkTheme" character varying(8192)`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "defaultDarkTheme"`);
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "defaultLightTheme"`);
+ }
+}
diff --git a/packages/backend/ormconfig.js b/packages/backend/ormconfig.js
index 524181cb89..b8150f7014 100644
--- a/packages/backend/ormconfig.js
+++ b/packages/backend/ormconfig.js
@@ -1,7 +1,7 @@
-const config = require('./built/config').default;
-const entities = require('./built/db/postgre').entities;
+import config from './built/config/index.js';
+import { entities } from './built/db/postgre.js';
-module.exports = {
+export default {
type: 'postgres',
host: config.db.host,
port: config.db.port,
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 3d3a901f34..3bc7051b1b 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,7 @@
{
"main": "./index.js",
"private": true,
+ "type": "module",
"scripts": {
"init": "npm run migrate",
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
@@ -18,15 +19,13 @@
"@elastic/elasticsearch": "7.11.0",
"@koa/cors": "3.1.0",
"@koa/multer": "3.0.0",
- "@koa/router": "9.0.1",
- "@sinonjs/fake-timers": "7.1.2",
+ "@koa/router": "10.1.1",
+ "@sinonjs/fake-timers": "9.1.0",
"@syuilo/aiscript": "0.11.1",
"@types/bcryptjs": "2.4.2",
- "@types/bull": "3.15.7",
+ "@types/bull": "3.15.8",
"@types/cbor": "6.0.0",
- "@types/dateformat": "3.0.1",
"@types/escape-regexp": "0.0.1",
- "@types/glob": "7.2.0",
"@types/is-url": "1.2.30",
"@types/js-yaml": "4.0.5",
"@types/jsdom": "16.2.14",
@@ -42,8 +41,8 @@
"@types/koa__cors": "3.1.1",
"@types/koa__multer": "2.0.4",
"@types/koa__router": "8.0.11",
- "@types/mocha": "8.2.3",
- "@types/node": "17.0.10",
+ "@types/mocha": "9.1.0",
+ "@types/node": "17.0.19",
"@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.4",
"@types/oauth": "0.9.1",
@@ -56,56 +55,54 @@
"@types/ratelimiter": "3.4.3",
"@types/redis": "4.0.11",
"@types/rename": "1.0.4",
- "@types/request-stats": "3.0.0",
"@types/sanitize-html": "2.6.2",
- "@types/seedrandom": "2.4.28",
+ "@types/seedrandom": "3.0.1",
"@types/sharp": "0.29.5",
- "@types/sinonjs__fake-timers": "6.0.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
"@types/speakeasy": "2.0.7",
"@types/throttle-debounce": "2.1.0",
"@types/tinycolor2": "1.4.3",
"@types/tmp": "0.2.3",
"@types/uuid": "8.3.4",
"@types/web-push": "3.3.2",
- "@types/webpack": "5.28.0",
- "@types/webpack-stream": "3.2.12",
- "@types/websocket": "1.0.4",
- "@types/ws": "8.2.2",
- "@typescript-eslint/eslint-plugin": "5.10.0",
- "@typescript-eslint/parser": "5.10.0",
+ "@types/websocket": "1.0.5",
+ "@types/ws": "8.2.3",
+ "@typescript-eslint/eslint-plugin": "5.12.1",
+ "@typescript-eslint/parser": "5.12.1",
"abort-controller": "3.0.0",
+ "ajv": "8.10.0",
"archiver": "5.3.0",
"autobind-decorator": "2.4.0",
"autwh": "0.1.0",
- "aws-sdk": "2.1061.0",
+ "aws-sdk": "2.1079.0",
"bcryptjs": "2.4.3",
- "blurhash": "1.1.4",
- "broadcast-channel": "4.9.0",
- "bull": "4.2.1",
+ "blurhash": "1.1.5",
+ "broadcast-channel": "4.10.0",
+ "bull": "4.6.2",
"cacheable-lookup": "6.0.4",
"cafy": "15.2.1",
"cbor": "8.1.0",
- "chalk": "4.1.2",
+ "chalk": "5.0.0",
+ "chalk-template": "0.3.1",
"cli-highlight": "2.1.11",
+ "color-convert": "2.0.1",
"content-disposition": "0.5.4",
- "crc-32": "1.2.0",
- "dateformat": "4.5.1",
+ "date-fns": "2.28.0",
"deep-email-validator": "0.1.21",
"escape-regexp": "0.0.1",
- "eslint": "8.7.0",
+ "eslint": "8.9.0",
"eslint-plugin-import": "2.25.4",
"eventemitter3": "4.0.7",
"feed": "4.2.2",
"file-type": "16.5.3",
"fluent-ffmpeg": "2.1.2",
- "glob": "7.2.0",
"got": "11.8.2",
"hpagent": "0.1.2",
"http-signature": "1.3.6",
"ip-cidr": "3.0.4",
"is-svg": "4.3.2",
"js-yaml": "4.1.0",
- "jsdom": "16.7.0",
+ "jsdom": "19.0.0",
"json5": "2.2.0",
"json5-loader": "4.0.1",
"jsonld": "5.2.0",
@@ -119,22 +116,21 @@
"koa-send": "5.0.1",
"koa-slow": "2.1.0",
"koa-views": "7.0.2",
- "langmap": "0.0.16",
"mfm-js": "0.21.0",
"mime-types": "2.1.34",
- "misskey-js": "0.0.13",
- "mocha": "8.4.0",
+ "misskey-js": "0.0.14",
+ "mocha": "9.2.1",
"ms": "3.0.0-canary.1",
"multer": "1.4.4",
"nested-property": "4.0.0",
- "node-fetch": "2.6.1",
+ "node-fetch": "2.6.7",
"nodemailer": "6.7.2",
"os-utils": "0.0.14",
"parse5": "6.0.1",
- "pg": "8.7.1",
+ "pg": "8.7.3",
"portscanner": "2.2.0",
"private-ip": "2.3.3",
- "probe-image-size": "7.2.2",
+ "probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
"pug": "3.0.2",
"punycode": "2.1.1",
@@ -142,47 +138,46 @@
"qrcode": "1.5.0",
"random-seed": "0.3.0",
"ratelimiter": "3.4.1",
- "re2": "1.17.3",
+ "re2": "1.17.4",
"redis": "3.1.2",
"redis-lock": "0.1.4",
"reflect-metadata": "0.1.13",
"rename": "1.0.4",
- "request-stats": "3.0.0",
"require-all": "3.0.0",
"rndstr": "1.0.0",
"s-age": "1.1.2",
- "sanitize-html": "2.6.1",
+ "sanitize-html": "2.7.0",
"seedrandom": "3.0.5",
- "sharp": "0.29.3",
+ "sharp": "0.30.1",
"speakeasy": "2.0.0",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"style-loader": "3.3.1",
"summaly": "2.5.0",
"syslog-pro": "1.0.0",
- "systeminformation": "5.9.9",
+ "systeminformation": "5.11.4",
"throttle-debounce": "3.0.1",
"tinycolor2": "1.4.2",
"tmp": "0.2.1",
"ts-loader": "9.2.6",
- "ts-node": "10.4.0",
+ "ts-node": "10.5.0",
"tsc-alias": "1.4.1",
"tsconfig-paths": "3.12.0",
"twemoji-parser": "13.1.0",
- "typeorm": "0.2.41",
+ "typeorm": "0.2.44",
"typescript": "4.5.5",
"ulid": "2.3.0",
"unzipper": "0.10.11",
"uuid": "8.3.2",
"web-push": "3.4.5",
"websocket": "1.0.34",
- "ws": "8.4.2",
+ "ws": "8.5.0",
"xev": "2.0.1"
},
"devDependencies": {
- "@redocly/openapi-core": "1.0.0-beta.79",
+ "@redocly/openapi-core": "1.0.0-beta.83",
"@types/fluent-ffmpeg": "2.1.20",
"cross-env": "7.0.3",
- "execa": "6.0.0"
+ "execa": "6.1.0"
}
}
diff --git a/packages/backend/@types/hcaptcha.d.ts b/packages/backend/src/@types/hcaptcha.d.ts
index afed587560..afed587560 100644
--- a/packages/backend/@types/hcaptcha.d.ts
+++ b/packages/backend/src/@types/hcaptcha.d.ts
diff --git a/packages/backend/@types/http-signature.d.ts b/packages/backend/src/@types/http-signature.d.ts
index 8d484312dc..8d484312dc 100644
--- a/packages/backend/@types/http-signature.d.ts
+++ b/packages/backend/src/@types/http-signature.d.ts
diff --git a/packages/backend/@types/jsrsasign.d.ts b/packages/backend/src/@types/jsrsasign.d.ts
index bb52f8f64e..bb52f8f64e 100644
--- a/packages/backend/@types/jsrsasign.d.ts
+++ b/packages/backend/src/@types/jsrsasign.d.ts
diff --git a/packages/backend/@types/koa-json-body.d.ts b/packages/backend/src/@types/koa-json-body.d.ts
index 5aa8179c5b..5aa8179c5b 100644
--- a/packages/backend/@types/koa-json-body.d.ts
+++ b/packages/backend/src/@types/koa-json-body.d.ts
diff --git a/packages/backend/@types/koa-slow.d.ts b/packages/backend/src/@types/koa-slow.d.ts
index e748e2cc98..e748e2cc98 100644
--- a/packages/backend/@types/koa-slow.d.ts
+++ b/packages/backend/src/@types/koa-slow.d.ts
diff --git a/packages/backend/@types/os-utils.d.ts b/packages/backend/src/@types/os-utils.d.ts
index 390df17d39..390df17d39 100644
--- a/packages/backend/@types/os-utils.d.ts
+++ b/packages/backend/src/@types/os-utils.d.ts
diff --git a/packages/backend/@types/package.json.d.ts b/packages/backend/src/@types/package.json.d.ts
index abe5fae687..abe5fae687 100644
--- a/packages/backend/@types/package.json.d.ts
+++ b/packages/backend/src/@types/package.json.d.ts
diff --git a/packages/backend/@types/probe-image-size.d.ts b/packages/backend/src/@types/probe-image-size.d.ts
index 665edcf2e7..11bb6c620c 100644
--- a/packages/backend/@types/probe-image-size.d.ts
+++ b/packages/backend/src/@types/probe-image-size.d.ts
@@ -1,5 +1,5 @@
declare module 'probe-image-size' {
- import { ReadStream } from 'fs';
+ import { ReadStream } from 'node:fs';
type ProbeOptions = {
retries: 1;
diff --git a/packages/backend/src/boot/index.ts b/packages/backend/src/boot/index.ts
index 1723c32dd0..5bb20a729f 100644
--- a/packages/backend/src/boot/index.ts
+++ b/packages/backend/src/boot/index.ts
@@ -1,18 +1,18 @@
-import * as cluster from 'cluster';
-import * as chalk from 'chalk';
-import Xev from 'xev';
+import cluster from 'node:cluster';
+import chalk from 'chalk';
+import { default as Xev } from 'xev';
-import Logger from '@/services/logger';
-import { envOption } from '../env';
+import Logger from '@/services/logger.js';
+import { envOption } from '../env.js';
// for typeorm
import 'reflect-metadata';
-import { masterMain } from './master';
-import { workerMain } from './worker';
+import { masterMain } from './master.js';
+import { workerMain } from './worker.js';
const logger = new Logger('core', 'cyan');
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
-const ev = new Xev();
+const ev = new Xev.default();
/**
* Init process
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index eeb7017cb0..1c909dff13 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -1,22 +1,22 @@
-import * as fs from 'fs';
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-import * as os from 'os';
-import * as cluster from 'cluster';
-import * as chalk from 'chalk';
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
+import * as os from 'node:os';
+import cluster from 'node:cluster';
+import chalk from 'chalk';
+import chalkTemplate from 'chalk-template';
import * as portscanner from 'portscanner';
import { getConnection } from 'typeorm';
-import Logger from '@/services/logger';
-import loadConfig from '@/config/load';
-import { Config } from '@/config/types';
-import { lessThan } from '@/prelude/array';
-import { envOption } from '../env';
-import { showMachineInfo } from '@/misc/show-machine-info';
-import { initDb } from '../db/postgre';
+import Logger from '@/services/logger.js';
+import loadConfig from '@/config/load.js';
+import { Config } from '@/config/types.js';
+import { lessThan } from '@/prelude/array.js';
+import { envOption } from '../env.js';
+import { showMachineInfo } from '@/misc/show-machine-info.js';
+import { initDb } from '../db/postgre.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json`, 'utf-8'));
@@ -24,22 +24,24 @@ const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json
const logger = new Logger('core', 'cyan');
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
+const themeColor = chalk.hex('#86b300');
+
function greet() {
if (!envOption.quiet) {
//#region Misskey logo
const v = `v${meta.version}`;
- console.log(' _____ _ _ ');
- console.log(' | |_|___ ___| |_ ___ _ _ ');
- console.log(' | | | | |_ -|_ -| \'_| -_| | |');
- console.log(' |_|_|_|_|___|___|_,_|___|_ |');
- console.log(' ' + chalk.gray(v) + (' |___|\n'.substr(v.length)));
+ console.log(themeColor(' _____ _ _ '));
+ console.log(themeColor(' | |_|___ ___| |_ ___ _ _ '));
+ console.log(themeColor(' | | | | |_ -|_ -| \'_| -_| | |'));
+ console.log(themeColor(' |_|_|_|_|___|___|_,_|___|_ |'));
+ console.log(' ' + chalk.gray(v) + themeColor(' |___|\n'.substr(v.length)));
//#endregion
console.log(' Misskey is an open-source decentralized microblogging platform.');
- console.log(chalk.keyword('orange')(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
+ console.log(chalk.rgb(255, 136, 0)(' If you like Misskey, please donate to support development. https://www.patreon.com/syuilo'));
console.log('');
- console.log(chalk`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
+ console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
}
bootLogger.info('Welcome to Misskey!');
@@ -80,9 +82,9 @@ export async function masterMain() {
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
if (!envOption.noDaemons) {
- require('../daemons/server-stats').default();
- require('../daemons/queue-stats').default();
- require('../daemons/janitor').default();
+ import('../daemons/server-stats.js').then(x => x.default());
+ import('../daemons/queue-stats.js').then(x => x.default());
+ import('../daemons/janitor.js').then(x => x.default());
}
}
diff --git a/packages/backend/src/boot/worker.ts b/packages/backend/src/boot/worker.ts
index 362fa3f26b..8038e25631 100644
--- a/packages/backend/src/boot/worker.ts
+++ b/packages/backend/src/boot/worker.ts
@@ -1,5 +1,5 @@
-import * as cluster from 'cluster';
-import { initDb } from '../db/postgre';
+import cluster from 'node:cluster';
+import { initDb } from '../db/postgre.js';
/**
* Init worker process
@@ -8,10 +8,10 @@ export async function workerMain() {
await initDb();
// start server
- await require('../server').default();
+ await import('../server/index.js').then(x => x.default());
// start job queue
- require('../queue').default();
+ import('../queue/index.js').then(x => x.default());
if (cluster.isWorker) {
// Send a 'ready' message to parent process
diff --git a/packages/backend/src/config/index.ts b/packages/backend/src/config/index.ts
index 7bfdca4612..3e53b00036 100644
--- a/packages/backend/src/config/index.ts
+++ b/packages/backend/src/config/index.ts
@@ -1,3 +1,3 @@
-import load from './load';
+import load from './load.js';
export default load();
diff --git a/packages/backend/src/config/load.ts b/packages/backend/src/config/load.ts
index 1b5457cdb0..7f765463e4 100644
--- a/packages/backend/src/config/load.ts
+++ b/packages/backend/src/config/load.ts
@@ -2,14 +2,13 @@
* Config loader
*/
-import * as fs from 'fs';
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
import * as yaml from 'js-yaml';
-import { Source, Mixin } from './types';
+import { Source, Mixin } from './types.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
/**
diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts
index e3ca6c1ab6..7a1b83c99b 100644
--- a/packages/backend/src/config/types.ts
+++ b/packages/backend/src/config/types.ts
@@ -62,6 +62,7 @@ export type Source = {
};
mediaProxy?: string;
+ proxyRemoteFiles?: boolean;
signToActivityPubGet?: boolean;
};
diff --git a/packages/backend/src/const.ts b/packages/backend/src/const.ts
index b00bd81655..6d3b9559e8 100644
--- a/packages/backend/src/const.ts
+++ b/packages/backend/src/const.ts
@@ -1,3 +1,5 @@
+export const MAX_NOTE_TEXT_LENGTH = 3000;
+
export const USER_ONLINE_THRESHOLD = 1000 * 60 * 10; // 10min
export const USER_ACTIVE_THRESHOLD = 1000 * 60 * 60 * 24 * 3; // 3days
diff --git a/packages/backend/src/daemons/janitor.ts b/packages/backend/src/daemons/janitor.ts
index 115c1fe380..f2a1bfcc2f 100644
--- a/packages/backend/src/daemons/janitor.ts
+++ b/packages/backend/src/daemons/janitor.ts
@@ -1,7 +1,7 @@
// TODO: 消したい
const interval = 30 * 60 * 1000;
-import { AttestationChallenges } from '@/models/index';
+import { AttestationChallenges } from '@/models/index.js';
import { LessThan } from 'typeorm';
/**
diff --git a/packages/backend/src/daemons/queue-stats.ts b/packages/backend/src/daemons/queue-stats.ts
index 5faa16ee44..bfef110545 100644
--- a/packages/backend/src/daemons/queue-stats.ts
+++ b/packages/backend/src/daemons/queue-stats.ts
@@ -1,7 +1,7 @@
-import Xev from 'xev';
-import { deliverQueue, inboxQueue } from '../queue/queues';
+import { default as Xev } from 'xev';
+import { deliverQueue, inboxQueue } from '../queue/queues.js';
-const ev = new Xev();
+const ev = new Xev.default();
const interval = 10000;
diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts
index 47c46042eb..327305ccc5 100644
--- a/packages/backend/src/daemons/server-stats.ts
+++ b/packages/backend/src/daemons/server-stats.ts
@@ -1,8 +1,8 @@
-import * as si from 'systeminformation';
-import Xev from 'xev';
+import si from 'systeminformation';
+import { default as Xev } from 'xev';
import * as osUtils from 'os-utils';
-const ev = new Xev();
+const ev = new Xev.default();
const interval = 2000;
@@ -36,8 +36,8 @@ export default function() {
tx: round(Math.max(0, netStats.tx_sec)),
},
fs: {
- r: round(Math.max(0, fsStats.rIO_sec)),
- w: round(Math.max(0, fsStats.wIO_sec)),
+ r: round(Math.max(0, fsStats.rIO_sec ?? 0)),
+ w: round(Math.max(0, fsStats.wIO_sec ?? 0)),
},
};
ev.emit('serverStats', stats);
@@ -51,9 +51,9 @@ export default function() {
}
// CPU STAT
-function cpuUsage() {
+function cpuUsage(): Promise<number> {
return new Promise((res, rej) => {
- osUtils.cpuUsage((cpuUsage: number) => {
+ osUtils.cpuUsage((cpuUsage) => {
res(cpuUsage);
});
});
diff --git a/packages/backend/src/db/elasticsearch.ts b/packages/backend/src/db/elasticsearch.ts
index 60a4061d44..d98c5d180b 100644
--- a/packages/backend/src/db/elasticsearch.ts
+++ b/packages/backend/src/db/elasticsearch.ts
@@ -1,5 +1,5 @@
import * as elasticsearch from '@elastic/elasticsearch';
-import config from '@/config/index';
+import config from '@/config/index.js';
const index = {
settings: {
diff --git a/packages/backend/src/db/logger.ts b/packages/backend/src/db/logger.ts
index 62f90555a0..22f4c6b1b0 100644
--- a/packages/backend/src/db/logger.ts
+++ b/packages/backend/src/db/logger.ts
@@ -1,3 +1,3 @@
-import Logger from '@/services/logger';
+import Logger from '@/services/logger.js';
export const dbLogger = new Logger('db');
diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts
index 69336c2a46..c1f7245bc7 100644
--- a/packages/backend/src/db/postgre.ts
+++ b/packages/backend/src/db/postgre.ts
@@ -1,78 +1,78 @@
// https://github.com/typeorm/typeorm/issues/2400
-const types = require('pg').types;
-types.setTypeParser(20, Number);
+import pg from 'pg';
+pg.types.setTypeParser(20, Number);
import { createConnection, Logger, getConnection } from 'typeorm';
import * as highlight from 'cli-highlight';
-import config from '@/config/index';
+import config from '@/config/index.js';
-import { dbLogger } from './logger';
+import { dbLogger } from './logger.js';
-import { User } from '@/models/entities/user';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFolder } from '@/models/entities/drive-folder';
-import { AccessToken } from '@/models/entities/access-token';
-import { App } from '@/models/entities/app';
-import { PollVote } from '@/models/entities/poll-vote';
-import { Note } from '@/models/entities/note';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { NoteWatching } from '@/models/entities/note-watching';
-import { NoteThreadMuting } from '@/models/entities/note-thread-muting';
-import { NoteUnread } from '@/models/entities/note-unread';
-import { Notification } from '@/models/entities/notification';
-import { Meta } from '@/models/entities/meta';
-import { Following } from '@/models/entities/following';
-import { Instance } from '@/models/entities/instance';
-import { Muting } from '@/models/entities/muting';
-import { SwSubscription } from '@/models/entities/sw-subscription';
-import { Blocking } from '@/models/entities/blocking';
-import { UserList } from '@/models/entities/user-list';
-import { UserListJoining } from '@/models/entities/user-list-joining';
-import { UserGroup } from '@/models/entities/user-group';
-import { UserGroupJoining } from '@/models/entities/user-group-joining';
-import { UserGroupInvitation } from '@/models/entities/user-group-invitation';
-import { Hashtag } from '@/models/entities/hashtag';
-import { NoteFavorite } from '@/models/entities/note-favorite';
-import { AbuseUserReport } from '@/models/entities/abuse-user-report';
-import { RegistrationTicket } from '@/models/entities/registration-tickets';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { Signin } from '@/models/entities/signin';
-import { AuthSession } from '@/models/entities/auth-session';
-import { FollowRequest } from '@/models/entities/follow-request';
-import { Emoji } from '@/models/entities/emoji';
-import { UserNotePining } from '@/models/entities/user-note-pining';
-import { Poll } from '@/models/entities/poll';
-import { UserKeypair } from '@/models/entities/user-keypair';
-import { UserPublickey } from '@/models/entities/user-publickey';
-import { UserProfile } from '@/models/entities/user-profile';
-import { UserSecurityKey } from '@/models/entities/user-security-key';
-import { AttestationChallenge } from '@/models/entities/attestation-challenge';
-import { Page } from '@/models/entities/page';
-import { PageLike } from '@/models/entities/page-like';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { GalleryLike } from '@/models/entities/gallery-like';
-import { ModerationLog } from '@/models/entities/moderation-log';
-import { UsedUsername } from '@/models/entities/used-username';
-import { Announcement } from '@/models/entities/announcement';
-import { AnnouncementRead } from '@/models/entities/announcement-read';
-import { Clip } from '@/models/entities/clip';
-import { ClipNote } from '@/models/entities/clip-note';
-import { Antenna } from '@/models/entities/antenna';
-import { AntennaNote } from '@/models/entities/antenna-note';
-import { PromoNote } from '@/models/entities/promo-note';
-import { PromoRead } from '@/models/entities/promo-read';
-import { envOption } from '../env';
-import { Relay } from '@/models/entities/relay';
-import { MutedNote } from '@/models/entities/muted-note';
-import { Channel } from '@/models/entities/channel';
-import { ChannelFollowing } from '@/models/entities/channel-following';
-import { ChannelNotePining } from '@/models/entities/channel-note-pining';
-import { RegistryItem } from '@/models/entities/registry-item';
-import { Ad } from '@/models/entities/ad';
-import { PasswordResetRequest } from '@/models/entities/password-reset-request';
-import { UserPending } from '@/models/entities/user-pending';
+import { User } from '@/models/entities/user.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFolder } from '@/models/entities/drive-folder.js';
+import { AccessToken } from '@/models/entities/access-token.js';
+import { App } from '@/models/entities/app.js';
+import { PollVote } from '@/models/entities/poll-vote.js';
+import { Note } from '@/models/entities/note.js';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { NoteWatching } from '@/models/entities/note-watching.js';
+import { NoteThreadMuting } from '@/models/entities/note-thread-muting.js';
+import { NoteUnread } from '@/models/entities/note-unread.js';
+import { Notification } from '@/models/entities/notification.js';
+import { Meta } from '@/models/entities/meta.js';
+import { Following } from '@/models/entities/following.js';
+import { Instance } from '@/models/entities/instance.js';
+import { Muting } from '@/models/entities/muting.js';
+import { SwSubscription } from '@/models/entities/sw-subscription.js';
+import { Blocking } from '@/models/entities/blocking.js';
+import { UserList } from '@/models/entities/user-list.js';
+import { UserListJoining } from '@/models/entities/user-list-joining.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
+import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
+import { Hashtag } from '@/models/entities/hashtag.js';
+import { NoteFavorite } from '@/models/entities/note-favorite.js';
+import { AbuseUserReport } from '@/models/entities/abuse-user-report.js';
+import { RegistrationTicket } from '@/models/entities/registration-tickets.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { Signin } from '@/models/entities/signin.js';
+import { AuthSession } from '@/models/entities/auth-session.js';
+import { FollowRequest } from '@/models/entities/follow-request.js';
+import { Emoji } from '@/models/entities/emoji.js';
+import { UserNotePining } from '@/models/entities/user-note-pining.js';
+import { Poll } from '@/models/entities/poll.js';
+import { UserKeypair } from '@/models/entities/user-keypair.js';
+import { UserPublickey } from '@/models/entities/user-publickey.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { UserSecurityKey } from '@/models/entities/user-security-key.js';
+import { AttestationChallenge } from '@/models/entities/attestation-challenge.js';
+import { Page } from '@/models/entities/page.js';
+import { PageLike } from '@/models/entities/page-like.js';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { GalleryLike } from '@/models/entities/gallery-like.js';
+import { ModerationLog } from '@/models/entities/moderation-log.js';
+import { UsedUsername } from '@/models/entities/used-username.js';
+import { Announcement } from '@/models/entities/announcement.js';
+import { AnnouncementRead } from '@/models/entities/announcement-read.js';
+import { Clip } from '@/models/entities/clip.js';
+import { ClipNote } from '@/models/entities/clip-note.js';
+import { Antenna } from '@/models/entities/antenna.js';
+import { AntennaNote } from '@/models/entities/antenna-note.js';
+import { PromoNote } from '@/models/entities/promo-note.js';
+import { PromoRead } from '@/models/entities/promo-read.js';
+import { envOption } from '../env.js';
+import { Relay } from '@/models/entities/relay.js';
+import { MutedNote } from '@/models/entities/muted-note.js';
+import { Channel } from '@/models/entities/channel.js';
+import { ChannelFollowing } from '@/models/entities/channel-following.js';
+import { ChannelNotePining } from '@/models/entities/channel-note-pining.js';
+import { RegistryItem } from '@/models/entities/registry-item.js';
+import { Ad } from '@/models/entities/ad.js';
+import { PasswordResetRequest } from '@/models/entities/password-reset-request.js';
+import { UserPending } from '@/models/entities/user-pending.js';
-import { entities as charts } from '@/services/chart/entities';
+import { entities as charts } from '@/services/chart/entities.js';
const sqlLogger = dbLogger.createSubLogger('sql', 'white', false);
diff --git a/packages/backend/src/db/redis.ts b/packages/backend/src/db/redis.ts
index 9fc2b62412..9346041456 100644
--- a/packages/backend/src/db/redis.ts
+++ b/packages/backend/src/db/redis.ts
@@ -1,5 +1,5 @@
import * as redis from 'redis';
-import config from '@/config/index';
+import config from '@/config/index.js';
export function createConnection() {
return redis.createClient(
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index 5e4e377ab0..bd9c0098bc 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -2,10 +2,12 @@
* Misskey Entry Point!
*/
-Error.stackTraceLimit = Infinity;
-
-require('events').EventEmitter.defaultMaxListeners = 128;
+import { EventEmitter } from 'node:events';
+import boot from './boot/index.js';
-import boot from './boot/index';
+Error.stackTraceLimit = Infinity;
+EventEmitter.defaultMaxListeners = 128;
-boot();
+boot().catch(err => {
+ console.error(err);
+});
diff --git a/packages/backend/src/mfm/from-html.ts b/packages/backend/src/mfm/from-html.ts
index fc6d3b3062..623cb0e71c 100644
--- a/packages/backend/src/mfm/from-html.ts
+++ b/packages/backend/src/mfm/from-html.ts
@@ -1,13 +1,11 @@
import * as parse5 from 'parse5';
-import treeAdapter = require('parse5/lib/tree-adapters/default');
-import { URL } from 'url';
+import treeAdapter from 'parse5/lib/tree-adapters/default.js';
+import { URL } from 'node:url';
const urlRegex = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+/;
const urlRegexFull = /^https?:\/\/[\w\/:%#@$&?!()\[\]~.,=+\-]+$/;
-export function fromHtml(html: string, hashtagNames?: string[]): string | null {
- if (html == null) return null;
-
+export function fromHtml(html: string, hashtagNames?: string[]): string {
const dom = parse5.parseFragment(html);
let text = '';
diff --git a/packages/backend/src/mfm/to-html.ts b/packages/backend/src/mfm/to-html.ts
index b16c6b95e5..5b382063eb 100644
--- a/packages/backend/src/mfm/to-html.ts
+++ b/packages/backend/src/mfm/to-html.ts
@@ -1,8 +1,8 @@
import { JSDOM } from 'jsdom';
import * as mfm from 'mfm-js';
-import config from '@/config/index';
-import { intersperse } from '@/prelude/array';
-import { IMentionedRemoteUsers } from '@/models/entities/note';
+import config from '@/config/index.js';
+import { intersperse } from '@/prelude/array.js';
+import { IMentionedRemoteUsers } from '@/models/entities/note.js';
export function toHtml(nodes: mfm.MfmNode[] | null, mentionedRemoteUsers: IMentionedRemoteUsers = []) {
if (nodes == null) {
diff --git a/packages/backend/src/misc/acct.ts b/packages/backend/src/misc/acct.ts
new file mode 100644
index 0000000000..c32cee86c9
--- /dev/null
+++ b/packages/backend/src/misc/acct.ts
@@ -0,0 +1,14 @@
+export type Acct = {
+ username: string;
+ host: string | null;
+};
+
+export function parse(acct: string): Acct {
+ if (acct.startsWith('@')) acct = acct.substr(1);
+ const split = acct.split('@', 2);
+ return { username: split[0], host: split[1] || null };
+}
+
+export function toString(acct: Acct): string {
+ return acct.host == null ? acct.username : `${acct.username}@${acct.host}`;
+}
diff --git a/packages/backend/src/misc/antenna-cache.ts b/packages/backend/src/misc/antenna-cache.ts
index a23eeb45ec..dcf96c1610 100644
--- a/packages/backend/src/misc/antenna-cache.ts
+++ b/packages/backend/src/misc/antenna-cache.ts
@@ -1,6 +1,6 @@
-import { Antennas } from '@/models/index';
-import { Antenna } from '@/models/entities/antenna';
-import { subsdcriber } from '../db/redis';
+import { Antennas } from '@/models/index.js';
+import { Antenna } from '@/models/entities/antenna.js';
+import { subsdcriber } from '../db/redis.js';
let antennasFetched = false;
let antennas: Antenna[] = [];
diff --git a/packages/backend/src/misc/app-lock.ts b/packages/backend/src/misc/app-lock.ts
index a32b600612..b5089cc6a6 100644
--- a/packages/backend/src/misc/app-lock.ts
+++ b/packages/backend/src/misc/app-lock.ts
@@ -1,6 +1,6 @@
-import { redisClient } from '../db/redis';
-import { promisify } from 'util';
-import * as redisLock from 'redis-lock';
+import { redisClient } from '../db/redis.js';
+import { promisify } from 'node:util';
+import redisLock from 'redis-lock';
/**
* Retry delay (ms) for lock acquisition
diff --git a/packages/backend/src/misc/before-shutdown.ts b/packages/backend/src/misc/before-shutdown.ts
index 33abf5fb4d..93ac7a1f39 100644
--- a/packages/backend/src/misc/before-shutdown.ts
+++ b/packages/backend/src/misc/before-shutdown.ts
@@ -24,14 +24,14 @@ const SHUTDOWN_TIMEOUT = 15000;
* down the process.
* @type {BeforeShutdownListener[]}
*/
-const shutdownListeners = [];
+const shutdownListeners: ((signalOrEvent: string) => void)[] = [];
/**
* Listen for signals and execute given `fn` function once.
* @param {string[]} signals System signals to listen to.
* @param {function(string)} fn Function to execute on shutdown.
*/
-const processOnce = (signals, fn) => {
+const processOnce = (signals: string[], fn: (signalOrEvent: string) => void) => {
for (const sig of signals) {
process.once(sig, fn);
}
@@ -41,7 +41,7 @@ const processOnce = (signals, fn) => {
* Sets a forced shutdown mechanism that will exit the process after `timeout` milliseconds.
* @param {number} timeout Time to wait before forcing shutdown (milliseconds)
*/
-const forceExitAfter = timeout => () => {
+const forceExitAfter = (timeout: number) => () => {
setTimeout(() => {
// Force shutdown after timeout
console.warn(`Could not close resources gracefully after ${timeout}ms: forcing shutdown`);
@@ -55,7 +55,7 @@ const forceExitAfter = timeout => () => {
* be logged out as a warning, but won't prevent other callbacks from executing.
* @param {string} signalOrEvent The exit signal or event name received on the process.
*/
-async function shutdownHandler(signalOrEvent) {
+async function shutdownHandler(signalOrEvent: string) {
if (process.env.NODE_ENV === 'test') return process.exit(0);
console.warn(`Shutting down: received [${signalOrEvent}] signal`);
@@ -64,7 +64,9 @@ async function shutdownHandler(signalOrEvent) {
try {
await listener(signalOrEvent);
} catch (err) {
- console.warn(`A shutdown handler failed before completing with: ${err.message || err}`);
+ if (err instanceof Error) {
+ console.warn(`A shutdown handler failed before completing with: ${err.message || err}`);
+ }
}
}
@@ -78,7 +80,7 @@ async function shutdownHandler(signalOrEvent) {
* @param {BeforeShutdownListener} listener The shutdown listener to register.
* @returns {BeforeShutdownListener} Echoes back the supplied `listener`.
*/
-export function beforeShutdown(listener) {
+export function beforeShutdown(listener: () => void) {
shutdownListeners.push(listener);
return listener;
}
diff --git a/packages/backend/src/misc/captcha.ts b/packages/backend/src/misc/captcha.ts
index 41a986d785..293cbdcd37 100644
--- a/packages/backend/src/misc/captcha.ts
+++ b/packages/backend/src/misc/captcha.ts
@@ -1,7 +1,7 @@
import fetch from 'node-fetch';
-import { URLSearchParams } from 'url';
-import { getAgentByUrl } from './fetch';
-import config from '@/config/index';
+import { URLSearchParams } from 'node:url';
+import { getAgentByUrl } from './fetch.js';
+import config from '@/config/index.js';
export async function verifyRecaptcha(secret: string, response: string) {
const result = await getCaptchaResponse('https://www.recaptcha.net/recaptcha/api/siteverify', secret, response).catch(e => {
diff --git a/packages/backend/src/misc/check-hit-antenna.ts b/packages/backend/src/misc/check-hit-antenna.ts
index 3c39a337fd..ceb74d6904 100644
--- a/packages/backend/src/misc/check-hit-antenna.ts
+++ b/packages/backend/src/misc/check-hit-antenna.ts
@@ -1,10 +1,10 @@
-import { Antenna } from '@/models/entities/antenna';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { UserListJoinings, UserGroupJoinings } from '@/models/index';
-import { getFullApAccount } from './convert-host';
-import * as Acct from 'misskey-js/built/acct';
-import { Packed } from './schema';
+import { Antenna } from '@/models/entities/antenna.js';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { UserListJoinings, UserGroupJoinings } from '@/models/index.js';
+import { getFullApAccount } from './convert-host.js';
+import * as Acct from '@/misc/acct.js';
+import { Packed } from './schema.js';
/**
* noteUserFollowers / antennaUserFollowing はどちらか一方が指定されていればよい
diff --git a/packages/backend/src/misc/check-word-mute.ts b/packages/backend/src/misc/check-word-mute.ts
index e2e871dd2b..588dc79e55 100644
--- a/packages/backend/src/misc/check-word-mute.ts
+++ b/packages/backend/src/misc/check-word-mute.ts
@@ -1,6 +1,6 @@
-const RE2 = require('re2');
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
+import RE2 from 're2';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
type NoteLike = {
userId: Note['userId'];
@@ -11,26 +11,31 @@ type UserLike = {
id: User['id'];
};
-export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: string[][]): Promise<boolean> {
+export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: Array<string | string[]>): Promise<boolean> {
// 自分自身
if (me && (note.userId === me.id)) return false;
- const words = mutedWords
- // Clean up
- .map(xs => xs.filter(x => x !== ''))
- .filter(xs => xs.length > 0);
-
- if (words.length > 0) {
+ if (mutedWords.length > 0) {
if (note.text == null) return false;
- const matched = words.some(and =>
- and.every(keyword => {
- const regexp = keyword.match(/^\/(.+)\/(.*)$/);
- if (regexp) {
+ const matched = mutedWords.some(filter => {
+ if (Array.isArray(filter)) {
+ return filter.every(keyword => note.text!.includes(keyword));
+ } else {
+ // represents RegExp
+ const regexp = filter.match(/^\/(.+)\/(.*)$/);
+
+ // This should never happen due to input sanitisation.
+ if (!regexp) return false;
+
+ try {
return new RE2(regexp[1], regexp[2]).test(note.text!);
+ } catch (err) {
+ // This should never happen due to input sanitisation.
+ return false;
}
- return note.text!.includes(keyword);
- }));
+ }
+ });
if (matched) return true;
}
diff --git a/packages/backend/src/misc/content-disposition.ts b/packages/backend/src/misc/content-disposition.ts
index 9df7ed4688..b2aec471d5 100644
--- a/packages/backend/src/misc/content-disposition.ts
+++ b/packages/backend/src/misc/content-disposition.ts
@@ -1,4 +1,4 @@
-const cd = require('content-disposition');
+import cd from 'content-disposition';
export function contentDisposition(type: 'inline' | 'attachment', filename: string): string {
const fallback = filename.replace(/[^\w.-]/g, '_');
diff --git a/packages/backend/src/misc/convert-host.ts b/packages/backend/src/misc/convert-host.ts
index 6e9f6ed3e9..7eb940a7e0 100644
--- a/packages/backend/src/misc/convert-host.ts
+++ b/packages/backend/src/misc/convert-host.ts
@@ -1,6 +1,6 @@
-import { URL } from 'url';
-import config from '@/config/index';
-import { toASCII } from 'punycode/';
+import { URL } from 'node:url';
+import config from '@/config/index.js';
+import { toASCII } from 'punycode';
export function getFullApAccount(username: string, host: string | null) {
return host ? `${username}@${toPuny(host)}` : `${username}@${toPuny(config.host)}`;
diff --git a/packages/backend/src/misc/count-same-renotes.ts b/packages/backend/src/misc/count-same-renotes.ts
index 6628761182..b7f8ce90c8 100644
--- a/packages/backend/src/misc/count-same-renotes.ts
+++ b/packages/backend/src/misc/count-same-renotes.ts
@@ -1,4 +1,4 @@
-import { Notes } from '@/models/index';
+import { Notes } from '@/models/index.js';
export async function countSameRenotes(userId: string, renoteId: string, excludeNoteId: string | undefined): Promise<number> {
// 指定したユーザーの指定したノートのリノートがいくつあるか数える
diff --git a/packages/backend/src/misc/detect-url-mime.ts b/packages/backend/src/misc/detect-url-mime.ts
index 274c291737..cd143cf2fb 100644
--- a/packages/backend/src/misc/detect-url-mime.ts
+++ b/packages/backend/src/misc/detect-url-mime.ts
@@ -1,6 +1,6 @@
-import { createTemp } from './create-temp';
-import { downloadUrl } from './download-url';
-import { detectType } from './get-file-info';
+import { createTemp } from './create-temp.js';
+import { downloadUrl } from './download-url.js';
+import { detectType } from './get-file-info.js';
export async function detectUrlMime(url: string) {
const [path, cleanup] = await createTemp();
diff --git a/packages/backend/src/misc/download-text-file.ts b/packages/backend/src/misc/download-text-file.ts
index e8e23cc120..c62c70ee33 100644
--- a/packages/backend/src/misc/download-text-file.ts
+++ b/packages/backend/src/misc/download-text-file.ts
@@ -1,8 +1,8 @@
-import * as fs from 'fs';
-import * as util from 'util';
-import Logger from '@/services/logger';
-import { createTemp } from './create-temp';
-import { downloadUrl } from './download-url';
+import * as fs from 'node:fs';
+import * as util from 'node:util';
+import Logger from '@/services/logger.js';
+import { createTemp } from './create-temp.js';
+import { downloadUrl } from './download-url.js';
const logger = new Logger('download-text-file');
diff --git a/packages/backend/src/misc/download-url.ts b/packages/backend/src/misc/download-url.ts
index 8e1f7b9e24..21eee57b33 100644
--- a/packages/backend/src/misc/download-url.ts
+++ b/packages/backend/src/misc/download-url.ts
@@ -1,13 +1,13 @@
-import * as fs from 'fs';
-import * as stream from 'stream';
-import * as util from 'util';
+import * as fs from 'node:fs';
+import * as stream from 'node:stream';
+import * as util from 'node:util';
import got, * as Got from 'got';
-import { httpAgent, httpsAgent, StatusError } from './fetch';
-import config from '@/config/index';
-import * as chalk from 'chalk';
-import Logger from '@/services/logger';
+import { httpAgent, httpsAgent, StatusError } from './fetch.js';
+import config from '@/config/index.js';
+import chalk from 'chalk';
+import Logger from '@/services/logger.js';
import * as IPCIDR from 'ip-cidr';
-const PrivateIp = require('private-ip');
+import PrivateIp from 'private-ip';
const pipeline = util.promisify(stream.pipeline);
@@ -38,7 +38,9 @@ export async function downloadUrl(url: string, path: string): Promise<void> {
https: httpsAgent,
},
http2: false, // default
- retry: 0,
+ retry: {
+ limit: 0,
+ },
}).on('response', (res: Got.Response) => {
if ((process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test') && !config.proxy && res.ip) {
if (isPrivateIp(res.ip)) {
@@ -75,7 +77,7 @@ export async function downloadUrl(url: string, path: string): Promise<void> {
logger.succ(`Download finished: ${chalk.cyan(url)}`);
}
-function isPrivateIp(ip: string) {
+function isPrivateIp(ip: string): boolean {
for (const net of config.allowedPrivateNetworks || []) {
const cidr = new IPCIDR(net);
if (cidr.contains(ip)) {
diff --git a/packages/backend/src/misc/emoji-regex.ts b/packages/backend/src/misc/emoji-regex.ts
index 8b07fbd8f2..ca224971c5 100644
--- a/packages/backend/src/misc/emoji-regex.ts
+++ b/packages/backend/src/misc/emoji-regex.ts
@@ -1,3 +1,4 @@
-const twemojiRegex = require('twemoji-parser/dist/lib/regex').default;
+import twemoji from 'twemoji-parser/dist/lib/regex.js';
+const twemojiRegex = twemoji.default;
export const emojiRegex = new RegExp(`(${twemojiRegex.source})`);
diff --git a/packages/backend/src/misc/extract-custom-emojis-from-mfm.ts b/packages/backend/src/misc/extract-custom-emojis-from-mfm.ts
index b29ce281b3..a0319d8dd5 100644
--- a/packages/backend/src/misc/extract-custom-emojis-from-mfm.ts
+++ b/packages/backend/src/misc/extract-custom-emojis-from-mfm.ts
@@ -1,5 +1,5 @@
import * as mfm from 'mfm-js';
-import { unique } from '@/prelude/array';
+import { unique } from '@/prelude/array.js';
export function extractCustomEmojisFromMfm(nodes: mfm.MfmNode[]): string[] {
const emojiNodes = mfm.extract(nodes, (node) => {
diff --git a/packages/backend/src/misc/extract-hashtags.ts b/packages/backend/src/misc/extract-hashtags.ts
index b0a74df219..0b0418eefd 100644
--- a/packages/backend/src/misc/extract-hashtags.ts
+++ b/packages/backend/src/misc/extract-hashtags.ts
@@ -1,5 +1,5 @@
import * as mfm from 'mfm-js';
-import { unique } from '@/prelude/array';
+import { unique } from '@/prelude/array.js';
export function extractHashtags(nodes: mfm.MfmNode[]): string[] {
const hashtagNodes = mfm.extract(nodes, (node) => node.type === 'hashtag');
diff --git a/packages/backend/src/misc/fetch-meta.ts b/packages/backend/src/misc/fetch-meta.ts
index b7b055d180..9f85d3d1db 100644
--- a/packages/backend/src/misc/fetch-meta.ts
+++ b/packages/backend/src/misc/fetch-meta.ts
@@ -1,4 +1,4 @@
-import { Meta } from '@/models/entities/meta';
+import { Meta } from '@/models/entities/meta.js';
import { getConnection } from 'typeorm';
let cache: Meta;
diff --git a/packages/backend/src/misc/fetch-proxy-account.ts b/packages/backend/src/misc/fetch-proxy-account.ts
index e0eedea4c8..ed8a4c794d 100644
--- a/packages/backend/src/misc/fetch-proxy-account.ts
+++ b/packages/backend/src/misc/fetch-proxy-account.ts
@@ -1,6 +1,6 @@
-import { fetchMeta } from './fetch-meta';
-import { ILocalUser } from '@/models/entities/user';
-import { Users } from '@/models/index';
+import { fetchMeta } from './fetch-meta.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
export async function fetchProxyAccount(): Promise<ILocalUser | null> {
const meta = await fetchMeta();
diff --git a/packages/backend/src/misc/fetch.ts b/packages/backend/src/misc/fetch.ts
index baebab1922..47a5cd471a 100644
--- a/packages/backend/src/misc/fetch.ts
+++ b/packages/backend/src/misc/fetch.ts
@@ -3,8 +3,8 @@ import * as https from 'https';
import CacheableLookup from 'cacheable-lookup';
import fetch from 'node-fetch';
import { HttpProxyAgent, HttpsProxyAgent } from 'hpagent';
-import config from '@/config/index';
-import { URL } from 'url';
+import config from '@/config/index.js';
+import { URL } from 'node:url';
export async function getJson(url: string, accept = 'application/json, */*', timeout = 10000, headers?: Record<string, string>) {
const res = await getResponse({
diff --git a/packages/backend/src/misc/gen-id.ts b/packages/backend/src/misc/gen-id.ts
index b1b542dc4b..fcf476857f 100644
--- a/packages/backend/src/misc/gen-id.ts
+++ b/packages/backend/src/misc/gen-id.ts
@@ -1,9 +1,9 @@
import { ulid } from 'ulid';
-import { genAid } from './id/aid';
-import { genMeid } from './id/meid';
-import { genMeidg } from './id/meidg';
-import { genObjectId } from './id/object-id';
-import config from '@/config/index';
+import { genAid } from './id/aid.js';
+import { genMeid } from './id/meid.js';
+import { genMeidg } from './id/meidg.js';
+import { genObjectId } from './id/object-id.js';
+import config from '@/config/index.js';
const metohd = config.id.toLowerCase();
diff --git a/packages/backend/src/misc/gen-identicon.ts b/packages/backend/src/misc/gen-identicon.ts
index 5cedd7afaf..9b30e5dbd4 100644
--- a/packages/backend/src/misc/gen-identicon.ts
+++ b/packages/backend/src/misc/gen-identicon.ts
@@ -3,9 +3,9 @@
* https://en.wikipedia.org/wiki/Identicon
*/
+import { WriteStream } from 'node:fs';
import * as p from 'pureimage';
-import * as gen from 'random-seed';
-import { WriteStream } from 'fs';
+import gen from 'random-seed';
const size = 256; // px
const n = 5; // resolution
@@ -39,7 +39,7 @@ const sideN = Math.floor(n / 2);
*/
export function genIdenticon(seed: string, stream: WriteStream): Promise<void> {
const rand = gen.create(seed);
- const canvas = p.make(size, size);
+ const canvas = p.make(size, size, undefined);
const ctx = canvas.getContext('2d');
ctx.fillStyle = bg;
diff --git a/packages/backend/src/misc/gen-key-pair.ts b/packages/backend/src/misc/gen-key-pair.ts
index 9db6b2a3ea..e2ad598501 100644
--- a/packages/backend/src/misc/gen-key-pair.ts
+++ b/packages/backend/src/misc/gen-key-pair.ts
@@ -1,5 +1,5 @@
-import * as crypto from 'crypto';
-import * as util from 'util';
+import * as crypto from 'node:crypto';
+import * as util from 'node:util';
const generateKeyPair = util.promisify(crypto.generateKeyPair);
diff --git a/packages/backend/src/misc/get-file-info.ts b/packages/backend/src/misc/get-file-info.ts
index 361cdd2951..48a5b40cc4 100644
--- a/packages/backend/src/misc/get-file-info.ts
+++ b/packages/backend/src/misc/get-file-info.ts
@@ -1,11 +1,11 @@
-import * as fs from 'fs';
-import * as crypto from 'crypto';
-import * as stream from 'stream';
-import * as util from 'util';
-import * as fileType from 'file-type';
+import * as fs from 'node:fs';
+import * as crypto from 'node:crypto';
+import * as stream from 'node:stream';
+import * as util from 'node:util';
+import fileType from 'file-type';
import isSvg from 'is-svg';
-import * as probeImageSize from 'probe-image-size';
-import * as sharp from 'sharp';
+import probeImageSize from 'probe-image-size';
+import sharp from 'sharp';
import { encode } from 'blurhash';
const pipeline = util.promisify(stream.pipeline);
diff --git a/packages/backend/src/misc/get-note-summary.ts b/packages/backend/src/misc/get-note-summary.ts
index d7273d1c5b..93783873da 100644
--- a/packages/backend/src/misc/get-note-summary.ts
+++ b/packages/backend/src/misc/get-note-summary.ts
@@ -1,4 +1,4 @@
-import { Packed } from './schema';
+import { Packed } from './schema.js';
/**
* 投稿を表す文字列を取得します。
diff --git a/packages/backend/src/misc/id/aid.ts b/packages/backend/src/misc/id/aid.ts
index 2bcde90bff..87e6888263 100644
--- a/packages/backend/src/misc/id/aid.ts
+++ b/packages/backend/src/misc/id/aid.ts
@@ -1,7 +1,7 @@
// AID
// 長さ8の[2000年1月1日からの経過ミリ秒をbase36でエンコードしたもの] + 長さ2の[ノイズ文字列]
-import * as crypto from 'crypto';
+import * as crypto from 'node:crypto';
const TIME2000 = 946684800000;
let counter = crypto.randomBytes(2).readUInt16LE(0);
diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts
index 23d8ceb1b7..04ff191e41 100644
--- a/packages/backend/src/misc/is-duplicate-key-value-error.ts
+++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts
@@ -1,3 +1,3 @@
-export function isDuplicateKeyValueError(e: Error): boolean {
- return e.message.startsWith('duplicate key value');
+export function isDuplicateKeyValueError(e: unknown | Error): boolean {
+ return (e as any).message && (e as Error).message.startsWith('duplicate key value');
}
diff --git a/packages/backend/src/misc/is-instance-muted.ts b/packages/backend/src/misc/is-instance-muted.ts
index 2e1785b517..a74ba524e3 100644
--- a/packages/backend/src/misc/is-instance-muted.ts
+++ b/packages/backend/src/misc/is-instance-muted.ts
@@ -1,4 +1,4 @@
-import { Packed } from "./schema";
+import { Packed } from './schema.js';
export function isInstanceMuted(note: Packed<'Note'>, mutedInstances: Set<string>): boolean {
if (mutedInstances.has(note?.user?.host ?? '')) return true;
diff --git a/packages/backend/src/misc/is-quote.ts b/packages/backend/src/misc/is-quote.ts
index 2b57f036a2..779f548b03 100644
--- a/packages/backend/src/misc/is-quote.ts
+++ b/packages/backend/src/misc/is-quote.ts
@@ -1,4 +1,4 @@
-import { Note } from '@/models/entities/note';
+import { Note } from '@/models/entities/note.js';
export default function(note: Note): boolean {
return note.renoteId != null && (note.text != null || note.hasPoll || (note.fileIds != null && note.fileIds.length > 0));
diff --git a/packages/backend/src/misc/keypair-store.ts b/packages/backend/src/misc/keypair-store.ts
index c018013b7b..3d505c0abb 100644
--- a/packages/backend/src/misc/keypair-store.ts
+++ b/packages/backend/src/misc/keypair-store.ts
@@ -1,7 +1,7 @@
-import { UserKeypairs } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { UserKeypair } from '@/models/entities/user-keypair';
-import { Cache } from './cache';
+import { UserKeypairs } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { UserKeypair } from '@/models/entities/user-keypair.js';
+import { Cache } from './cache.js';
const cache = new Cache<UserKeypair>(Infinity);
diff --git a/packages/backend/src/misc/langmap.ts b/packages/backend/src/misc/langmap.ts
new file mode 100644
index 0000000000..5ee85e6c09
--- /dev/null
+++ b/packages/backend/src/misc/langmap.ts
@@ -0,0 +1,666 @@
+// TODO: sharedに置いてフロントエンドのと統合したい
+export const langmap = {
+ 'ach': {
+ nativeName: 'Lwo',
+ },
+ 'ady': {
+ nativeName: 'Адыгэбзэ',
+ },
+ 'af': {
+ nativeName: 'Afrikaans',
+ },
+ 'af-NA': {
+ nativeName: 'Afrikaans (Namibia)',
+ },
+ 'af-ZA': {
+ nativeName: 'Afrikaans (South Africa)',
+ },
+ 'ak': {
+ nativeName: 'Tɕɥi',
+ },
+ 'ar': {
+ nativeName: 'العربية',
+ },
+ 'ar-AR': {
+ nativeName: 'العربية',
+ },
+ 'ar-MA': {
+ nativeName: 'العربية',
+ },
+ 'ar-SA': {
+ nativeName: 'العربية (السعودية)',
+ },
+ 'ay-BO': {
+ nativeName: 'Aymar aru',
+ },
+ 'az': {
+ nativeName: 'Azərbaycan dili',
+ },
+ 'az-AZ': {
+ nativeName: 'Azərbaycan dili',
+ },
+ 'be-BY': {
+ nativeName: 'Беларуская',
+ },
+ 'bg': {
+ nativeName: 'Български',
+ },
+ 'bg-BG': {
+ nativeName: 'Български',
+ },
+ 'bn': {
+ nativeName: 'বাংলা',
+ },
+ 'bn-IN': {
+ nativeName: 'বাংলা (ভারত)',
+ },
+ 'bn-BD': {
+ nativeName: 'বাংলা(বাংলাদেশ)',
+ },
+ 'br': {
+ nativeName: 'Brezhoneg',
+ },
+ 'bs-BA': {
+ nativeName: 'Bosanski',
+ },
+ 'ca': {
+ nativeName: 'Català',
+ },
+ 'ca-ES': {
+ nativeName: 'Català',
+ },
+ 'cak': {
+ nativeName: 'Maya Kaqchikel',
+ },
+ 'ck-US': {
+ nativeName: 'ᏣᎳᎩ (tsalagi)',
+ },
+ 'cs': {
+ nativeName: 'Čeština',
+ },
+ 'cs-CZ': {
+ nativeName: 'Čeština',
+ },
+ 'cy': {
+ nativeName: 'Cymraeg',
+ },
+ 'cy-GB': {
+ nativeName: 'Cymraeg',
+ },
+ 'da': {
+ nativeName: 'Dansk',
+ },
+ 'da-DK': {
+ nativeName: 'Dansk',
+ },
+ 'de': {
+ nativeName: 'Deutsch',
+ },
+ 'de-AT': {
+ nativeName: 'Deutsch (Österreich)',
+ },
+ 'de-DE': {
+ nativeName: 'Deutsch (Deutschland)',
+ },
+ 'de-CH': {
+ nativeName: 'Deutsch (Schweiz)',
+ },
+ 'dsb': {
+ nativeName: 'Dolnoserbšćina',
+ },
+ 'el': {
+ nativeName: 'Ελληνικά',
+ },
+ 'el-GR': {
+ nativeName: 'Ελληνικά',
+ },
+ 'en': {
+ nativeName: 'English',
+ },
+ 'en-GB': {
+ nativeName: 'English (UK)',
+ },
+ 'en-AU': {
+ nativeName: 'English (Australia)',
+ },
+ 'en-CA': {
+ nativeName: 'English (Canada)',
+ },
+ 'en-IE': {
+ nativeName: 'English (Ireland)',
+ },
+ 'en-IN': {
+ nativeName: 'English (India)',
+ },
+ 'en-PI': {
+ nativeName: 'English (Pirate)',
+ },
+ 'en-SG': {
+ nativeName: 'English (Singapore)',
+ },
+ 'en-UD': {
+ nativeName: 'English (Upside Down)',
+ },
+ 'en-US': {
+ nativeName: 'English (US)',
+ },
+ 'en-ZA': {
+ nativeName: 'English (South Africa)',
+ },
+ 'en@pirate': {
+ nativeName: 'English (Pirate)',
+ },
+ 'eo': {
+ nativeName: 'Esperanto',
+ },
+ 'eo-EO': {
+ nativeName: 'Esperanto',
+ },
+ 'es': {
+ nativeName: 'Español',
+ },
+ 'es-AR': {
+ nativeName: 'Español (Argentine)',
+ },
+ 'es-419': {
+ nativeName: 'Español (Latinoamérica)',
+ },
+ 'es-CL': {
+ nativeName: 'Español (Chile)',
+ },
+ 'es-CO': {
+ nativeName: 'Español (Colombia)',
+ },
+ 'es-EC': {
+ nativeName: 'Español (Ecuador)',
+ },
+ 'es-ES': {
+ nativeName: 'Español (España)',
+ },
+ 'es-LA': {
+ nativeName: 'Español (Latinoamérica)',
+ },
+ 'es-NI': {
+ nativeName: 'Español (Nicaragua)',
+ },
+ 'es-MX': {
+ nativeName: 'Español (México)',
+ },
+ 'es-US': {
+ nativeName: 'Español (Estados Unidos)',
+ },
+ 'es-VE': {
+ nativeName: 'Español (Venezuela)',
+ },
+ 'et': {
+ nativeName: 'eesti keel',
+ },
+ 'et-EE': {
+ nativeName: 'Eesti (Estonia)',
+ },
+ 'eu': {
+ nativeName: 'Euskara',
+ },
+ 'eu-ES': {
+ nativeName: 'Euskara',
+ },
+ 'fa': {
+ nativeName: 'فارسی',
+ },
+ 'fa-IR': {
+ nativeName: 'فارسی',
+ },
+ 'fb-LT': {
+ nativeName: 'Leet Speak',
+ },
+ 'ff': {
+ nativeName: 'Fulah',
+ },
+ 'fi': {
+ nativeName: 'Suomi',
+ },
+ 'fi-FI': {
+ nativeName: 'Suomi',
+ },
+ 'fo': {
+ nativeName: 'Føroyskt',
+ },
+ 'fo-FO': {
+ nativeName: 'Føroyskt (Færeyjar)',
+ },
+ 'fr': {
+ nativeName: 'Français',
+ },
+ 'fr-CA': {
+ nativeName: 'Français (Canada)',
+ },
+ 'fr-FR': {
+ nativeName: 'Français (France)',
+ },
+ 'fr-BE': {
+ nativeName: 'Français (Belgique)',
+ },
+ 'fr-CH': {
+ nativeName: 'Français (Suisse)',
+ },
+ 'fy-NL': {
+ nativeName: 'Frysk',
+ },
+ 'ga': {
+ nativeName: 'Gaeilge',
+ },
+ 'ga-IE': {
+ nativeName: 'Gaeilge',
+ },
+ 'gd': {
+ nativeName: 'Gàidhlig',
+ },
+ 'gl': {
+ nativeName: 'Galego',
+ },
+ 'gl-ES': {
+ nativeName: 'Galego',
+ },
+ 'gn-PY': {
+ nativeName: 'Avañe\'ẽ',
+ },
+ 'gu-IN': {
+ nativeName: 'ગુજરાતી',
+ },
+ 'gv': {
+ nativeName: 'Gaelg',
+ },
+ 'gx-GR': {
+ nativeName: 'Ἑλληνική ἀρχαία',
+ },
+ 'he': {
+ nativeName: 'עברית‏',
+ },
+ 'he-IL': {
+ nativeName: 'עברית‏',
+ },
+ 'hi': {
+ nativeName: 'हिन्दी',
+ },
+ 'hi-IN': {
+ nativeName: 'हिन्दी',
+ },
+ 'hr': {
+ nativeName: 'Hrvatski',
+ },
+ 'hr-HR': {
+ nativeName: 'Hrvatski',
+ },
+ 'hsb': {
+ nativeName: 'Hornjoserbšćina',
+ },
+ 'ht': {
+ nativeName: 'Kreyòl',
+ },
+ 'hu': {
+ nativeName: 'Magyar',
+ },
+ 'hu-HU': {
+ nativeName: 'Magyar',
+ },
+ 'hy': {
+ nativeName: 'Հայերեն',
+ },
+ 'hy-AM': {
+ nativeName: 'Հայերեն (Հայաստան)',
+ },
+ 'id': {
+ nativeName: 'Bahasa Indonesia',
+ },
+ 'id-ID': {
+ nativeName: 'Bahasa Indonesia',
+ },
+ 'is': {
+ nativeName: 'Íslenska',
+ },
+ 'is-IS': {
+ nativeName: 'Íslenska (Iceland)',
+ },
+ 'it': {
+ nativeName: 'Italiano',
+ },
+ 'it-IT': {
+ nativeName: 'Italiano',
+ },
+ 'ja': {
+ nativeName: '日本語',
+ },
+ 'ja-JP': {
+ nativeName: '日本語 (日本)',
+ },
+ 'jv-ID': {
+ nativeName: 'Basa Jawa',
+ },
+ 'ka-GE': {
+ nativeName: 'ქართული',
+ },
+ 'kk-KZ': {
+ nativeName: 'Қазақша',
+ },
+ 'km': {
+ nativeName: 'ភាសាខ្មែរ',
+ },
+ 'kl': {
+ nativeName: 'kalaallisut',
+ },
+ 'km-KH': {
+ nativeName: 'ភាសាខ្មែរ',
+ },
+ 'kab': {
+ nativeName: 'Taqbaylit',
+ },
+ 'kn': {
+ nativeName: 'ಕನ್ನಡ',
+ },
+ 'kn-IN': {
+ nativeName: 'ಕನ್ನಡ (India)',
+ },
+ 'ko': {
+ nativeName: '한국어',
+ },
+ 'ko-KR': {
+ nativeName: '한국어 (한국)',
+ },
+ 'ku-TR': {
+ nativeName: 'Kurdî',
+ },
+ 'kw': {
+ nativeName: 'Kernewek',
+ },
+ 'la': {
+ nativeName: 'Latin',
+ },
+ 'la-VA': {
+ nativeName: 'Latin',
+ },
+ 'lb': {
+ nativeName: 'Lëtzebuergesch',
+ },
+ 'li-NL': {
+ nativeName: 'Lèmbörgs',
+ },
+ 'lt': {
+ nativeName: 'Lietuvių',
+ },
+ 'lt-LT': {
+ nativeName: 'Lietuvių',
+ },
+ 'lv': {
+ nativeName: 'Latviešu',
+ },
+ 'lv-LV': {
+ nativeName: 'Latviešu',
+ },
+ 'mai': {
+ nativeName: 'मैथिली, মৈথিলী',
+ },
+ 'mg-MG': {
+ nativeName: 'Malagasy',
+ },
+ 'mk': {
+ nativeName: 'Македонски',
+ },
+ 'mk-MK': {
+ nativeName: 'Македонски (Македонски)',
+ },
+ 'ml': {
+ nativeName: 'മലയാളം',
+ },
+ 'ml-IN': {
+ nativeName: 'മലയാളം',
+ },
+ 'mn-MN': {
+ nativeName: 'Монгол',
+ },
+ 'mr': {
+ nativeName: 'मराठी',
+ },
+ 'mr-IN': {
+ nativeName: 'मराठी',
+ },
+ 'ms': {
+ nativeName: 'Bahasa Melayu',
+ },
+ 'ms-MY': {
+ nativeName: 'Bahasa Melayu',
+ },
+ 'mt': {
+ nativeName: 'Malti',
+ },
+ 'mt-MT': {
+ nativeName: 'Malti',
+ },
+ 'my': {
+ nativeName: 'ဗမာစကာ',
+ },
+ 'no': {
+ nativeName: 'Norsk',
+ },
+ 'nb': {
+ nativeName: 'Norsk (bokmål)',
+ },
+ 'nb-NO': {
+ nativeName: 'Norsk (bokmål)',
+ },
+ 'ne': {
+ nativeName: 'नेपाली',
+ },
+ 'ne-NP': {
+ nativeName: 'नेपाली',
+ },
+ 'nl': {
+ nativeName: 'Nederlands',
+ },
+ 'nl-BE': {
+ nativeName: 'Nederlands (België)',
+ },
+ 'nl-NL': {
+ nativeName: 'Nederlands (Nederland)',
+ },
+ 'nn-NO': {
+ nativeName: 'Norsk (nynorsk)',
+ },
+ 'oc': {
+ nativeName: 'Occitan',
+ },
+ 'or-IN': {
+ nativeName: 'ଓଡ଼ିଆ',
+ },
+ 'pa': {
+ nativeName: 'ਪੰਜਾਬੀ',
+ },
+ 'pa-IN': {
+ nativeName: 'ਪੰਜਾਬੀ (ਭਾਰਤ ਨੂੰ)',
+ },
+ 'pl': {
+ nativeName: 'Polski',
+ },
+ 'pl-PL': {
+ nativeName: 'Polski',
+ },
+ 'ps-AF': {
+ nativeName: 'پښتو',
+ },
+ 'pt': {
+ nativeName: 'Português',
+ },
+ 'pt-BR': {
+ nativeName: 'Português (Brasil)',
+ },
+ 'pt-PT': {
+ nativeName: 'Português (Portugal)',
+ },
+ 'qu-PE': {
+ nativeName: 'Qhichwa',
+ },
+ 'rm-CH': {
+ nativeName: 'Rumantsch',
+ },
+ 'ro': {
+ nativeName: 'Română',
+ },
+ 'ro-RO': {
+ nativeName: 'Română',
+ },
+ 'ru': {
+ nativeName: 'Русский',
+ },
+ 'ru-RU': {
+ nativeName: 'Русский',
+ },
+ 'sa-IN': {
+ nativeName: 'संस्कृतम्',
+ },
+ 'se-NO': {
+ nativeName: 'Davvisámegiella',
+ },
+ 'sh': {
+ nativeName: 'српскохрватски',
+ },
+ 'si-LK': {
+ nativeName: 'සිංහල',
+ },
+ 'sk': {
+ nativeName: 'Slovenčina',
+ },
+ 'sk-SK': {
+ nativeName: 'Slovenčina (Slovakia)',
+ },
+ 'sl': {
+ nativeName: 'Slovenščina',
+ },
+ 'sl-SI': {
+ nativeName: 'Slovenščina',
+ },
+ 'so-SO': {
+ nativeName: 'Soomaaliga',
+ },
+ 'sq': {
+ nativeName: 'Shqip',
+ },
+ 'sq-AL': {
+ nativeName: 'Shqip',
+ },
+ 'sr': {
+ nativeName: 'Српски',
+ },
+ 'sr-RS': {
+ nativeName: 'Српски (Serbia)',
+ },
+ 'su': {
+ nativeName: 'Basa Sunda',
+ },
+ 'sv': {
+ nativeName: 'Svenska',
+ },
+ 'sv-SE': {
+ nativeName: 'Svenska',
+ },
+ 'sw': {
+ nativeName: 'Kiswahili',
+ },
+ 'sw-KE': {
+ nativeName: 'Kiswahili',
+ },
+ 'ta': {
+ nativeName: 'தமிழ்',
+ },
+ 'ta-IN': {
+ nativeName: 'தமிழ்',
+ },
+ 'te': {
+ nativeName: 'తెలుగు',
+ },
+ 'te-IN': {
+ nativeName: 'తెలుగు',
+ },
+ 'tg': {
+ nativeName: 'забо́ни тоҷикӣ́',
+ },
+ 'tg-TJ': {
+ nativeName: 'тоҷикӣ',
+ },
+ 'th': {
+ nativeName: 'ภาษาไทย',
+ },
+ 'th-TH': {
+ nativeName: 'ภาษาไทย (ประเทศไทย)',
+ },
+ 'fil': {
+ nativeName: 'Filipino',
+ },
+ 'tlh': {
+ nativeName: 'tlhIngan-Hol',
+ },
+ 'tr': {
+ nativeName: 'Türkçe',
+ },
+ 'tr-TR': {
+ nativeName: 'Türkçe',
+ },
+ 'tt-RU': {
+ nativeName: 'татарча',
+ },
+ 'uk': {
+ nativeName: 'Українська',
+ },
+ 'uk-UA': {
+ nativeName: 'Українська',
+ },
+ 'ur': {
+ nativeName: 'اردو',
+ },
+ 'ur-PK': {
+ nativeName: 'اردو',
+ },
+ 'uz': {
+ nativeName: 'O\'zbek',
+ },
+ 'uz-UZ': {
+ nativeName: 'O\'zbek',
+ },
+ 'vi': {
+ nativeName: 'Tiếng Việt',
+ },
+ 'vi-VN': {
+ nativeName: 'Tiếng Việt',
+ },
+ 'xh-ZA': {
+ nativeName: 'isiXhosa',
+ },
+ 'yi': {
+ nativeName: 'ייִדיש',
+ },
+ 'yi-DE': {
+ nativeName: 'ייִדיש (German)',
+ },
+ 'zh': {
+ nativeName: '中文',
+ },
+ 'zh-Hans': {
+ nativeName: '中文简体',
+ },
+ 'zh-Hant': {
+ nativeName: '中文繁體',
+ },
+ 'zh-CN': {
+ nativeName: '中文(中国大陆)',
+ },
+ 'zh-HK': {
+ nativeName: '中文(香港)',
+ },
+ 'zh-SG': {
+ nativeName: '中文(新加坡)',
+ },
+ 'zh-TW': {
+ nativeName: '中文(台灣)',
+ },
+ 'zu-ZA': {
+ nativeName: 'isiZulu',
+ },
+};
diff --git a/packages/backend/src/misc/populate-emojis.ts b/packages/backend/src/misc/populate-emojis.ts
index 26c05e5fa6..4953c6890b 100644
--- a/packages/backend/src/misc/populate-emojis.ts
+++ b/packages/backend/src/misc/populate-emojis.ts
@@ -1,12 +1,12 @@
import { In } from 'typeorm';
-import { Emojis } from '@/models/index';
-import { Emoji } from '@/models/entities/emoji';
-import { Note } from '@/models/entities/note';
-import { Cache } from './cache';
-import { isSelfHost, toPunyNullable } from './convert-host';
-import { decodeReaction } from './reaction-lib';
-import config from '@/config/index';
-import { query } from '@/prelude/url';
+import { Emojis } from '@/models/index.js';
+import { Emoji } from '@/models/entities/emoji.js';
+import { Note } from '@/models/entities/note.js';
+import { Cache } from './cache.js';
+import { isSelfHost, toPunyNullable } from './convert-host.js';
+import { decodeReaction } from './reaction-lib.js';
+import config from '@/config/index.js';
+import { query } from '@/prelude/url.js';
const cache = new Cache<Emoji | null>(1000 * 60 * 60 * 12);
diff --git a/packages/backend/src/misc/reaction-lib.ts b/packages/backend/src/misc/reaction-lib.ts
index 04b1e34ebe..086944ccfb 100644
--- a/packages/backend/src/misc/reaction-lib.ts
+++ b/packages/backend/src/misc/reaction-lib.ts
@@ -1,8 +1,8 @@
/* eslint-disable key-spacing */
-import { emojiRegex } from './emoji-regex';
-import { fetchMeta } from './fetch-meta';
-import { Emojis } from '@/models/index';
-import { toPunyNullable } from './convert-host';
+import { emojiRegex } from './emoji-regex.js';
+import { fetchMeta } from './fetch-meta.js';
+import { Emojis } from '@/models/index.js';
+import { toPunyNullable } from './convert-host.js';
const legacies: Record<string, string> = {
'like': '👍',
diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts
index 2dae954af9..5b69812090 100644
--- a/packages/backend/src/misc/schema.ts
+++ b/packages/backend/src/misc/schema.ts
@@ -6,29 +6,29 @@ import {
packedMeDetailedSchema,
packedUserDetailedSchema,
packedUserSchema,
-} from '@/models/schema/user';
-import { packedNoteSchema } from '@/models/schema/note';
-import { packedUserListSchema } from '@/models/schema/user-list';
-import { packedAppSchema } from '@/models/schema/app';
-import { packedMessagingMessageSchema } from '@/models/schema/messaging-message';
-import { packedNotificationSchema } from '@/models/schema/notification';
-import { packedDriveFileSchema } from '@/models/schema/drive-file';
-import { packedDriveFolderSchema } from '@/models/schema/drive-folder';
-import { packedFollowingSchema } from '@/models/schema/following';
-import { packedMutingSchema } from '@/models/schema/muting';
-import { packedBlockingSchema } from '@/models/schema/blocking';
-import { packedNoteReactionSchema } from '@/models/schema/note-reaction';
-import { packedHashtagSchema } from '@/models/schema/hashtag';
-import { packedPageSchema } from '@/models/schema/page';
-import { packedUserGroupSchema } from '@/models/schema/user-group';
-import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite';
-import { packedChannelSchema } from '@/models/schema/channel';
-import { packedAntennaSchema } from '@/models/schema/antenna';
-import { packedClipSchema } from '@/models/schema/clip';
-import { packedFederationInstanceSchema } from '@/models/schema/federation-instance';
-import { packedQueueCountSchema } from '@/models/schema/queue';
-import { packedGalleryPostSchema } from '@/models/schema/gallery-post';
-import { packedEmojiSchema } from '@/models/schema/emoji';
+} from '@/models/schema/user.js';
+import { packedNoteSchema } from '@/models/schema/note.js';
+import { packedUserListSchema } from '@/models/schema/user-list.js';
+import { packedAppSchema } from '@/models/schema/app.js';
+import { packedMessagingMessageSchema } from '@/models/schema/messaging-message.js';
+import { packedNotificationSchema } from '@/models/schema/notification.js';
+import { packedDriveFileSchema } from '@/models/schema/drive-file.js';
+import { packedDriveFolderSchema } from '@/models/schema/drive-folder.js';
+import { packedFollowingSchema } from '@/models/schema/following.js';
+import { packedMutingSchema } from '@/models/schema/muting.js';
+import { packedBlockingSchema } from '@/models/schema/blocking.js';
+import { packedNoteReactionSchema } from '@/models/schema/note-reaction.js';
+import { packedHashtagSchema } from '@/models/schema/hashtag.js';
+import { packedPageSchema } from '@/models/schema/page.js';
+import { packedUserGroupSchema } from '@/models/schema/user-group.js';
+import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite.js';
+import { packedChannelSchema } from '@/models/schema/channel.js';
+import { packedAntennaSchema } from '@/models/schema/antenna.js';
+import { packedClipSchema } from '@/models/schema/clip.js';
+import { packedFederationInstanceSchema } from '@/models/schema/federation-instance.js';
+import { packedQueueCountSchema } from '@/models/schema/queue.js';
+import { packedGalleryPostSchema } from '@/models/schema/gallery-post.js';
+import { packedEmojiSchema } from '@/models/schema/emoji.js';
export const refs = {
UserLite: packedUserLiteSchema,
@@ -63,18 +63,13 @@ export const refs = {
Emoji: packedEmojiSchema,
};
-// Packed = SchemaTypeDef<typeof refs[x]>; とすると展開されてマウスホバー時に型表示が使い物にならなくなる
-// ObjType<r['properties']>を指定すると(なぜか)展開されずにPacked<'Hoge'>と表示される
-type PackedDef<r extends { properties?: Obj; oneOf?: ReadonlyArray<MinimumSchema>; allOf?: ReadonlyArray<MinimumSchema> }> =
- r['allOf'] extends ReadonlyArray<MinimumSchema> ? UnionToIntersection<UnionSchemaType<r['allOf']>> :
- r['oneOf'] extends ReadonlyArray<MinimumSchema> ? UnionSchemaType<r['oneOf']> :
- r['properties'] extends Obj ? ObjType<r['properties']> :
- never;
-export type Packed<x extends keyof typeof refs> = PackedDef<typeof refs[x]>;
+export type Packed<x extends keyof typeof refs> = SchemaType<typeof refs[x]>;
-type TypeStringef = 'boolean' | 'number' | 'string' | 'array' | 'object' | 'any';
+type TypeStringef = 'null' | 'boolean' | 'integer' | 'number' | 'string' | 'array' | 'object' | 'any';
type StringDefToType<T extends TypeStringef> =
+ T extends 'null' ? null :
T extends 'boolean' ? boolean :
+ T extends 'integer' ? number :
T extends 'number' ? number :
T extends 'string' ? string | Date :
T extends 'array' ? ReadonlyArray<any> :
@@ -83,17 +78,18 @@ type StringDefToType<T extends TypeStringef> =
// https://swagger.io/specification/?sbsearch=optional#schema-object
type OfSchema = {
- readonly anyOf?: ReadonlyArray<MinimumSchema>;
- readonly oneOf?: ReadonlyArray<MinimumSchema>;
- readonly allOf?: ReadonlyArray<MinimumSchema>;
+ readonly anyOf?: ReadonlyArray<Schema>;
+ readonly oneOf?: ReadonlyArray<Schema>;
+ readonly allOf?: ReadonlyArray<Schema>;
}
-export interface MinimumSchema extends OfSchema {
+export interface Schema extends OfSchema {
readonly type?: TypeStringef;
readonly nullable?: boolean;
readonly optional?: boolean;
- readonly items?: MinimumSchema;
+ readonly items?: Schema;
readonly properties?: Obj;
+ readonly required?: ReadonlyArray<keyof NonNullable<this['properties']>>;
readonly description?: string;
readonly example?: any;
readonly format?: string;
@@ -104,26 +100,22 @@ export interface MinimumSchema extends OfSchema {
readonly minLength?: number;
}
-export interface Schema extends MinimumSchema {
- readonly nullable: boolean;
- readonly optional: boolean;
-}
-
-type NonUndefinedPropertyNames<T extends Obj> = {
- [K in keyof T]: T[K]['optional'] extends true ? never : K
-}[keyof T];
-
-type UndefinedPropertyNames<T extends Obj> = {
- [K in keyof T]: T[K]['optional'] extends true ? K : never
-}[keyof T];
+type RequiredPropertyNames<s extends Obj> = {
+ [K in keyof s]:
+ // K is not optional
+ s[K]['optional'] extends false ? K :
+ // K has default value
+ s[K]['default'] extends null | string | number | boolean | Record<string, unknown> ? K : never
+}[keyof s];
export interface Obj { [key: string]: Schema; }
-export type ObjType<s extends Obj> =
- { -readonly [P in UndefinedPropertyNames<s>]?: SchemaType<s[P]> } &
- { -readonly [P in NonUndefinedPropertyNames<s>]: SchemaType<s[P]> };
+export type ObjType<s extends Obj, RequiredProps extends keyof s> =
+ { -readonly [P in keyof s]?: SchemaType<s[P]> } &
+ { -readonly [P in RequiredProps]: SchemaType<s[P]> } &
+ { -readonly [P in RequiredPropertyNames<s>]: SchemaType<s[P]> };
-type NullOrUndefined<p extends MinimumSchema, T> =
+type NullOrUndefined<p extends Schema, T> =
p['nullable'] extends true
? p['optional'] extends true
? (T | null | undefined)
@@ -132,15 +124,18 @@ type NullOrUndefined<p extends MinimumSchema, T> =
? (T | undefined)
: T;
-// 共用体型を交差型にする型 https://stackoverflow.com/questions/54938141/typescript-convert-union-to-intersection
+// https://stackoverflow.com/questions/54938141/typescript-convert-union-to-intersection
+// Get intersection from union
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
// https://github.com/misskey-dev/misskey/pull/8144#discussion_r785287552
-// 単純にSchemaTypeDef<X>で判定するだけではダメ
-type UnionSchemaType<a extends readonly any[], X extends MinimumSchema = a[number]> = X extends any ? SchemaType<X> : never;
+// To get union, we use `Foo extends any ? Hoge<Foo> : never`
+type UnionSchemaType<a extends readonly any[], X extends Schema = a[number]> = X extends any ? SchemaType<X> : never;
type ArrayUnion<T> = T extends any ? Array<T> : never;
-export type SchemaTypeDef<p extends MinimumSchema> =
+export type SchemaTypeDef<p extends Schema> =
+ p['type'] extends 'null' ? null :
+ p['type'] extends 'integer' ? number :
p['type'] extends 'number' ? number :
p['type'] extends 'string' ? (
p['enum'] extends readonly string[] ?
@@ -151,22 +146,22 @@ export type SchemaTypeDef<p extends MinimumSchema> =
p['type'] extends 'boolean' ? boolean :
p['type'] extends 'object' ? (
p['ref'] extends keyof typeof refs ? Packed<p['ref']> :
- p['properties'] extends NonNullable<Obj> ? ObjType<p['properties']> :
- p['anyOf'] extends ReadonlyArray<MinimumSchema> ? UnionSchemaType<p['anyOf']> & Partial<UnionToIntersection<UnionSchemaType<p['anyOf']>>> :
- p['allOf'] extends ReadonlyArray<MinimumSchema> ? UnionToIntersection<UnionSchemaType<p['allOf']>> :
+ p['properties'] extends NonNullable<Obj> ? ObjType<p['properties'], NonNullable<p['required']>[number]> :
+ p['anyOf'] extends ReadonlyArray<Schema> ? UnionSchemaType<p['anyOf']> & Partial<UnionToIntersection<UnionSchemaType<p['anyOf']>>> :
+ p['allOf'] extends ReadonlyArray<Schema> ? UnionToIntersection<UnionSchemaType<p['allOf']>> :
any
) :
p['type'] extends 'array' ? (
p['items'] extends OfSchema ? (
- p['items']['anyOf'] extends ReadonlyArray<MinimumSchema> ? UnionSchemaType<NonNullable<p['items']['anyOf']>>[] :
- p['items']['oneOf'] extends ReadonlyArray<MinimumSchema> ? ArrayUnion<UnionSchemaType<NonNullable<p['items']['oneOf']>>> :
- p['items']['allOf'] extends ReadonlyArray<MinimumSchema> ? UnionToIntersection<UnionSchemaType<NonNullable<p['items']['allOf']>>>[] :
+ p['items']['anyOf'] extends ReadonlyArray<Schema> ? UnionSchemaType<NonNullable<p['items']['anyOf']>>[] :
+ p['items']['oneOf'] extends ReadonlyArray<Schema> ? ArrayUnion<UnionSchemaType<NonNullable<p['items']['oneOf']>>> :
+ p['items']['allOf'] extends ReadonlyArray<Schema> ? UnionToIntersection<UnionSchemaType<NonNullable<p['items']['allOf']>>>[] :
never
) :
- p['items'] extends NonNullable<MinimumSchema> ? SchemaTypeDef<p['items']>[] :
+ p['items'] extends NonNullable<Schema> ? SchemaTypeDef<p['items']>[] :
any[]
) :
- p['oneOf'] extends ReadonlyArray<MinimumSchema> ? UnionSchemaType<p['oneOf']> :
+ p['oneOf'] extends ReadonlyArray<Schema> ? UnionSchemaType<p['oneOf']> :
any;
-export type SchemaType<p extends MinimumSchema> = NullOrUndefined<p, SchemaTypeDef<p>>;
+export type SchemaType<p extends Schema> = NullOrUndefined<p, SchemaTypeDef<p>>;
diff --git a/packages/backend/src/misc/secure-rndstr.ts b/packages/backend/src/misc/secure-rndstr.ts
index 76ee1225eb..8d4fcb1ba9 100644
--- a/packages/backend/src/misc/secure-rndstr.ts
+++ b/packages/backend/src/misc/secure-rndstr.ts
@@ -1,4 +1,4 @@
-import * as crypto from 'crypto';
+import * as crypto from 'node:crypto';
const L_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz';
const LU_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
diff --git a/packages/backend/src/misc/show-machine-info.ts b/packages/backend/src/misc/show-machine-info.ts
index 58747c1152..bc71cfbe96 100644
--- a/packages/backend/src/misc/show-machine-info.ts
+++ b/packages/backend/src/misc/show-machine-info.ts
@@ -1,6 +1,6 @@
-import * as os from 'os';
-import * as sysUtils from 'systeminformation';
-import Logger from '@/services/logger';
+import * as os from 'node:os';
+import sysUtils from 'systeminformation';
+import Logger from '@/services/logger.js';
export async function showMachineInfo(parentLogger: Logger) {
const logger = parentLogger.createSubLogger('machine');
diff --git a/packages/backend/src/models/entities/abuse-user-report.ts b/packages/backend/src/models/entities/abuse-user-report.ts
index 27c1e47fd8..6ac5635528 100644
--- a/packages/backend/src/models/entities/abuse-user-report.ts
+++ b/packages/backend/src/models/entities/abuse-user-report.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class AbuseUserReport {
diff --git a/packages/backend/src/models/entities/access-token.ts b/packages/backend/src/models/entities/access-token.ts
index 33b60e44f3..69cdc49cec 100644
--- a/packages/backend/src/models/entities/access-token.ts
+++ b/packages/backend/src/models/entities/access-token.ts
@@ -1,7 +1,7 @@
import { Entity, PrimaryColumn, Index, Column, ManyToOne, JoinColumn } from 'typeorm';
-import { User } from './user';
-import { App } from './app';
-import { id } from '../id';
+import { User } from './user.js';
+import { App } from './app.js';
+import { id } from '../id.js';
@Entity()
export class AccessToken {
diff --git a/packages/backend/src/models/entities/ad.ts b/packages/backend/src/models/entities/ad.ts
index 68be4ab1ca..36b758f205 100644
--- a/packages/backend/src/models/entities/ad.ts
+++ b/packages/backend/src/models/entities/ad.ts
@@ -1,5 +1,5 @@
import { Entity, Index, Column, PrimaryColumn } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class Ad {
diff --git a/packages/backend/src/models/entities/announcement-read.ts b/packages/backend/src/models/entities/announcement-read.ts
index 88a1966e28..e4d256a864 100644
--- a/packages/backend/src/models/entities/announcement-read.ts
+++ b/packages/backend/src/models/entities/announcement-read.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Announcement } from './announcement';
-import { id } from '../id';
+import { User } from './user.js';
+import { Announcement } from './announcement.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'announcementId'], { unique: true })
diff --git a/packages/backend/src/models/entities/announcement.ts b/packages/backend/src/models/entities/announcement.ts
index 3448bb6861..beb2f82462 100644
--- a/packages/backend/src/models/entities/announcement.ts
+++ b/packages/backend/src/models/entities/announcement.ts
@@ -1,5 +1,5 @@
import { Entity, Index, Column, PrimaryColumn } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class Announcement {
diff --git a/packages/backend/src/models/entities/antenna-note.ts b/packages/backend/src/models/entities/antenna-note.ts
index a72da423de..fcca493fe0 100644
--- a/packages/backend/src/models/entities/antenna-note.ts
+++ b/packages/backend/src/models/entities/antenna-note.ts
@@ -1,7 +1,7 @@
import { Entity, Index, JoinColumn, Column, ManyToOne, PrimaryColumn } from 'typeorm';
-import { Note } from './note';
-import { Antenna } from './antenna';
-import { id } from '../id';
+import { Note } from './note.js';
+import { Antenna } from './antenna.js';
+import { id } from '../id.js';
@Entity()
@Index(['noteId', 'antennaId'], { unique: true })
diff --git a/packages/backend/src/models/entities/antenna.ts b/packages/backend/src/models/entities/antenna.ts
index ffe7cc7e3d..6c8bb13e50 100644
--- a/packages/backend/src/models/entities/antenna.ts
+++ b/packages/backend/src/models/entities/antenna.ts
@@ -1,8 +1,8 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { UserList } from './user-list';
-import { UserGroupJoining } from './user-group-joining';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { UserList } from './user-list.js';
+import { UserGroupJoining } from './user-group-joining.js';
@Entity()
export class Antenna {
diff --git a/packages/backend/src/models/entities/app.ts b/packages/backend/src/models/entities/app.ts
index c1efdc0705..46c11548a5 100644
--- a/packages/backend/src/models/entities/app.ts
+++ b/packages/backend/src/models/entities/app.ts
@@ -1,6 +1,6 @@
import { Entity, PrimaryColumn, Column, Index, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class App {
diff --git a/packages/backend/src/models/entities/attestation-challenge.ts b/packages/backend/src/models/entities/attestation-challenge.ts
index cf3527059e..c40df23293 100644
--- a/packages/backend/src/models/entities/attestation-challenge.ts
+++ b/packages/backend/src/models/entities/attestation-challenge.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, JoinColumn, Column, ManyToOne, Index } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class AttestationChallenge {
diff --git a/packages/backend/src/models/entities/auth-session.ts b/packages/backend/src/models/entities/auth-session.ts
index 1991385525..b825856201 100644
--- a/packages/backend/src/models/entities/auth-session.ts
+++ b/packages/backend/src/models/entities/auth-session.ts
@@ -1,7 +1,7 @@
import { Entity, PrimaryColumn, Index, Column, ManyToOne, JoinColumn } from 'typeorm';
-import { User } from './user';
-import { App } from './app';
-import { id } from '../id';
+import { User } from './user.js';
+import { App } from './app.js';
+import { id } from '../id.js';
@Entity()
export class AuthSession {
diff --git a/packages/backend/src/models/entities/blocking.ts b/packages/backend/src/models/entities/blocking.ts
index aacbfef7fd..4ac73a00b5 100644
--- a/packages/backend/src/models/entities/blocking.ts
+++ b/packages/backend/src/models/entities/blocking.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['blockerId', 'blockeeId'], { unique: true })
diff --git a/packages/backend/src/models/entities/channel-following.ts b/packages/backend/src/models/entities/channel-following.ts
index 3727283a28..029dd6cf1a 100644
--- a/packages/backend/src/models/entities/channel-following.ts
+++ b/packages/backend/src/models/entities/channel-following.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { Channel } from './channel';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { Channel } from './channel.js';
@Entity()
@Index(['followerId', 'followeeId'], { unique: true })
diff --git a/packages/backend/src/models/entities/channel-note-pining.ts b/packages/backend/src/models/entities/channel-note-pining.ts
index d6b6774033..23be3b69d4 100644
--- a/packages/backend/src/models/entities/channel-note-pining.ts
+++ b/packages/backend/src/models/entities/channel-note-pining.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { Note } from './note';
-import { Channel } from './channel';
-import { id } from '../id';
+import { Note } from './note.js';
+import { Channel } from './channel.js';
+import { id } from '../id.js';
@Entity()
@Index(['channelId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/channel.ts b/packages/backend/src/models/entities/channel.ts
index a6767b038f..abf6668bd2 100644
--- a/packages/backend/src/models/entities/channel.ts
+++ b/packages/backend/src/models/entities/channel.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { DriveFile } from './drive-file';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { DriveFile } from './drive-file.js';
@Entity()
export class Channel {
diff --git a/packages/backend/src/models/entities/clip-note.ts b/packages/backend/src/models/entities/clip-note.ts
index 2bc4352266..6f36885508 100644
--- a/packages/backend/src/models/entities/clip-note.ts
+++ b/packages/backend/src/models/entities/clip-note.ts
@@ -1,7 +1,7 @@
import { Entity, Index, JoinColumn, Column, ManyToOne, PrimaryColumn } from 'typeorm';
-import { Note } from './note';
-import { Clip } from './clip';
-import { id } from '../id';
+import { Note } from './note.js';
+import { Clip } from './clip.js';
+import { id } from '../id.js';
@Entity()
@Index(['noteId', 'clipId'], { unique: true })
diff --git a/packages/backend/src/models/entities/clip.ts b/packages/backend/src/models/entities/clip.ts
index 84f5c4d214..da6b3c7a7f 100644
--- a/packages/backend/src/models/entities/clip.ts
+++ b/packages/backend/src/models/entities/clip.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class Clip {
diff --git a/packages/backend/src/models/entities/drive-file.ts b/packages/backend/src/models/entities/drive-file.ts
index cec86880f5..3d375f0e35 100644
--- a/packages/backend/src/models/entities/drive-file.ts
+++ b/packages/backend/src/models/entities/drive-file.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { DriveFolder } from './drive-folder';
-import { id } from '../id';
+import { User } from './user.js';
+import { DriveFolder } from './drive-folder.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'folderId', 'id'])
diff --git a/packages/backend/src/models/entities/drive-folder.ts b/packages/backend/src/models/entities/drive-folder.ts
index 09f5e6448e..d4022c6ebc 100644
--- a/packages/backend/src/models/entities/drive-folder.ts
+++ b/packages/backend/src/models/entities/drive-folder.ts
@@ -1,6 +1,6 @@
import { JoinColumn, ManyToOne, Entity, PrimaryColumn, Index, Column } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class DriveFolder {
diff --git a/packages/backend/src/models/entities/emoji.ts b/packages/backend/src/models/entities/emoji.ts
index 2e9c11d21c..b72ca72331 100644
--- a/packages/backend/src/models/entities/emoji.ts
+++ b/packages/backend/src/models/entities/emoji.ts
@@ -1,5 +1,5 @@
import { PrimaryColumn, Entity, Index, Column } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
@Index(['name', 'host'], { unique: true })
diff --git a/packages/backend/src/models/entities/follow-request.ts b/packages/backend/src/models/entities/follow-request.ts
index 6aa202299a..89946f6d35 100644
--- a/packages/backend/src/models/entities/follow-request.ts
+++ b/packages/backend/src/models/entities/follow-request.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['followerId', 'followeeId'], { unique: true })
diff --git a/packages/backend/src/models/entities/following.ts b/packages/backend/src/models/entities/following.ts
index c3631e8501..b283ca7e8a 100644
--- a/packages/backend/src/models/entities/following.ts
+++ b/packages/backend/src/models/entities/following.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['followerId', 'followeeId'], { unique: true })
@@ -41,6 +41,7 @@ export class Following {
public follower: User | null;
//#region Denormalized fields
+ @Index()
@Column('varchar', {
length: 128, nullable: true,
comment: '[Denormalized]',
@@ -59,6 +60,7 @@ export class Following {
})
public followerSharedInbox: string | null;
+ @Index()
@Column('varchar', {
length: 128, nullable: true,
comment: '[Denormalized]',
diff --git a/packages/backend/src/models/entities/gallery-like.ts b/packages/backend/src/models/entities/gallery-like.ts
index 41615dcea9..4ce166d194 100644
--- a/packages/backend/src/models/entities/gallery-like.ts
+++ b/packages/backend/src/models/entities/gallery-like.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { GalleryPost } from './gallery-post';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { GalleryPost } from './gallery-post.js';
@Entity()
@Index(['userId', 'postId'], { unique: true })
diff --git a/packages/backend/src/models/entities/gallery-post.ts b/packages/backend/src/models/entities/gallery-post.ts
index 393603e3d9..774cb946e9 100644
--- a/packages/backend/src/models/entities/gallery-post.ts
+++ b/packages/backend/src/models/entities/gallery-post.ts
@@ -1,7 +1,7 @@
import { Entity, Index, JoinColumn, Column, PrimaryColumn, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { DriveFile } from './drive-file';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { DriveFile } from './drive-file.js';
@Entity()
export class GalleryPost {
diff --git a/packages/backend/src/models/entities/hashtag.ts b/packages/backend/src/models/entities/hashtag.ts
index 761974590a..6bd991f629 100644
--- a/packages/backend/src/models/entities/hashtag.ts
+++ b/packages/backend/src/models/entities/hashtag.ts
@@ -1,6 +1,6 @@
import { Entity, PrimaryColumn, Index, Column } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class Hashtag {
diff --git a/packages/backend/src/models/entities/instance.ts b/packages/backend/src/models/entities/instance.ts
index d1314be178..c15c80ff43 100644
--- a/packages/backend/src/models/entities/instance.ts
+++ b/packages/backend/src/models/entities/instance.ts
@@ -1,5 +1,5 @@
import { Entity, PrimaryColumn, Index, Column } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class Instance {
diff --git a/packages/backend/src/models/entities/messaging-message.ts b/packages/backend/src/models/entities/messaging-message.ts
index 06ae005de9..099fb7aa01 100644
--- a/packages/backend/src/models/entities/messaging-message.ts
+++ b/packages/backend/src/models/entities/messaging-message.ts
@@ -1,8 +1,8 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { DriveFile } from './drive-file';
-import { id } from '../id';
-import { UserGroup } from './user-group';
+import { User } from './user.js';
+import { DriveFile } from './drive-file.js';
+import { id } from '../id.js';
+import { UserGroup } from './user-group.js';
@Entity()
export class MessagingMessage {
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index c462d5ade6..4d58b5f04f 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -1,7 +1,7 @@
import { Entity, Column, PrimaryColumn, ManyToOne, JoinColumn } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { Clip } from './clip';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { Clip } from './clip.js';
@Entity()
export class Meta {
@@ -91,6 +91,12 @@ export class Meta {
@Column('varchar', {
length: 512,
nullable: true,
+ })
+ public themeColor: string | null;
+
+ @Column('varchar', {
+ length: 512,
+ nullable: true,
default: '/assets/ai.png',
})
public mascotImageUrl: string | null;
@@ -131,11 +137,6 @@ export class Meta {
})
public cacheRemoteFiles: boolean;
- @Column('boolean', {
- default: false,
- })
- public proxyRemoteFiles: boolean;
-
@Column({
...id(),
nullable: true,
@@ -199,12 +200,6 @@ export class Meta {
})
public remoteDriveCapacityMb: number;
- @Column('integer', {
- default: 500,
- comment: 'Max allowed note text length in characters',
- })
- public maxNoteTextLength: number;
-
@Column('varchar', {
length: 128,
nullable: true,
@@ -349,6 +344,20 @@ export class Meta {
})
public feedbackUrl: string | null;
+ @Column('varchar', {
+ length: 8192,
+ default: null,
+ nullable: true,
+ })
+ public defaultLightTheme: string | null;
+
+ @Column('varchar', {
+ length: 8192,
+ default: null,
+ nullable: true,
+ })
+ public defaultDarkTheme: string | null;
+
@Column('boolean', {
default: false,
})
diff --git a/packages/backend/src/models/entities/moderation-log.ts b/packages/backend/src/models/entities/moderation-log.ts
index fe000e14f2..c99e550782 100644
--- a/packages/backend/src/models/entities/moderation-log.ts
+++ b/packages/backend/src/models/entities/moderation-log.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class ModerationLog {
diff --git a/packages/backend/src/models/entities/muted-note.ts b/packages/backend/src/models/entities/muted-note.ts
index b01bb0551a..96a4fa8e33 100644
--- a/packages/backend/src/models/entities/muted-note.ts
+++ b/packages/backend/src/models/entities/muted-note.ts
@@ -1,8 +1,8 @@
import { Entity, Index, JoinColumn, Column, ManyToOne, PrimaryColumn } from 'typeorm';
-import { Note } from './note';
-import { User } from './user';
-import { id } from '../id';
-import { mutedNoteReasons } from '../../types';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { mutedNoteReasons } from '../../types.js';
@Entity()
@Index(['noteId', 'userId'], { unique: true })
diff --git a/packages/backend/src/models/entities/muting.ts b/packages/backend/src/models/entities/muting.ts
index b9f18a5852..8cdd2af9d1 100644
--- a/packages/backend/src/models/entities/muting.ts
+++ b/packages/backend/src/models/entities/muting.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['muterId', 'muteeId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note-favorite.ts b/packages/backend/src/models/entities/note-favorite.ts
index 69d9b49d13..fe065b77a8 100644
--- a/packages/backend/src/models/entities/note-favorite.ts
+++ b/packages/backend/src/models/entities/note-favorite.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { Note } from './note';
-import { User } from './user';
-import { id } from '../id';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note-reaction.ts b/packages/backend/src/models/entities/note-reaction.ts
index 369505a6c6..d7bc609898 100644
--- a/packages/backend/src/models/entities/note-reaction.ts
+++ b/packages/backend/src/models/entities/note-reaction.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Note } from './note';
-import { id } from '../id';
+import { User } from './user.js';
+import { Note } from './note.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note-thread-muting.ts b/packages/backend/src/models/entities/note-thread-muting.ts
index f4a3a48876..8c5f7bbab4 100644
--- a/packages/backend/src/models/entities/note-thread-muting.ts
+++ b/packages/backend/src/models/entities/note-thread-muting.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Note } from './note';
-import { id } from '../id';
+import { User } from './user.js';
+import { Note } from './note.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'threadId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note-unread.ts b/packages/backend/src/models/entities/note-unread.ts
index 952f71cdaa..a7acf254d3 100644
--- a/packages/backend/src/models/entities/note-unread.ts
+++ b/packages/backend/src/models/entities/note-unread.ts
@@ -1,8 +1,8 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Note } from './note';
-import { id } from '../id';
-import { Channel } from './channel';
+import { User } from './user.js';
+import { Note } from './note.js';
+import { id } from '../id.js';
+import { Channel } from './channel.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note-watching.ts b/packages/backend/src/models/entities/note-watching.ts
index 2758efdc35..ed82e7dfe7 100644
--- a/packages/backend/src/models/entities/note-watching.ts
+++ b/packages/backend/src/models/entities/note-watching.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Note } from './note';
-import { id } from '../id';
+import { User } from './user.js';
+import { Note } from './note.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/note.ts b/packages/backend/src/models/entities/note.ts
index e4a5ac871c..da49d53b69 100644
--- a/packages/backend/src/models/entities/note.ts
+++ b/packages/backend/src/models/entities/note.ts
@@ -1,9 +1,9 @@
import { Entity, Index, JoinColumn, Column, PrimaryColumn, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { DriveFile } from './drive-file';
-import { id } from '../id';
-import { noteVisibilities } from '../../types';
-import { Channel } from './channel';
+import { User } from './user.js';
+import { DriveFile } from './drive-file.js';
+import { id } from '../id.js';
+import { noteVisibilities } from '../../types.js';
+import { Channel } from './channel.js';
@Entity()
@Index('IDX_NOTE_TAGS', { synchronize: false })
diff --git a/packages/backend/src/models/entities/notification.ts b/packages/backend/src/models/entities/notification.ts
index 9c1d8242fe..4a4739b8c5 100644
--- a/packages/backend/src/models/entities/notification.ts
+++ b/packages/backend/src/models/entities/notification.ts
@@ -1,11 +1,11 @@
import { Entity, Index, JoinColumn, ManyToOne, Column, PrimaryColumn } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { Note } from './note';
-import { FollowRequest } from './follow-request';
-import { UserGroupInvitation } from './user-group-invitation';
-import { AccessToken } from './access-token';
-import { notificationTypes } from '@/types';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { Note } from './note.js';
+import { FollowRequest } from './follow-request.js';
+import { UserGroupInvitation } from './user-group-invitation.js';
+import { AccessToken } from './access-token.js';
+import { notificationTypes } from '@/types.js';
@Entity()
export class Notification {
diff --git a/packages/backend/src/models/entities/page-like.ts b/packages/backend/src/models/entities/page-like.ts
index 16fb8f172a..17f4ebf520 100644
--- a/packages/backend/src/models/entities/page-like.ts
+++ b/packages/backend/src/models/entities/page-like.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { Page } from './page';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { Page } from './page.js';
@Entity()
@Index(['userId', 'pageId'], { unique: true })
diff --git a/packages/backend/src/models/entities/page.ts b/packages/backend/src/models/entities/page.ts
index 2b540e1990..baad3a36fa 100644
--- a/packages/backend/src/models/entities/page.ts
+++ b/packages/backend/src/models/entities/page.ts
@@ -1,7 +1,7 @@
import { Entity, Index, JoinColumn, Column, PrimaryColumn, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
-import { DriveFile } from './drive-file';
+import { User } from './user.js';
+import { id } from '../id.js';
+import { DriveFile } from './drive-file.js';
@Entity()
@Index(['userId', 'name'], { unique: true })
diff --git a/packages/backend/src/models/entities/password-reset-request.ts b/packages/backend/src/models/entities/password-reset-request.ts
index a2db0f1147..05e62cc5ab 100644
--- a/packages/backend/src/models/entities/password-reset-request.ts
+++ b/packages/backend/src/models/entities/password-reset-request.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, Column, ManyToOne, JoinColumn } from 'typeorm';
-import { id } from '../id';
-import { User } from './user';
+import { id } from '../id.js';
+import { User } from './user.js';
@Entity()
export class PasswordResetRequest {
diff --git a/packages/backend/src/models/entities/poll-vote.ts b/packages/backend/src/models/entities/poll-vote.ts
index fb44a58e9f..fca1cd0099 100644
--- a/packages/backend/src/models/entities/poll-vote.ts
+++ b/packages/backend/src/models/entities/poll-vote.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { Note } from './note';
-import { id } from '../id';
+import { User } from './user.js';
+import { Note } from './note.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId', 'choice'], { unique: true })
diff --git a/packages/backend/src/models/entities/poll.ts b/packages/backend/src/models/entities/poll.ts
index 9c80693491..83d0873cc5 100644
--- a/packages/backend/src/models/entities/poll.ts
+++ b/packages/backend/src/models/entities/poll.ts
@@ -1,8 +1,8 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, OneToOne } from 'typeorm';
-import { id } from '../id';
-import { Note } from './note';
-import { User } from './user';
-import { noteVisibilities } from '../../types';
+import { id } from '../id.js';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { noteVisibilities } from '../../types.js';
@Entity()
export class Poll {
diff --git a/packages/backend/src/models/entities/promo-note.ts b/packages/backend/src/models/entities/promo-note.ts
index e3fbab4414..d110b81e93 100644
--- a/packages/backend/src/models/entities/promo-note.ts
+++ b/packages/backend/src/models/entities/promo-note.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, OneToOne } from 'typeorm';
-import { Note } from './note';
-import { User } from './user';
-import { id } from '../id';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class PromoNote {
diff --git a/packages/backend/src/models/entities/promo-read.ts b/packages/backend/src/models/entities/promo-read.ts
index 777ed301ba..a63b79cd1e 100644
--- a/packages/backend/src/models/entities/promo-read.ts
+++ b/packages/backend/src/models/entities/promo-read.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { Note } from './note';
-import { User } from './user';
-import { id } from '../id';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/registration-tickets.ts b/packages/backend/src/models/entities/registration-tickets.ts
index d962f78a78..139e40f85e 100644
--- a/packages/backend/src/models/entities/registration-tickets.ts
+++ b/packages/backend/src/models/entities/registration-tickets.ts
@@ -1,5 +1,5 @@
import { PrimaryColumn, Entity, Index, Column } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class RegistrationTicket {
diff --git a/packages/backend/src/models/entities/registry-item.ts b/packages/backend/src/models/entities/registry-item.ts
index 6d5f0185db..283796df91 100644
--- a/packages/backend/src/models/entities/registry-item.ts
+++ b/packages/backend/src/models/entities/registry-item.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
// TODO: 同じdomain、同じscope、同じkeyのレコードは二つ以上存在しないように制約付けたい
@Entity()
diff --git a/packages/backend/src/models/entities/relay.ts b/packages/backend/src/models/entities/relay.ts
index 4c82ccb125..94d1929574 100644
--- a/packages/backend/src/models/entities/relay.ts
+++ b/packages/backend/src/models/entities/relay.ts
@@ -1,5 +1,5 @@
import { PrimaryColumn, Entity, Index, Column } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class Relay {
diff --git a/packages/backend/src/models/entities/signin.ts b/packages/backend/src/models/entities/signin.ts
index 7f54f2ebf2..ba81f45e49 100644
--- a/packages/backend/src/models/entities/signin.ts
+++ b/packages/backend/src/models/entities/signin.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class Signin {
diff --git a/packages/backend/src/models/entities/sw-subscription.ts b/packages/backend/src/models/entities/sw-subscription.ts
index 2debcf7443..59144d348b 100644
--- a/packages/backend/src/models/entities/sw-subscription.ts
+++ b/packages/backend/src/models/entities/sw-subscription.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class SwSubscription {
diff --git a/packages/backend/src/models/entities/user-group-invitation.ts b/packages/backend/src/models/entities/user-group-invitation.ts
index 479442a135..10f357049f 100644
--- a/packages/backend/src/models/entities/user-group-invitation.ts
+++ b/packages/backend/src/models/entities/user-group-invitation.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { UserGroup } from './user-group';
-import { id } from '../id';
+import { User } from './user.js';
+import { UserGroup } from './user-group.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'userGroupId'], { unique: true })
diff --git a/packages/backend/src/models/entities/user-group-joining.ts b/packages/backend/src/models/entities/user-group-joining.ts
index 81f3358588..62a814218a 100644
--- a/packages/backend/src/models/entities/user-group-joining.ts
+++ b/packages/backend/src/models/entities/user-group-joining.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { UserGroup } from './user-group';
-import { id } from '../id';
+import { User } from './user.js';
+import { UserGroup } from './user-group.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'userGroupId'], { unique: true })
diff --git a/packages/backend/src/models/entities/user-group.ts b/packages/backend/src/models/entities/user-group.ts
index 1fdb60c40d..8d5de1d926 100644
--- a/packages/backend/src/models/entities/user-group.ts
+++ b/packages/backend/src/models/entities/user-group.ts
@@ -1,6 +1,6 @@
import { Entity, Index, JoinColumn, Column, PrimaryColumn, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class UserGroup {
diff --git a/packages/backend/src/models/entities/user-keypair.ts b/packages/backend/src/models/entities/user-keypair.ts
index 48bff0d104..85fa062977 100644
--- a/packages/backend/src/models/entities/user-keypair.ts
+++ b/packages/backend/src/models/entities/user-keypair.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, JoinColumn, Column, OneToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class UserKeypair {
diff --git a/packages/backend/src/models/entities/user-list-joining.ts b/packages/backend/src/models/entities/user-list-joining.ts
index 2efa017527..12f28c4149 100644
--- a/packages/backend/src/models/entities/user-list-joining.ts
+++ b/packages/backend/src/models/entities/user-list-joining.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { UserList } from './user-list';
-import { id } from '../id';
+import { User } from './user.js';
+import { UserList } from './user-list.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'userListId'], { unique: true })
diff --git a/packages/backend/src/models/entities/user-list.ts b/packages/backend/src/models/entities/user-list.ts
index c2896a1dbe..ca69394e93 100644
--- a/packages/backend/src/models/entities/user-list.ts
+++ b/packages/backend/src/models/entities/user-list.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class UserList {
diff --git a/packages/backend/src/models/entities/user-note-pining.ts b/packages/backend/src/models/entities/user-note-pining.ts
index b91e02c5cb..c91ab7fdd8 100644
--- a/packages/backend/src/models/entities/user-note-pining.ts
+++ b/packages/backend/src/models/entities/user-note-pining.ts
@@ -1,7 +1,7 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
-import { Note } from './note';
-import { User } from './user';
-import { id } from '../id';
+import { Note } from './note.js';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
@Index(['userId', 'noteId'], { unique: true })
diff --git a/packages/backend/src/models/entities/user-pending.ts b/packages/backend/src/models/entities/user-pending.ts
index 40482af333..7637948841 100644
--- a/packages/backend/src/models/entities/user-pending.ts
+++ b/packages/backend/src/models/entities/user-pending.ts
@@ -1,5 +1,5 @@
import { PrimaryColumn, Entity, Index, Column } from 'typeorm';
-import { id } from '../id';
+import { id } from '../id.js';
@Entity()
export class UserPending {
diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts
index d8317de8d3..f95cb144c5 100644
--- a/packages/backend/src/models/entities/user-profile.ts
+++ b/packages/backend/src/models/entities/user-profile.ts
@@ -1,8 +1,8 @@
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
-import { id } from '../id';
-import { User } from './user';
-import { Page } from './page';
-import { ffVisibility, notificationTypes } from '@/types';
+import { id } from '../id.js';
+import { User } from './user.js';
+import { Page } from './page.js';
+import { ffVisibility, notificationTypes } from '@/types.js';
// TODO: このテーブルで管理している情報すべてレジストリで管理するようにしても良いかも
// ただ、「emailVerified が true なユーザーを find する」のようなクエリは書けなくなるからウーン
diff --git a/packages/backend/src/models/entities/user-publickey.ts b/packages/backend/src/models/entities/user-publickey.ts
index 128e13510c..31ed60de82 100644
--- a/packages/backend/src/models/entities/user-publickey.ts
+++ b/packages/backend/src/models/entities/user-publickey.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, Index, JoinColumn, Column, OneToOne } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class UserPublickey {
diff --git a/packages/backend/src/models/entities/user-security-key.ts b/packages/backend/src/models/entities/user-security-key.ts
index e7b63fb825..c4f2a852e2 100644
--- a/packages/backend/src/models/entities/user-security-key.ts
+++ b/packages/backend/src/models/entities/user-security-key.ts
@@ -1,6 +1,6 @@
import { PrimaryColumn, Entity, JoinColumn, Column, ManyToOne, Index } from 'typeorm';
-import { User } from './user';
-import { id } from '../id';
+import { User } from './user.js';
+import { id } from '../id.js';
@Entity()
export class UserSecurityKey {
diff --git a/packages/backend/src/models/entities/user.ts b/packages/backend/src/models/entities/user.ts
index 0aa01ba00a..9d5db10eb3 100644
--- a/packages/backend/src/models/entities/user.ts
+++ b/packages/backend/src/models/entities/user.ts
@@ -1,6 +1,6 @@
import { Entity, Column, Index, OneToOne, JoinColumn, PrimaryColumn } from 'typeorm';
-import { DriveFile } from './drive-file';
-import { id } from '../id';
+import { DriveFile } from './drive-file.js';
+import { id } from '../id.js';
@Entity()
@Index(['usernameLower', 'host'], { unique: true })
@@ -106,26 +106,6 @@ export class User {
})
public tags: string[];
- @Column('varchar', {
- length: 512, nullable: true,
- })
- public avatarUrl: string | null;
-
- @Column('varchar', {
- length: 512, nullable: true,
- })
- public bannerUrl: string | null;
-
- @Column('varchar', {
- length: 128, nullable: true,
- })
- public avatarBlurhash: string | null;
-
- @Column('varchar', {
- length: 128, nullable: true,
- })
- public bannerBlurhash: string | null;
-
@Column('boolean', {
default: false,
comment: 'Whether the User is suspended.',
@@ -225,6 +205,12 @@ export class User {
})
public followersUri: string | null;
+ @Column('boolean', {
+ default: false,
+ comment: 'Whether to show users replying to other users in the timeline'
+ })
+ public showTimelineReplies: boolean;
+
@Index({ unique: true })
@Column('char', {
length: 16, nullable: true, unique: true,
diff --git a/packages/backend/src/models/index.ts b/packages/backend/src/models/index.ts
index 67da347395..e7b6854886 100644
--- a/packages/backend/src/models/index.ts
+++ b/packages/backend/src/models/index.ts
@@ -1,66 +1,67 @@
import { getRepository, getCustomRepository } from 'typeorm';
-import { Announcement } from './entities/announcement';
-import { AnnouncementRead } from './entities/announcement-read';
-import { Instance } from './entities/instance';
-import { Poll } from './entities/poll';
-import { PollVote } from './entities/poll-vote';
-import { Meta } from './entities/meta';
-import { SwSubscription } from './entities/sw-subscription';
-import { NoteWatching } from './entities/note-watching';
-import { NoteThreadMuting } from './entities/note-thread-muting';
-import { NoteUnread } from './entities/note-unread';
-import { RegistrationTicket } from './entities/registration-tickets';
-import { UserRepository } from './repositories/user';
-import { NoteRepository } from './repositories/note';
-import { DriveFileRepository } from './repositories/drive-file';
-import { DriveFolderRepository } from './repositories/drive-folder';
-import { AccessToken } from './entities/access-token';
-import { UserNotePining } from './entities/user-note-pining';
-import { SigninRepository } from './repositories/signin';
-import { MessagingMessageRepository } from './repositories/messaging-message';
-import { UserListRepository } from './repositories/user-list';
-import { UserListJoining } from './entities/user-list-joining';
-import { UserGroupRepository } from './repositories/user-group';
-import { UserGroupJoining } from './entities/user-group-joining';
-import { UserGroupInvitationRepository } from './repositories/user-group-invitation';
-import { FollowRequestRepository } from './repositories/follow-request';
-import { MutingRepository } from './repositories/muting';
-import { BlockingRepository } from './repositories/blocking';
-import { NoteReactionRepository } from './repositories/note-reaction';
-import { NotificationRepository } from './repositories/notification';
-import { NoteFavoriteRepository } from './repositories/note-favorite';
-import { UserPublickey } from './entities/user-publickey';
-import { UserKeypair } from './entities/user-keypair';
-import { AppRepository } from './repositories/app';
-import { FollowingRepository } from './repositories/following';
-import { AbuseUserReportRepository } from './repositories/abuse-user-report';
-import { AuthSessionRepository } from './repositories/auth-session';
-import { UserProfile } from './entities/user-profile';
-import { AttestationChallenge } from './entities/attestation-challenge';
-import { UserSecurityKey } from './entities/user-security-key';
-import { HashtagRepository } from './repositories/hashtag';
-import { PageRepository } from './repositories/page';
-import { PageLikeRepository } from './repositories/page-like';
-import { GalleryPostRepository } from './repositories/gallery-post';
-import { GalleryLikeRepository } from './repositories/gallery-like';
-import { ModerationLogRepository } from './repositories/moderation-logs';
-import { UsedUsername } from './entities/used-username';
-import { ClipRepository } from './repositories/clip';
-import { ClipNote } from './entities/clip-note';
-import { AntennaRepository } from './repositories/antenna';
-import { AntennaNote } from './entities/antenna-note';
-import { PromoNote } from './entities/promo-note';
-import { PromoRead } from './entities/promo-read';
-import { EmojiRepository } from './repositories/emoji';
-import { RelayRepository } from './repositories/relay';
-import { ChannelRepository } from './repositories/channel';
-import { MutedNote } from './entities/muted-note';
-import { ChannelFollowing } from './entities/channel-following';
-import { ChannelNotePining } from './entities/channel-note-pining';
-import { RegistryItem } from './entities/registry-item';
-import { Ad } from './entities/ad';
-import { PasswordResetRequest } from './entities/password-reset-request';
-import { UserPending } from './entities/user-pending';
+import { Announcement } from './entities/announcement.js';
+import { AnnouncementRead } from './entities/announcement-read.js';
+import { Instance } from './entities/instance.js';
+import { Poll } from './entities/poll.js';
+import { PollVote } from './entities/poll-vote.js';
+import { Meta } from './entities/meta.js';
+import { SwSubscription } from './entities/sw-subscription.js';
+import { NoteWatching } from './entities/note-watching.js';
+import { NoteThreadMuting } from './entities/note-thread-muting.js';
+import { NoteUnread } from './entities/note-unread.js';
+import { RegistrationTicket } from './entities/registration-tickets.js';
+import { UserRepository } from './repositories/user.js';
+import { NoteRepository } from './repositories/note.js';
+import { DriveFileRepository } from './repositories/drive-file.js';
+import { DriveFolderRepository } from './repositories/drive-folder.js';
+import { AccessToken } from './entities/access-token.js';
+import { UserNotePining } from './entities/user-note-pining.js';
+import { SigninRepository } from './repositories/signin.js';
+import { MessagingMessageRepository } from './repositories/messaging-message.js';
+import { UserListRepository } from './repositories/user-list.js';
+import { UserListJoining } from './entities/user-list-joining.js';
+import { UserGroupRepository } from './repositories/user-group.js';
+import { UserGroupJoining } from './entities/user-group-joining.js';
+import { UserGroupInvitationRepository } from './repositories/user-group-invitation.js';
+import { FollowRequestRepository } from './repositories/follow-request.js';
+import { MutingRepository } from './repositories/muting.js';
+import { BlockingRepository } from './repositories/blocking.js';
+import { NoteReactionRepository } from './repositories/note-reaction.js';
+import { NotificationRepository } from './repositories/notification.js';
+import { NoteFavoriteRepository } from './repositories/note-favorite.js';
+import { UserPublickey } from './entities/user-publickey.js';
+import { UserKeypair } from './entities/user-keypair.js';
+import { AppRepository } from './repositories/app.js';
+import { FollowingRepository } from './repositories/following.js';
+import { AbuseUserReportRepository } from './repositories/abuse-user-report.js';
+import { AuthSessionRepository } from './repositories/auth-session.js';
+import { UserProfile } from './entities/user-profile.js';
+import { AttestationChallenge } from './entities/attestation-challenge.js';
+import { UserSecurityKey } from './entities/user-security-key.js';
+import { HashtagRepository } from './repositories/hashtag.js';
+import { PageRepository } from './repositories/page.js';
+import { PageLikeRepository } from './repositories/page-like.js';
+import { GalleryPostRepository } from './repositories/gallery-post.js';
+import { GalleryLikeRepository } from './repositories/gallery-like.js';
+import { ModerationLogRepository } from './repositories/moderation-logs.js';
+import { UsedUsername } from './entities/used-username.js';
+import { ClipRepository } from './repositories/clip.js';
+import { ClipNote } from './entities/clip-note.js';
+import { AntennaRepository } from './repositories/antenna.js';
+import { AntennaNote } from './entities/antenna-note.js';
+import { PromoNote } from './entities/promo-note.js';
+import { PromoRead } from './entities/promo-read.js';
+import { EmojiRepository } from './repositories/emoji.js';
+import { RelayRepository } from './repositories/relay.js';
+import { ChannelRepository } from './repositories/channel.js';
+import { MutedNote } from './entities/muted-note.js';
+import { ChannelFollowing } from './entities/channel-following.js';
+import { ChannelNotePining } from './entities/channel-note-pining.js';
+import { RegistryItem } from './entities/registry-item.js';
+import { Ad } from './entities/ad.js';
+import { PasswordResetRequest } from './entities/password-reset-request.js';
+import { UserPending } from './entities/user-pending.js';
+import { InstanceRepository } from './repositories/instance.js';
export const Announcements = getRepository(Announcement);
export const AnnouncementReads = getRepository(AnnouncementRead);
@@ -89,7 +90,7 @@ export const UserNotePinings = getRepository(UserNotePining);
export const UsedUsernames = getRepository(UsedUsername);
export const Followings = getCustomRepository(FollowingRepository);
export const FollowRequests = getCustomRepository(FollowRequestRepository);
-export const Instances = getRepository(Instance);
+export const Instances = getCustomRepository(InstanceRepository);
export const Emojis = getCustomRepository(EmojiRepository);
export const DriveFiles = getCustomRepository(DriveFileRepository);
export const DriveFolders = getCustomRepository(DriveFolderRepository);
diff --git a/packages/backend/src/models/repositories/abuse-user-report.ts b/packages/backend/src/models/repositories/abuse-user-report.ts
index 943b65eb64..348f88b3a2 100644
--- a/packages/backend/src/models/repositories/abuse-user-report.ts
+++ b/packages/backend/src/models/repositories/abuse-user-report.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../index';
-import { AbuseUserReport } from '@/models/entities/abuse-user-report';
-import { awaitAll } from '@/prelude/await-all';
+import { Users } from '../index.js';
+import { AbuseUserReport } from '@/models/entities/abuse-user-report.js';
+import { awaitAll } from '@/prelude/await-all.js';
@EntityRepository(AbuseUserReport)
export class AbuseUserReportRepository extends Repository<AbuseUserReport> {
@@ -12,7 +12,7 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> {
return await awaitAll({
id: report.id,
- createdAt: report.createdAt,
+ createdAt: report.createdAt.toISOString(),
comment: report.comment,
resolved: report.resolved,
reporterId: report.reporterId,
diff --git a/packages/backend/src/models/repositories/antenna.ts b/packages/backend/src/models/repositories/antenna.ts
index 3bf0645a7f..3440ca1871 100644
--- a/packages/backend/src/models/repositories/antenna.ts
+++ b/packages/backend/src/models/repositories/antenna.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Antenna } from '@/models/entities/antenna';
-import { Packed } from '@/misc/schema';
-import { AntennaNotes, UserGroupJoinings } from '../index';
+import { Antenna } from '@/models/entities/antenna.js';
+import { Packed } from '@/misc/schema.js';
+import { AntennaNotes, UserGroupJoinings } from '../index.js';
@EntityRepository(Antenna)
export class AntennaRepository extends Repository<Antenna> {
diff --git a/packages/backend/src/models/repositories/app.ts b/packages/backend/src/models/repositories/app.ts
index 6bac4d9598..4c3c488da0 100644
--- a/packages/backend/src/models/repositories/app.ts
+++ b/packages/backend/src/models/repositories/app.ts
@@ -1,8 +1,8 @@
import { EntityRepository, Repository } from 'typeorm';
-import { App } from '@/models/entities/app';
-import { AccessTokens } from '../index';
-import { Packed } from '@/misc/schema';
-import { User } from '../entities/user';
+import { App } from '@/models/entities/app.js';
+import { AccessTokens } from '../index.js';
+import { Packed } from '@/misc/schema.js';
+import { User } from '../entities/user.js';
@EntityRepository(App)
export class AppRepository extends Repository<App> {
@@ -32,7 +32,7 @@ export class AppRepository extends Repository<App> {
...(me ? {
isAuthorized: await AccessTokens.count({
appId: app.id,
- userId: me,
+ userId: me.id,
}).then(count => count > 0),
} : {}),
};
diff --git a/packages/backend/src/models/repositories/auth-session.ts b/packages/backend/src/models/repositories/auth-session.ts
index 6308909c41..7a7bd3a1ed 100644
--- a/packages/backend/src/models/repositories/auth-session.ts
+++ b/packages/backend/src/models/repositories/auth-session.ts
@@ -1,8 +1,8 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Apps } from '../index';
-import { AuthSession } from '@/models/entities/auth-session';
-import { awaitAll } from '@/prelude/await-all';
-import { User } from '@/models/entities/user';
+import { Apps } from '../index.js';
+import { AuthSession } from '@/models/entities/auth-session.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(AuthSession)
export class AuthSessionRepository extends Repository<AuthSession> {
diff --git a/packages/backend/src/models/repositories/blocking.ts b/packages/backend/src/models/repositories/blocking.ts
index c20b02f501..b155bf944b 100644
--- a/packages/backend/src/models/repositories/blocking.ts
+++ b/packages/backend/src/models/repositories/blocking.ts
@@ -1,9 +1,9 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../index';
-import { Blocking } from '@/models/entities/blocking';
-import { awaitAll } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
-import { User } from '@/models/entities/user';
+import { Users } from '../index.js';
+import { Blocking } from '@/models/entities/blocking.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(Blocking)
export class BlockingRepository extends Repository<Blocking> {
diff --git a/packages/backend/src/models/repositories/channel.ts b/packages/backend/src/models/repositories/channel.ts
index b3afb823ab..cc13d7c1e6 100644
--- a/packages/backend/src/models/repositories/channel.ts
+++ b/packages/backend/src/models/repositories/channel.ts
@@ -1,8 +1,8 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Channel } from '@/models/entities/channel';
-import { Packed } from '@/misc/schema';
-import { DriveFiles, ChannelFollowings, NoteUnreads } from '../index';
-import { User } from '@/models/entities/user';
+import { Channel } from '@/models/entities/channel.js';
+import { Packed } from '@/misc/schema.js';
+import { DriveFiles, ChannelFollowings, NoteUnreads } from '../index.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(Channel)
export class ChannelRepository extends Repository<Channel> {
diff --git a/packages/backend/src/models/repositories/clip.ts b/packages/backend/src/models/repositories/clip.ts
index 6f9ceeb50a..9e1979729a 100644
--- a/packages/backend/src/models/repositories/clip.ts
+++ b/packages/backend/src/models/repositories/clip.ts
@@ -1,8 +1,8 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Clip } from '@/models/entities/clip';
-import { Packed } from '@/misc/schema';
-import { Users } from '../index';
-import { awaitAll } from '@/prelude/await-all';
+import { Clip } from '@/models/entities/clip.js';
+import { Packed } from '@/misc/schema.js';
+import { Users } from '../index.js';
+import { awaitAll } from '@/prelude/await-all.js';
@EntityRepository(Clip)
export class ClipRepository extends Repository<Clip> {
diff --git a/packages/backend/src/models/repositories/drive-file.ts b/packages/backend/src/models/repositories/drive-file.ts
index 44db9a0a58..6452632db7 100644
--- a/packages/backend/src/models/repositories/drive-file.ts
+++ b/packages/backend/src/models/repositories/drive-file.ts
@@ -1,14 +1,14 @@
import { EntityRepository, Repository } from 'typeorm';
-import { DriveFile } from '@/models/entities/drive-file';
-import { Users, DriveFolders } from '../index';
-import { User } from '@/models/entities/user';
-import { toPuny } from '@/misc/convert-host';
-import { awaitAll, Promiseable } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
-import config from '@/config/index';
-import { query, appendQuery } from '@/prelude/url';
-import { Meta } from '@/models/entities/meta';
-import { fetchMeta } from '@/misc/fetch-meta';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { Users, DriveFolders } from '../index.js';
+import { User } from '@/models/entities/user.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { awaitAll, Promiseable } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
+import config from '@/config/index.js';
+import { query, appendQuery } from '@/prelude/url.js';
+import { Meta } from '@/models/entities/meta.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
type PackOptions = {
detail?: boolean,
@@ -41,7 +41,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
return file.properties;
}
- public getPublicUrl(file: DriveFile, thumbnail = false, meta?: Meta): string | null {
+ public getPublicUrl(file: DriveFile, thumbnail = false): string | null {
// リモートかつメディアプロキシ
if (file.uri != null && file.userHost != null && config.mediaProxy != null) {
return appendQuery(config.mediaProxy, query({
@@ -51,7 +51,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
}
// リモートかつ期限切れはローカルプロキシを試みる
- if (file.uri != null && file.isLink && meta && meta.proxyRemoteFiles) {
+ if (file.uri != null && file.isLink && config.proxyRemoteFiles) {
const key = thumbnail ? file.thumbnailAccessKey : file.webpublicAccessKey;
if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外
@@ -136,8 +136,8 @@ export class DriveFileRepository extends Repository<DriveFile> {
isSensitive: file.isSensitive,
blurhash: file.blurhash,
properties: opts.self ? file.properties : this.getPublicProperties(file),
- url: opts.self ? file.url : this.getPublicUrl(file, false, meta),
- thumbnailUrl: this.getPublicUrl(file, true, meta),
+ url: opts.self ? file.url : this.getPublicUrl(file, false),
+ thumbnailUrl: this.getPublicUrl(file, true),
comment: file.comment,
folderId: file.folderId,
folder: opts.detail && file.folderId ? DriveFolders.pack(file.folderId, {
diff --git a/packages/backend/src/models/repositories/drive-folder.ts b/packages/backend/src/models/repositories/drive-folder.ts
index b2e6cee9b8..b0e09eedf5 100644
--- a/packages/backend/src/models/repositories/drive-folder.ts
+++ b/packages/backend/src/models/repositories/drive-folder.ts
@@ -1,18 +1,11 @@
import { EntityRepository, Repository } from 'typeorm';
-import { DriveFolders, DriveFiles } from '../index';
-import { DriveFolder } from '@/models/entities/drive-folder';
-import { awaitAll } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
+import { DriveFolders, DriveFiles } from '../index.js';
+import { DriveFolder } from '@/models/entities/drive-folder.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
@EntityRepository(DriveFolder)
export class DriveFolderRepository extends Repository<DriveFolder> {
- public validateFolderName(name: string): boolean {
- return (
- (name.trim().length > 0) &&
- (name.length <= 200)
- );
- }
-
public async pack(
src: DriveFolder['id'] | DriveFolder,
options?: {
diff --git a/packages/backend/src/models/repositories/emoji.ts b/packages/backend/src/models/repositories/emoji.ts
index b9dc6ed0ac..3b13832a35 100644
--- a/packages/backend/src/models/repositories/emoji.ts
+++ b/packages/backend/src/models/repositories/emoji.ts
@@ -1,6 +1,6 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Emoji } from '@/models/entities/emoji';
-import { Packed } from '@/misc/schema';
+import { Emoji } from '@/models/entities/emoji.js';
+import { Packed } from '@/misc/schema.js';
@EntityRepository(Emoji)
export class EmojiRepository extends Repository<Emoji> {
diff --git a/packages/backend/src/models/repositories/federation-instance.ts b/packages/backend/src/models/repositories/federation-instance.ts
deleted file mode 100644
index 426fd5bfc3..0000000000
--- a/packages/backend/src/models/repositories/federation-instance.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import config from '@/config/index';
-
diff --git a/packages/backend/src/models/repositories/follow-request.ts b/packages/backend/src/models/repositories/follow-request.ts
index d6ee58e235..1da1f875ea 100644
--- a/packages/backend/src/models/repositories/follow-request.ts
+++ b/packages/backend/src/models/repositories/follow-request.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { FollowRequest } from '@/models/entities/follow-request';
-import { Users } from '../index';
-import { User } from '@/models/entities/user';
+import { FollowRequest } from '@/models/entities/follow-request.js';
+import { Users } from '../index.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(FollowRequest)
export class FollowRequestRepository extends Repository<FollowRequest> {
diff --git a/packages/backend/src/models/repositories/following.ts b/packages/backend/src/models/repositories/following.ts
index 9d20f442df..f25289d19c 100644
--- a/packages/backend/src/models/repositories/following.ts
+++ b/packages/backend/src/models/repositories/following.ts
@@ -1,9 +1,9 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../index';
-import { Following } from '@/models/entities/following';
-import { awaitAll } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
-import { User } from '@/models/entities/user';
+import { Users } from '../index.js';
+import { Following } from '@/models/entities/following.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
+import { User } from '@/models/entities/user.js';
type LocalFollowerFollowing = Following & {
followerHost: null;
diff --git a/packages/backend/src/models/repositories/gallery-like.ts b/packages/backend/src/models/repositories/gallery-like.ts
index 79123e5eec..545186fa19 100644
--- a/packages/backend/src/models/repositories/gallery-like.ts
+++ b/packages/backend/src/models/repositories/gallery-like.ts
@@ -1,6 +1,6 @@
import { EntityRepository, Repository } from 'typeorm';
-import { GalleryLike } from '@/models/entities/gallery-like';
-import { GalleryPosts } from '../index';
+import { GalleryLike } from '@/models/entities/gallery-like.js';
+import { GalleryPosts } from '../index.js';
@EntityRepository(GalleryLike)
export class GalleryLikeRepository extends Repository<GalleryLike> {
diff --git a/packages/backend/src/models/repositories/gallery-post.ts b/packages/backend/src/models/repositories/gallery-post.ts
index e9233bb91e..bbb036dd09 100644
--- a/packages/backend/src/models/repositories/gallery-post.ts
+++ b/packages/backend/src/models/repositories/gallery-post.ts
@@ -1,9 +1,9 @@
import { EntityRepository, Repository } from 'typeorm';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { Packed } from '@/misc/schema';
-import { Users, DriveFiles, GalleryLikes } from '../index';
-import { awaitAll } from '@/prelude/await-all';
-import { User } from '@/models/entities/user';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { Packed } from '@/misc/schema.js';
+import { Users, DriveFiles, GalleryLikes } from '../index.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(GalleryPost)
export class GalleryPostRepository extends Repository<GalleryPost> {
diff --git a/packages/backend/src/models/repositories/hashtag.ts b/packages/backend/src/models/repositories/hashtag.ts
index c4b8d50c4e..0548e19ee3 100644
--- a/packages/backend/src/models/repositories/hashtag.ts
+++ b/packages/backend/src/models/repositories/hashtag.ts
@@ -1,6 +1,6 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Hashtag } from '@/models/entities/hashtag';
-import { Packed } from '@/misc/schema';
+import { Hashtag } from '@/models/entities/hashtag.js';
+import { Packed } from '@/misc/schema.js';
@EntityRepository(Hashtag)
export class HashtagRepository extends Repository<Hashtag> {
diff --git a/packages/backend/src/models/repositories/instance.ts b/packages/backend/src/models/repositories/instance.ts
new file mode 100644
index 0000000000..358e055aaa
--- /dev/null
+++ b/packages/backend/src/models/repositories/instance.ts
@@ -0,0 +1,39 @@
+import { EntityRepository, Repository } from 'typeorm';
+import { Instance } from '@/models/entities/instance.js';
+import { Packed } from '@/misc/schema.js';
+
+@EntityRepository(Instance)
+export class InstanceRepository extends Repository<Instance> {
+ public async pack(
+ instance: Instance,
+ ): Promise<Packed<'FederationInstance'>> {
+ return {
+ id: instance.id,
+ caughtAt: instance.caughtAt.toISOString(),
+ host: instance.host,
+ usersCount: instance.usersCount,
+ notesCount: instance.notesCount,
+ followingCount: instance.followingCount,
+ followersCount: instance.followersCount,
+ latestRequestSentAt: instance.latestRequestSentAt ? instance.latestRequestSentAt.toISOString() : null,
+ lastCommunicatedAt: instance.lastCommunicatedAt.toISOString(),
+ isNotResponding: instance.isNotResponding,
+ isSuspended: instance.isSuspended,
+ softwareName: instance.softwareName,
+ softwareVersion: instance.softwareVersion,
+ openRegistrations: instance.openRegistrations,
+ name: instance.name,
+ description: instance.description,
+ maintainerName: instance.maintainerName,
+ maintainerEmail: instance.maintainerEmail,
+ iconUrl: instance.iconUrl,
+ infoUpdatedAt: instance.infoUpdatedAt ? instance.infoUpdatedAt.toISOString() : null,
+ };
+ }
+
+ public packMany(
+ instances: Instance[],
+ ) {
+ return Promise.all(instances.map(x => this.pack(x)));
+ }
+}
diff --git a/packages/backend/src/models/repositories/messaging-message.ts b/packages/backend/src/models/repositories/messaging-message.ts
index 0a342430b9..3f51707008 100644
--- a/packages/backend/src/models/repositories/messaging-message.ts
+++ b/packages/backend/src/models/repositories/messaging-message.ts
@@ -1,15 +1,11 @@
import { EntityRepository, Repository } from 'typeorm';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { Users, DriveFiles, UserGroups } from '../index';
-import { Packed } from '@/misc/schema';
-import { User } from '@/models/entities/user';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { Users, DriveFiles, UserGroups } from '../index.js';
+import { Packed } from '@/misc/schema.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(MessagingMessage)
export class MessagingMessageRepository extends Repository<MessagingMessage> {
- public validateText(text: string): boolean {
- return text.trim().length <= 1000 && text.trim() != '';
- }
-
public async pack(
src: MessagingMessage['id'] | MessagingMessage,
me?: { id: User['id'] } | null | undefined,
diff --git a/packages/backend/src/models/repositories/moderation-logs.ts b/packages/backend/src/models/repositories/moderation-logs.ts
index 1585d5bfcf..ea78104960 100644
--- a/packages/backend/src/models/repositories/moderation-logs.ts
+++ b/packages/backend/src/models/repositories/moderation-logs.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../index';
-import { ModerationLog } from '@/models/entities/moderation-log';
-import { awaitAll } from '@/prelude/await-all';
+import { Users } from '../index.js';
+import { ModerationLog } from '@/models/entities/moderation-log.js';
+import { awaitAll } from '@/prelude/await-all.js';
@EntityRepository(ModerationLog)
export class ModerationLogRepository extends Repository<ModerationLog> {
@@ -12,7 +12,7 @@ export class ModerationLogRepository extends Repository<ModerationLog> {
return await awaitAll({
id: log.id,
- createdAt: log.createdAt,
+ createdAt: log.createdAt.toISOString(),
type: log.type,
info: log.info,
userId: log.userId,
diff --git a/packages/backend/src/models/repositories/muting.ts b/packages/backend/src/models/repositories/muting.ts
index bdbe9b47da..6ffecc302a 100644
--- a/packages/backend/src/models/repositories/muting.ts
+++ b/packages/backend/src/models/repositories/muting.ts
@@ -1,9 +1,9 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Users } from '../index';
-import { Muting } from '@/models/entities/muting';
-import { awaitAll } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
-import { User } from '@/models/entities/user';
+import { Users } from '../index.js';
+import { Muting } from '@/models/entities/muting.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(Muting)
export class MutingRepository extends Repository<Muting> {
diff --git a/packages/backend/src/models/repositories/note-favorite.ts b/packages/backend/src/models/repositories/note-favorite.ts
index c5de55c0c0..d7a7925ebc 100644
--- a/packages/backend/src/models/repositories/note-favorite.ts
+++ b/packages/backend/src/models/repositories/note-favorite.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { NoteFavorite } from '@/models/entities/note-favorite';
-import { Notes } from '../index';
-import { User } from '@/models/entities/user';
+import { NoteFavorite } from '@/models/entities/note-favorite.js';
+import { Notes } from '../index.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(NoteFavorite)
export class NoteFavoriteRepository extends Repository<NoteFavorite> {
@@ -13,7 +13,7 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> {
return {
id: favorite.id,
- createdAt: favorite.createdAt,
+ createdAt: favorite.createdAt.toISOString(),
noteId: favorite.noteId,
note: await Notes.pack(favorite.note || favorite.noteId, me),
};
diff --git a/packages/backend/src/models/repositories/note-reaction.ts b/packages/backend/src/models/repositories/note-reaction.ts
index 097574effa..a212b0d3e9 100644
--- a/packages/backend/src/models/repositories/note-reaction.ts
+++ b/packages/backend/src/models/repositories/note-reaction.ts
@@ -1,9 +1,9 @@
import { EntityRepository, Repository } from 'typeorm';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { Notes, Users } from '../index';
-import { Packed } from '@/misc/schema';
-import { convertLegacyReaction } from '@/misc/reaction-lib';
-import { User } from '@/models/entities/user';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { Notes, Users } from '../index.js';
+import { Packed } from '@/misc/schema.js';
+import { convertLegacyReaction } from '@/misc/reaction-lib.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(NoteReaction)
export class NoteReactionRepository extends Repository<NoteReaction> {
@@ -23,10 +23,10 @@ export class NoteReactionRepository extends Repository<NoteReaction> {
return {
id: reaction.id,
createdAt: reaction.createdAt.toISOString(),
- user: await Users.pack(reaction.userId, me),
+ user: await Users.pack(reaction.user ?? reaction.userId, me),
type: convertLegacyReaction(reaction.reaction),
...(opts.withNote ? {
- note: await Notes.pack(reaction.noteId, me),
+ note: await Notes.pack(reaction.note ?? reaction.noteId, me),
} : {}),
};
}
diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts
index 9a7fef4977..418d6e2346 100644
--- a/packages/backend/src/models/repositories/note.ts
+++ b/packages/backend/src/models/repositories/note.ts
@@ -1,21 +1,17 @@
import { EntityRepository, Repository, In } from 'typeorm';
import * as mfm from 'mfm-js';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index';
-import { Packed } from '@/misc/schema';
-import { nyaize } from '@/misc/nyaize';
-import { awaitAll } from '@/prelude/await-all';
-import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '@/misc/reaction-lib';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { aggregateNoteEmojis, populateEmojis, prefetchEmojis } from '@/misc/populate-emojis';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.js';
+import { Packed } from '@/misc/schema.js';
+import { nyaize } from '@/misc/nyaize.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '@/misc/reaction-lib.js';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { aggregateNoteEmojis, populateEmojis, prefetchEmojis } from '@/misc/populate-emojis.js';
@EntityRepository(Note)
export class NoteRepository extends Repository<Note> {
- public validateCw(x: string) {
- return x.trim().length <= 100;
- }
-
public async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
// visibility が specified かつ自分が指定されていなかったら非表示
if (note.visibility === 'specified') {
@@ -206,8 +202,8 @@ export class NoteRepository extends Repository<Note> {
let text = note.text;
- if (note.name && (note.url || note.uri)) {
- text = `【${note.name}】\n${(note.text || '').trim()}\n\n${note.url || note.uri}`;
+ if (note.name && (note.url ?? note.uri)) {
+ text = `【${note.name}】\n${(note.text || '').trim()}\n\n${note.url ?? note.uri}`;
}
const channel = note.channelId
@@ -222,7 +218,7 @@ export class NoteRepository extends Repository<Note> {
id: note.id,
createdAt: note.createdAt.toISOString(),
userId: note.userId,
- user: Users.pack(note.user || note.userId, me, {
+ user: Users.pack(note.user ?? note.userId, me, {
detail: false,
}),
text: text,
diff --git a/packages/backend/src/models/repositories/notification.ts b/packages/backend/src/models/repositories/notification.ts
index 5e42798898..441bb79261 100644
--- a/packages/backend/src/models/repositories/notification.ts
+++ b/packages/backend/src/models/repositories/notification.ts
@@ -1,13 +1,13 @@
import { EntityRepository, In, Repository } from 'typeorm';
-import { Users, Notes, UserGroupInvitations, AccessTokens, NoteReactions } from '../index';
-import { Notification } from '@/models/entities/notification';
-import { awaitAll } from '@/prelude/await-all';
-import { Packed } from '@/misc/schema';
-import { Note } from '@/models/entities/note';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { User } from '@/models/entities/user';
-import { aggregateNoteEmojis, prefetchEmojis } from '@/misc/populate-emojis';
-import { notificationTypes } from '@/types';
+import { Users, Notes, UserGroupInvitations, AccessTokens, NoteReactions } from '../index.js';
+import { Notification } from '@/models/entities/notification.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { Packed } from '@/misc/schema.js';
+import { Note } from '@/models/entities/note.js';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { User } from '@/models/entities/user.js';
+import { aggregateNoteEmojis, prefetchEmojis } from '@/misc/populate-emojis.js';
+import { notificationTypes } from '@/types.js';
@EntityRepository(Notification)
export class NotificationRepository extends Repository<Notification> {
diff --git a/packages/backend/src/models/repositories/page-like.ts b/packages/backend/src/models/repositories/page-like.ts
index 28f34254d9..66d780584f 100644
--- a/packages/backend/src/models/repositories/page-like.ts
+++ b/packages/backend/src/models/repositories/page-like.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { PageLike } from '@/models/entities/page-like';
-import { Pages } from '../index';
-import { User } from '@/models/entities/user';
+import { PageLike } from '@/models/entities/page-like.js';
+import { Pages } from '../index.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(PageLike)
export class PageLikeRepository extends Repository<PageLike> {
diff --git a/packages/backend/src/models/repositories/page.ts b/packages/backend/src/models/repositories/page.ts
index ec76c2e418..037c13c434 100644
--- a/packages/backend/src/models/repositories/page.ts
+++ b/packages/backend/src/models/repositories/page.ts
@@ -1,10 +1,10 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Page } from '@/models/entities/page';
-import { Packed } from '@/misc/schema';
-import { Users, DriveFiles, PageLikes } from '../index';
-import { awaitAll } from '@/prelude/await-all';
-import { DriveFile } from '@/models/entities/drive-file';
-import { User } from '@/models/entities/user';
+import { Page } from '@/models/entities/page.js';
+import { Packed } from '@/misc/schema.js';
+import { Users, DriveFiles, PageLikes } from '../index.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { User } from '@/models/entities/user.js';
@EntityRepository(Page)
export class PageRepository extends Repository<Page> {
diff --git a/packages/backend/src/models/repositories/relay.ts b/packages/backend/src/models/repositories/relay.ts
index 72ead899f1..160ca60f7b 100644
--- a/packages/backend/src/models/repositories/relay.ts
+++ b/packages/backend/src/models/repositories/relay.ts
@@ -1,5 +1,5 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Relay } from '@/models/entities/relay';
+import { Relay } from '@/models/entities/relay.js';
@EntityRepository(Relay)
export class RelayRepository extends Repository<Relay> {
diff --git a/packages/backend/src/models/repositories/signin.ts b/packages/backend/src/models/repositories/signin.ts
index f375f9b5c0..a0e2ce1526 100644
--- a/packages/backend/src/models/repositories/signin.ts
+++ b/packages/backend/src/models/repositories/signin.ts
@@ -1,5 +1,5 @@
import { EntityRepository, Repository } from 'typeorm';
-import { Signin } from '@/models/entities/signin';
+import { Signin } from '@/models/entities/signin.js';
@EntityRepository(Signin)
export class SigninRepository extends Repository<Signin> {
diff --git a/packages/backend/src/models/repositories/user-group-invitation.ts b/packages/backend/src/models/repositories/user-group-invitation.ts
index 638603d6ea..e338242c64 100644
--- a/packages/backend/src/models/repositories/user-group-invitation.ts
+++ b/packages/backend/src/models/repositories/user-group-invitation.ts
@@ -1,6 +1,6 @@
import { EntityRepository, Repository } from 'typeorm';
-import { UserGroupInvitation } from '@/models/entities/user-group-invitation';
-import { UserGroups } from '../index';
+import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
+import { UserGroups } from '../index.js';
@EntityRepository(UserGroupInvitation)
export class UserGroupInvitationRepository extends Repository<UserGroupInvitation> {
diff --git a/packages/backend/src/models/repositories/user-group.ts b/packages/backend/src/models/repositories/user-group.ts
index 3ed37ca0ed..a9ffe7369e 100644
--- a/packages/backend/src/models/repositories/user-group.ts
+++ b/packages/backend/src/models/repositories/user-group.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { UserGroup } from '@/models/entities/user-group';
-import { UserGroupJoinings } from '../index';
-import { Packed } from '@/misc/schema';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { UserGroupJoinings } from '../index.js';
+import { Packed } from '@/misc/schema.js';
@EntityRepository(UserGroup)
export class UserGroupRepository extends Repository<UserGroup> {
diff --git a/packages/backend/src/models/repositories/user-list.ts b/packages/backend/src/models/repositories/user-list.ts
index a2bffe8357..0ea26427fe 100644
--- a/packages/backend/src/models/repositories/user-list.ts
+++ b/packages/backend/src/models/repositories/user-list.ts
@@ -1,7 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
-import { UserList } from '@/models/entities/user-list';
-import { UserListJoinings } from '../index';
-import { Packed } from '@/misc/schema';
+import { UserList } from '@/models/entities/user-list.js';
+import { UserListJoinings } from '../index.js';
+import { Packed } from '@/misc/schema.js';
@EntityRepository(UserList)
export class UserListRepository extends Repository<UserList> {
diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts
index 2b8398832d..a909ab3ba6 100644
--- a/packages/backend/src/models/repositories/user.ts
+++ b/packages/backend/src/models/repositories/user.ts
@@ -1,13 +1,13 @@
-import $ from 'cafy';
import { EntityRepository, Repository, In, Not } from 'typeorm';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances } from '../index';
-import config from '@/config/index';
-import { Packed } from '@/misc/schema';
-import { awaitAll, Promiseable } from '@/prelude/await-all';
-import { populateEmojis } from '@/misc/populate-emojis';
-import { getAntennas } from '@/misc/antenna-cache';
-import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const';
+import Ajv from 'ajv';
+import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances, DriveFiles } from '../index.js';
+import config from '@/config/index.js';
+import { Packed } from '@/misc/schema.js';
+import { awaitAll, Promiseable } from '@/prelude/await-all.js';
+import { populateEmojis } from '@/misc/populate-emojis.js';
+import { getAntennas } from '@/misc/antenna-cache.js';
+import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const.js';
type IsUserDetailed<Detailed extends boolean> = Detailed extends true ? Packed<'UserDetailed'> : Packed<'UserLite'>;
type IsMeAndIsUserDetailed<ExpectsMe extends boolean | null, Detailed extends boolean> =
@@ -17,8 +17,26 @@ type IsMeAndIsUserDetailed<ExpectsMe extends boolean | null, Detailed extends bo
Packed<'UserDetailed'> :
Packed<'UserLite'>;
+const ajv = new Ajv();
+
@EntityRepository(User)
export class UserRepository extends Repository<User> {
+ public localUsernameSchema = { type: 'string', pattern: /^\w{1,20}$/.toString().slice(1, -1) } as const;
+ public passwordSchema = { type: 'string', minLength: 1 } as const;
+ public nameSchema = { type: 'string', minLength: 1, maxLength: 50 } as const;
+ public descriptionSchema = { type: 'string', minLength: 1, maxLength: 500 } as const;
+ public locationSchema = { type: 'string', minLength: 1, maxLength: 50 } as const;
+ public birthdaySchema = { type: 'string', pattern: /^([0-9]{4})-([0-9]{2})-([0-9]{2})$/.toString().slice(1, -1) } as const;
+
+ //#region Validators
+ public validateLocalUsername = ajv.compile(this.localUsernameSchema);
+ public validatePassword = ajv.compile(this.passwordSchema);
+ public validateName = ajv.compile(this.nameSchema);
+ public validateDescription = ajv.compile(this.descriptionSchema);
+ public validateLocation = ajv.compile(this.locationSchema);
+ public validateBirthday = ajv.compile(this.birthdaySchema);
+ //#endregion
+
public async getRelation(me: User['id'], target: User['id']) {
const [following1, following2, followReq1, followReq2, toBlocking, fromBlocked, mute] = await Promise.all([
Followings.findOne({
@@ -164,13 +182,18 @@ export class UserRepository extends Repository<User> {
}
public getAvatarUrl(user: User): string {
- if (user.avatarUrl) {
- return user.avatarUrl;
+ // TODO: avatarIdがあるがavatarがない(JOINされてない)場合のハンドリング
+ if (user.avatar) {
+ return DriveFiles.getPublicUrl(user.avatar, true) || this.getIdenticonUrl(user.id);
} else {
- return `${config.url}/identicon/${user.id}`;
+ return this.getIdenticonUrl(user.id);
}
}
+ public getIdenticonUrl(userId: User['id']): string {
+ return `${config.url}/identicon/${userId}`;
+ }
+
public async pack<ExpectsMe extends boolean | null = null, D extends boolean = false>(
src: User['id'] | User,
me?: { id: User['id'] } | null | undefined,
@@ -184,7 +207,18 @@ export class UserRepository extends Repository<User> {
includeSecrets: false,
}, options);
- const user = typeof src === 'object' ? src : await this.findOneOrFail(src);
+ let user: User;
+
+ if (typeof src === 'object') {
+ user = src;
+ if (src.avatar === undefined && src.avatarId) src.avatar = await DriveFiles.findOne(src.avatarId) ?? null;
+ if (src.banner === undefined && src.bannerId) src.banner = await DriveFiles.findOne(src.bannerId) ?? null;
+ } else {
+ user = await this.findOneOrFail(src, {
+ relations: ['avatar', 'banner'],
+ });
+ }
+
const meId = me ? me.id : null;
const isMe = meId === user.id;
@@ -214,12 +248,13 @@ export class UserRepository extends Repository<User> {
username: user.username,
host: user.host,
avatarUrl: this.getAvatarUrl(user),
- avatarBlurhash: user.avatarBlurhash,
+ avatarBlurhash: user.avatar?.blurhash || null,
avatarColor: null, // 後方互換性のため
isAdmin: user.isAdmin || falsy,
isModerator: user.isModerator || falsy,
isBot: user.isBot || falsy,
isCat: user.isCat || falsy,
+ showTimelineReplies: user.showTimelineReplies || falsy,
instance: user.host ? Instances.findOne({ host: user.host }).then(instance => instance ? {
name: instance.name,
softwareName: instance.softwareName,
@@ -237,8 +272,8 @@ export class UserRepository extends Repository<User> {
createdAt: user.createdAt.toISOString(),
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
lastFetchedAt: user.lastFetchedAt ? user.lastFetchedAt.toISOString() : null,
- bannerUrl: user.bannerUrl,
- bannerBlurhash: user.bannerBlurhash,
+ bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null,
+ bannerBlurhash: user.banner?.blurhash || null,
bannerColor: null, // 後方互換性のため
isLocked: user.isLocked,
isSilenced: user.isSilenced || falsy,
@@ -350,13 +385,4 @@ export class UserRepository extends Repository<User> {
public isRemoteUser(user: User | { host: User['host'] }): boolean {
return !this.isLocalUser(user);
}
-
- //#region Validators
- public validateLocalUsername = $.str.match(/^\w{1,20}$/);
- public validatePassword = $.str.min(1);
- public validateName = $.str.min(1).max(50);
- public validateDescription = $.str.min(1).max(500);
- public validateLocation = $.str.min(1).max(50);
- public validateBirthday = $.str.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/);
- //#endregion
}
diff --git a/packages/backend/src/models/schema/federation-instance.ts b/packages/backend/src/models/schema/federation-instance.ts
index eef2f9e24f..c4e7b3f18b 100644
--- a/packages/backend/src/models/schema/federation-instance.ts
+++ b/packages/backend/src/models/schema/federation-instance.ts
@@ -1,4 +1,4 @@
-import config from "@/config";
+import config from '@/config/index.js';
export const packedFederationInstanceSchema = {
type: 'object',
@@ -34,14 +34,6 @@ export const packedFederationInstanceSchema = {
type: 'number',
optional: false, nullable: false,
},
- driveUsage: {
- type: 'number',
- optional: false, nullable: false,
- },
- driveFiles: {
- type: 'number',
- optional: false, nullable: false,
- },
latestRequestSentAt: {
type: 'string',
optional: false, nullable: true,
diff --git a/packages/backend/src/models/schema/notification.ts b/packages/backend/src/models/schema/notification.ts
index f3c293c480..d3f2405cdd 100644
--- a/packages/backend/src/models/schema/notification.ts
+++ b/packages/backend/src/models/schema/notification.ts
@@ -1,4 +1,4 @@
-import { notificationTypes } from "@/types";
+import { notificationTypes } from '@/types.js';
export const packedNotificationSchema = {
type: 'object',
diff --git a/packages/backend/src/prelude/array.ts b/packages/backend/src/prelude/array.ts
index 1e9e62b895..0b2830cb7b 100644
--- a/packages/backend/src/prelude/array.ts
+++ b/packages/backend/src/prelude/array.ts
@@ -1,4 +1,4 @@
-import { EndoRelation, Predicate } from './relation';
+import { EndoRelation, Predicate } from './relation.js';
/**
* Count the number of elements that satisfy the predicate
diff --git a/packages/backend/src/queue/get-job-info.ts b/packages/backend/src/queue/get-job-info.ts
index f601ae62d0..d33e349c36 100644
--- a/packages/backend/src/queue/get-job-info.ts
+++ b/packages/backend/src/queue/get-job-info.ts
@@ -1,4 +1,4 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
export function getJobInfo(job: Bull.Job, increment = false) {
const age = Date.now() - job.timestamp;
diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts
index f9994c3b59..94055e9c5a 100644
--- a/packages/backend/src/queue/index.ts
+++ b/packages/backend/src/queue/index.ts
@@ -1,18 +1,19 @@
-import * as httpSignature from 'http-signature';
+import httpSignature from 'http-signature';
-import config from '@/config/index';
-import { envOption } from '../env';
+import config from '@/config/index.js';
+import { envOption } from '../env.js';
-import processDeliver from './processors/deliver';
-import processInbox from './processors/inbox';
-import processDb from './processors/db/index';
-import procesObjectStorage from './processors/object-storage/index';
-import { queueLogger } from './logger';
-import { DriveFile } from '@/models/entities/drive-file';
-import { getJobInfo } from './get-job-info';
-import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue } from './queues';
-import { ThinUser } from './types';
-import { IActivity } from '@/remote/activitypub/type';
+import processDeliver from './processors/deliver.js';
+import processInbox from './processors/inbox.js';
+import processDb from './processors/db/index.js';
+import processObjectStorage from './processors/object-storage/index.js';
+import processSystemQueue from './processors/system/index.js';
+import { queueLogger } from './logger.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { getJobInfo } from './get-job-info.js';
+import { systemQueue, dbQueue, deliverQueue, inboxQueue, objectStorageQueue } from './queues.js';
+import { ThinUser } from './types.js';
+import { IActivity } from '@/remote/activitypub/type.js';
function renderError(e: Error): any {
return {
@@ -255,12 +256,24 @@ export default function() {
deliverQueue.process(config.deliverJobConcurrency || 128, processDeliver);
inboxQueue.process(config.inboxJobConcurrency || 16, processInbox);
processDb(dbQueue);
- procesObjectStorage(objectStorageQueue);
+ processObjectStorage(objectStorageQueue);
+
+ systemQueue.add('tickCharts', {
+ }, {
+ repeat: { cron: '55 * * * *' },
+ });
systemQueue.add('resyncCharts', {
}, {
repeat: { cron: '0 0 * * *' },
});
+
+ systemQueue.add('cleanCharts', {
+ }, {
+ repeat: { cron: '0 0 * * *' },
+ });
+
+ processSystemQueue(systemQueue);
}
export function destroy() {
diff --git a/packages/backend/src/queue/initialize.ts b/packages/backend/src/queue/initialize.ts
index af9acb3ce5..1db118ca9f 100644
--- a/packages/backend/src/queue/initialize.ts
+++ b/packages/backend/src/queue/initialize.ts
@@ -1,5 +1,5 @@
-import * as Bull from 'bull';
-import config from '@/config/index';
+import Bull from 'bull';
+import config from '@/config/index.js';
export function initialize<T>(name: string, limitPerSec = -1) {
return new Bull<T>(name, {
diff --git a/packages/backend/src/queue/logger.ts b/packages/backend/src/queue/logger.ts
index f789b9d079..2843a3c263 100644
--- a/packages/backend/src/queue/logger.ts
+++ b/packages/backend/src/queue/logger.ts
@@ -1,3 +1,3 @@
-import Logger from '@/services/logger';
+import Logger from '@/services/logger.js';
export const queueLogger = new Logger('queue', 'orange');
diff --git a/packages/backend/src/queue/processors/db/delete-account.ts b/packages/backend/src/queue/processors/db/delete-account.ts
index 4b620842a4..dbc1f16a46 100644
--- a/packages/backend/src/queue/processors/db/delete-account.ts
+++ b/packages/backend/src/queue/processors/db/delete-account.ts
@@ -1,12 +1,12 @@
-import * as Bull from 'bull';
-import { queueLogger } from '../../logger';
-import { DriveFiles, Notes, UserProfiles, Users } from '@/models/index';
-import { DbUserDeleteJobData } from '@/queue/types';
-import { Note } from '@/models/entities/note';
-import { DriveFile } from '@/models/entities/drive-file';
+import Bull from 'bull';
+import { queueLogger } from '../../logger.js';
+import { DriveFiles, Notes, UserProfiles, Users } from '@/models/index.js';
+import { DbUserDeleteJobData } from '@/queue/types.js';
+import { Note } from '@/models/entities/note.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
import { MoreThan } from 'typeorm';
-import { deleteFileSync } from '@/services/drive/delete-file';
-import { sendEmail } from '@/services/send-email';
+import { deleteFileSync } from '@/services/drive/delete-file.js';
+import { sendEmail } from '@/services/send-email.js';
const logger = queueLogger.createSubLogger('delete-account');
@@ -31,7 +31,7 @@ export async function deleteAccount(job: Bull.Job<DbUserDeleteJobData>): Promise
order: {
id: 1,
},
- });
+ }) as Note[];
if (notes.length === 0) {
break;
@@ -58,7 +58,7 @@ export async function deleteAccount(job: Bull.Job<DbUserDeleteJobData>): Promise
order: {
id: 1,
},
- });
+ }) as DriveFile[];
if (files.length === 0) {
break;
diff --git a/packages/backend/src/queue/processors/db/delete-drive-files.ts b/packages/backend/src/queue/processors/db/delete-drive-files.ts
index d26f5a47c4..f6a8699855 100644
--- a/packages/backend/src/queue/processors/db/delete-drive-files.ts
+++ b/packages/backend/src/queue/processors/db/delete-drive-files.ts
@@ -1,10 +1,10 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import { deleteFileSync } from '@/services/drive/delete-file';
-import { Users, DriveFiles } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { deleteFileSync } from '@/services/drive/delete-file.js';
+import { Users, DriveFiles } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import { DbUserJobData } from '@/queue/types';
+import { DbUserJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('delete-drive-files');
diff --git a/packages/backend/src/queue/processors/db/export-blocking.ts b/packages/backend/src/queue/processors/db/export-blocking.ts
index 01edaaeb63..83f1ec8fd6 100644
--- a/packages/backend/src/queue/processors/db/export-blocking.ts
+++ b/packages/backend/src/queue/processors/db/export-blocking.ts
@@ -1,14 +1,14 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { getFullApAccount } from '@/misc/convert-host';
-import { Users, Blockings } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { getFullApAccount } from '@/misc/convert-host.js';
+import { Users, Blockings } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import { DbUserJobData } from '@/queue/types';
+import { DbUserJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('export-blocking');
@@ -85,7 +85,7 @@ export async function exportBlocking(job: Bull.Job<DbUserJobData>, done: any): P
stream.end();
logger.succ(`Exported to: ${path}`);
- const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
+ const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv';
const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/export-custom-emojis.ts b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
index 240a542fec..a65b46cc00 100644
--- a/packages/backend/src/queue/processors/db/export-custom-emojis.ts
+++ b/packages/backend/src/queue/processors/db/export-custom-emojis.ts
@@ -1,17 +1,17 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
import { ulid } from 'ulid';
-const mime = require('mime-types');
-const archiver = require('archiver');
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { Users, Emojis } from '@/models/index';
-import { } from '@/queue/types';
-import { downloadUrl } from '@/misc/download-url';
-import config from '@/config/index';
+import mime from 'mime-types';
+import archiver from 'archiver';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { Users, Emojis } from '@/models/index.js';
+import { } from '@/queue/types.js';
+import { downloadUrl } from '@/misc/download-url.js';
+import config from '@/config/index.js';
const logger = queueLogger.createSubLogger('export-custom-emojis');
@@ -75,7 +75,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
await downloadUrl(emoji.originalUrl, emojiPath);
downloaded = true;
} catch (e) { // TODO: 何度か再試行
- logger.error(e);
+ logger.error(e instanceof Error ? e : new Error(e as string));
}
if (!downloaded) {
@@ -110,7 +110,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
archiveStream.on('close', async () => {
logger.succ(`Exported to: ${archivePath}`);
- const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.zip';
+ const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.zip';
const driveFile = await addFile({ user, path: archivePath, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/export-following.ts b/packages/backend/src/queue/processors/db/export-following.ts
index 06572acec1..162862180b 100644
--- a/packages/backend/src/queue/processors/db/export-following.ts
+++ b/packages/backend/src/queue/processors/db/export-following.ts
@@ -1,15 +1,15 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { getFullApAccount } from '@/misc/convert-host';
-import { Users, Followings, Mutings } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { getFullApAccount } from '@/misc/convert-host.js';
+import { Users, Followings, Mutings } from '@/models/index.js';
import { In, MoreThan, Not } from 'typeorm';
-import { DbUserJobData } from '@/queue/types';
-import { Following } from '@/models/entities/following';
+import { DbUserJobData } from '@/queue/types.js';
+import { Following } from '@/models/entities/following.js';
const logger = queueLogger.createSubLogger('export-following');
@@ -51,7 +51,7 @@ export async function exportFollowing(job: Bull.Job<DbUserJobData>, done: () =>
order: {
id: 1,
},
- });
+ }) as Following[];
if (followings.length === 0) {
break;
@@ -86,7 +86,7 @@ export async function exportFollowing(job: Bull.Job<DbUserJobData>, done: () =>
stream.end();
logger.succ(`Exported to: ${path}`);
- const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
+ const fileName = 'following-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv';
const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/export-mute.ts b/packages/backend/src/queue/processors/db/export-mute.ts
index 4a856f8ef9..8602e00bff 100644
--- a/packages/backend/src/queue/processors/db/export-mute.ts
+++ b/packages/backend/src/queue/processors/db/export-mute.ts
@@ -1,14 +1,14 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { getFullApAccount } from '@/misc/convert-host';
-import { Users, Mutings } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { getFullApAccount } from '@/misc/convert-host.js';
+import { Users, Mutings } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import { DbUserJobData } from '@/queue/types';
+import { DbUserJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('export-mute');
@@ -85,7 +85,7 @@ export async function exportMute(job: Bull.Job<DbUserJobData>, done: any): Promi
stream.end();
logger.succ(`Exported to: ${path}`);
- const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
+ const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv';
const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/export-notes.ts b/packages/backend/src/queue/processors/db/export-notes.ts
index 305abf44cf..c79679366c 100644
--- a/packages/backend/src/queue/processors/db/export-notes.ts
+++ b/packages/backend/src/queue/processors/db/export-notes.ts
@@ -1,15 +1,15 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { Users, Notes, Polls } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { Users, Notes, Polls } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import { Note } from '@/models/entities/note';
-import { Poll } from '@/models/entities/poll';
-import { DbUserJobData } from '@/queue/types';
+import { Note } from '@/models/entities/note.js';
+import { Poll } from '@/models/entities/poll.js';
+import { DbUserJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('export-notes');
@@ -62,7 +62,7 @@ export async function exportNotes(job: Bull.Job<DbUserJobData>, done: any): Prom
order: {
id: 1,
},
- });
+ }) as Note[];
if (notes.length === 0) {
job.progress(100);
@@ -94,7 +94,7 @@ export async function exportNotes(job: Bull.Job<DbUserJobData>, done: any): Prom
stream.end();
logger.succ(`Exported to: ${path}`);
- const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json';
+ const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.json';
const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/export-user-lists.ts b/packages/backend/src/queue/processors/db/export-user-lists.ts
index f907cf9526..1c04c36789 100644
--- a/packages/backend/src/queue/processors/db/export-user-lists.ts
+++ b/packages/backend/src/queue/processors/db/export-user-lists.ts
@@ -1,14 +1,14 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
+import * as fs from 'node:fs';
-import { queueLogger } from '../../logger';
-import { addFile } from '@/services/drive/add-file';
-import * as dateFormat from 'dateformat';
-import { getFullApAccount } from '@/misc/convert-host';
-import { Users, UserLists, UserListJoinings } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { format as dateFormat } from 'date-fns';
+import { getFullApAccount } from '@/misc/convert-host.js';
+import { Users, UserLists, UserListJoinings } from '@/models/index.js';
import { In } from 'typeorm';
-import { DbUserJobData } from '@/queue/types';
+import { DbUserJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('export-user-lists');
@@ -62,7 +62,7 @@ export async function exportUserLists(job: Bull.Job<DbUserJobData>, done: any):
stream.end();
logger.succ(`Exported to: ${path}`);
- const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
+ const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-MM-dd-HH-mm-ss') + '.csv';
const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`);
diff --git a/packages/backend/src/queue/processors/db/import-blocking.ts b/packages/backend/src/queue/processors/db/import-blocking.ts
index 42c3cd0a40..857c2629e3 100644
--- a/packages/backend/src/queue/processors/db/import-blocking.ts
+++ b/packages/backend/src/queue/processors/db/import-blocking.ts
@@ -1,13 +1,13 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import * as Acct from 'misskey-js/built/acct';
-import { resolveUser } from '@/remote/resolve-user';
-import { downloadTextFile } from '@/misc/download-text-file';
-import { isSelfHost, toPuny } from '@/misc/convert-host';
-import { Users, DriveFiles, Blockings } from '@/models/index';
-import { DbUserImportJobData } from '@/queue/types';
-import block from '@/services/blocking/create';
+import { queueLogger } from '../../logger.js';
+import * as Acct from '@/misc/acct.js';
+import { resolveUser } from '@/remote/resolve-user.js';
+import { downloadTextFile } from '@/misc/download-text-file.js';
+import { isSelfHost, toPuny } from '@/misc/convert-host.js';
+import { Users, DriveFiles, Blockings } from '@/models/index.js';
+import { DbUserImportJobData } from '@/queue/types.js';
+import block from '@/services/blocking/create.js';
const logger = queueLogger.createSubLogger('import-blocking');
diff --git a/packages/backend/src/queue/processors/db/import-custom-emojis.ts b/packages/backend/src/queue/processors/db/import-custom-emojis.ts
index 04e93671ed..f862276b47 100644
--- a/packages/backend/src/queue/processors/db/import-custom-emojis.ts
+++ b/packages/backend/src/queue/processors/db/import-custom-emojis.ts
@@ -1,15 +1,15 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
import * as tmp from 'tmp';
-import * as fs from 'fs';
-const unzipper = require('unzipper');
+import * as fs from 'node:fs';
+import unzipper from 'unzipper';
import { getConnection } from 'typeorm';
-import { queueLogger } from '../../logger';
-import { downloadUrl } from '@/misc/download-url';
-import { DriveFiles, Emojis } from '@/models/index';
-import { DbUserImportJobData } from '@/queue/types';
-import { addFile } from '@/services/drive/add-file';
-import { genId } from '@/misc/gen-id';
+import { queueLogger } from '../../logger.js';
+import { downloadUrl } from '@/misc/download-url.js';
+import { DriveFiles, Emojis } from '@/models/index.js';
+import { DbUserImportJobData } from '@/queue/types.js';
+import { addFile } from '@/services/drive/add-file.js';
+import { genId } from '@/misc/gen-id.js';
const logger = queueLogger.createSubLogger('import-custom-emojis');
@@ -41,7 +41,9 @@ export async function importCustomEmojis(job: Bull.Job<DbUserImportJobData>, don
fs.writeFileSync(destPath, '', 'binary');
await downloadUrl(file.url, destPath);
} catch (e) { // TODO: 何度か再試行
- logger.error(e);
+ if (e instanceof Error || typeof e === 'string') {
+ logger.error(e);
+ }
throw e;
}
diff --git a/packages/backend/src/queue/processors/db/import-following.ts b/packages/backend/src/queue/processors/db/import-following.ts
index f19296832e..235fc28394 100644
--- a/packages/backend/src/queue/processors/db/import-following.ts
+++ b/packages/backend/src/queue/processors/db/import-following.ts
@@ -1,13 +1,13 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import follow from '@/services/following/create';
-import * as Acct from 'misskey-js/built/acct';
-import { resolveUser } from '@/remote/resolve-user';
-import { downloadTextFile } from '@/misc/download-text-file';
-import { isSelfHost, toPuny } from '@/misc/convert-host';
-import { Users, DriveFiles } from '@/models/index';
-import { DbUserImportJobData } from '@/queue/types';
+import { queueLogger } from '../../logger.js';
+import follow from '@/services/following/create.js';
+import * as Acct from '@/misc/acct.js';
+import { resolveUser } from '@/remote/resolve-user.js';
+import { downloadTextFile } from '@/misc/download-text-file.js';
+import { isSelfHost, toPuny } from '@/misc/convert-host.js';
+import { Users, DriveFiles } from '@/models/index.js';
+import { DbUserImportJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('import-following');
diff --git a/packages/backend/src/queue/processors/db/import-muting.ts b/packages/backend/src/queue/processors/db/import-muting.ts
index 189740c292..32f5f6bbee 100644
--- a/packages/backend/src/queue/processors/db/import-muting.ts
+++ b/packages/backend/src/queue/processors/db/import-muting.ts
@@ -1,14 +1,14 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import * as Acct from 'misskey-js/built/acct';
-import { resolveUser } from '@/remote/resolve-user';
-import { downloadTextFile } from '@/misc/download-text-file';
-import { isSelfHost, toPuny } from '@/misc/convert-host';
-import { Users, DriveFiles, Mutings } from '@/models/index';
-import { DbUserImportJobData } from '@/queue/types';
-import { User } from '@/models/entities/user';
-import { genId } from '@/misc/gen-id';
+import { queueLogger } from '../../logger.js';
+import * as Acct from '@/misc/acct.js';
+import { resolveUser } from '@/remote/resolve-user.js';
+import { downloadTextFile } from '@/misc/download-text-file.js';
+import { isSelfHost, toPuny } from '@/misc/convert-host.js';
+import { Users, DriveFiles, Mutings } from '@/models/index.js';
+import { DbUserImportJobData } from '@/queue/types.js';
+import { User } from '@/models/entities/user.js';
+import { genId } from '@/misc/gen-id.js';
const logger = queueLogger.createSubLogger('import-muting');
diff --git a/packages/backend/src/queue/processors/db/import-user-lists.ts b/packages/backend/src/queue/processors/db/import-user-lists.ts
index e060e86dd8..ae263e19b0 100644
--- a/packages/backend/src/queue/processors/db/import-user-lists.ts
+++ b/packages/backend/src/queue/processors/db/import-user-lists.ts
@@ -1,14 +1,14 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import * as Acct from 'misskey-js/built/acct';
-import { resolveUser } from '@/remote/resolve-user';
-import { pushUserToUserList } from '@/services/user-list/push';
-import { downloadTextFile } from '@/misc/download-text-file';
-import { isSelfHost, toPuny } from '@/misc/convert-host';
-import { DriveFiles, Users, UserLists, UserListJoinings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { DbUserImportJobData } from '@/queue/types';
+import { queueLogger } from '../../logger.js';
+import * as Acct from '@/misc/acct.js';
+import { resolveUser } from '@/remote/resolve-user.js';
+import { pushUserToUserList } from '@/services/user-list/push.js';
+import { downloadTextFile } from '@/misc/download-text-file.js';
+import { isSelfHost, toPuny } from '@/misc/convert-host.js';
+import { DriveFiles, Users, UserLists, UserListJoinings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { DbUserImportJobData } from '@/queue/types.js';
const logger = queueLogger.createSubLogger('import-user-lists');
@@ -51,7 +51,6 @@ export async function importUserLists(job: Bull.Job<DbUserImportJobData>, done:
createdAt: new Date(),
userId: user.id,
name: listName,
- userIds: [],
}).then(x => UserLists.findOneOrFail(x.identifiers[0]));
}
@@ -67,9 +66,9 @@ export async function importUserLists(job: Bull.Job<DbUserImportJobData>, done:
target = await resolveUser(username, host);
}
- if (await UserListJoinings.findOne({ userListId: list.id, userId: target.id }) != null) continue;
+ if (await UserListJoinings.findOne({ userListId: list!.id, userId: target.id }) != null) continue;
- pushUserToUserList(target, list);
+ pushUserToUserList(target, list!);
} catch (e) {
logger.warn(`Error in line:${linenum} ${e}`);
}
diff --git a/packages/backend/src/queue/processors/db/index.ts b/packages/backend/src/queue/processors/db/index.ts
index 5fffa378f5..e91d569779 100644
--- a/packages/backend/src/queue/processors/db/index.ts
+++ b/packages/backend/src/queue/processors/db/index.ts
@@ -1,18 +1,18 @@
-import * as Bull from 'bull';
-import { DbJobData } from '@/queue/types';
-import { deleteDriveFiles } from './delete-drive-files';
-import { exportCustomEmojis } from './export-custom-emojis';
-import { exportNotes } from './export-notes';
-import { exportFollowing } from './export-following';
-import { exportMute } from './export-mute';
-import { exportBlocking } from './export-blocking';
-import { exportUserLists } from './export-user-lists';
-import { importFollowing } from './import-following';
-import { importUserLists } from './import-user-lists';
-import { deleteAccount } from './delete-account';
-import { importMuting } from './import-muting';
-import { importBlocking } from './import-blocking';
-import { importCustomEmojis } from './import-custom-emojis';
+import Bull from 'bull';
+import { DbJobData } from '@/queue/types.js';
+import { deleteDriveFiles } from './delete-drive-files.js';
+import { exportCustomEmojis } from './export-custom-emojis.js';
+import { exportNotes } from './export-notes.js';
+import { exportFollowing } from './export-following.js';
+import { exportMute } from './export-mute.js';
+import { exportBlocking } from './export-blocking.js';
+import { exportUserLists } from './export-user-lists.js';
+import { importFollowing } from './import-following.js';
+import { importUserLists } from './import-user-lists.js';
+import { deleteAccount } from './delete-account.js';
+import { importMuting } from './import-muting.js';
+import { importBlocking } from './import-blocking.js';
+import { importCustomEmojis } from './import-custom-emojis.js';
const jobs = {
deleteDriveFiles,
diff --git a/packages/backend/src/queue/processors/deliver.ts b/packages/backend/src/queue/processors/deliver.ts
index 46aeb8cb7e..291c05766e 100644
--- a/packages/backend/src/queue/processors/deliver.ts
+++ b/packages/backend/src/queue/processors/deliver.ts
@@ -1,17 +1,17 @@
-import { URL } from 'url';
-import * as Bull from 'bull';
-import request from '@/remote/activitypub/request';
-import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc';
-import Logger from '@/services/logger';
-import { Instances } from '@/models/index';
-import { instanceChart } from '@/services/chart/index';
-import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { toPuny } from '@/misc/convert-host';
-import { Cache } from '@/misc/cache';
-import { Instance } from '@/models/entities/instance';
-import { DeliverJobData } from '../types';
-import { StatusError } from '@/misc/fetch';
+import { URL } from 'node:url';
+import Bull from 'bull';
+import request from '@/remote/activitypub/request.js';
+import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
+import Logger from '@/services/logger.js';
+import { Instances } from '@/models/index.js';
+import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
+import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { Cache } from '@/misc/cache.js';
+import { Instance } from '@/models/entities/instance.js';
+import { DeliverJobData } from '../types.js';
+import { StatusError } from '@/misc/fetch.js';
const logger = new Logger('deliver');
@@ -61,6 +61,8 @@ export default async (job: Bull.Job<DeliverJobData>) => {
fetchInstanceMetadata(i);
instanceChart.requestSent(i.host, true);
+ apRequestChart.deliverSucc();
+ federationChart.deliverd(i.host, true);
});
return 'Success';
@@ -74,6 +76,8 @@ export default async (job: Bull.Job<DeliverJobData>) => {
});
instanceChart.requestSent(i.host, false);
+ apRequestChart.deliverFail();
+ federationChart.deliverd(i.host, false);
});
if (res instanceof StatusError) {
diff --git a/packages/backend/src/queue/processors/inbox.ts b/packages/backend/src/queue/processors/inbox.ts
index bfdebc0077..1b3f94b700 100644
--- a/packages/backend/src/queue/processors/inbox.ts
+++ b/packages/backend/src/queue/processors/inbox.ts
@@ -1,20 +1,20 @@
-import { URL } from 'url';
-import * as Bull from 'bull';
-import * as httpSignature from 'http-signature';
-import perform from '@/remote/activitypub/perform';
-import Logger from '@/services/logger';
-import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc';
-import { Instances } from '@/models/index';
-import { instanceChart } from '@/services/chart/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { toPuny, extractDbHost } from '@/misc/convert-host';
-import { getApId } from '@/remote/activitypub/type';
-import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata';
-import { InboxJobData } from '../types';
-import DbResolver from '@/remote/activitypub/db-resolver';
-import { resolvePerson } from '@/remote/activitypub/models/person';
-import { LdSignature } from '@/remote/activitypub/misc/ld-signature';
-import { StatusError } from '@/misc/fetch';
+import { URL } from 'node:url';
+import Bull from 'bull';
+import httpSignature from 'http-signature';
+import perform from '@/remote/activitypub/perform.js';
+import Logger from '@/services/logger.js';
+import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
+import { Instances } from '@/models/index.js';
+import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { toPuny, extractDbHost } from '@/misc/convert-host.js';
+import { getApId } from '@/remote/activitypub/type.js';
+import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
+import { InboxJobData } from '../types.js';
+import DbResolver from '@/remote/activitypub/db-resolver.js';
+import { resolvePerson } from '@/remote/activitypub/models/person.js';
+import { LdSignature } from '@/remote/activitypub/misc/ld-signature.js';
+import { StatusError } from '@/misc/fetch.js';
const logger = new Logger('inbox');
@@ -54,10 +54,12 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
authUser = await dbResolver.getAuthUserFromApId(getApId(activity.actor));
} catch (e) {
// 対象が4xxならスキップ
- if (e instanceof StatusError && e.isClientError) {
- return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`;
+ if (e instanceof StatusError) {
+ if (e.isClientError) {
+ return `skip: Ignored deleted actors on both ends ${activity.actor} - ${e.statusCode}`;
+ }
+ throw `Error in actor ${activity.actor} - ${e.statusCode || e}`;
}
- throw `Error in actor ${activity.actor} - ${e.statusCode || e}`;
}
}
@@ -141,6 +143,8 @@ export default async (job: Bull.Job<InboxJobData>): Promise<string> => {
fetchInstanceMetadata(i);
instanceChart.requestReceived(i.host);
+ apRequestChart.inbox();
+ federationChart.inbox(i.host);
});
// アクティビティを処理
diff --git a/packages/backend/src/queue/processors/object-storage/clean-remote-files.ts b/packages/backend/src/queue/processors/object-storage/clean-remote-files.ts
index 788383a0a3..7d71a20adb 100644
--- a/packages/backend/src/queue/processors/object-storage/clean-remote-files.ts
+++ b/packages/backend/src/queue/processors/object-storage/clean-remote-files.ts
@@ -1,8 +1,8 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import { deleteFileSync } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
+import { queueLogger } from '../../logger.js';
+import { deleteFileSync } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
import { MoreThan, Not, IsNull } from 'typeorm';
const logger = queueLogger.createSubLogger('clean-remote-files');
diff --git a/packages/backend/src/queue/processors/object-storage/delete-file.ts b/packages/backend/src/queue/processors/object-storage/delete-file.ts
index ed22968a27..c271e3ddd4 100644
--- a/packages/backend/src/queue/processors/object-storage/delete-file.ts
+++ b/packages/backend/src/queue/processors/object-storage/delete-file.ts
@@ -1,6 +1,6 @@
-import { ObjectStorageFileJobData } from '@/queue/types';
-import * as Bull from 'bull';
-import { deleteObjectStorageFile } from '@/services/drive/delete-file';
+import { ObjectStorageFileJobData } from '@/queue/types.js';
+import Bull from 'bull';
+import { deleteObjectStorageFile } from '@/services/drive/delete-file.js';
export default async (job: Bull.Job<ObjectStorageFileJobData>) => {
const key: string = job.data.key;
diff --git a/packages/backend/src/queue/processors/object-storage/index.ts b/packages/backend/src/queue/processors/object-storage/index.ts
index 0d9570e179..ae6c481fea 100644
--- a/packages/backend/src/queue/processors/object-storage/index.ts
+++ b/packages/backend/src/queue/processors/object-storage/index.ts
@@ -1,7 +1,7 @@
-import * as Bull from 'bull';
-import { ObjectStorageJobData } from '@/queue/types';
-import deleteFile from './delete-file';
-import cleanRemoteFiles from './clean-remote-files';
+import Bull from 'bull';
+import { ObjectStorageJobData } from '@/queue/types.js';
+import deleteFile from './delete-file.js';
+import cleanRemoteFiles from './clean-remote-files.js';
const jobs = {
deleteFile,
diff --git a/packages/backend/src/queue/processors/system/clean-charts.ts b/packages/backend/src/queue/processors/system/clean-charts.ts
new file mode 100644
index 0000000000..c9169d5acf
--- /dev/null
+++ b/packages/backend/src/queue/processors/system/clean-charts.ts
@@ -0,0 +1,28 @@
+import Bull from 'bull';
+
+import { queueLogger } from '../../logger.js';
+import { activeUsersChart, driveChart, federationChart, hashtagChart, instanceChart, notesChart, perUserDriveChart, perUserFollowingChart, perUserNotesChart, perUserReactionsChart, usersChart, apRequestChart } from '@/services/chart/index.js';
+
+const logger = queueLogger.createSubLogger('clean-charts');
+
+export async function cleanCharts(job: Bull.Job<Record<string, unknown>>, done: any): Promise<void> {
+ logger.info(`Clean charts...`);
+
+ await Promise.all([
+ federationChart.clean(),
+ notesChart.clean(),
+ usersChart.clean(),
+ activeUsersChart.clean(),
+ instanceChart.clean(),
+ perUserNotesChart.clean(),
+ driveChart.clean(),
+ perUserReactionsChart.clean(),
+ hashtagChart.clean(),
+ perUserFollowingChart.clean(),
+ perUserDriveChart.clean(),
+ apRequestChart.clean(),
+ ]);
+
+ logger.succ(`All charts successfully cleaned.`);
+ done();
+}
diff --git a/packages/backend/src/queue/processors/system/index.ts b/packages/backend/src/queue/processors/system/index.ts
index 8460ea0a9b..dca3249e82 100644
--- a/packages/backend/src/queue/processors/system/index.ts
+++ b/packages/backend/src/queue/processors/system/index.ts
@@ -1,8 +1,12 @@
-import * as Bull from 'bull';
-import { resyncCharts } from './resync-charts';
+import Bull from 'bull';
+import { tickCharts } from './tick-charts.js';
+import { resyncCharts } from './resync-charts.js';
+import { cleanCharts } from './clean-charts.js';
const jobs = {
+ tickCharts,
resyncCharts,
+ cleanCharts,
} as Record<string, Bull.ProcessCallbackFunction<Record<string, unknown>> | Bull.ProcessPromiseFunction<Record<string, unknown>>>;
export default function(dbQueue: Bull.Queue<Record<string, unknown>>) {
diff --git a/packages/backend/src/queue/processors/system/resync-charts.ts b/packages/backend/src/queue/processors/system/resync-charts.ts
index 78a70bb981..20012513af 100644
--- a/packages/backend/src/queue/processors/system/resync-charts.ts
+++ b/packages/backend/src/queue/processors/system/resync-charts.ts
@@ -1,7 +1,7 @@
-import * as Bull from 'bull';
+import Bull from 'bull';
-import { queueLogger } from '../../logger';
-import { driveChart, notesChart, usersChart } from '@/services/chart/index';
+import { queueLogger } from '../../logger.js';
+import { driveChart, notesChart, usersChart } from '@/services/chart/index.js';
const logger = queueLogger.createSubLogger('resync-charts');
diff --git a/packages/backend/src/queue/processors/system/tick-charts.ts b/packages/backend/src/queue/processors/system/tick-charts.ts
new file mode 100644
index 0000000000..13403f8f73
--- /dev/null
+++ b/packages/backend/src/queue/processors/system/tick-charts.ts
@@ -0,0 +1,28 @@
+import Bull from 'bull';
+
+import { queueLogger } from '../../logger.js';
+import { activeUsersChart, driveChart, federationChart, hashtagChart, instanceChart, notesChart, perUserDriveChart, perUserFollowingChart, perUserNotesChart, perUserReactionsChart, usersChart, apRequestChart } from '@/services/chart/index.js';
+
+const logger = queueLogger.createSubLogger('tick-charts');
+
+export async function tickCharts(job: Bull.Job<Record<string, unknown>>, done: any): Promise<void> {
+ logger.info(`Tick charts...`);
+
+ await Promise.all([
+ federationChart.tick(false),
+ notesChart.tick(false),
+ usersChart.tick(false),
+ activeUsersChart.tick(false),
+ instanceChart.tick(false),
+ perUserNotesChart.tick(false),
+ driveChart.tick(false),
+ perUserReactionsChart.tick(false),
+ hashtagChart.tick(false),
+ perUserFollowingChart.tick(false),
+ perUserDriveChart.tick(false),
+ apRequestChart.tick(false),
+ ]);
+
+ logger.succ(`All charts successfully ticked.`);
+ done();
+}
diff --git a/packages/backend/src/queue/queues.ts b/packages/backend/src/queue/queues.ts
index b1d790fcb1..6ac4ec69cf 100644
--- a/packages/backend/src/queue/queues.ts
+++ b/packages/backend/src/queue/queues.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { initialize as initializeQueue } from './initialize';
-import { DeliverJobData, InboxJobData, DbJobData, ObjectStorageJobData } from './types';
+import config from '@/config/index.js';
+import { initialize as initializeQueue } from './initialize.js';
+import { DeliverJobData, InboxJobData, DbJobData, ObjectStorageJobData } from './types.js';
export const systemQueue = initializeQueue<Record<string, unknown>>('system');
export const deliverQueue = initializeQueue<DeliverJobData>('deliver', config.deliverJobPerSec || 128);
diff --git a/packages/backend/src/queue/types.ts b/packages/backend/src/queue/types.ts
index 91036177dc..de5f5d1396 100644
--- a/packages/backend/src/queue/types.ts
+++ b/packages/backend/src/queue/types.ts
@@ -1,7 +1,7 @@
-import { DriveFile } from '@/models/entities/drive-file';
-import { User } from '@/models/entities/user';
-import { IActivity } from '@/remote/activitypub/type';
-import * as httpSignature from 'http-signature';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { User } from '@/models/entities/user.js';
+import { IActivity } from '@/remote/activitypub/type.js';
+import httpSignature from 'http-signature';
export type DeliverJobData = {
/** Actor */
diff --git a/packages/backend/src/remote/activitypub/ap-request.ts b/packages/backend/src/remote/activitypub/ap-request.ts
index c75f44f2e6..96bfec3b11 100644
--- a/packages/backend/src/remote/activitypub/ap-request.ts
+++ b/packages/backend/src/remote/activitypub/ap-request.ts
@@ -1,5 +1,5 @@
-import * as crypto from 'crypto';
-import { URL } from 'url';
+import * as crypto from 'node:crypto';
+import { URL } from 'node:url';
type Request = {
url: string;
diff --git a/packages/backend/src/remote/activitypub/audience.ts b/packages/backend/src/remote/activitypub/audience.ts
index e82ed94a68..ba69b11e85 100644
--- a/packages/backend/src/remote/activitypub/audience.ts
+++ b/packages/backend/src/remote/activitypub/audience.ts
@@ -1,9 +1,9 @@
-import { ApObject, getApIds } from './type';
-import Resolver from './resolver';
-import { resolvePerson } from './models/person';
-import { unique, concat } from '@/prelude/array';
-import * as promiseLimit from 'promise-limit';
-import { User, IRemoteUser } from '@/models/entities/user';
+import { ApObject, getApIds } from './type.js';
+import Resolver from './resolver.js';
+import { resolvePerson } from './models/person.js';
+import { unique, concat } from '@/prelude/array.js';
+import promiseLimit from 'promise-limit';
+import { User, IRemoteUser } from '@/models/entities/user.js';
type Visibility = 'public' | 'home' | 'followers' | 'specified';
diff --git a/packages/backend/src/remote/activitypub/db-resolver.ts b/packages/backend/src/remote/activitypub/db-resolver.ts
index f2064cf26d..9281e494d0 100644
--- a/packages/backend/src/remote/activitypub/db-resolver.ts
+++ b/packages/backend/src/remote/activitypub/db-resolver.ts
@@ -1,12 +1,12 @@
-import config from '@/config/index';
-import { Note } from '@/models/entities/note';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { UserPublickey } from '@/models/entities/user-publickey';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { Notes, Users, UserPublickeys, MessagingMessages } from '@/models/index';
-import { IObject, getApId } from './type';
-import { resolvePerson } from './models/person';
-import escapeRegexp = require('escape-regexp');
+import config from '@/config/index.js';
+import { Note } from '@/models/entities/note.js';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { UserPublickey } from '@/models/entities/user-publickey.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { Notes, Users, UserPublickeys, MessagingMessages } from '@/models/index.js';
+import { IObject, getApId } from './type.js';
+import { resolvePerson } from './models/person.js';
+import escapeRegexp from 'escape-regexp';
export default class DbResolver {
constructor() {
diff --git a/packages/backend/src/remote/activitypub/deliver-manager.ts b/packages/backend/src/remote/activitypub/deliver-manager.ts
index b16f907693..9c4e3418ff 100644
--- a/packages/backend/src/remote/activitypub/deliver-manager.ts
+++ b/packages/backend/src/remote/activitypub/deliver-manager.ts
@@ -1,6 +1,6 @@
-import { Users, Followings } from '@/models/index';
-import { ILocalUser, IRemoteUser, User } from '@/models/entities/user';
-import { deliver } from '@/queue/index';
+import { Users, Followings } from '@/models/index.js';
+import { ILocalUser, IRemoteUser, User } from '@/models/entities/user.js';
+import { deliver } from '@/queue/index.js';
//#region types
interface IRecipe {
diff --git a/packages/backend/src/remote/activitypub/kernel/accept/follow.ts b/packages/backend/src/remote/activitypub/kernel/accept/follow.ts
index 1afb733ab5..393516addf 100644
--- a/packages/backend/src/remote/activitypub/kernel/accept/follow.ts
+++ b/packages/backend/src/remote/activitypub/kernel/accept/follow.ts
@@ -1,8 +1,8 @@
-import { IRemoteUser } from '@/models/entities/user';
-import accept from '@/services/following/requests/accept';
-import { IFollow } from '../../type';
-import DbResolver from '../../db-resolver';
-import { relayAccepted } from '@/services/relay';
+import { IRemoteUser } from '@/models/entities/user.js';
+import accept from '@/services/following/requests/accept.js';
+import { IFollow } from '../../type.js';
+import DbResolver from '../../db-resolver.js';
+import { relayAccepted } from '@/services/relay.js';
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
// ※ activityはこっちから投げたフォローリクエストなので、activity.actorは存在するローカルユーザーである必要がある
diff --git a/packages/backend/src/remote/activitypub/kernel/accept/index.ts b/packages/backend/src/remote/activitypub/kernel/accept/index.ts
index 5c6f81b2e3..354bd4f6e1 100644
--- a/packages/backend/src/remote/activitypub/kernel/accept/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/accept/index.ts
@@ -1,8 +1,8 @@
-import Resolver from '../../resolver';
-import { IRemoteUser } from '@/models/entities/user';
-import acceptFollow from './follow';
-import { IAccept, isFollow, getApType } from '../../type';
-import { apLogger } from '../../logger';
+import Resolver from '../../resolver.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import acceptFollow from './follow.js';
+import { IAccept, isFollow, getApType } from '../../type.js';
+import { apLogger } from '../../logger.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/add/index.ts b/packages/backend/src/remote/activitypub/kernel/add/index.ts
index b33be0cc85..9a2fac1e74 100644
--- a/packages/backend/src/remote/activitypub/kernel/add/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/add/index.ts
@@ -1,7 +1,7 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { IAdd } from '../../type';
-import { resolveNote } from '../../models/note';
-import { addPinned } from '@/services/i/pin';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IAdd } from '../../type.js';
+import { resolveNote } from '../../models/note.js';
+import { addPinned } from '@/services/i/pin.js';
export default async (actor: IRemoteUser, activity: IAdd): Promise<void> => {
if ('actor' in activity && actor.uri !== activity.actor) {
diff --git a/packages/backend/src/remote/activitypub/kernel/announce/index.ts b/packages/backend/src/remote/activitypub/kernel/announce/index.ts
index 581357e577..7e2e73bdd5 100644
--- a/packages/backend/src/remote/activitypub/kernel/announce/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/announce/index.ts
@@ -1,8 +1,8 @@
-import Resolver from '../../resolver';
-import { IRemoteUser } from '@/models/entities/user';
-import announceNote from './note';
-import { IAnnounce, getApId } from '../../type';
-import { apLogger } from '../../logger';
+import Resolver from '../../resolver.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import announceNote from './note.js';
+import { IAnnounce, getApId } from '../../type.js';
+import { apLogger } from '../../logger.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/announce/note.ts b/packages/backend/src/remote/activitypub/kernel/announce/note.ts
index e9158f7752..f6068fac79 100644
--- a/packages/backend/src/remote/activitypub/kernel/announce/note.ts
+++ b/packages/backend/src/remote/activitypub/kernel/announce/note.ts
@@ -1,14 +1,14 @@
-import Resolver from '../../resolver';
-import post from '@/services/note/create';
-import { IRemoteUser } from '@/models/entities/user';
-import { IAnnounce, getApId } from '../../type';
-import { fetchNote, resolveNote } from '../../models/note';
-import { apLogger } from '../../logger';
-import { extractDbHost } from '@/misc/convert-host';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { getApLock } from '@/misc/app-lock';
-import { parseAudience } from '../../audience';
-import { StatusError } from '@/misc/fetch';
+import Resolver from '../../resolver.js';
+import post from '@/services/note/create.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IAnnounce, getApId } from '../../type.js';
+import { fetchNote, resolveNote } from '../../models/note.js';
+import { apLogger } from '../../logger.js';
+import { extractDbHost } from '@/misc/convert-host.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { getApLock } from '@/misc/app-lock.js';
+import { parseAudience } from '../../audience.js';
+import { StatusError } from '@/misc/fetch.js';
const logger = apLogger;
@@ -42,11 +42,14 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity:
renote = await resolveNote(targetUri);
} catch (e) {
// 対象が4xxならスキップ
- if (e instanceof StatusError && e.isClientError) {
- logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`);
- return;
+ if (e instanceof StatusError) {
+ if (e.isClientError) {
+ logger.warn(`Ignored announce target ${targetUri} - ${e.statusCode}`);
+ return;
+ }
+
+ logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`);
}
- logger.warn(`Error in announce target ${targetUri} - ${e.statusCode || e}`);
throw e;
}
diff --git a/packages/backend/src/remote/activitypub/kernel/block/index.ts b/packages/backend/src/remote/activitypub/kernel/block/index.ts
index 4fd1e07b9b..9e4f1b316e 100644
--- a/packages/backend/src/remote/activitypub/kernel/block/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/block/index.ts
@@ -1,7 +1,7 @@
-import { IBlock } from '../../type';
-import block from '@/services/blocking/create';
-import { IRemoteUser } from '@/models/entities/user';
-import DbResolver from '../../db-resolver';
+import { IBlock } from '../../type.js';
+import block from '@/services/blocking/create.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import DbResolver from '../../db-resolver.js';
export default async (actor: IRemoteUser, activity: IBlock): Promise<string> => {
// ※ activity.objectにブロック対象があり、それは存在するローカルユーザーのはず
diff --git a/packages/backend/src/remote/activitypub/kernel/create/index.ts b/packages/backend/src/remote/activitypub/kernel/create/index.ts
index ce039a363b..1187b95ac6 100644
--- a/packages/backend/src/remote/activitypub/kernel/create/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/create/index.ts
@@ -1,9 +1,9 @@
-import Resolver from '../../resolver';
-import { IRemoteUser } from '@/models/entities/user';
-import createNote from './note';
-import { ICreate, getApId, isPost, getApType } from '../../type';
-import { apLogger } from '../../logger';
-import { toArray, concat, unique } from '@/prelude/array';
+import Resolver from '../../resolver.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import createNote from './note.js';
+import { ICreate, getApId, isPost, getApType } from '../../type.js';
+import { apLogger } from '../../logger.js';
+import { toArray, concat, unique } from '@/prelude/array.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/create/note.ts b/packages/backend/src/remote/activitypub/kernel/create/note.ts
index 14e311e4cd..b5c47990aa 100644
--- a/packages/backend/src/remote/activitypub/kernel/create/note.ts
+++ b/packages/backend/src/remote/activitypub/kernel/create/note.ts
@@ -1,10 +1,10 @@
-import Resolver from '../../resolver';
-import { IRemoteUser } from '@/models/entities/user';
-import { createNote, fetchNote } from '../../models/note';
-import { getApId, IObject, ICreate } from '../../type';
-import { getApLock } from '@/misc/app-lock';
-import { extractDbHost } from '@/misc/convert-host';
-import { StatusError } from '@/misc/fetch';
+import Resolver from '../../resolver.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { createNote, fetchNote } from '../../models/note.js';
+import { getApId, IObject, ICreate } from '../../type.js';
+import { getApLock } from '@/misc/app-lock.js';
+import { extractDbHost } from '@/misc/convert-host.js';
+import { StatusError } from '@/misc/fetch.js';
/**
* 投稿作成アクティビティを捌きます
diff --git a/packages/backend/src/remote/activitypub/kernel/delete/actor.ts b/packages/backend/src/remote/activitypub/kernel/delete/actor.ts
index 502f8d5ab5..2f75841e52 100644
--- a/packages/backend/src/remote/activitypub/kernel/delete/actor.ts
+++ b/packages/backend/src/remote/activitypub/kernel/delete/actor.ts
@@ -1,7 +1,7 @@
-import { apLogger } from '../../logger';
-import { createDeleteAccountJob } from '@/queue';
-import { IRemoteUser } from '@/models/entities/user';
-import { Users } from '@/models/index';
+import { apLogger } from '../../logger.js';
+import { createDeleteAccountJob } from '@/queue/index.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/delete/index.ts b/packages/backend/src/remote/activitypub/kernel/delete/index.ts
index 86a452de76..b6d5e96d03 100644
--- a/packages/backend/src/remote/activitypub/kernel/delete/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/delete/index.ts
@@ -1,8 +1,8 @@
-import deleteNote from './note';
-import { IRemoteUser } from '@/models/entities/user';
-import { IDelete, getApId, isTombstone, IObject, validPost, validActor } from '../../type';
-import { toSingle } from '@/prelude/array';
-import { deleteActor } from './actor';
+import deleteNote from './note.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IDelete, getApId, isTombstone, IObject, validPost, validActor } from '../../type.js';
+import { toSingle } from '@/prelude/array.js';
+import { deleteActor } from './actor.js';
/**
* 削除アクティビティを捌きます
diff --git a/packages/backend/src/remote/activitypub/kernel/delete/note.ts b/packages/backend/src/remote/activitypub/kernel/delete/note.ts
index 3875a33d13..ad5e1a2edc 100644
--- a/packages/backend/src/remote/activitypub/kernel/delete/note.ts
+++ b/packages/backend/src/remote/activitypub/kernel/delete/note.ts
@@ -1,9 +1,9 @@
-import { IRemoteUser } from '@/models/entities/user';
-import deleteNode from '@/services/note/delete';
-import { apLogger } from '../../logger';
-import DbResolver from '../../db-resolver';
-import { getApLock } from '@/misc/app-lock';
-import { deleteMessage } from '@/services/messages/delete';
+import { IRemoteUser } from '@/models/entities/user.js';
+import deleteNode from '@/services/note/delete.js';
+import { apLogger } from '../../logger.js';
+import DbResolver from '../../db-resolver.js';
+import { getApLock } from '@/misc/app-lock.js';
+import { deleteMessage } from '@/services/messages/delete.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/flag/index.ts b/packages/backend/src/remote/activitypub/kernel/flag/index.ts
index aec6d2daaa..e80e632786 100644
--- a/packages/backend/src/remote/activitypub/kernel/flag/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/flag/index.ts
@@ -1,16 +1,16 @@
-import { IRemoteUser } from '@/models/entities/user';
-import config from '@/config/index';
-import { IFlag, getApIds } from '../../type';
-import { AbuseUserReports, Users } from '@/models/index';
+import { IRemoteUser } from '@/models/entities/user.js';
+import config from '@/config/index.js';
+import { IFlag, getApIds } from '../../type.js';
+import { AbuseUserReports, Users } from '@/models/index.js';
import { In } from 'typeorm';
-import { genId } from '@/misc/gen-id';
+import { genId } from '@/misc/gen-id.js';
export default async (actor: IRemoteUser, activity: IFlag): Promise<string> => {
// objectは `(User|Note) | (User|Note)[]` だけど、全パターンDBスキーマと対応させられないので
// 対象ユーザーは一番最初のユーザー として あとはコメントとして格納する
const uris = getApIds(activity.object);
- const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop());
+ const userIds = uris.filter(uri => uri.startsWith(config.url + '/users/')).map(uri => uri.split('/').pop()!);
const users = await Users.find({
id: In(userIds),
});
diff --git a/packages/backend/src/remote/activitypub/kernel/follow.ts b/packages/backend/src/remote/activitypub/kernel/follow.ts
index 3183207afa..49c1a7ee01 100644
--- a/packages/backend/src/remote/activitypub/kernel/follow.ts
+++ b/packages/backend/src/remote/activitypub/kernel/follow.ts
@@ -1,7 +1,7 @@
-import { IRemoteUser } from '@/models/entities/user';
-import follow from '@/services/following/create';
-import { IFollow } from '../type';
-import DbResolver from '../db-resolver';
+import { IRemoteUser } from '@/models/entities/user.js';
+import follow from '@/services/following/create.js';
+import { IFollow } from '../type.js';
+import DbResolver from '../db-resolver.js';
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
const dbResolver = new DbResolver();
diff --git a/packages/backend/src/remote/activitypub/kernel/index.ts b/packages/backend/src/remote/activitypub/kernel/index.ts
index 20df28eec6..6aea8e57cf 100644
--- a/packages/backend/src/remote/activitypub/kernel/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/index.ts
@@ -1,22 +1,22 @@
-import { IObject, isCreate, isDelete, isUpdate, isRead, isFollow, isAccept, isReject, isAdd, isRemove, isAnnounce, isLike, isUndo, isBlock, isCollectionOrOrderedCollection, isCollection, isFlag } from '../type';
-import { IRemoteUser } from '@/models/entities/user';
-import create from './create/index';
-import performDeleteActivity from './delete/index';
-import performUpdateActivity from './update/index';
-import { performReadActivity } from './read';
-import follow from './follow';
-import undo from './undo/index';
-import like from './like';
-import announce from './announce/index';
-import accept from './accept/index';
-import reject from './reject/index';
-import add from './add/index';
-import remove from './remove/index';
-import block from './block/index';
-import flag from './flag/index';
-import { apLogger } from '../logger';
-import Resolver from '../resolver';
-import { toArray } from '@/prelude/array';
+import { IObject, isCreate, isDelete, isUpdate, isRead, isFollow, isAccept, isReject, isAdd, isRemove, isAnnounce, isLike, isUndo, isBlock, isCollectionOrOrderedCollection, isCollection, isFlag } from '../type.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import create from './create/index.js';
+import performDeleteActivity from './delete/index.js';
+import performUpdateActivity from './update/index.js';
+import { performReadActivity } from './read.js';
+import follow from './follow.js';
+import undo from './undo/index.js';
+import like from './like.js';
+import announce from './announce/index.js';
+import accept from './accept/index.js';
+import reject from './reject/index.js';
+import add from './add/index.js';
+import remove from './remove/index.js';
+import block from './block/index.js';
+import flag from './flag/index.js';
+import { apLogger } from '../logger.js';
+import Resolver from '../resolver.js';
+import { toArray } from '@/prelude/array.js';
export async function performActivity(actor: IRemoteUser, activity: IObject) {
if (isCollectionOrOrderedCollection(activity)) {
@@ -25,8 +25,10 @@ export async function performActivity(actor: IRemoteUser, activity: IObject) {
const act = await resolver.resolve(item);
try {
await performOneActivity(actor, act);
- } catch (e) {
- apLogger.error(e);
+ } catch (err) {
+ if (err instanceof Error || typeof err === 'string') {
+ apLogger.error(err);
+ }
}
}
} else {
diff --git a/packages/backend/src/remote/activitypub/kernel/like.ts b/packages/backend/src/remote/activitypub/kernel/like.ts
index 58d5aefefc..715cc379b9 100644
--- a/packages/backend/src/remote/activitypub/kernel/like.ts
+++ b/packages/backend/src/remote/activitypub/kernel/like.ts
@@ -1,7 +1,7 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { ILike, getApId } from '../type';
-import create from '@/services/note/reaction/create';
-import { fetchNote, extractEmojis } from '../models/note';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { ILike, getApId } from '../type.js';
+import create from '@/services/note/reaction/create.js';
+import { fetchNote, extractEmojis } from '../models/note.js';
export default async (actor: IRemoteUser, activity: ILike) => {
const targetUri = getApId(activity.object);
diff --git a/packages/backend/src/remote/activitypub/kernel/read.ts b/packages/backend/src/remote/activitypub/kernel/read.ts
index 11a1731869..93cc36ec46 100644
--- a/packages/backend/src/remote/activitypub/kernel/read.ts
+++ b/packages/backend/src/remote/activitypub/kernel/read.ts
@@ -1,8 +1,8 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { IRead, getApId } from '../type';
-import { isSelfHost, extractDbHost } from '@/misc/convert-host';
-import { MessagingMessages } from '@/models/index';
-import { readUserMessagingMessage } from '../../../server/api/common/read-messaging-message';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IRead, getApId } from '../type.js';
+import { isSelfHost, extractDbHost } from '@/misc/convert-host.js';
+import { MessagingMessages } from '@/models/index.js';
+import { readUserMessagingMessage } from '../../../server/api/common/read-messaging-message.js';
export const performReadActivity = async (actor: IRemoteUser, activity: IRead): Promise<string> => {
const id = await getApId(activity.object);
diff --git a/packages/backend/src/remote/activitypub/kernel/reject/follow.ts b/packages/backend/src/remote/activitypub/kernel/reject/follow.ts
index 049437b18f..72751e83c0 100644
--- a/packages/backend/src/remote/activitypub/kernel/reject/follow.ts
+++ b/packages/backend/src/remote/activitypub/kernel/reject/follow.ts
@@ -1,9 +1,9 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { remoteReject } from '@/services/following/reject';
-import { IFollow } from '../../type';
-import DbResolver from '../../db-resolver';
-import { relayRejected } from '@/services/relay';
-import { Users } from '@/models';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { remoteReject } from '@/services/following/reject.js';
+import { IFollow } from '../../type.js';
+import DbResolver from '../../db-resolver.js';
+import { relayRejected } from '@/services/relay.js';
+import { Users } from '@/models/index.js';
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
// ※ activityはこっちから投げたフォローリクエストなので、activity.actorは存在するローカルユーザーである必要がある
diff --git a/packages/backend/src/remote/activitypub/kernel/reject/index.ts b/packages/backend/src/remote/activitypub/kernel/reject/index.ts
index d0de9c329b..ed86a4aa2f 100644
--- a/packages/backend/src/remote/activitypub/kernel/reject/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/reject/index.ts
@@ -1,8 +1,8 @@
-import Resolver from '../../resolver';
-import { IRemoteUser } from '@/models/entities/user';
-import rejectFollow from './follow';
-import { IReject, isFollow, getApType } from '../../type';
-import { apLogger } from '../../logger';
+import Resolver from '../../resolver.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import rejectFollow from './follow.js';
+import { IReject, isFollow, getApType } from '../../type.js';
+import { apLogger } from '../../logger.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/remove/index.ts b/packages/backend/src/remote/activitypub/kernel/remove/index.ts
index d59953e653..7d7b3386c0 100644
--- a/packages/backend/src/remote/activitypub/kernel/remove/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/remove/index.ts
@@ -1,7 +1,7 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { IRemove } from '../../type';
-import { resolveNote } from '../../models/note';
-import { removePinned } from '@/services/i/pin';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IRemove } from '../../type.js';
+import { resolveNote } from '../../models/note.js';
+import { removePinned } from '@/services/i/pin.js';
export default async (actor: IRemoteUser, activity: IRemove): Promise<void> => {
if ('actor' in activity && actor.uri !== activity.actor) {
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/accept.ts b/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
index 10c8a9c9d9..2383eea5bd 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/accept.ts
@@ -1,9 +1,9 @@
-import unfollow from '@/services/following/delete';
-import cancelRequest from '@/services/following/requests/cancel';
-import {IAccept} from '../../type';
-import { IRemoteUser } from '@/models/entities/user';
-import { Followings } from '@/models/index';
-import DbResolver from '../../db-resolver';
+import unfollow from '@/services/following/delete.js';
+import cancelRequest from '@/services/following/requests/cancel.js';
+import {IAccept} from '../../type.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { Followings } from '@/models/index.js';
+import DbResolver from '../../db-resolver.js';
export default async (actor: IRemoteUser, activity: IAccept): Promise<string> => {
const dbResolver = new DbResolver();
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/announce.ts b/packages/backend/src/remote/activitypub/kernel/undo/announce.ts
index 7f302a616d..822c1e4948 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/announce.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/announce.ts
@@ -1,7 +1,7 @@
-import { Notes } from '@/models/index';
-import { IRemoteUser } from '@/models/entities/user';
-import { IAnnounce, getApId } from '../../type';
-import deleteNote from '@/services/note/delete';
+import { Notes } from '@/models/index.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { IAnnounce, getApId } from '../../type.js';
+import deleteNote from '@/services/note/delete.js';
export const undoAnnounce = async (actor: IRemoteUser, activity: IAnnounce): Promise<string> => {
const uri = getApId(activity);
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/block.ts b/packages/backend/src/remote/activitypub/kernel/undo/block.ts
index 61940486be..844b067e2b 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/block.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/block.ts
@@ -1,7 +1,7 @@
-import { IBlock } from '../../type';
-import unblock from '@/services/blocking/delete';
-import { IRemoteUser } from '@/models/entities/user';
-import DbResolver from '../../db-resolver';
+import { IBlock } from '../../type.js';
+import unblock from '@/services/blocking/delete.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import DbResolver from '../../db-resolver.js';
export default async (actor: IRemoteUser, activity: IBlock): Promise<string> => {
const dbResolver = new DbResolver();
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/follow.ts b/packages/backend/src/remote/activitypub/kernel/undo/follow.ts
index 783e5acf15..6715adcf76 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/follow.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/follow.ts
@@ -1,9 +1,9 @@
-import unfollow from '@/services/following/delete';
-import cancelRequest from '@/services/following/requests/cancel';
-import { IFollow } from '../../type';
-import { IRemoteUser } from '@/models/entities/user';
-import { FollowRequests, Followings } from '@/models/index';
-import DbResolver from '../../db-resolver';
+import unfollow from '@/services/following/delete.js';
+import cancelRequest from '@/services/following/requests/cancel.js';
+import { IFollow } from '../../type.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { FollowRequests, Followings } from '@/models/index.js';
+import DbResolver from '../../db-resolver.js';
export default async (actor: IRemoteUser, activity: IFollow): Promise<string> => {
const dbResolver = new DbResolver();
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/index.ts b/packages/backend/src/remote/activitypub/kernel/undo/index.ts
index 8de78420e3..05937c6855 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/index.ts
@@ -1,12 +1,12 @@
-import { IRemoteUser } from '@/models/entities/user';
-import {IUndo, isFollow, isBlock, isLike, isAnnounce, getApType, isAccept} from '../../type';
-import unfollow from './follow';
-import unblock from './block';
-import undoLike from './like';
-import undoAccept from './accept';
-import { undoAnnounce } from './announce';
-import Resolver from '../../resolver';
-import { apLogger } from '../../logger';
+import { IRemoteUser } from '@/models/entities/user.js';
+import {IUndo, isFollow, isBlock, isLike, isAnnounce, getApType, isAccept} from '../../type.js';
+import unfollow from './follow.js';
+import unblock from './block.js';
+import undoLike from './like.js';
+import undoAccept from './accept.js';
+import { undoAnnounce } from './announce.js';
+import Resolver from '../../resolver.js';
+import { apLogger } from '../../logger.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/kernel/undo/like.ts b/packages/backend/src/remote/activitypub/kernel/undo/like.ts
index 107d3053e3..08ac630351 100644
--- a/packages/backend/src/remote/activitypub/kernel/undo/like.ts
+++ b/packages/backend/src/remote/activitypub/kernel/undo/like.ts
@@ -1,7 +1,7 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { ILike, getApId } from '../../type';
-import deleteReaction from '@/services/note/reaction/delete';
-import { fetchNote } from '../../models/note';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { ILike, getApId } from '../../type.js';
+import deleteReaction from '@/services/note/reaction/delete.js';
+import { fetchNote } from '../../models/note.js';
/**
* Process Undo.Like activity
diff --git a/packages/backend/src/remote/activitypub/kernel/update/index.ts b/packages/backend/src/remote/activitypub/kernel/update/index.ts
index 52bfc5002e..7888c698e3 100644
--- a/packages/backend/src/remote/activitypub/kernel/update/index.ts
+++ b/packages/backend/src/remote/activitypub/kernel/update/index.ts
@@ -1,9 +1,9 @@
-import { IRemoteUser } from '@/models/entities/user';
-import { getApType, IUpdate, isActor } from '../../type';
-import { apLogger } from '../../logger';
-import { updateQuestion } from '../../models/question';
-import Resolver from '../../resolver';
-import { updatePerson } from '../../models/person';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { getApType, IUpdate, isActor } from '../../type.js';
+import { apLogger } from '../../logger.js';
+import { updateQuestion } from '../../models/question.js';
+import Resolver from '../../resolver.js';
+import { updatePerson } from '../../models/person.js';
/**
* Updateアクティビティを捌きます
diff --git a/packages/backend/src/remote/activitypub/logger.ts b/packages/backend/src/remote/activitypub/logger.ts
index e13add01db..cab51b3bf5 100644
--- a/packages/backend/src/remote/activitypub/logger.ts
+++ b/packages/backend/src/remote/activitypub/logger.ts
@@ -1,3 +1,3 @@
-import { remoteLogger } from '../logger';
+import { remoteLogger } from '../logger.js';
export const apLogger = remoteLogger.createSubLogger('ap', 'magenta');
diff --git a/packages/backend/src/remote/activitypub/misc/get-note-html.ts b/packages/backend/src/remote/activitypub/misc/get-note-html.ts
index 043335a5be..3800b40608 100644
--- a/packages/backend/src/remote/activitypub/misc/get-note-html.ts
+++ b/packages/backend/src/remote/activitypub/misc/get-note-html.ts
@@ -1,6 +1,6 @@
import * as mfm from 'mfm-js';
-import { Note } from '@/models/entities/note';
-import { toHtml } from '../../../mfm/to-html';
+import { Note } from '@/models/entities/note.js';
+import { toHtml } from '../../../mfm/to-html.js';
export default function(note: Note) {
let html = note.text ? toHtml(mfm.parse(note.text), JSON.parse(note.mentionedRemoteUsers)) : null;
diff --git a/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts b/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
index 5cca04df21..bb1ba7925c 100644
--- a/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
+++ b/packages/backend/src/remote/activitypub/misc/html-to-mfm.ts
@@ -1,6 +1,6 @@
-import { IObject } from '../type';
-import { extractApHashtagObjects } from '../models/tag';
-import { fromHtml } from '../../../mfm/from-html';
+import { IObject } from '../type.js';
+import { extractApHashtagObjects } from '../models/tag.js';
+import { fromHtml } from '../../../mfm/from-html.js';
export function htmlToMfm(html: string, tag?: IObject | IObject[]) {
const hashtagNames = extractApHashtagObjects(tag).map(x => x.name).filter((x): x is string => x != null);
diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts
index 946914bfaa..34294c935d 100644
--- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts
+++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts
@@ -1,8 +1,8 @@
-import * as crypto from 'crypto';
+import * as crypto from 'node:crypto';
import * as jsonld from 'jsonld';
-import { CONTEXTS } from './contexts';
+import { CONTEXTS } from './contexts.js';
import fetch from 'node-fetch';
-import { httpAgent, httpsAgent } from '@/misc/fetch';
+import { httpAgent, httpsAgent } from '@/misc/fetch.js';
// RsaSignature2017 based from https://github.com/transmute-industries/RsaSignature2017
@@ -24,7 +24,7 @@ export class LdSignature {
} as {
type: string;
creator: string;
- domain: string;
+ domain?: string;
nonce: string;
created: string;
};
@@ -114,7 +114,7 @@ export class LdSignature {
Accept: 'application/ld+json, application/json',
},
timeout: this.loderTimeout,
- agent: u => u.protocol == 'http:' ? httpAgent : httpsAgent,
+ agent: u => u.protocol === 'http:' ? httpAgent : httpsAgent,
}).then(res => {
if (!res.ok) {
throw `${res.status} ${res.statusText}`;
diff --git a/packages/backend/src/remote/activitypub/models/image.ts b/packages/backend/src/remote/activitypub/models/image.ts
index 6f60b7827d..b5e9181d30 100644
--- a/packages/backend/src/remote/activitypub/models/image.ts
+++ b/packages/backend/src/remote/activitypub/models/image.ts
@@ -1,12 +1,12 @@
-import { uploadFromUrl } from '@/services/drive/upload-from-url';
-import { IRemoteUser } from '@/models/entities/user';
-import Resolver from '../resolver';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { apLogger } from '../logger';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
-import { truncate } from '@/misc/truncate';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import Resolver from '../resolver.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { apLogger } from '../logger.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
+import { truncate } from '@/misc/truncate.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/models/mention.ts b/packages/backend/src/remote/activitypub/models/mention.ts
index ade9c90806..c5b0ea53ce 100644
--- a/packages/backend/src/remote/activitypub/models/mention.ts
+++ b/packages/backend/src/remote/activitypub/models/mention.ts
@@ -1,9 +1,9 @@
-import { toArray, unique } from '@/prelude/array';
-import { IObject, isMention, IApMention } from '../type';
-import { resolvePerson } from './person';
-import * as promiseLimit from 'promise-limit';
-import Resolver from '../resolver';
-import { User } from '@/models/entities/user';
+import { toArray, unique } from '@/prelude/array.js';
+import { IObject, isMention, IApMention } from '../type.js';
+import { resolvePerson } from './person.js';
+import promiseLimit from 'promise-limit';
+import Resolver from '../resolver.js';
+import { User } from '@/models/entities/user.js';
export async function extractApMentions(tags: IObject | IObject[] | null | undefined) {
const hrefs = unique(extractApMentionObjects(tags).map(x => x.href as string));
diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts
index 6847925a51..dca64d0a60 100644
--- a/packages/backend/src/remote/activitypub/models/note.ts
+++ b/packages/backend/src/remote/activitypub/models/note.ts
@@ -1,32 +1,32 @@
-import * as promiseLimit from 'promise-limit';
+import promiseLimit from 'promise-limit';
-import config from '@/config/index';
-import Resolver from '../resolver';
-import post from '@/services/note/create';
-import { resolvePerson, updatePerson } from './person';
-import { resolveImage } from './image';
-import { IRemoteUser } from '@/models/entities/user';
-import { htmlToMfm } from '../misc/html-to-mfm';
-import { extractApHashtags } from './tag';
-import { unique, toArray, toSingle } from '@/prelude/array';
-import { extractPollFromQuestion } from './question';
-import vote from '@/services/note/polls/vote';
-import { apLogger } from '../logger';
-import { DriveFile } from '@/models/entities/drive-file';
-import { deliverQuestionUpdate } from '@/services/note/polls/update';
-import { extractDbHost, toPuny } from '@/misc/convert-host';
-import { Emojis, Polls, MessagingMessages } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { IObject, getOneApId, getApId, getOneApHrefNullable, validPost, IPost, isEmoji, getApType } from '../type';
-import { Emoji } from '@/models/entities/emoji';
-import { genId } from '@/misc/gen-id';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { getApLock } from '@/misc/app-lock';
-import { createMessage } from '@/services/messages/create';
-import { parseAudience } from '../audience';
-import { extractApMentions } from './mention';
-import DbResolver from '../db-resolver';
-import { StatusError } from '@/misc/fetch';
+import config from '@/config/index.js';
+import Resolver from '../resolver.js';
+import post from '@/services/note/create.js';
+import { resolvePerson, updatePerson } from './person.js';
+import { resolveImage } from './image.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { htmlToMfm } from '../misc/html-to-mfm.js';
+import { extractApHashtags } from './tag.js';
+import { unique, toArray, toSingle } from '@/prelude/array.js';
+import { extractPollFromQuestion } from './question.js';
+import vote from '@/services/note/polls/vote.js';
+import { apLogger } from '../logger.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
+import { extractDbHost, toPuny } from '@/misc/convert-host.js';
+import { Emojis, Polls, MessagingMessages } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { IObject, getOneApId, getApId, getOneApHrefNullable, validPost, IPost, isEmoji, getApType } from '../type.js';
+import { Emoji } from '@/models/entities/emoji.js';
+import { genId } from '@/misc/gen-id.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { getApLock } from '@/misc/app-lock.js';
+import { createMessage } from '@/services/messages/create.js';
+import { parseAudience } from '../audience.js';
+import { extractApMentions } from './mention.js';
+import DbResolver from '../db-resolver.js';
+import { StatusError } from '@/misc/fetch.js';
const logger = apLogger;
diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts
index 19a7a70903..659d3ac9a2 100644
--- a/packages/backend/src/remote/activitypub/models/person.ts
+++ b/packages/backend/src/remote/activitypub/models/person.ts
@@ -1,35 +1,35 @@
-import { URL } from 'url';
-import * as promiseLimit from 'promise-limit';
+import { URL } from 'node:url';
+import promiseLimit from 'promise-limit';
import $, { Context } from 'cafy';
-import config from '@/config/index';
-import Resolver from '../resolver';
-import { resolveImage } from './image';
-import { isCollectionOrOrderedCollection, isCollection, IActor, getApId, getOneApHrefNullable, IObject, isPropertyValue, IApPropertyValue, getApType, isActor } from '../type';
-import { fromHtml } from '../../../mfm/from-html';
-import { htmlToMfm } from '../misc/html-to-mfm';
-import { resolveNote, extractEmojis } from './note';
-import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc';
-import { extractApHashtags } from './tag';
-import { apLogger } from '../logger';
-import { Note } from '@/models/entities/note';
-import { updateUsertags } from '@/services/update-hashtag';
-import { Users, Instances, DriveFiles, Followings, UserProfiles, UserPublickeys } from '@/models/index';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { Emoji } from '@/models/entities/emoji';
-import { UserNotePining } from '@/models/entities/user-note-pining';
-import { genId } from '@/misc/gen-id';
-import { instanceChart, usersChart } from '@/services/chart/index';
-import { UserPublickey } from '@/models/entities/user-publickey';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-import { toPuny } from '@/misc/convert-host';
-import { UserProfile } from '@/models/entities/user-profile';
+import config from '@/config/index.js';
+import Resolver from '../resolver.js';
+import { resolveImage } from './image.js';
+import { isCollectionOrOrderedCollection, isCollection, IActor, getApId, getOneApHrefNullable, IObject, isPropertyValue, IApPropertyValue, getApType, isActor } from '../type.js';
+import { fromHtml } from '../../../mfm/from-html.js';
+import { htmlToMfm } from '../misc/html-to-mfm.js';
+import { resolveNote, extractEmojis } from './note.js';
+import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
+import { extractApHashtags } from './tag.js';
+import { apLogger } from '../logger.js';
+import { Note } from '@/models/entities/note.js';
+import { updateUsertags } from '@/services/update-hashtag.js';
+import { Users, Instances, DriveFiles, Followings, UserProfiles, UserPublickeys } from '@/models/index.js';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { Emoji } from '@/models/entities/emoji.js';
+import { UserNotePining } from '@/models/entities/user-note-pining.js';
+import { genId } from '@/misc/gen-id.js';
+import { instanceChart, usersChart } from '@/services/chart/index.js';
+import { UserPublickey } from '@/models/entities/user-publickey.js';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
import { getConnection } from 'typeorm';
-import { toArray } from '@/prelude/array';
-import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
-import { truncate } from '@/misc/truncate';
-import { StatusError } from '@/misc/fetch';
+import { toArray } from '@/prelude/array.js';
+import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { truncate } from '@/misc/truncate.js';
+import { StatusError } from '@/misc/fetch.js';
const logger = apLogger;
@@ -57,15 +57,15 @@ function validateActor(x: IObject, uri: string): IActor {
if (e) throw new Error(`invalid Actor: ${name} ${e.message}`);
};
- validate('id', x.id, $.str.min(1));
- validate('inbox', x.inbox, $.str.min(1));
- validate('preferredUsername', x.preferredUsername, $.str.min(1).max(128).match(/^\w([\w-.]*\w)?$/));
+ validate('id', x.id, $.default.str.min(1));
+ validate('inbox', x.inbox, $.default.str.min(1));
+ validate('preferredUsername', x.preferredUsername, $.default.str.min(1).max(128).match(/^\w([\w-.]*\w)?$/));
// These fields are only informational, and some AP software allows these
// fields to be very long. If they are too long, we cut them off. This way
// we can at least see these users and their activities.
- validate('name', truncate(x.name, nameLength), $.optional.nullable.str);
- validate('summary', truncate(x.summary, summaryLength), $.optional.nullable.str);
+ validate('name', truncate(x.name, nameLength), $.default.optional.nullable.str);
+ validate('summary', truncate(x.summary, summaryLength), $.default.optional.nullable.str);
const idHost = toPuny(new URL(x.id!).hostname);
if (idHost !== expectHost) {
@@ -164,6 +164,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<Us
tags,
isBot,
isCat: (person as any).isCat === true,
+ showTimelineReplies: false,
})) as IRemoteUser;
await transactionalEntityManager.save(new UserProfile({
@@ -198,7 +199,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<Us
throw new Error('already registered');
}
} else {
- logger.error(e);
+ logger.error(e instanceof Error ? e : new Error(e as string));
throw e;
}
}
@@ -227,26 +228,14 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<Us
const avatarId = avatar ? avatar.id : null;
const bannerId = banner ? banner.id : null;
- const avatarUrl = avatar ? DriveFiles.getPublicUrl(avatar, true) : null;
- const bannerUrl = banner ? DriveFiles.getPublicUrl(banner) : null;
- const avatarBlurhash = avatar ? avatar.blurhash : null;
- const bannerBlurhash = banner ? banner.blurhash : null;
await Users.update(user!.id, {
avatarId,
bannerId,
- avatarUrl,
- bannerUrl,
- avatarBlurhash,
- bannerBlurhash,
});
user!.avatarId = avatarId;
user!.bannerId = bannerId;
- user!.avatarUrl = avatarUrl;
- user!.bannerUrl = bannerUrl;
- user!.avatarBlurhash = avatarBlurhash;
- user!.bannerBlurhash = bannerBlurhash;
//#endregion
//#region カスタム絵文字取得
@@ -339,14 +328,10 @@ export async function updatePerson(uri: string, resolver?: Resolver | null, hint
if (avatar) {
updates.avatarId = avatar.id;
- updates.avatarUrl = DriveFiles.getPublicUrl(avatar, true);
- updates.avatarBlurhash = avatar.blurhash;
}
if (banner) {
updates.bannerId = banner.id;
- updates.bannerUrl = DriveFiles.getPublicUrl(banner);
- updates.bannerBlurhash = banner.blurhash;
}
// Update user
diff --git a/packages/backend/src/remote/activitypub/models/question.ts b/packages/backend/src/remote/activitypub/models/question.ts
index 3e48e598e6..0a77465e31 100644
--- a/packages/backend/src/remote/activitypub/models/question.ts
+++ b/packages/backend/src/remote/activitypub/models/question.ts
@@ -1,9 +1,9 @@
-import config from '@/config/index';
-import Resolver from '../resolver';
-import { IObject, IQuestion, isQuestion } from '../type';
-import { apLogger } from '../logger';
-import { Notes, Polls } from '@/models/index';
-import { IPoll } from '@/models/entities/poll';
+import config from '@/config/index.js';
+import Resolver from '../resolver.js';
+import { IObject, IQuestion, isQuestion } from '../type.js';
+import { apLogger } from '../logger.js';
+import { Notes, Polls } from '@/models/index.js';
+import { IPoll } from '@/models/entities/poll.js';
export async function extractPollFromQuestion(source: string | IObject, resolver?: Resolver): Promise<IPoll> {
if (resolver == null) resolver = new Resolver();
diff --git a/packages/backend/src/remote/activitypub/models/tag.ts b/packages/backend/src/remote/activitypub/models/tag.ts
index fbc6b9b428..964dabad04 100644
--- a/packages/backend/src/remote/activitypub/models/tag.ts
+++ b/packages/backend/src/remote/activitypub/models/tag.ts
@@ -1,5 +1,5 @@
-import { toArray } from '@/prelude/array';
-import { IObject, isHashtag, IApHashtag } from '../type';
+import { toArray } from '@/prelude/array.js';
+import { IObject, isHashtag, IApHashtag } from '../type.js';
export function extractApHashtags(tags: IObject | IObject[] | null | undefined) {
if (tags == null) return [];
diff --git a/packages/backend/src/remote/activitypub/perform.ts b/packages/backend/src/remote/activitypub/perform.ts
index 01f0e3676e..3e18815586 100644
--- a/packages/backend/src/remote/activitypub/perform.ts
+++ b/packages/backend/src/remote/activitypub/perform.ts
@@ -1,6 +1,6 @@
-import { IObject } from './type';
-import { IRemoteUser } from '@/models/entities/user';
-import { performActivity } from './kernel/index';
+import { IObject } from './type.js';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { performActivity } from './kernel/index.js';
export default async (actor: IRemoteUser, activity: IObject): Promise<void> => {
await performActivity(actor, activity);
diff --git a/packages/backend/src/remote/activitypub/renderer/accept.ts b/packages/backend/src/remote/activitypub/renderer/accept.ts
index 3bce2165cd..cb01f6a91b 100644
--- a/packages/backend/src/remote/activitypub/renderer/accept.ts
+++ b/packages/backend/src/remote/activitypub/renderer/accept.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
export default (object: any, user: { id: User['id']; host: null }) => ({
type: 'Accept',
diff --git a/packages/backend/src/remote/activitypub/renderer/add.ts b/packages/backend/src/remote/activitypub/renderer/add.ts
index 960daf8424..ec47884291 100644
--- a/packages/backend/src/remote/activitypub/renderer/add.ts
+++ b/packages/backend/src/remote/activitypub/renderer/add.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { ILocalUser } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
export default (user: ILocalUser, target: any, object: any) => ({
type: 'Add',
diff --git a/packages/backend/src/remote/activitypub/renderer/announce.ts b/packages/backend/src/remote/activitypub/renderer/announce.ts
index ab113b48e6..2709fea51d 100644
--- a/packages/backend/src/remote/activitypub/renderer/announce.ts
+++ b/packages/backend/src/remote/activitypub/renderer/announce.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { Note } from '@/models/entities/note';
+import config from '@/config/index.js';
+import { Note } from '@/models/entities/note.js';
export default (object: any, note: Note) => {
const attributedTo = `${config.url}/users/${note.userId}`;
diff --git a/packages/backend/src/remote/activitypub/renderer/block.ts b/packages/backend/src/remote/activitypub/renderer/block.ts
index bfb831daa8..10a4fde517 100644
--- a/packages/backend/src/remote/activitypub/renderer/block.ts
+++ b/packages/backend/src/remote/activitypub/renderer/block.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { ILocalUser, IRemoteUser } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { ILocalUser, IRemoteUser } from '@/models/entities/user.js';
export default (blocker: ILocalUser, blockee: IRemoteUser) => ({
type: 'Block',
diff --git a/packages/backend/src/remote/activitypub/renderer/create.ts b/packages/backend/src/remote/activitypub/renderer/create.ts
index ac9e69af20..281a3cb2af 100644
--- a/packages/backend/src/remote/activitypub/renderer/create.ts
+++ b/packages/backend/src/remote/activitypub/renderer/create.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { Note } from '@/models/entities/note';
+import config from '@/config/index.js';
+import { Note } from '@/models/entities/note.js';
export default (object: any, note: Note) => {
const activity = {
diff --git a/packages/backend/src/remote/activitypub/renderer/delete.ts b/packages/backend/src/remote/activitypub/renderer/delete.ts
index 176a6f7e27..4edd3a8807 100644
--- a/packages/backend/src/remote/activitypub/renderer/delete.ts
+++ b/packages/backend/src/remote/activitypub/renderer/delete.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
export default (object: any, user: { id: User['id']; host: null }) => ({
type: 'Delete',
diff --git a/packages/backend/src/remote/activitypub/renderer/document.ts b/packages/backend/src/remote/activitypub/renderer/document.ts
index a9d86dea15..c973de4c4c 100644
--- a/packages/backend/src/remote/activitypub/renderer/document.ts
+++ b/packages/backend/src/remote/activitypub/renderer/document.ts
@@ -1,5 +1,5 @@
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
export default (file: DriveFile) => ({
type: 'Document',
diff --git a/packages/backend/src/remote/activitypub/renderer/emoji.ts b/packages/backend/src/remote/activitypub/renderer/emoji.ts
index e7ae7d959a..0bf15eefd9 100644
--- a/packages/backend/src/remote/activitypub/renderer/emoji.ts
+++ b/packages/backend/src/remote/activitypub/renderer/emoji.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { Emoji } from '@/models/entities/emoji';
+import config from '@/config/index.js';
+import { Emoji } from '@/models/entities/emoji.js';
export default (emoji: Emoji) => ({
id: `${config.url}/emojis/${emoji.name}`,
diff --git a/packages/backend/src/remote/activitypub/renderer/flag.ts b/packages/backend/src/remote/activitypub/renderer/flag.ts
index 60ac496509..6fbc11580f 100644
--- a/packages/backend/src/remote/activitypub/renderer/flag.ts
+++ b/packages/backend/src/remote/activitypub/renderer/flag.ts
@@ -1,7 +1,7 @@
-import config from '@/config/index';
-import { IObject, IActivity } from '@/remote/activitypub/type';
-import { ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { getInstanceActor } from '@/services/instance-actor';
+import config from '@/config/index.js';
+import { IObject, IActivity } from '@/remote/activitypub/type.js';
+import { ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { getInstanceActor } from '@/services/instance-actor.js';
// to anonymise reporters, the reporting actor must be a system user
// object has to be a uri or array of uris
diff --git a/packages/backend/src/remote/activitypub/renderer/follow-relay.ts b/packages/backend/src/remote/activitypub/renderer/follow-relay.ts
index 38800267bf..2c9678090f 100644
--- a/packages/backend/src/remote/activitypub/renderer/follow-relay.ts
+++ b/packages/backend/src/remote/activitypub/renderer/follow-relay.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { Relay } from '@/models/entities/relay';
-import { ILocalUser } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { Relay } from '@/models/entities/relay.js';
+import { ILocalUser } from '@/models/entities/user.js';
export function renderFollowRelay(relay: Relay, relayActor: ILocalUser) {
const follow = {
diff --git a/packages/backend/src/remote/activitypub/renderer/follow-user.ts b/packages/backend/src/remote/activitypub/renderer/follow-user.ts
index e3dde7f7fe..ad1d63b933 100644
--- a/packages/backend/src/remote/activitypub/renderer/follow-user.ts
+++ b/packages/backend/src/remote/activitypub/renderer/follow-user.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { Users } from '@/models/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
/**
* Convert (local|remote)(Follower|Followee)ID to URL
diff --git a/packages/backend/src/remote/activitypub/renderer/follow.ts b/packages/backend/src/remote/activitypub/renderer/follow.ts
index 5258df7e97..9e9692b77a 100644
--- a/packages/backend/src/remote/activitypub/renderer/follow.ts
+++ b/packages/backend/src/remote/activitypub/renderer/follow.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { Users } from '@/models/index';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
export default (follower: { id: User['id']; host: User['host']; uri: User['host'] }, followee: { id: User['id']; host: User['host']; uri: User['host'] }, requestId?: string) => {
const follow = {
diff --git a/packages/backend/src/remote/activitypub/renderer/hashtag.ts b/packages/backend/src/remote/activitypub/renderer/hashtag.ts
index d83a8e68b1..a7b441e006 100644
--- a/packages/backend/src/remote/activitypub/renderer/hashtag.ts
+++ b/packages/backend/src/remote/activitypub/renderer/hashtag.ts
@@ -1,4 +1,4 @@
-import config from '@/config/index';
+import config from '@/config/index.js';
export default (tag: string) => ({
type: 'Hashtag',
diff --git a/packages/backend/src/remote/activitypub/renderer/image.ts b/packages/backend/src/remote/activitypub/renderer/image.ts
index ee3860be8c..c7d5a31a27 100644
--- a/packages/backend/src/remote/activitypub/renderer/image.ts
+++ b/packages/backend/src/remote/activitypub/renderer/image.ts
@@ -1,5 +1,5 @@
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
export default (file: DriveFile) => ({
type: 'Image',
diff --git a/packages/backend/src/remote/activitypub/renderer/index.ts b/packages/backend/src/remote/activitypub/renderer/index.ts
index cffc9bfe04..5f69332266 100644
--- a/packages/backend/src/remote/activitypub/renderer/index.ts
+++ b/packages/backend/src/remote/activitypub/renderer/index.ts
@@ -1,9 +1,9 @@
-import config from '@/config/index';
+import config from '@/config/index.js';
import { v4 as uuid } from 'uuid';
-import { IActivity } from '../type';
-import { LdSignature } from '../misc/ld-signature';
-import { getUserKeypair } from '@/misc/keypair-store';
-import { User } from '@/models/entities/user';
+import { IActivity } from '../type.js';
+import { LdSignature } from '../misc/ld-signature.js';
+import { getUserKeypair } from '@/misc/keypair-store.js';
+import { User } from '@/models/entities/user.js';
export const renderActivity = (x: any): IActivity | null => {
if (x == null) return null;
diff --git a/packages/backend/src/remote/activitypub/renderer/key.ts b/packages/backend/src/remote/activitypub/renderer/key.ts
index 51bc888dd7..c4f3d464f8 100644
--- a/packages/backend/src/remote/activitypub/renderer/key.ts
+++ b/packages/backend/src/remote/activitypub/renderer/key.ts
@@ -1,7 +1,7 @@
-import config from '@/config/index';
-import { ILocalUser } from '@/models/entities/user';
-import { UserKeypair } from '@/models/entities/user-keypair';
-import { createPublicKey } from 'crypto';
+import config from '@/config/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { UserKeypair } from '@/models/entities/user-keypair.js';
+import { createPublicKey } from 'node:crypto';
export default (user: ILocalUser, key: UserKeypair, postfix?: string) => ({
id: `${config.url}/users/${user.id}${postfix || '/publickey'}`,
diff --git a/packages/backend/src/remote/activitypub/renderer/like.ts b/packages/backend/src/remote/activitypub/renderer/like.ts
index 2e4da9d26f..1bf36d4708 100644
--- a/packages/backend/src/remote/activitypub/renderer/like.ts
+++ b/packages/backend/src/remote/activitypub/renderer/like.ts
@@ -1,8 +1,8 @@
-import config from '@/config/index';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { Note } from '@/models/entities/note';
-import { Emojis } from '@/models/index';
-import renderEmoji from './emoji';
+import config from '@/config/index.js';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { Note } from '@/models/entities/note.js';
+import { Emojis } from '@/models/index.js';
+import renderEmoji from './emoji.js';
export const renderLike = async (noteReaction: NoteReaction, note: Note) => {
const reaction = noteReaction.reaction;
diff --git a/packages/backend/src/remote/activitypub/renderer/mention.ts b/packages/backend/src/remote/activitypub/renderer/mention.ts
index 06d2d33e59..c7e62e8840 100644
--- a/packages/backend/src/remote/activitypub/renderer/mention.ts
+++ b/packages/backend/src/remote/activitypub/renderer/mention.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { User, ILocalUser } from '@/models/entities/user';
-import { Users } from '@/models/index';
+import config from '@/config/index.js';
+import { User, ILocalUser } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
export default (mention: User) => ({
type: 'Mention',
diff --git a/packages/backend/src/remote/activitypub/renderer/note.ts b/packages/backend/src/remote/activitypub/renderer/note.ts
index 4f9a372b2f..c3d9e120d6 100644
--- a/packages/backend/src/remote/activitypub/renderer/note.ts
+++ b/packages/backend/src/remote/activitypub/renderer/note.ts
@@ -1,17 +1,17 @@
-import renderDocument from './document';
-import renderHashtag from './hashtag';
-import renderMention from './mention';
-import renderEmoji from './emoji';
-import config from '@/config/index';
-import toHtml from '../misc/get-note-html';
-import { Note, IMentionedRemoteUsers } from '@/models/entities/note';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles, Notes, Users, Emojis, Polls } from '@/models/index';
+import renderDocument from './document.js';
+import renderHashtag from './hashtag.js';
+import renderMention from './mention.js';
+import renderEmoji from './emoji.js';
+import config from '@/config/index.js';
+import toHtml from '../misc/get-note-html.js';
+import { Note, IMentionedRemoteUsers } from '@/models/entities/note.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles, Notes, Users, Emojis, Polls } from '@/models/index.js';
import { In } from 'typeorm';
-import { Emoji } from '@/models/entities/emoji';
-import { Poll } from '@/models/entities/poll';
+import { Emoji } from '@/models/entities/emoji.js';
+import { Poll } from '@/models/entities/poll.js';
-export default async function renderNote(note: Note, dive = true, isTalk = false): Promise<any> {
+export default async function renderNote(note: Note, dive = true, isTalk = false): Promise<Record<string, unknown>> {
const getPromisedFiles = async (ids: string[]) => {
if (!ids || ids.length === 0) return [];
const items = await DriveFiles.find({ id: In(ids) });
diff --git a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts
index c4b4337af8..ff9a77be3d 100644
--- a/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts
+++ b/packages/backend/src/remote/activitypub/renderer/ordered-collection.ts
@@ -6,7 +6,14 @@
* @param last URL of last page (optional)
* @param orderedItems attached objects (optional)
*/
-export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record<string, unknown>) {
+export default function(id: string | null, totalItems: any, first?: string, last?: string, orderedItems?: Record<string, unknown>[]): {
+ id: string | null;
+ type: 'OrderedCollection';
+ totalItems: any;
+ first?: string;
+ last?: string;
+ orderedItems?: Record<string, unknown>[];
+} {
const page: any = {
id,
type: 'OrderedCollection',
diff --git a/packages/backend/src/remote/activitypub/renderer/person.ts b/packages/backend/src/remote/activitypub/renderer/person.ts
index d1c4c0040b..3d86e37cca 100644
--- a/packages/backend/src/remote/activitypub/renderer/person.ts
+++ b/packages/backend/src/remote/activitypub/renderer/person.ts
@@ -1,16 +1,16 @@
-import { URL } from 'url';
+import { URL } from 'node:url';
import * as mfm from 'mfm-js';
-import renderImage from './image';
-import renderKey from './key';
-import config from '@/config/index';
-import { ILocalUser } from '@/models/entities/user';
-import { toHtml } from '../../../mfm/to-html';
-import { getEmojis } from './note';
-import renderEmoji from './emoji';
-import { IIdentifier } from '../models/identifier';
-import renderHashtag from './hashtag';
-import { DriveFiles, UserProfiles } from '@/models/index';
-import { getUserKeypair } from '@/misc/keypair-store';
+import renderImage from './image.js';
+import renderKey from './key.js';
+import config from '@/config/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { toHtml } from '../../../mfm/to-html.js';
+import { getEmojis } from './note.js';
+import renderEmoji from './emoji.js';
+import { IIdentifier } from '../models/identifier.js';
+import renderHashtag from './hashtag.js';
+import { DriveFiles, UserProfiles } from '@/models/index.js';
+import { getUserKeypair } from '@/misc/keypair-store.js';
export async function renderPerson(user: ILocalUser) {
const id = `${config.url}/users/${user.id}`;
diff --git a/packages/backend/src/remote/activitypub/renderer/question.ts b/packages/backend/src/remote/activitypub/renderer/question.ts
index 3cbff33abc..d4d1b590af 100644
--- a/packages/backend/src/remote/activitypub/renderer/question.ts
+++ b/packages/backend/src/remote/activitypub/renderer/question.ts
@@ -1,7 +1,7 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { Poll } from '@/models/entities/poll';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { Poll } from '@/models/entities/poll.js';
export default async function renderQuestion(user: { id: User['id'] }, note: Note, poll: Poll) {
const question = {
diff --git a/packages/backend/src/remote/activitypub/renderer/read.ts b/packages/backend/src/remote/activitypub/renderer/read.ts
index 2fe3b8e5e0..a30e649f64 100644
--- a/packages/backend/src/remote/activitypub/renderer/read.ts
+++ b/packages/backend/src/remote/activitypub/renderer/read.ts
@@ -1,6 +1,6 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { MessagingMessage } from '@/models/entities/messaging-message';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
export const renderReadActivity = (user: { id: User['id'] }, message: MessagingMessage) => ({
type: 'Read',
diff --git a/packages/backend/src/remote/activitypub/renderer/reject.ts b/packages/backend/src/remote/activitypub/renderer/reject.ts
index 575ef52ab8..ab4cc1646a 100644
--- a/packages/backend/src/remote/activitypub/renderer/reject.ts
+++ b/packages/backend/src/remote/activitypub/renderer/reject.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
export default (object: any, user: { id: User['id'] }) => ({
type: 'Reject',
diff --git a/packages/backend/src/remote/activitypub/renderer/remove.ts b/packages/backend/src/remote/activitypub/renderer/remove.ts
index 8afaf199cc..1be3edc5d5 100644
--- a/packages/backend/src/remote/activitypub/renderer/remove.ts
+++ b/packages/backend/src/remote/activitypub/renderer/remove.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
export default (user: { id: User['id'] }, target: any, object: any) => ({
type: 'Remove',
diff --git a/packages/backend/src/remote/activitypub/renderer/undo.ts b/packages/backend/src/remote/activitypub/renderer/undo.ts
index 14115b788d..d28778e22e 100644
--- a/packages/backend/src/remote/activitypub/renderer/undo.ts
+++ b/packages/backend/src/remote/activitypub/renderer/undo.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { ILocalUser, User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { ILocalUser, User } from '@/models/entities/user.js';
export default (object: any, user: { id: User['id'] }) => {
if (object == null) return null;
diff --git a/packages/backend/src/remote/activitypub/renderer/update.ts b/packages/backend/src/remote/activitypub/renderer/update.ts
index 8bb415d117..cf880f03fc 100644
--- a/packages/backend/src/remote/activitypub/renderer/update.ts
+++ b/packages/backend/src/remote/activitypub/renderer/update.ts
@@ -1,5 +1,5 @@
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
export default (object: any, user: { id: User['id'] }) => {
const activity = {
diff --git a/packages/backend/src/remote/activitypub/renderer/vote.ts b/packages/backend/src/remote/activitypub/renderer/vote.ts
index fd7bc9dbed..b6eb8e095d 100644
--- a/packages/backend/src/remote/activitypub/renderer/vote.ts
+++ b/packages/backend/src/remote/activitypub/renderer/vote.ts
@@ -1,8 +1,8 @@
-import config from '@/config/index';
-import { Note } from '@/models/entities/note';
-import { IRemoteUser, User } from '@/models/entities/user';
-import { PollVote } from '@/models/entities/poll-vote';
-import { Poll } from '@/models/entities/poll';
+import config from '@/config/index.js';
+import { Note } from '@/models/entities/note.js';
+import { IRemoteUser, User } from '@/models/entities/user.js';
+import { PollVote } from '@/models/entities/poll-vote.js';
+import { Poll } from '@/models/entities/poll.js';
export default async function renderVote(user: { id: User['id'] }, vote: PollVote, note: Note, poll: Poll, pollOwner: IRemoteUser): Promise<any> {
return {
diff --git a/packages/backend/src/remote/activitypub/request.ts b/packages/backend/src/remote/activitypub/request.ts
index 715937e2a7..5cbfd8c259 100644
--- a/packages/backend/src/remote/activitypub/request.ts
+++ b/packages/backend/src/remote/activitypub/request.ts
@@ -1,8 +1,8 @@
-import config from '@/config/index';
-import { getUserKeypair } from '@/misc/keypair-store';
-import { User } from '@/models/entities/user';
-import { getResponse } from '../../misc/fetch';
-import { createSignedPost, createSignedGet } from './ap-request';
+import config from '@/config/index.js';
+import { getUserKeypair } from '@/misc/keypair-store.js';
+import { User } from '@/models/entities/user.js';
+import { getResponse } from '../../misc/fetch.js';
+import { createSignedPost, createSignedGet } from './ap-request.js';
export default async (user: { id: User['id'] }, url: string, object: any) => {
const body = JSON.stringify(object);
diff --git a/packages/backend/src/remote/activitypub/resolver.ts b/packages/backend/src/remote/activitypub/resolver.ts
index f392a65e3a..c1269c75c5 100644
--- a/packages/backend/src/remote/activitypub/resolver.ts
+++ b/packages/backend/src/remote/activitypub/resolver.ts
@@ -1,11 +1,11 @@
-import config from '@/config/index';
-import { getJson } from '@/misc/fetch';
-import { ILocalUser } from '@/models/entities/user';
-import { getInstanceActor } from '@/services/instance-actor';
-import { signedGet } from './request';
-import { IObject, isCollectionOrOrderedCollection, ICollection, IOrderedCollection } from './type';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { extractDbHost } from '@/misc/convert-host';
+import config from '@/config/index.js';
+import { getJson } from '@/misc/fetch.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { getInstanceActor } from '@/services/instance-actor.js';
+import { signedGet } from './request.js';
+import { IObject, isCollectionOrOrderedCollection, ICollection, IOrderedCollection } from './type.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { extractDbHost } from '@/misc/convert-host.js';
export default class Resolver {
private history: Set<string>;
diff --git a/packages/backend/src/remote/logger.ts b/packages/backend/src/remote/logger.ts
index 9ffad4d716..4921f53bd8 100644
--- a/packages/backend/src/remote/logger.ts
+++ b/packages/backend/src/remote/logger.ts
@@ -1,3 +1,3 @@
-import Logger from '@/services/logger';
+import Logger from '@/services/logger.js';
export const remoteLogger = new Logger('remote', 'cyan');
diff --git a/packages/backend/src/remote/resolve-user.ts b/packages/backend/src/remote/resolve-user.ts
index 747735ecaa..aa37013c4a 100644
--- a/packages/backend/src/remote/resolve-user.ts
+++ b/packages/backend/src/remote/resolve-user.ts
@@ -1,12 +1,12 @@
-import { URL } from 'url';
-import webFinger from './webfinger';
-import config from '@/config/index';
-import { createPerson, updatePerson } from './activitypub/models/person';
-import { remoteLogger } from './logger';
-import * as chalk from 'chalk';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { Users } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
+import { URL } from 'node:url';
+import webFinger from './webfinger.js';
+import config from '@/config/index.js';
+import { createPerson, updatePerson } from './activitypub/models/person.js';
+import { remoteLogger } from './logger.js';
+import chalk from 'chalk';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
const logger = remoteLogger.createSubLogger('resolve-user');
@@ -26,7 +26,7 @@ export async function resolveUser(username: string, host: string | null, option?
host = toPuny(host);
- if (config.host == host) {
+ if (config.host === host) {
logger.info(`return local user: ${usernameLower}`);
return await Users.findOne({ usernameLower, host: null }).then(u => {
if (u == null) {
diff --git a/packages/backend/src/remote/webfinger.ts b/packages/backend/src/remote/webfinger.ts
index f63fd03628..9d3bfab24b 100644
--- a/packages/backend/src/remote/webfinger.ts
+++ b/packages/backend/src/remote/webfinger.ts
@@ -1,6 +1,6 @@
-import { URL } from 'url';
-import { getJson } from '@/misc/fetch';
-import { query as urlQuery } from '@/prelude/url';
+import { URL } from 'node:url';
+import { getJson } from '@/misc/fetch.js';
+import { query as urlQuery } from '@/prelude/url.js';
type ILink = {
href: string;
diff --git a/packages/backend/src/server/activitypub.ts b/packages/backend/src/server/activitypub.ts
index bbbc231b8c..21be0a2517 100644
--- a/packages/backend/src/server/activitypub.ts
+++ b/packages/backend/src/server/activitypub.ts
@@ -1,23 +1,23 @@
-import * as Router from '@koa/router';
-import * as json from 'koa-json-body';
-import * as httpSignature from 'http-signature';
+import Router from '@koa/router';
+import json from 'koa-json-body';
+import httpSignature from 'http-signature';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderNote from '@/remote/activitypub/renderer/note';
-import renderKey from '@/remote/activitypub/renderer/key';
-import { renderPerson } from '@/remote/activitypub/renderer/person';
-import renderEmoji from '@/remote/activitypub/renderer/emoji';
-import Outbox, { packActivity } from './activitypub/outbox';
-import Followers from './activitypub/followers';
-import Following from './activitypub/following';
-import Featured from './activitypub/featured';
-import { inbox as processInbox } from '@/queue/index';
-import { isSelfHost } from '@/misc/convert-host';
-import { Notes, Users, Emojis, NoteReactions } from '@/models/index';
-import { ILocalUser, User } from '@/models/entities/user';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import renderKey from '@/remote/activitypub/renderer/key.js';
+import { renderPerson } from '@/remote/activitypub/renderer/person.js';
+import renderEmoji from '@/remote/activitypub/renderer/emoji.js';
+import Outbox, { packActivity } from './activitypub/outbox.js';
+import Followers from './activitypub/followers.js';
+import Following from './activitypub/following.js';
+import Featured from './activitypub/featured.js';
+import { inbox as processInbox } from '@/queue/index.js';
+import { isSelfHost } from '@/misc/convert-host.js';
+import { Notes, Users, Emojis, NoteReactions } from '@/models/index.js';
+import { ILocalUser, User } from '@/models/entities/user.js';
import { In } from 'typeorm';
-import { renderLike } from '@/remote/activitypub/renderer/like';
-import { getUserKeypair } from '@/misc/keypair-store';
+import { renderLike } from '@/remote/activitypub/renderer/like.js';
+import { getUserKeypair } from '@/misc/keypair-store.js';
// Init router
const router = new Router();
diff --git a/packages/backend/src/server/activitypub/featured.ts b/packages/backend/src/server/activitypub/featured.ts
index 40b8d8cc81..129881a718 100644
--- a/packages/backend/src/server/activitypub/featured.ts
+++ b/packages/backend/src/server/activitypub/featured.ts
@@ -1,10 +1,10 @@
-import * as Router from '@koa/router';
-import config from '@/config/index';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection';
-import { setResponseType } from '../activitypub';
-import renderNote from '@/remote/activitypub/renderer/note';
-import { Users, Notes, UserNotePinings } from '@/models/index';
+import Router from '@koa/router';
+import config from '@/config/index.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection.js';
+import { setResponseType } from '../activitypub.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import { Users, Notes, UserNotePinings } from '@/models/index.js';
export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user;
@@ -32,7 +32,7 @@ export default async (ctx: Router.RouterContext) => {
const rendered = renderOrderedCollection(
`${config.url}/users/${userId}/collections/featured`,
- renderedNotes.length, undefined, undefined, renderedNotes
+ renderedNotes.length, undefined, undefined, renderedNotes,
);
ctx.body = renderActivity(rendered);
diff --git a/packages/backend/src/server/activitypub/followers.ts b/packages/backend/src/server/activitypub/followers.ts
index 927fb5d18a..5d1d7c59eb 100644
--- a/packages/backend/src/server/activitypub/followers.ts
+++ b/packages/backend/src/server/activitypub/followers.ts
@@ -1,24 +1,24 @@
-import * as Router from '@koa/router';
-import config from '@/config/index';
+import Router from '@koa/router';
+import config from '@/config/index.js';
import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import * as url from '@/prelude/url';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection';
-import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page';
-import renderFollowUser from '@/remote/activitypub/renderer/follow-user';
-import { setResponseType } from '../activitypub';
-import { Users, Followings, UserProfiles } from '@/models/index';
+import { ID } from '@/misc/cafy-id.js';
+import * as url from '@/prelude/url.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection.js';
+import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page.js';
+import renderFollowUser from '@/remote/activitypub/renderer/follow-user.js';
+import { setResponseType } from '../activitypub.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
import { LessThan } from 'typeorm';
export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user;
// Get 'cursor' parameter
- const [cursor, cursorErr] = $.optional.type(ID).get(ctx.request.query.cursor);
+ const [cursor, cursorErr] = $.default.optional.type(ID).get(ctx.request.query.cursor);
// Get 'page' parameter
- const pageErr = !$.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
+ const pageErr = !$.default.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
const page: boolean = ctx.request.query.page === 'true';
// Validate parameters
diff --git a/packages/backend/src/server/activitypub/following.ts b/packages/backend/src/server/activitypub/following.ts
index a3237582ad..23110ce873 100644
--- a/packages/backend/src/server/activitypub/following.ts
+++ b/packages/backend/src/server/activitypub/following.ts
@@ -1,25 +1,25 @@
-import * as Router from '@koa/router';
-import config from '@/config/index';
+import Router from '@koa/router';
+import config from '@/config/index.js';
import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import * as url from '@/prelude/url';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection';
-import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page';
-import renderFollowUser from '@/remote/activitypub/renderer/follow-user';
-import { setResponseType } from '../activitypub';
-import { Users, Followings, UserProfiles } from '@/models/index';
+import { ID } from '@/misc/cafy-id.js';
+import * as url from '@/prelude/url.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection.js';
+import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page.js';
+import renderFollowUser from '@/remote/activitypub/renderer/follow-user.js';
+import { setResponseType } from '../activitypub.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
import { LessThan, FindConditions } from 'typeorm';
-import { Following } from '@/models/entities/following';
+import { Following } from '@/models/entities/following.js';
export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user;
// Get 'cursor' parameter
- const [cursor, cursorErr] = $.optional.type(ID).get(ctx.request.query.cursor);
+ const [cursor, cursorErr] = $.default.optional.type(ID).get(ctx.request.query.cursor);
// Get 'page' parameter
- const pageErr = !$.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
+ const pageErr = !$.default.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
const page: boolean = ctx.request.query.page === 'true';
// Validate parameters
diff --git a/packages/backend/src/server/activitypub/outbox.ts b/packages/backend/src/server/activitypub/outbox.ts
index ba6b46a0cc..57c126752a 100644
--- a/packages/backend/src/server/activitypub/outbox.ts
+++ b/packages/backend/src/server/activitypub/outbox.ts
@@ -1,32 +1,32 @@
-import * as Router from '@koa/router';
-import config from '@/config/index';
+import Router from '@koa/router';
+import config from '@/config/index.js';
import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection';
-import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page';
-import { setResponseType } from '../activitypub';
-import renderNote from '@/remote/activitypub/renderer/note';
-import renderCreate from '@/remote/activitypub/renderer/create';
-import renderAnnounce from '@/remote/activitypub/renderer/announce';
-import { countIf } from '@/prelude/array';
-import * as url from '@/prelude/url';
-import { Users, Notes } from '@/models/index';
-import { makePaginationQuery } from '../api/common/make-pagination-query';
+import { ID } from '@/misc/cafy-id.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderOrderedCollection from '@/remote/activitypub/renderer/ordered-collection.js';
+import renderOrderedCollectionPage from '@/remote/activitypub/renderer/ordered-collection-page.js';
+import { setResponseType } from '../activitypub.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import renderCreate from '@/remote/activitypub/renderer/create.js';
+import renderAnnounce from '@/remote/activitypub/renderer/announce.js';
+import { countIf } from '@/prelude/array.js';
+import * as url from '@/prelude/url.js';
+import { Users, Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../api/common/make-pagination-query.js';
import { Brackets } from 'typeorm';
-import { Note } from '@/models/entities/note';
+import { Note } from '@/models/entities/note.js';
export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user;
// Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.optional.type(ID).get(ctx.request.query.since_id);
+ const [sinceId, sinceIdErr] = $.default.optional.type(ID).get(ctx.request.query.since_id);
// Get 'untilId' parameter
- const [untilId, untilIdErr] = $.optional.type(ID).get(ctx.request.query.until_id);
+ const [untilId, untilIdErr] = $.default.optional.type(ID).get(ctx.request.query.until_id);
// Get 'page' parameter
- const pageErr = !$.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
+ const pageErr = !$.default.optional.str.or(['true', 'false']).ok(ctx.request.query.page);
const page: boolean = ctx.request.query.page === 'true';
// Validate parameters
diff --git a/packages/backend/src/server/api/2fa.ts b/packages/backend/src/server/api/2fa.ts
index 2a69e49c83..e1c226979a 100644
--- a/packages/backend/src/server/api/2fa.ts
+++ b/packages/backend/src/server/api/2fa.ts
@@ -1,5 +1,5 @@
-import * as crypto from 'crypto';
-import config from '@/config/index';
+import * as crypto from 'node:crypto';
+import config from '@/config/index.js';
import * as jsrsasign from 'jsrsasign';
const ECC_PRELUDE = Buffer.from([0x04]);
diff --git a/packages/backend/src/server/api/api-handler.ts b/packages/backend/src/server/api/api-handler.ts
index faa35d12d4..f97c3dd397 100644
--- a/packages/backend/src/server/api/api-handler.ts
+++ b/packages/backend/src/server/api/api-handler.ts
@@ -1,11 +1,11 @@
-import * as Koa from 'koa';
+import Koa from 'koa';
-import { IEndpoint } from './endpoints';
-import authenticate, { AuthenticationError } from './authenticate';
-import call from './call';
-import { ApiError } from './error';
+import { IEndpoint } from './endpoints.js';
+import authenticate, { AuthenticationError } from './authenticate.js';
+import call from './call.js';
+import { ApiError } from './error.js';
-export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise((res) => {
+export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise<void>((res) => {
const body = ctx.request.body;
const reply = (x?: any, y?: ApiError) => {
@@ -32,7 +32,7 @@ export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise((res) => {
// Authentication
authenticate(body['i']).then(([user, app]) => {
// API invoking
- call(endpoint.name, user, app, body, (ctx as any).file).then((res: any) => {
+ call(endpoint.name, user, app, body, ctx).then((res: any) => {
reply(res);
}).catch((e: ApiError) => {
reply(e.httpStatusCode ? e.httpStatusCode : e.kind === 'client' ? 400 : 500, e);
diff --git a/packages/backend/src/server/api/authenticate.ts b/packages/backend/src/server/api/authenticate.ts
index 9e2f3eb743..7fdf14666e 100644
--- a/packages/backend/src/server/api/authenticate.ts
+++ b/packages/backend/src/server/api/authenticate.ts
@@ -1,7 +1,7 @@
-import isNativeToken from './common/is-native-token';
-import { User } from '@/models/entities/user';
-import { Users, AccessTokens, Apps } from '@/models/index';
-import { AccessToken } from '@/models/entities/access-token';
+import isNativeToken from './common/is-native-token.js';
+import { User } from '@/models/entities/user.js';
+import { Users, AccessTokens, Apps } from '@/models/index.js';
+import { AccessToken } from '@/models/entities/access-token.js';
export class AuthenticationError extends Error {
constructor(message: string) {
diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts
index 399ee65bde..5c5ef66019 100644
--- a/packages/backend/src/server/api/call.ts
+++ b/packages/backend/src/server/api/call.ts
@@ -1,10 +1,11 @@
+import Koa from 'koa';
import { performance } from 'perf_hooks';
-import { limiter } from './limiter';
-import { User } from '@/models/entities/user';
-import endpoints from './endpoints';
-import { ApiError } from './error';
-import { apiLogger } from './logger';
-import { AccessToken } from '@/models/entities/access-token';
+import { limiter } from './limiter.js';
+import { User } from '@/models/entities/user.js';
+import endpoints, { IEndpoint } from './endpoints.js';
+import { ApiError } from './error.js';
+import { apiLogger } from './logger.js';
+import { AccessToken } from '@/models/entities/access-token.js';
const accessDenied = {
message: 'Access denied.',
@@ -12,7 +13,7 @@ const accessDenied = {
id: '56f35758-7dd5-468b-8439-5d6fb8ec9b8e',
};
-export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, file?: any) => {
+export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, ctx?: Koa.Context) => {
const isSecure = user != null && token == null;
const ep = endpoints.find(e => e.name === endpoint);
@@ -66,7 +67,7 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac
if (ep.meta.requireCredential && ep.meta.limit && !user!.isAdmin && !user!.isModerator) {
// Rate limit
- await limiter(ep, user!).catch(e => {
+ await limiter(ep as IEndpoint & { meta: { limit: NonNullable<IEndpoint['meta']['limit']> } }, user!).catch(e => {
throw new ApiError({
message: 'Rate limit exceeded. Please try again later.',
code: 'RATE_LIMIT_EXCEEDED',
@@ -76,9 +77,30 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac
});
}
+ // Cast non JSON input
+ if (ep.meta.requireFile && ep.params.properties) {
+ for (const k of Object.keys(ep.params.properties)) {
+ const param = ep.params.properties![k];
+ if (['boolean', 'number', 'integer'].includes(param.type ?? '') && typeof data[k] === 'string') {
+ try {
+ data[k] = JSON.parse(data[k]);
+ } catch (e) {
+ throw new ApiError({
+ message: 'Invalid param.',
+ code: 'INVALID_PARAM',
+ id: '0b5f1631-7c1a-41a6-b399-cce335f34d85',
+ }, {
+ param: k,
+ reason: `cannot cast to ${param.type}`,
+ });
+ }
+ }
+ }
+ }
+
// API invoking
const before = performance.now();
- return await ep.exec(data, user, token, file).catch((e: Error) => {
+ return await ep.exec(data, user, token, ctx?.file).catch((e: Error) => {
if (e instanceof ApiError) {
throw e;
} else {
diff --git a/packages/backend/src/server/api/common/generate-block-query.ts b/packages/backend/src/server/api/common/generate-block-query.ts
index 4fd6184738..60db1e731b 100644
--- a/packages/backend/src/server/api/common/generate-block-query.ts
+++ b/packages/backend/src/server/api/common/generate-block-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { Blockings } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { Blockings } from '@/models/index.js';
import { Brackets, SelectQueryBuilder } from 'typeorm';
// ここでいうBlockedは被Blockedの意
diff --git a/packages/backend/src/server/api/common/generate-channel-query.ts b/packages/backend/src/server/api/common/generate-channel-query.ts
index 80a0acf7f9..333bb73b86 100644
--- a/packages/backend/src/server/api/common/generate-channel-query.ts
+++ b/packages/backend/src/server/api/common/generate-channel-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { ChannelFollowings } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { ChannelFollowings } from '@/models/index.js';
import { Brackets, SelectQueryBuilder } from 'typeorm';
export function generateChannelQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
diff --git a/packages/backend/src/server/api/common/generate-muted-instance-query.ts b/packages/backend/src/server/api/common/generate-muted-instance-query.ts
index dbc9fc98f1..72a6fec68f 100644
--- a/packages/backend/src/server/api/common/generate-muted-instance-query.ts
+++ b/packages/backend/src/server/api/common/generate-muted-instance-query.ts
@@ -1,6 +1,6 @@
-import { User } from '@/models/entities/user';
-import { id } from '@/models/id';
-import { UserProfiles } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { id } from '@/models/id.js';
+import { UserProfiles } from '@/models/index.js';
import { SelectQueryBuilder, Brackets } from 'typeorm';
function createMutesQuery(id: string) {
diff --git a/packages/backend/src/server/api/common/generate-muted-note-query.ts b/packages/backend/src/server/api/common/generate-muted-note-query.ts
index 0737842613..f544e334d3 100644
--- a/packages/backend/src/server/api/common/generate-muted-note-query.ts
+++ b/packages/backend/src/server/api/common/generate-muted-note-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { MutedNotes } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { MutedNotes } from '@/models/index.js';
import { SelectQueryBuilder } from 'typeorm';
export function generateMutedNoteQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
diff --git a/packages/backend/src/server/api/common/generate-muted-note-thread-query.ts b/packages/backend/src/server/api/common/generate-muted-note-thread-query.ts
index 7e2cbd498b..7263ea2e60 100644
--- a/packages/backend/src/server/api/common/generate-muted-note-thread-query.ts
+++ b/packages/backend/src/server/api/common/generate-muted-note-thread-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { NoteThreadMutings } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { NoteThreadMutings } from '@/models/index.js';
import { Brackets, SelectQueryBuilder } from 'typeorm';
export function generateMutedNoteThreadQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }) {
diff --git a/packages/backend/src/server/api/common/generate-muted-user-query.ts b/packages/backend/src/server/api/common/generate-muted-user-query.ts
index 7e200b87ef..79cb3ff894 100644
--- a/packages/backend/src/server/api/common/generate-muted-user-query.ts
+++ b/packages/backend/src/server/api/common/generate-muted-user-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { Mutings } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { Mutings } from '@/models/index.js';
import { SelectQueryBuilder, Brackets } from 'typeorm';
export function generateMutedUserQuery(q: SelectQueryBuilder<any>, me: { id: User['id'] }, exclude?: User) {
diff --git a/packages/backend/src/server/api/common/generate-native-user-token.ts b/packages/backend/src/server/api/common/generate-native-user-token.ts
index 1f791c57ce..5d8a4c5378 100644
--- a/packages/backend/src/server/api/common/generate-native-user-token.ts
+++ b/packages/backend/src/server/api/common/generate-native-user-token.ts
@@ -1,3 +1,3 @@
-import { secureRndstr } from '@/misc/secure-rndstr';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export default () => secureRndstr(16, true);
diff --git a/packages/backend/src/server/api/common/generate-replies-query.ts b/packages/backend/src/server/api/common/generate-replies-query.ts
index fbc41b2c25..301782eab9 100644
--- a/packages/backend/src/server/api/common/generate-replies-query.ts
+++ b/packages/backend/src/server/api/common/generate-replies-query.ts
@@ -1,7 +1,7 @@
-import { User } from '@/models/entities/user';
+import { User } from '@/models/entities/user.js';
import { Brackets, SelectQueryBuilder } from 'typeorm';
-export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
+export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: Pick<User, 'id' | 'showTimelineReplies'> | null) {
if (me == null) {
q.andWhere(new Brackets(qb => { qb
.where(`note.replyId IS NULL`) // 返信ではない
@@ -10,7 +10,7 @@ export function generateRepliesQuery(q: SelectQueryBuilder<any>, me?: { id: User
.andWhere('note.replyUserId = note.userId');
}));
}));
- } else {
+ } else if (!me.showTimelineReplies) {
q.andWhere(new Brackets(qb => { qb
.where(`note.replyId IS NULL`) // 返信ではない
.orWhere('note.replyUserId = :meId', { meId: me.id }) // 返信だけど自分のノートへの返信
diff --git a/packages/backend/src/server/api/common/generate-visibility-query.ts b/packages/backend/src/server/api/common/generate-visibility-query.ts
index 813e8b6c09..715982934c 100644
--- a/packages/backend/src/server/api/common/generate-visibility-query.ts
+++ b/packages/backend/src/server/api/common/generate-visibility-query.ts
@@ -1,5 +1,5 @@
-import { User } from '@/models/entities/user';
-import { Followings } from '@/models/index';
+import { User } from '@/models/entities/user.js';
+import { Followings } from '@/models/index.js';
import { Brackets, SelectQueryBuilder } from 'typeorm';
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
diff --git a/packages/backend/src/server/api/common/getters.ts b/packages/backend/src/server/api/common/getters.ts
index 4b2ee8f1da..c5a47876d0 100644
--- a/packages/backend/src/server/api/common/getters.ts
+++ b/packages/backend/src/server/api/common/getters.ts
@@ -1,7 +1,7 @@
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { Notes, Users } from '@/models/index';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { Notes, Users } from '@/models/index.js';
/**
* Get note for API processing
diff --git a/packages/backend/src/server/api/common/inject-featured.ts b/packages/backend/src/server/api/common/inject-featured.ts
index 1dc13c83ef..b7dd8028b5 100644
--- a/packages/backend/src/server/api/common/inject-featured.ts
+++ b/packages/backend/src/server/api/common/inject-featured.ts
@@ -1,9 +1,9 @@
import rndstr from 'rndstr';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { Notes, UserProfiles, NoteReactions } from '@/models/index';
-import { generateMutedUserQuery } from './generate-muted-user-query';
-import { generateBlockedUserQuery } from './generate-block-query';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { Notes, UserProfiles, NoteReactions } from '@/models/index.js';
+import { generateMutedUserQuery } from './generate-muted-user-query.js';
+import { generateBlockedUserQuery } from './generate-block-query.js';
// TODO: リアクション、Renote、返信などをしたノートは除外する
diff --git a/packages/backend/src/server/api/common/inject-promo.ts b/packages/backend/src/server/api/common/inject-promo.ts
index 06a3841995..b467b7b70b 100644
--- a/packages/backend/src/server/api/common/inject-promo.ts
+++ b/packages/backend/src/server/api/common/inject-promo.ts
@@ -1,7 +1,7 @@
import rndstr from 'rndstr';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { PromoReads, PromoNotes, Notes, Users } from '@/models/index';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { PromoReads, PromoNotes, Notes, Users } from '@/models/index.js';
export async function injectPromo(timeline: Note[], user?: User | null) {
if (timeline.length < 5) return;
diff --git a/packages/backend/src/server/api/common/read-messaging-message.ts b/packages/backend/src/server/api/common/read-messaging-message.ts
index 928333e59c..b0ce54d370 100644
--- a/packages/backend/src/server/api/common/read-messaging-message.ts
+++ b/packages/backend/src/server/api/common/read-messaging-message.ts
@@ -1,17 +1,17 @@
-import { publishMainStream, publishGroupMessagingStream } from '@/services/stream';
-import { publishMessagingStream } from '@/services/stream';
-import { publishMessagingIndexStream } from '@/services/stream';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { MessagingMessages, UserGroupJoinings, Users } from '@/models/index';
+import { publishMainStream, publishGroupMessagingStream } from '@/services/stream.js';
+import { publishMessagingStream } from '@/services/stream.js';
+import { publishMessagingIndexStream } from '@/services/stream.js';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { MessagingMessages, UserGroupJoinings, Users } from '@/models/index.js';
import { In } from 'typeorm';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { UserGroup } from '@/models/entities/user-group';
-import { toArray } from '@/prelude/array';
-import { renderReadActivity } from '@/remote/activitypub/renderer/read';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { deliver } from '@/queue/index';
-import orderedCollection from '@/remote/activitypub/renderer/ordered-collection';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { toArray } from '@/prelude/array.js';
+import { renderReadActivity } from '@/remote/activitypub/renderer/read.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { deliver } from '@/queue/index.js';
+import orderedCollection from '@/remote/activitypub/renderer/ordered-collection.js';
/**
* Mark messages as read
diff --git a/packages/backend/src/server/api/common/read-notification.ts b/packages/backend/src/server/api/common/read-notification.ts
index 049a7feed6..1f575042a0 100644
--- a/packages/backend/src/server/api/common/read-notification.ts
+++ b/packages/backend/src/server/api/common/read-notification.ts
@@ -1,7 +1,7 @@
-import { publishMainStream } from '@/services/stream';
-import { User } from '@/models/entities/user';
-import { Notification } from '@/models/entities/notification';
-import { Notifications, Users } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import { User } from '@/models/entities/user.js';
+import { Notification } from '@/models/entities/notification.js';
+import { Notifications, Users } from '@/models/index.js';
import { In } from 'typeorm';
export async function readNotification(
diff --git a/packages/backend/src/server/api/common/signin.ts b/packages/backend/src/server/api/common/signin.ts
index df986fc457..163f132a44 100644
--- a/packages/backend/src/server/api/common/signin.ts
+++ b/packages/backend/src/server/api/common/signin.ts
@@ -1,10 +1,10 @@
-import * as Koa from 'koa';
+import Koa from 'koa';
-import config from '@/config/index';
-import { ILocalUser } from '@/models/entities/user';
-import { Signins } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { publishMainStream } from '@/services/stream';
+import config from '@/config/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { Signins } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { publishMainStream } from '@/services/stream.js';
export default function(ctx: Koa.Context, user: ILocalUser, redirect = false) {
if (redirect) {
diff --git a/packages/backend/src/server/api/common/signup.ts b/packages/backend/src/server/api/common/signup.ts
index f8db7e374e..7689e8233f 100644
--- a/packages/backend/src/server/api/common/signup.ts
+++ b/packages/backend/src/server/api/common/signup.ts
@@ -1,15 +1,15 @@
-import * as bcrypt from 'bcryptjs';
-import { generateKeyPair } from 'crypto';
-import generateUserToken from './generate-native-user-token';
-import { User } from '@/models/entities/user';
-import { Users, UsedUsernames } from '@/models/index';
-import { UserProfile } from '@/models/entities/user-profile';
+import bcrypt from 'bcryptjs';
+import { generateKeyPair } from 'node:crypto';
+import generateUserToken from './generate-native-user-token.js';
+import { User } from '@/models/entities/user.js';
+import { Users, UsedUsernames } from '@/models/index.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
import { getConnection } from 'typeorm';
-import { genId } from '@/misc/gen-id';
-import { toPunyNullable } from '@/misc/convert-host';
-import { UserKeypair } from '@/models/entities/user-keypair';
-import { usersChart } from '@/services/chart/index';
-import { UsedUsername } from '@/models/entities/used-username';
+import { genId } from '@/misc/gen-id.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
+import { UserKeypair } from '@/models/entities/user-keypair.js';
+import { usersChart } from '@/services/chart/index.js';
+import { UsedUsername } from '@/models/entities/used-username.js';
export async function signup(opts: {
username: User['username'];
@@ -21,13 +21,13 @@ export async function signup(opts: {
let hash = passwordHash;
// Validate username
- if (!Users.validateLocalUsername.ok(username)) {
+ if (!Users.validateLocalUsername(username)) {
throw new Error('INVALID_USERNAME');
}
if (password != null && passwordHash == null) {
// Validate password
- if (!Users.validatePassword.ok(password)) {
+ if (!Users.validatePassword(password)) {
throw new Error('INVALID_PASSWORD');
}
diff --git a/packages/backend/src/server/api/define.ts b/packages/backend/src/server/api/define.ts
index 71e5fadde0..9094fcffc6 100644
--- a/packages/backend/src/server/api/define.ts
+++ b/packages/backend/src/server/api/define.ts
@@ -1,14 +1,14 @@
-import * as fs from 'fs';
-import { ILocalUser } from '@/models/entities/user';
-import { IEndpointMeta } from './endpoints';
-import { ApiError } from './error';
-import { SchemaType } from '@/misc/schema';
-import { AccessToken } from '@/models/entities/access-token';
-
-type NonOptional<T> = T extends undefined ? never : T;
+import * as fs from 'node:fs';
+import Ajv from 'ajv';
+import { ILocalUser } from '@/models/entities/user.js';
+import { IEndpointMeta } from './endpoints.js';
+import { ApiError } from './error.js';
+import { Schema, SchemaType } from '@/misc/schema.js';
+import { AccessToken } from '@/models/entities/access-token.js';
type SimpleUserInfo = {
id: ILocalUser['id'];
+ createdAt: ILocalUser['createdAt'];
host: ILocalUser['host'];
username: ILocalUser['username'];
uri: ILocalUser['uri'];
@@ -17,24 +17,27 @@ type SimpleUserInfo = {
isAdmin: ILocalUser['isAdmin'];
isModerator: ILocalUser['isModerator'];
isSilenced: ILocalUser['isSilenced'];
-};
-
-type Params<T extends IEndpointMeta> = {
- [P in keyof T['params']]: NonNullable<T['params']>[P]['transform'] extends () => any
- ? ReturnType<NonNullable<T['params']>[P]['transform']>
- : NonNullable<T['params']>[P]['default'] extends null | number | string
- ? NonOptional<ReturnType<NonNullable<T['params']>[P]['validator']['get']>[0]>
- : ReturnType<NonNullable<T['params']>[P]['validator']['get']>[0];
+ showTimelineReplies: ILocalUser['showTimelineReplies'];
};
export type Response = Record<string, any> | void;
-type executor<T extends IEndpointMeta> =
- (params: Params<T>, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any, cleanup?: () => any) =>
+// TODO: paramsの型をT['params']のスキーマ定義から推論する
+type executor<T extends IEndpointMeta, Ps extends Schema> =
+ (params: SchemaType<Ps>, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any, cleanup?: () => any) =>
Promise<T['res'] extends undefined ? Response : SchemaType<NonNullable<T['res']>>>;
-export default function <T extends IEndpointMeta>(meta: T, cb: executor<T>)
+const ajv = new Ajv({
+ useDefaults: true,
+});
+
+ajv.addFormat('misskey:id', /^[a-z0-9]+$/);
+
+export default function <T extends IEndpointMeta, Ps extends Schema>(meta: T, paramDef: Ps, cb: executor<T, Ps>)
: (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => Promise<any> {
+
+ const validate = ajv.compile(paramDef);
+
return (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => {
function cleanup() {
fs.unlink(file.path, () => {});
@@ -46,42 +49,22 @@ export default function <T extends IEndpointMeta>(meta: T, cb: executor<T>)
id: '4267801e-70d1-416a-b011-4ee502885d8b',
}));
- const [ps, pserr] = getParams(meta, params);
- if (pserr) {
+ const valid = validate(params);
+ if (!valid) {
if (file) cleanup();
- return Promise.reject(pserr);
- }
-
- return cb(ps, user, token, file, cleanup);
- };
-}
-function getParams<T extends IEndpointMeta>(defs: T, params: any): [Params<T>, ApiError | null] {
- if (defs.params == null) return [params, null];
-
- const x: any = {};
- let err: ApiError | null = null;
- Object.entries(defs.params).some(([k, def]) => {
- const [v, e] = def.validator.get(params[k]);
- if (e) {
- err = new ApiError({
+ const errors = validate.errors!;
+ const err = new ApiError({
message: 'Invalid param.',
code: 'INVALID_PARAM',
id: '3d81ceae-475f-4600-b2a8-2bc116157532',
}, {
- param: k,
- reason: e.message,
+ param: errors[0].schemaPath,
+ reason: errors[0].message,
});
- return true;
- } else {
- if (v === undefined && Object.prototype.hasOwnProperty.call(def, 'default')) {
- x[k] = def.default;
- } else {
- x[k] = v;
- }
- if (def.transform) x[k] = def.transform(x[k]);
- return false;
+ return Promise.reject(err);
}
- });
- return [x, err];
+
+ return cb(params as SchemaType<Ps>, user, token, file, cleanup);
+ };
}
diff --git a/packages/backend/src/server/api/endpoints.ts b/packages/backend/src/server/api/endpoints.ts
index bb4e972b8e..6b4eff0780 100644
--- a/packages/backend/src/server/api/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints.ts
@@ -1,31 +1,618 @@
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-import { Context } from 'cafy';
-import * as path from 'path';
-import * as glob from 'glob';
-import { Schema } from '@/misc/schema';
+import { Schema } from '@/misc/schema.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
-const _dirname = dirname(_filename);
+import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-reports.js';
+import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
+import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
+import * as ep___admin_ad_create from './endpoints/admin/ad/create.js';
+import * as ep___admin_ad_delete from './endpoints/admin/ad/delete.js';
+import * as ep___admin_ad_list from './endpoints/admin/ad/list.js';
+import * as ep___admin_ad_update from './endpoints/admin/ad/update.js';
+import * as ep___admin_announcements_create from './endpoints/admin/announcements/create.js';
+import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.js';
+import * as ep___admin_announcements_list from './endpoints/admin/announcements/list.js';
+import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.js';
+import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js';
+import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js';
+import * as ep___admin_drive_cleanup from './endpoints/admin/drive/cleanup.js';
+import * as ep___admin_drive_files from './endpoints/admin/drive/files.js';
+import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.js';
+import * as ep___admin_emoji_addAliasesBulk from './endpoints/admin/emoji/add-aliases-bulk.js';
+import * as ep___admin_emoji_add from './endpoints/admin/emoji/add.js';
+import * as ep___admin_emoji_copy from './endpoints/admin/emoji/copy.js';
+import * as ep___admin_emoji_deleteBulk from './endpoints/admin/emoji/delete-bulk.js';
+import * as ep___admin_emoji_delete from './endpoints/admin/emoji/delete.js';
+import * as ep___admin_emoji_importZip from './endpoints/admin/emoji/import-zip.js';
+import * as ep___admin_emoji_listRemote from './endpoints/admin/emoji/list-remote.js';
+import * as ep___admin_emoji_list from './endpoints/admin/emoji/list.js';
+import * as ep___admin_emoji_removeAliasesBulk from './endpoints/admin/emoji/remove-aliases-bulk.js';
+import * as ep___admin_emoji_setAliasesBulk from './endpoints/admin/emoji/set-aliases-bulk.js';
+import * as ep___admin_emoji_setCategoryBulk from './endpoints/admin/emoji/set-category-bulk.js';
+import * as ep___admin_emoji_update from './endpoints/admin/emoji/update.js';
+import * as ep___admin_federation_deleteAllFiles from './endpoints/admin/federation/delete-all-files.js';
+import * as ep___admin_federation_refreshRemoteInstanceMetadata from './endpoints/admin/federation/refresh-remote-instance-metadata.js';
+import * as ep___admin_federation_removeAllFollowing from './endpoints/admin/federation/remove-all-following.js';
+import * as ep___admin_federation_updateInstance from './endpoints/admin/federation/update-instance.js';
+import * as ep___admin_getIndexStats from './endpoints/admin/get-index-stats.js';
+import * as ep___admin_getTableStats from './endpoints/admin/get-table-stats.js';
+import * as ep___admin_invite from './endpoints/admin/invite.js';
+import * as ep___admin_moderators_add from './endpoints/admin/moderators/add.js';
+import * as ep___admin_moderators_remove from './endpoints/admin/moderators/remove.js';
+import * as ep___admin_promo_create from './endpoints/admin/promo/create.js';
+import * as ep___admin_queue_clear from './endpoints/admin/queue/clear.js';
+import * as ep___admin_queue_deliverDelayed from './endpoints/admin/queue/deliver-delayed.js';
+import * as ep___admin_queue_inboxDelayed from './endpoints/admin/queue/inbox-delayed.js';
+import * as ep___admin_queue_stats from './endpoints/admin/queue/stats.js';
+import * as ep___admin_relays_add from './endpoints/admin/relays/add.js';
+import * as ep___admin_relays_list from './endpoints/admin/relays/list.js';
+import * as ep___admin_relays_remove from './endpoints/admin/relays/remove.js';
+import * as ep___admin_resetPassword from './endpoints/admin/reset-password.js';
+import * as ep___admin_resolveAbuseUserReport from './endpoints/admin/resolve-abuse-user-report.js';
+import * as ep___admin_sendEmail from './endpoints/admin/send-email.js';
+import * as ep___admin_serverInfo from './endpoints/admin/server-info.js';
+import * as ep___admin_showModerationLogs from './endpoints/admin/show-moderation-logs.js';
+import * as ep___admin_showUser from './endpoints/admin/show-user.js';
+import * as ep___admin_showUsers from './endpoints/admin/show-users.js';
+import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js';
+import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
+import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js';
+import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
+import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
+import * as ep___admin_vacuum from './endpoints/admin/vacuum.js';
+import * as ep___announcements from './endpoints/announcements.js';
+import * as ep___antennas_create from './endpoints/antennas/create.js';
+import * as ep___antennas_delete from './endpoints/antennas/delete.js';
+import * as ep___antennas_list from './endpoints/antennas/list.js';
+import * as ep___antennas_notes from './endpoints/antennas/notes.js';
+import * as ep___antennas_show from './endpoints/antennas/show.js';
+import * as ep___antennas_update from './endpoints/antennas/update.js';
+import * as ep___ap_get from './endpoints/ap/get.js';
+import * as ep___ap_show from './endpoints/ap/show.js';
+import * as ep___app_create from './endpoints/app/create.js';
+import * as ep___app_show from './endpoints/app/show.js';
+import * as ep___auth_accept from './endpoints/auth/accept.js';
+import * as ep___auth_session_generate from './endpoints/auth/session/generate.js';
+import * as ep___auth_session_show from './endpoints/auth/session/show.js';
+import * as ep___auth_session_userkey from './endpoints/auth/session/userkey.js';
+import * as ep___blocking_create from './endpoints/blocking/create.js';
+import * as ep___blocking_delete from './endpoints/blocking/delete.js';
+import * as ep___blocking_list from './endpoints/blocking/list.js';
+import * as ep___channels_create from './endpoints/channels/create.js';
+import * as ep___channels_featured from './endpoints/channels/featured.js';
+import * as ep___channels_follow from './endpoints/channels/follow.js';
+import * as ep___channels_followed from './endpoints/channels/followed.js';
+import * as ep___channels_owned from './endpoints/channels/owned.js';
+import * as ep___channels_show from './endpoints/channels/show.js';
+import * as ep___channels_timeline from './endpoints/channels/timeline.js';
+import * as ep___channels_unfollow from './endpoints/channels/unfollow.js';
+import * as ep___channels_update from './endpoints/channels/update.js';
+import * as ep___charts_activeUsers from './endpoints/charts/active-users.js';
+import * as ep___charts_apRequest from './endpoints/charts/ap-request.js';
+import * as ep___charts_drive from './endpoints/charts/drive.js';
+import * as ep___charts_federation from './endpoints/charts/federation.js';
+import * as ep___charts_hashtag from './endpoints/charts/hashtag.js';
+import * as ep___charts_instance from './endpoints/charts/instance.js';
+import * as ep___charts_notes from './endpoints/charts/notes.js';
+import * as ep___charts_user_drive from './endpoints/charts/user/drive.js';
+import * as ep___charts_user_following from './endpoints/charts/user/following.js';
+import * as ep___charts_user_notes from './endpoints/charts/user/notes.js';
+import * as ep___charts_user_reactions from './endpoints/charts/user/reactions.js';
+import * as ep___charts_users from './endpoints/charts/users.js';
+import * as ep___clips_addNote from './endpoints/clips/add-note.js';
+import * as ep___clips_create from './endpoints/clips/create.js';
+import * as ep___clips_delete from './endpoints/clips/delete.js';
+import * as ep___clips_list from './endpoints/clips/list.js';
+import * as ep___clips_notes from './endpoints/clips/notes.js';
+import * as ep___clips_show from './endpoints/clips/show.js';
+import * as ep___clips_update from './endpoints/clips/update.js';
+import * as ep___drive from './endpoints/drive.js';
+import * as ep___drive_files from './endpoints/drive/files.js';
+import * as ep___drive_files_attachedNotes from './endpoints/drive/files/attached-notes.js';
+import * as ep___drive_files_checkExistence from './endpoints/drive/files/check-existence.js';
+import * as ep___drive_files_create from './endpoints/drive/files/create.js';
+import * as ep___drive_files_delete from './endpoints/drive/files/delete.js';
+import * as ep___drive_files_findByHash from './endpoints/drive/files/find-by-hash.js';
+import * as ep___drive_files_find from './endpoints/drive/files/find.js';
+import * as ep___drive_files_show from './endpoints/drive/files/show.js';
+import * as ep___drive_files_update from './endpoints/drive/files/update.js';
+import * as ep___drive_files_uploadFromUrl from './endpoints/drive/files/upload-from-url.js';
+import * as ep___drive_folders from './endpoints/drive/folders.js';
+import * as ep___drive_folders_create from './endpoints/drive/folders/create.js';
+import * as ep___drive_folders_delete from './endpoints/drive/folders/delete.js';
+import * as ep___drive_folders_find from './endpoints/drive/folders/find.js';
+import * as ep___drive_folders_show from './endpoints/drive/folders/show.js';
+import * as ep___drive_folders_update from './endpoints/drive/folders/update.js';
+import * as ep___drive_stream from './endpoints/drive/stream.js';
+import * as ep___emailAddress_available from './endpoints/email-address/available.js';
+import * as ep___endpoint from './endpoints/endpoint.js';
+import * as ep___endpoints from './endpoints/endpoints.js';
+import * as ep___exportCustomEmojis from './endpoints/export-custom-emojis.js';
+import * as ep___federation_followers from './endpoints/federation/followers.js';
+import * as ep___federation_following from './endpoints/federation/following.js';
+import * as ep___federation_instances from './endpoints/federation/instances.js';
+import * as ep___federation_showInstance from './endpoints/federation/show-instance.js';
+import * as ep___federation_updateRemoteUser from './endpoints/federation/update-remote-user.js';
+import * as ep___federation_users from './endpoints/federation/users.js';
+import * as ep___following_create from './endpoints/following/create.js';
+import * as ep___following_delete from './endpoints/following/delete.js';
+import * as ep___following_invalidate from './endpoints/following/invalidate.js';
+import * as ep___following_requests_accept from './endpoints/following/requests/accept.js';
+import * as ep___following_requests_cancel from './endpoints/following/requests/cancel.js';
+import * as ep___following_requests_list from './endpoints/following/requests/list.js';
+import * as ep___following_requests_reject from './endpoints/following/requests/reject.js';
+import * as ep___gallery_featured from './endpoints/gallery/featured.js';
+import * as ep___gallery_popular from './endpoints/gallery/popular.js';
+import * as ep___gallery_posts from './endpoints/gallery/posts.js';
+import * as ep___gallery_posts_create from './endpoints/gallery/posts/create.js';
+import * as ep___gallery_posts_delete from './endpoints/gallery/posts/delete.js';
+import * as ep___gallery_posts_like from './endpoints/gallery/posts/like.js';
+import * as ep___gallery_posts_show from './endpoints/gallery/posts/show.js';
+import * as ep___gallery_posts_unlike from './endpoints/gallery/posts/unlike.js';
+import * as ep___gallery_posts_update from './endpoints/gallery/posts/update.js';
+import * as ep___getOnlineUsersCount from './endpoints/get-online-users-count.js';
+import * as ep___hashtags_list from './endpoints/hashtags/list.js';
+import * as ep___hashtags_search from './endpoints/hashtags/search.js';
+import * as ep___hashtags_show from './endpoints/hashtags/show.js';
+import * as ep___hashtags_trend from './endpoints/hashtags/trend.js';
+import * as ep___hashtags_users from './endpoints/hashtags/users.js';
+import * as ep___i from './endpoints/i.js';
+import * as ep___i_2fa_done from './endpoints/i/2fa/done.js';
+import * as ep___i_2fa_keyDone from './endpoints/i/2fa/key-done.js';
+import * as ep___i_2fa_passwordLess from './endpoints/i/2fa/password-less.js';
+import * as ep___i_2fa_registerKey from './endpoints/i/2fa/register-key.js';
+import * as ep___i_2fa_register from './endpoints/i/2fa/register.js';
+import * as ep___i_2fa_removeKey from './endpoints/i/2fa/remove-key.js';
+import * as ep___i_2fa_unregister from './endpoints/i/2fa/unregister.js';
+import * as ep___i_apps from './endpoints/i/apps.js';
+import * as ep___i_authorizedApps from './endpoints/i/authorized-apps.js';
+import * as ep___i_changePassword from './endpoints/i/change-password.js';
+import * as ep___i_deleteAccount from './endpoints/i/delete-account.js';
+import * as ep___i_exportBlocking from './endpoints/i/export-blocking.js';
+import * as ep___i_exportFollowing from './endpoints/i/export-following.js';
+import * as ep___i_exportMute from './endpoints/i/export-mute.js';
+import * as ep___i_exportNotes from './endpoints/i/export-notes.js';
+import * as ep___i_exportUserLists from './endpoints/i/export-user-lists.js';
+import * as ep___i_favorites from './endpoints/i/favorites.js';
+import * as ep___i_gallery_likes from './endpoints/i/gallery/likes.js';
+import * as ep___i_gallery_posts from './endpoints/i/gallery/posts.js';
+import * as ep___i_getWordMutedNotesCount from './endpoints/i/get-word-muted-notes-count.js';
+import * as ep___i_importBlocking from './endpoints/i/import-blocking.js';
+import * as ep___i_importFollowing from './endpoints/i/import-following.js';
+import * as ep___i_importMuting from './endpoints/i/import-muting.js';
+import * as ep___i_importUserLists from './endpoints/i/import-user-lists.js';
+import * as ep___i_notifications from './endpoints/i/notifications.js';
+import * as ep___i_pageLikes from './endpoints/i/page-likes.js';
+import * as ep___i_pages from './endpoints/i/pages.js';
+import * as ep___i_pin from './endpoints/i/pin.js';
+import * as ep___i_readAllMessagingMessages from './endpoints/i/read-all-messaging-messages.js';
+import * as ep___i_readAllUnreadNotes from './endpoints/i/read-all-unread-notes.js';
+import * as ep___i_readAnnouncement from './endpoints/i/read-announcement.js';
+import * as ep___i_regenerateToken from './endpoints/i/regenerate-token.js';
+import * as ep___i_registry_getAll from './endpoints/i/registry/get-all.js';
+import * as ep___i_registry_getDetail from './endpoints/i/registry/get-detail.js';
+import * as ep___i_registry_get from './endpoints/i/registry/get.js';
+import * as ep___i_registry_keysWithType from './endpoints/i/registry/keys-with-type.js';
+import * as ep___i_registry_keys from './endpoints/i/registry/keys.js';
+import * as ep___i_registry_remove from './endpoints/i/registry/remove.js';
+import * as ep___i_registry_scopes from './endpoints/i/registry/scopes.js';
+import * as ep___i_registry_set from './endpoints/i/registry/set.js';
+import * as ep___i_revokeToken from './endpoints/i/revoke-token.js';
+import * as ep___i_signinHistory from './endpoints/i/signin-history.js';
+import * as ep___i_unpin from './endpoints/i/unpin.js';
+import * as ep___i_updateEmail from './endpoints/i/update-email.js';
+import * as ep___i_update from './endpoints/i/update.js';
+import * as ep___i_userGroupInvites from './endpoints/i/user-group-invites.js';
+import * as ep___messaging_history from './endpoints/messaging/history.js';
+import * as ep___messaging_messages from './endpoints/messaging/messages.js';
+import * as ep___messaging_messages_create from './endpoints/messaging/messages/create.js';
+import * as ep___messaging_messages_delete from './endpoints/messaging/messages/delete.js';
+import * as ep___messaging_messages_read from './endpoints/messaging/messages/read.js';
+import * as ep___meta from './endpoints/meta.js';
+import * as ep___miauth_genToken from './endpoints/miauth/gen-token.js';
+import * as ep___mute_create from './endpoints/mute/create.js';
+import * as ep___mute_delete from './endpoints/mute/delete.js';
+import * as ep___mute_list from './endpoints/mute/list.js';
+import * as ep___my_apps from './endpoints/my/apps.js';
+import * as ep___notes from './endpoints/notes.js';
+import * as ep___notes_children from './endpoints/notes/children.js';
+import * as ep___notes_clips from './endpoints/notes/clips.js';
+import * as ep___notes_conversation from './endpoints/notes/conversation.js';
+import * as ep___notes_create from './endpoints/notes/create.js';
+import * as ep___notes_delete from './endpoints/notes/delete.js';
+import * as ep___notes_favorites_create from './endpoints/notes/favorites/create.js';
+import * as ep___notes_favorites_delete from './endpoints/notes/favorites/delete.js';
+import * as ep___notes_featured from './endpoints/notes/featured.js';
+import * as ep___notes_globalTimeline from './endpoints/notes/global-timeline.js';
+import * as ep___notes_hybridTimeline from './endpoints/notes/hybrid-timeline.js';
+import * as ep___notes_localTimeline from './endpoints/notes/local-timeline.js';
+import * as ep___notes_mentions from './endpoints/notes/mentions.js';
+import * as ep___notes_polls_recommendation from './endpoints/notes/polls/recommendation.js';
+import * as ep___notes_polls_vote from './endpoints/notes/polls/vote.js';
+import * as ep___notes_reactions from './endpoints/notes/reactions.js';
+import * as ep___notes_reactions_create from './endpoints/notes/reactions/create.js';
+import * as ep___notes_reactions_delete from './endpoints/notes/reactions/delete.js';
+import * as ep___notes_renotes from './endpoints/notes/renotes.js';
+import * as ep___notes_replies from './endpoints/notes/replies.js';
+import * as ep___notes_searchByTag from './endpoints/notes/search-by-tag.js';
+import * as ep___notes_search from './endpoints/notes/search.js';
+import * as ep___notes_show from './endpoints/notes/show.js';
+import * as ep___notes_state from './endpoints/notes/state.js';
+import * as ep___notes_threadMuting_create from './endpoints/notes/thread-muting/create.js';
+import * as ep___notes_threadMuting_delete from './endpoints/notes/thread-muting/delete.js';
+import * as ep___notes_timeline from './endpoints/notes/timeline.js';
+import * as ep___notes_translate from './endpoints/notes/translate.js';
+import * as ep___notes_unrenote from './endpoints/notes/unrenote.js';
+import * as ep___notes_userListTimeline from './endpoints/notes/user-list-timeline.js';
+import * as ep___notes_watching_create from './endpoints/notes/watching/create.js';
+import * as ep___notes_watching_delete from './endpoints/notes/watching/delete.js';
+import * as ep___notifications_create from './endpoints/notifications/create.js';
+import * as ep___notifications_markAllAsRead from './endpoints/notifications/mark-all-as-read.js';
+import * as ep___notifications_read from './endpoints/notifications/read.js';
+import * as ep___pagePush from './endpoints/page-push.js';
+import * as ep___pages_create from './endpoints/pages/create.js';
+import * as ep___pages_delete from './endpoints/pages/delete.js';
+import * as ep___pages_featured from './endpoints/pages/featured.js';
+import * as ep___pages_like from './endpoints/pages/like.js';
+import * as ep___pages_show from './endpoints/pages/show.js';
+import * as ep___pages_unlike from './endpoints/pages/unlike.js';
+import * as ep___pages_update from './endpoints/pages/update.js';
+import * as ep___ping from './endpoints/ping.js';
+import * as ep___pinnedUsers from './endpoints/pinned-users.js';
+import * as ep___promo_read from './endpoints/promo/read.js';
+import * as ep___requestResetPassword from './endpoints/request-reset-password.js';
+import * as ep___resetDb from './endpoints/reset-db.js';
+import * as ep___resetPassword from './endpoints/reset-password.js';
+import * as ep___serverInfo from './endpoints/server-info.js';
+import * as ep___stats from './endpoints/stats.js';
+import * as ep___sw_register from './endpoints/sw/register.js';
+import * as ep___sw_unregister from './endpoints/sw/unregister.js';
+import * as ep___test from './endpoints/test.js';
+import * as ep___username_available from './endpoints/username/available.js';
+import * as ep___users from './endpoints/users.js';
+import * as ep___users_clips from './endpoints/users/clips.js';
+import * as ep___users_followers from './endpoints/users/followers.js';
+import * as ep___users_following from './endpoints/users/following.js';
+import * as ep___users_gallery_posts from './endpoints/users/gallery/posts.js';
+import * as ep___users_getFrequentlyRepliedUsers from './endpoints/users/get-frequently-replied-users.js';
+import * as ep___users_groups_create from './endpoints/users/groups/create.js';
+import * as ep___users_groups_delete from './endpoints/users/groups/delete.js';
+import * as ep___users_groups_invitations_accept from './endpoints/users/groups/invitations/accept.js';
+import * as ep___users_groups_invitations_reject from './endpoints/users/groups/invitations/reject.js';
+import * as ep___users_groups_invite from './endpoints/users/groups/invite.js';
+import * as ep___users_groups_joined from './endpoints/users/groups/joined.js';
+import * as ep___users_groups_leave from './endpoints/users/groups/leave.js';
+import * as ep___users_groups_owned from './endpoints/users/groups/owned.js';
+import * as ep___users_groups_pull from './endpoints/users/groups/pull.js';
+import * as ep___users_groups_show from './endpoints/users/groups/show.js';
+import * as ep___users_groups_transfer from './endpoints/users/groups/transfer.js';
+import * as ep___users_groups_update from './endpoints/users/groups/update.js';
+import * as ep___users_lists_create from './endpoints/users/lists/create.js';
+import * as ep___users_lists_delete from './endpoints/users/lists/delete.js';
+import * as ep___users_lists_list from './endpoints/users/lists/list.js';
+import * as ep___users_lists_pull from './endpoints/users/lists/pull.js';
+import * as ep___users_lists_push from './endpoints/users/lists/push.js';
+import * as ep___users_lists_show from './endpoints/users/lists/show.js';
+import * as ep___users_lists_update from './endpoints/users/lists/update.js';
+import * as ep___users_notes from './endpoints/users/notes.js';
+import * as ep___users_pages from './endpoints/users/pages.js';
+import * as ep___users_reactions from './endpoints/users/reactions.js';
+import * as ep___users_recommendation from './endpoints/users/recommendation.js';
+import * as ep___users_relation from './endpoints/users/relation.js';
+import * as ep___users_reportAbuse from './endpoints/users/report-abuse.js';
+import * as ep___users_searchByUsernameAndHost from './endpoints/users/search-by-username-and-host.js';
+import * as ep___users_search from './endpoints/users/search.js';
+import * as ep___users_show from './endpoints/users/show.js';
+import * as ep___users_stats from './endpoints/users/stats.js';
-export type Param = {
- validator: Context<any>;
- transform?: any;
- default?: any;
- deprecated?: boolean;
- ref?: string;
-};
+const eps = [
+ ['admin/abuse-user-reports', ep___admin_abuseUserReports],
+ ['admin/accounts/create', ep___admin_accounts_create],
+ ['admin/accounts/delete', ep___admin_accounts_delete],
+ ['admin/ad/create', ep___admin_ad_create],
+ ['admin/ad/delete', ep___admin_ad_delete],
+ ['admin/ad/list', ep___admin_ad_list],
+ ['admin/ad/update', ep___admin_ad_update],
+ ['admin/announcements/create', ep___admin_announcements_create],
+ ['admin/announcements/delete', ep___admin_announcements_delete],
+ ['admin/announcements/list', ep___admin_announcements_list],
+ ['admin/announcements/update', ep___admin_announcements_update],
+ ['admin/delete-all-files-of-a-user', ep___admin_deleteAllFilesOfAUser],
+ ['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles],
+ ['admin/drive/cleanup', ep___admin_drive_cleanup],
+ ['admin/drive/files', ep___admin_drive_files],
+ ['admin/drive/show-file', ep___admin_drive_showFile],
+ ['admin/emoji/add-aliases-bulk', ep___admin_emoji_addAliasesBulk],
+ ['admin/emoji/add', ep___admin_emoji_add],
+ ['admin/emoji/copy', ep___admin_emoji_copy],
+ ['admin/emoji/delete-bulk', ep___admin_emoji_deleteBulk],
+ ['admin/emoji/delete', ep___admin_emoji_delete],
+ ['admin/emoji/import-zip', ep___admin_emoji_importZip],
+ ['admin/emoji/list-remote', ep___admin_emoji_listRemote],
+ ['admin/emoji/list', ep___admin_emoji_list],
+ ['admin/emoji/remove-aliases-bulk', ep___admin_emoji_removeAliasesBulk],
+ ['admin/emoji/set-aliases-bulk', ep___admin_emoji_setAliasesBulk],
+ ['admin/emoji/set-category-bulk', ep___admin_emoji_setCategoryBulk],
+ ['admin/emoji/update', ep___admin_emoji_update],
+ ['admin/federation/delete-all-files', ep___admin_federation_deleteAllFiles],
+ ['admin/federation/refresh-remote-instance-metadata', ep___admin_federation_refreshRemoteInstanceMetadata],
+ ['admin/federation/remove-all-following', ep___admin_federation_removeAllFollowing],
+ ['admin/federation/update-instance', ep___admin_federation_updateInstance],
+ ['admin/get-index-stats', ep___admin_getIndexStats],
+ ['admin/get-table-stats', ep___admin_getTableStats],
+ ['admin/invite', ep___admin_invite],
+ ['admin/moderators/add', ep___admin_moderators_add],
+ ['admin/moderators/remove', ep___admin_moderators_remove],
+ ['admin/promo/create', ep___admin_promo_create],
+ ['admin/queue/clear', ep___admin_queue_clear],
+ ['admin/queue/deliver-delayed', ep___admin_queue_deliverDelayed],
+ ['admin/queue/inbox-delayed', ep___admin_queue_inboxDelayed],
+ ['admin/queue/stats', ep___admin_queue_stats],
+ ['admin/relays/add', ep___admin_relays_add],
+ ['admin/relays/list', ep___admin_relays_list],
+ ['admin/relays/remove', ep___admin_relays_remove],
+ ['admin/reset-password', ep___admin_resetPassword],
+ ['admin/resolve-abuse-user-report', ep___admin_resolveAbuseUserReport],
+ ['admin/send-email', ep___admin_sendEmail],
+ ['admin/server-info', ep___admin_serverInfo],
+ ['admin/show-moderation-logs', ep___admin_showModerationLogs],
+ ['admin/show-user', ep___admin_showUser],
+ ['admin/show-users', ep___admin_showUsers],
+ ['admin/silence-user', ep___admin_silenceUser],
+ ['admin/suspend-user', ep___admin_suspendUser],
+ ['admin/unsilence-user', ep___admin_unsilenceUser],
+ ['admin/unsuspend-user', ep___admin_unsuspendUser],
+ ['admin/update-meta', ep___admin_updateMeta],
+ ['admin/vacuum', ep___admin_vacuum],
+ ['announcements', ep___announcements],
+ ['antennas/create', ep___antennas_create],
+ ['antennas/delete', ep___antennas_delete],
+ ['antennas/list', ep___antennas_list],
+ ['antennas/notes', ep___antennas_notes],
+ ['antennas/show', ep___antennas_show],
+ ['antennas/update', ep___antennas_update],
+ ['ap/get', ep___ap_get],
+ ['ap/show', ep___ap_show],
+ ['app/create', ep___app_create],
+ ['app/show', ep___app_show],
+ ['auth/accept', ep___auth_accept],
+ ['auth/session/generate', ep___auth_session_generate],
+ ['auth/session/show', ep___auth_session_show],
+ ['auth/session/userkey', ep___auth_session_userkey],
+ ['blocking/create', ep___blocking_create],
+ ['blocking/delete', ep___blocking_delete],
+ ['blocking/list', ep___blocking_list],
+ ['channels/create', ep___channels_create],
+ ['channels/featured', ep___channels_featured],
+ ['channels/follow', ep___channels_follow],
+ ['channels/followed', ep___channels_followed],
+ ['channels/owned', ep___channels_owned],
+ ['channels/show', ep___channels_show],
+ ['channels/timeline', ep___channels_timeline],
+ ['channels/unfollow', ep___channels_unfollow],
+ ['channels/update', ep___channels_update],
+ ['charts/active-users', ep___charts_activeUsers],
+ ['charts/ap-request', ep___charts_apRequest],
+ ['charts/drive', ep___charts_drive],
+ ['charts/federation', ep___charts_federation],
+ ['charts/hashtag', ep___charts_hashtag],
+ ['charts/instance', ep___charts_instance],
+ ['charts/notes', ep___charts_notes],
+ ['charts/user/drive', ep___charts_user_drive],
+ ['charts/user/following', ep___charts_user_following],
+ ['charts/user/notes', ep___charts_user_notes],
+ ['charts/user/reactions', ep___charts_user_reactions],
+ ['charts/users', ep___charts_users],
+ ['clips/add-note', ep___clips_addNote],
+ ['clips/create', ep___clips_create],
+ ['clips/delete', ep___clips_delete],
+ ['clips/list', ep___clips_list],
+ ['clips/notes', ep___clips_notes],
+ ['clips/show', ep___clips_show],
+ ['clips/update', ep___clips_update],
+ ['drive', ep___drive],
+ ['drive/files', ep___drive_files],
+ ['drive/files/attached-notes', ep___drive_files_attachedNotes],
+ ['drive/files/check-existence', ep___drive_files_checkExistence],
+ ['drive/files/create', ep___drive_files_create],
+ ['drive/files/delete', ep___drive_files_delete],
+ ['drive/files/find-by-hash', ep___drive_files_findByHash],
+ ['drive/files/find', ep___drive_files_find],
+ ['drive/files/show', ep___drive_files_show],
+ ['drive/files/update', ep___drive_files_update],
+ ['drive/files/upload-from-url', ep___drive_files_uploadFromUrl],
+ ['drive/folders', ep___drive_folders],
+ ['drive/folders/create', ep___drive_folders_create],
+ ['drive/folders/delete', ep___drive_folders_delete],
+ ['drive/folders/find', ep___drive_folders_find],
+ ['drive/folders/show', ep___drive_folders_show],
+ ['drive/folders/update', ep___drive_folders_update],
+ ['drive/stream', ep___drive_stream],
+ ['email-address/available', ep___emailAddress_available],
+ ['endpoint', ep___endpoint],
+ ['endpoints', ep___endpoints],
+ ['export-custom-emojis', ep___exportCustomEmojis],
+ ['federation/followers', ep___federation_followers],
+ ['federation/following', ep___federation_following],
+ ['federation/instances', ep___federation_instances],
+ ['federation/show-instance', ep___federation_showInstance],
+ ['federation/update-remote-user', ep___federation_updateRemoteUser],
+ ['federation/users', ep___federation_users],
+ ['following/create', ep___following_create],
+ ['following/delete', ep___following_delete],
+ ['following/invalidate', ep___following_invalidate],
+ ['following/requests/accept', ep___following_requests_accept],
+ ['following/requests/cancel', ep___following_requests_cancel],
+ ['following/requests/list', ep___following_requests_list],
+ ['following/requests/reject', ep___following_requests_reject],
+ ['gallery/featured', ep___gallery_featured],
+ ['gallery/popular', ep___gallery_popular],
+ ['gallery/posts', ep___gallery_posts],
+ ['gallery/posts/create', ep___gallery_posts_create],
+ ['gallery/posts/delete', ep___gallery_posts_delete],
+ ['gallery/posts/like', ep___gallery_posts_like],
+ ['gallery/posts/show', ep___gallery_posts_show],
+ ['gallery/posts/unlike', ep___gallery_posts_unlike],
+ ['gallery/posts/update', ep___gallery_posts_update],
+ ['get-online-users-count', ep___getOnlineUsersCount],
+ ['hashtags/list', ep___hashtags_list],
+ ['hashtags/search', ep___hashtags_search],
+ ['hashtags/show', ep___hashtags_show],
+ ['hashtags/trend', ep___hashtags_trend],
+ ['hashtags/users', ep___hashtags_users],
+ ['i', ep___i],
+ ['i/2fa/done', ep___i_2fa_done],
+ ['i/2fa/key-done', ep___i_2fa_keyDone],
+ ['i/2fa/password-less', ep___i_2fa_passwordLess],
+ ['i/2fa/register-key', ep___i_2fa_registerKey],
+ ['i/2fa/register', ep___i_2fa_register],
+ ['i/2fa/remove-key', ep___i_2fa_removeKey],
+ ['i/2fa/unregister', ep___i_2fa_unregister],
+ ['i/apps', ep___i_apps],
+ ['i/authorized-apps', ep___i_authorizedApps],
+ ['i/change-password', ep___i_changePassword],
+ ['i/delete-account', ep___i_deleteAccount],
+ ['i/export-blocking', ep___i_exportBlocking],
+ ['i/export-following', ep___i_exportFollowing],
+ ['i/export-mute', ep___i_exportMute],
+ ['i/export-notes', ep___i_exportNotes],
+ ['i/export-user-lists', ep___i_exportUserLists],
+ ['i/favorites', ep___i_favorites],
+ ['i/gallery/likes', ep___i_gallery_likes],
+ ['i/gallery/posts', ep___i_gallery_posts],
+ ['i/get-word-muted-notes-count', ep___i_getWordMutedNotesCount],
+ ['i/import-blocking', ep___i_importBlocking],
+ ['i/import-following', ep___i_importFollowing],
+ ['i/import-muting', ep___i_importMuting],
+ ['i/import-user-lists', ep___i_importUserLists],
+ ['i/notifications', ep___i_notifications],
+ ['i/page-likes', ep___i_pageLikes],
+ ['i/pages', ep___i_pages],
+ ['i/pin', ep___i_pin],
+ ['i/read-all-messaging-messages', ep___i_readAllMessagingMessages],
+ ['i/read-all-unread-notes', ep___i_readAllUnreadNotes],
+ ['i/read-announcement', ep___i_readAnnouncement],
+ ['i/regenerate-token', ep___i_regenerateToken],
+ ['i/registry/get-all', ep___i_registry_getAll],
+ ['i/registry/get-detail', ep___i_registry_getDetail],
+ ['i/registry/get', ep___i_registry_get],
+ ['i/registry/keys-with-type', ep___i_registry_keysWithType],
+ ['i/registry/keys', ep___i_registry_keys],
+ ['i/registry/remove', ep___i_registry_remove],
+ ['i/registry/scopes', ep___i_registry_scopes],
+ ['i/registry/set', ep___i_registry_set],
+ ['i/revoke-token', ep___i_revokeToken],
+ ['i/signin-history', ep___i_signinHistory],
+ ['i/unpin', ep___i_unpin],
+ ['i/update-email', ep___i_updateEmail],
+ ['i/update', ep___i_update],
+ ['i/user-group-invites', ep___i_userGroupInvites],
+ ['messaging/history', ep___messaging_history],
+ ['messaging/messages', ep___messaging_messages],
+ ['messaging/messages/create', ep___messaging_messages_create],
+ ['messaging/messages/delete', ep___messaging_messages_delete],
+ ['messaging/messages/read', ep___messaging_messages_read],
+ ['meta', ep___meta],
+ ['miauth/gen-token', ep___miauth_genToken],
+ ['mute/create', ep___mute_create],
+ ['mute/delete', ep___mute_delete],
+ ['mute/list', ep___mute_list],
+ ['my/apps', ep___my_apps],
+ ['notes', ep___notes],
+ ['notes/children', ep___notes_children],
+ ['notes/clips', ep___notes_clips],
+ ['notes/conversation', ep___notes_conversation],
+ ['notes/create', ep___notes_create],
+ ['notes/delete', ep___notes_delete],
+ ['notes/favorites/create', ep___notes_favorites_create],
+ ['notes/favorites/delete', ep___notes_favorites_delete],
+ ['notes/featured', ep___notes_featured],
+ ['notes/global-timeline', ep___notes_globalTimeline],
+ ['notes/hybrid-timeline', ep___notes_hybridTimeline],
+ ['notes/local-timeline', ep___notes_localTimeline],
+ ['notes/mentions', ep___notes_mentions],
+ ['notes/polls/recommendation', ep___notes_polls_recommendation],
+ ['notes/polls/vote', ep___notes_polls_vote],
+ ['notes/reactions', ep___notes_reactions],
+ ['notes/reactions/create', ep___notes_reactions_create],
+ ['notes/reactions/delete', ep___notes_reactions_delete],
+ ['notes/renotes', ep___notes_renotes],
+ ['notes/replies', ep___notes_replies],
+ ['notes/search-by-tag', ep___notes_searchByTag],
+ ['notes/search', ep___notes_search],
+ ['notes/show', ep___notes_show],
+ ['notes/state', ep___notes_state],
+ ['notes/thread-muting/create', ep___notes_threadMuting_create],
+ ['notes/thread-muting/delete', ep___notes_threadMuting_delete],
+ ['notes/timeline', ep___notes_timeline],
+ ['notes/translate', ep___notes_translate],
+ ['notes/unrenote', ep___notes_unrenote],
+ ['notes/user-list-timeline', ep___notes_userListTimeline],
+ ['notes/watching/create', ep___notes_watching_create],
+ ['notes/watching/delete', ep___notes_watching_delete],
+ ['notifications/create', ep___notifications_create],
+ ['notifications/mark-all-as-read', ep___notifications_markAllAsRead],
+ ['notifications/read', ep___notifications_read],
+ ['page-push', ep___pagePush],
+ ['pages/create', ep___pages_create],
+ ['pages/delete', ep___pages_delete],
+ ['pages/featured', ep___pages_featured],
+ ['pages/like', ep___pages_like],
+ ['pages/show', ep___pages_show],
+ ['pages/unlike', ep___pages_unlike],
+ ['pages/update', ep___pages_update],
+ ['ping', ep___ping],
+ ['pinned-users', ep___pinnedUsers],
+ ['promo/read', ep___promo_read],
+ ['request-reset-password', ep___requestResetPassword],
+ ['reset-db', ep___resetDb],
+ ['reset-password', ep___resetPassword],
+ ['server-info', ep___serverInfo],
+ ['stats', ep___stats],
+ ['sw/register', ep___sw_register],
+ ['sw/unregister', ep___sw_unregister],
+ ['test', ep___test],
+ ['username/available', ep___username_available],
+ ['users', ep___users],
+ ['users/clips', ep___users_clips],
+ ['users/followers', ep___users_followers],
+ ['users/following', ep___users_following],
+ ['users/gallery/posts', ep___users_gallery_posts],
+ ['users/get-frequently-replied-users', ep___users_getFrequentlyRepliedUsers],
+ ['users/groups/create', ep___users_groups_create],
+ ['users/groups/delete', ep___users_groups_delete],
+ ['users/groups/invitations/accept', ep___users_groups_invitations_accept],
+ ['users/groups/invitations/reject', ep___users_groups_invitations_reject],
+ ['users/groups/invite', ep___users_groups_invite],
+ ['users/groups/joined', ep___users_groups_joined],
+ ['users/groups/leave', ep___users_groups_leave],
+ ['users/groups/owned', ep___users_groups_owned],
+ ['users/groups/pull', ep___users_groups_pull],
+ ['users/groups/show', ep___users_groups_show],
+ ['users/groups/transfer', ep___users_groups_transfer],
+ ['users/groups/update', ep___users_groups_update],
+ ['users/lists/create', ep___users_lists_create],
+ ['users/lists/delete', ep___users_lists_delete],
+ ['users/lists/list', ep___users_lists_list],
+ ['users/lists/pull', ep___users_lists_pull],
+ ['users/lists/push', ep___users_lists_push],
+ ['users/lists/show', ep___users_lists_show],
+ ['users/lists/update', ep___users_lists_update],
+ ['users/notes', ep___users_notes],
+ ['users/pages', ep___users_pages],
+ ['users/reactions', ep___users_reactions],
+ ['users/recommendation', ep___users_recommendation],
+ ['users/relation', ep___users_relation],
+ ['users/report-abuse', ep___users_reportAbuse],
+ ['users/search-by-username-and-host', ep___users_searchByUsernameAndHost],
+ ['users/search', ep___users_search],
+ ['users/show', ep___users_show],
+ ['users/stats', ep___users_stats],
+];
export interface IEndpointMeta {
readonly stability?: 'deprecated' | 'experimental' | 'stable';
readonly tags?: ReadonlyArray<string>;
- readonly params?: {
- readonly [key: string]: Param;
- };
-
readonly errors?: {
readonly [key: string]: {
readonly message: string;
@@ -99,25 +686,23 @@ export interface IEndpointMeta {
* パーミッションの実現に利用されます。
*/
readonly kind?: string;
+
+ readonly description?: string;
}
export interface IEndpoint {
name: string;
exec: any;
meta: IEndpointMeta;
+ params: Schema;
}
-const files = glob.sync('**/*.js', {
- cwd: path.resolve(_dirname + '/endpoints/'),
-});
-
-const endpoints: IEndpoint[] = files.map(f => {
- const ep = require(`./endpoints/${f}`);
-
+const endpoints: IEndpoint[] = eps.map(([name, ep]) => {
return {
- name: f.replace('.js', ''),
+ name: name,
exec: ep.default,
meta: ep.meta || {},
+ params: ep.paramDef,
};
});
diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
index ed7b146d03..333746f423 100644
--- a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { AbuseUserReports } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { AbuseUserReports } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,49 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- state: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- reporterOrigin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'combined',
- },
-
- targetUserOrigin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'combined',
- },
-
- forwarded: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -115,8 +70,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ state: { type: 'string', nullable: true, default: null },
+ reporterOrigin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "combined" },
+ targetUserOrigin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "combined" },
+ forwarded: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId);
switch (ps.state) {
@@ -134,7 +103,7 @@ export default define(meta, async (ps) => {
case 'remote': query.andWhere('report.targetUserHost IS NOT NULL'); break;
}
- const reports = await query.take(ps.limit!).getMany();
+ const reports = await query.take(ps.limit).getMany();
return await AbuseUserReports.packMany(reports);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
index 20f1232959..2820c7993d 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts
@@ -1,20 +1,10 @@
-import define from '../../../define';
-import { Users } from '@/models/index';
-import { signup } from '../../../common/signup';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
+import { signup } from '../../../common/signup.js';
export const meta = {
tags: ['admin'],
- params: {
- username: {
- validator: Users.validateLocalUsername,
- },
-
- password: {
- validator: Users.validatePassword,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -28,8 +18,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: Users.localUsernameSchema,
+ password: Users.passwordSchema,
+ },
+ required: ['username', 'password'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, _me) => {
+export default define(meta, paramDef, async (ps, _me) => {
const me = _me ? await Users.findOneOrFail(_me.id) : null;
const noUsers = (await Users.count({
host: null,
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
index 1701c1e3a7..01754ec8f3 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/delete.ts
@@ -1,26 +1,26 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Users } from '@/models/index';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
-import { createDeleteAccountJob } from '@/queue';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
+import { createDeleteAccountJob } from '@/queue/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/create.ts b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
index 00ad2012fe..ab2c50b50f 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/create.ts
@@ -1,41 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Ads } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- url: {
- validator: $.str.min(1),
- },
- memo: {
- validator: $.str,
- },
- place: {
- validator: $.str,
- },
- priority: {
- validator: $.str,
- },
- ratio: {
- validator: $.num.int().min(0),
- },
- expiresAt: {
- validator: $.num.int(),
- },
- imageUrl: {
- validator: $.str.min(1),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ url: { type: 'string', minLength: 1 },
+ memo: { type: 'string' },
+ place: { type: 'string' },
+ priority: { type: 'string' },
+ ratio: { type: 'integer' },
+ expiresAt: { type: 'integer' },
+ imageUrl: { type: 'string', minLength: 1 },
},
+ required: ['url', 'memo', 'place', 'priority', 'ratio', 'expiresAt', 'imageUrl'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Ads.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
index c0124e2484..3663d974c5 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Ads } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAd: {
message: 'No such ad.',
@@ -25,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ad = await Ads.findOne(ps.id);
if (ad == null) throw new ApiError(meta.errors.noSuchAd);
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/list.ts b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
index 7a83637f3b..74f154f272 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/list.ts
@@ -1,37 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Ads } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Ads.createQueryBuilder('ad'), ps.sinceId, ps.untilId)
.andWhere('ad.expiresAt > :now', { now: new Date() });
- const ads = await query.take(ps.limit!).getMany();
+ const ads = await query.take(ps.limit).getMany();
return ads;
});
diff --git a/packages/backend/src/server/api/endpoints/admin/ad/update.ts b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
index c2b09ab9cf..89c421db66 100644
--- a/packages/backend/src/server/api/endpoints/admin/ad/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/ad/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Ads } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Ads } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,33 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- memo: {
- validator: $.str,
- },
- url: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.str.min(1),
- },
- place: {
- validator: $.str,
- },
- priority: {
- validator: $.str,
- },
- ratio: {
- validator: $.num.int().min(0),
- },
- expiresAt: {
- validator: $.num.int(),
- },
- },
-
errors: {
noSuchAd: {
message: 'No such ad.',
@@ -46,8 +17,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ memo: { type: 'string' },
+ url: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', minLength: 1 },
+ place: { type: 'string' },
+ priority: { type: 'string' },
+ ratio: { type: 'integer' },
+ expiresAt: { type: 'integer' },
+ },
+ required: ['id', 'memo', 'url', 'imageUrl', 'place', 'priority', 'ratio', 'expiresAt'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ad = await Ads.findOne(ps.id);
if (ad == null) throw new ApiError(meta.errors.noSuchAd);
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
index 24c4caa37d..41570078d4 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/create.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Announcements } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
@@ -9,18 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- title: {
- validator: $.str.min(1),
- },
- text: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.nullable.str.min(1),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -57,8 +44,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string', minLength: 1 },
+ text: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', nullable: true, minLength: 1 },
+ },
+ required: ['title', 'text', 'imageUrl'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const announcement = await Announcements.insert({
id: genId(),
createdAt: new Date(),
@@ -68,5 +65,5 @@ export default define(meta, async (ps) => {
imageUrl: ps.imageUrl,
}).then(x => Announcements.findOneOrFail(x.identifiers[0]));
- return announcement;
+ return Object.assign({}, announcement, { createdAt: announcement.createdAt.toISOString(), updatedAt: null });
});
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
index 5548f99006..4871dc4e12 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Announcements } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -25,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const announcement = await Announcements.findOne(ps.id);
if (announcement == null) throw new ApiError(meta.errors.noSuchAnnouncement);
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
index e5cc53ccdd..0ba0a8ee08 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Announcements, AnnouncementReads } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { Announcements, AnnouncementReads } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -69,11 +52,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Announcements.createQueryBuilder('announcement'), ps.sinceId, ps.untilId);
- const announcements = await query.take(ps.limit!).getMany();
+ const announcements = await query.take(ps.limit).getMany();
for (const announcement of announcements) {
(announcement as any).reads = await AnnouncementReads.count({
diff --git a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
index f66293bb18..138337ef5b 100644
--- a/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/announcements/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Announcements } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { Announcements } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- title: {
- validator: $.str.min(1),
- },
- text: {
- validator: $.str.min(1),
- },
- imageUrl: {
- validator: $.nullable.str.min(1),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -34,8 +17,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string', minLength: 1 },
+ text: { type: 'string', minLength: 1 },
+ imageUrl: { type: 'string', nullable: true, minLength: 1 },
+ },
+ required: ['id', 'title', 'text', 'imageUrl'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const announcement = await Announcements.findOne(ps.id);
if (announcement == null) throw new ApiError(meta.errors.noSuchAnnouncement);
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
index 249e63a0f8..90e65ec4cd 100644
--- a/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/delete-all-files-of-a-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userId: ps.userId,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
index acabbfef5c..bab149532e 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/clean-remote-files.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { createCleanRemoteFilesJob } from '@/queue/index';
+import define from '../../../define.js';
+import { createCleanRemoteFilesJob } from '@/queue/index.js';
export const meta = {
tags: ['admin'],
@@ -8,7 +8,13 @@ export const meta = {
requireModerator: true,
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
createCleanRemoteFilesJob();
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
index 452e7069a8..3e7d43fb0b 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/cleanup.ts
@@ -1,7 +1,7 @@
import { IsNull } from 'typeorm';
-import define from '../../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -10,8 +10,14 @@ export const meta = {
requireModerator: true,
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userId: IsNull(),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/files.ts b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
index 264f549867..646d85a1e0 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,39 +8,6 @@ export const meta = {
requireCredential: false,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- type: {
- validator: $.optional.nullable.str.match(/^[a-zA-Z0-9\/\-*]+$/),
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
-
- hostname: {
- validator: $.optional.nullable.str,
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -54,8 +19,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', nullable: true, pattern: /^[a-zA-Z0-9\/\-*]+$/.toString().slice(1, -1) },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ hostname: { type: 'string', nullable: true, default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId);
if (ps.origin === 'local') {
@@ -76,7 +54,7 @@ export default define(meta, async (ps, me) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: true, withUser: true, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
index 5d9a1f2703..e821160095 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -10,16 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.optional.type(ID),
- },
-
- url: {
- validator: $.optional.str,
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -161,8 +149,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ url: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const file = ps.fileId ? await DriveFiles.findOne(ps.fileId) : await DriveFiles.findOne({
where: [{
url: ps.url,
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
index f0fd73c276..77a4adea61 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
index 1dfeae262f..c5787d59dc 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/add.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis, DriveFiles } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Emojis, DriveFiles } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
-import { ID } from '@/misc/cafy-id';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
import rndstr from 'rndstr';
-import { publishBroadcastStream } from '@/services/stream';
+import { publishBroadcastStream } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
@@ -15,12 +13,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
index 17cbf208aa..a0eaa61258 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/copy.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import { getConnection } from 'typeorm';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
-import { ID } from '@/misc/cafy-id';
-import { uploadFromUrl } from '@/services/drive/upload-from-url';
-import { publishBroadcastStream } from '@/services/stream';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
+import { publishBroadcastStream } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
@@ -15,12 +13,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- emojiId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -42,8 +34,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ emojiId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['emojiId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emoji = await Emojis.findOne(ps.emojiId);
if (emoji == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
index 797a5de672..38a2d65cf6 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete-bulk.ts
@@ -1,26 +1,28 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
},
+ required: ['ids'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
index 1580439024..a0cffb47f8 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { ApiError } from '../../../error';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -12,12 +10,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['id'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const emoji = await Emojis.findOne(ps.id);
if (emoji == null) throw new ApiError(meta.errors.noSuchEmoji);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
index 8856a38f24..3f03dc2da4 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/import-zip.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { createImportCustomEmojisJob } from '@/queue/index';
+import define from '../../../define.js';
+import { createImportCustomEmojisJob } from '@/queue/index.js';
import ms from 'ms';
-import { ID } from '@/misc/cafy-id';
export const meta = {
secure: true,
requireCredential: true,
requireModerator: true,
- params: {
- fileId: {
- validator: $.type(ID),
- },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
},
+ required: ['fileId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createImportCustomEmojisJob(user, ps.fileId);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
index 6e502547f5..f19c3ddbd8 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list-remote.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -11,31 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- query: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- host: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -77,8 +50,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string', nullable: true, default: null },
+ host: { type: 'string', nullable: true, default: null },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const q = makePaginationQuery(Emojis.createQueryBuilder('emoji'), ps.sinceId, ps.untilId);
if (ps.host == null) {
@@ -93,7 +78,7 @@ export default define(meta, async (ps) => {
const emojis = await q
.orderBy('emoji.id', 'DESC')
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return Emojis.packMany(emojis);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
index 76ef190f94..f488a71a00 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/list.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Emojis } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
-import { ID } from '@/misc/cafy-id';
-import { Emoji } from '@/models/entities/emoji';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
+import { Emoji } from '@/models/entities/emoji.js';
export const meta = {
tags: ['admin'],
@@ -11,26 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- query: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -72,8 +50,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string', nullable: true, default: null },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const q = makePaginationQuery(Emojis.createQueryBuilder('emoji'), ps.sinceId, ps.untilId)
.andWhere(`emoji.host IS NULL`);
@@ -81,7 +70,7 @@ export default define(meta, async (ps) => {
if (ps.query) {
//q.andWhere('emoji.name ILIKE :q', { q: `%${ps.query}%` });
- //const emojis = await q.take(ps.limit!).getMany();
+ //const emojis = await q.take(ps.limit).getMany();
emojis = await q.getMany();
@@ -90,9 +79,9 @@ export default define(meta, async (ps) => {
emoji.aliases.some(a => a.includes(ps.query!)) ||
emoji.category?.includes(ps.query!));
- emojis.splice(ps.limit! + 1);
+ emojis.splice(ps.limit + 1);
} else {
- emojis = await q.take(ps.limit!).getMany();
+ emojis = await q.take(ps.limit).getMany();
}
return Emojis.packMany(emojis);
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
index c49f84b7fb..dbad93d336 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/remove-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emojis = await Emojis.find({
id: In(ps.ids),
});
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
index 06197820f0..470b9bef08 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-aliases-bulk.ts
@@ -1,29 +1,30 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- aliases: {
- validator: $.arr($.str),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
},
+ required: ['ids', 'aliases'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Emojis.update({
id: In(ps.ids),
}, {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
index f0645f111b..40e4c0199e 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/set-category-bulk.ts
@@ -1,29 +1,28 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection, In } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- ids: {
- validator: $.arr($.type(ID)),
- },
-
- category: {
- validator: $.optional.nullable.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ ids: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ category: { type: 'string', nullable: true },
},
+ required: ['ids'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await Emojis.update({
id: In(ps.ids),
}, {
diff --git a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
index 54a2cf9517..c6d07e16fa 100644
--- a/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
+++ b/packages/backend/src/server/api/endpoints/admin/emoji/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { Emojis } from '@/models/index';
+import define from '../../../define.js';
+import { Emojis } from '@/models/index.js';
import { getConnection } from 'typeorm';
-import { ApiError } from '../../../error';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -11,24 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- id: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str,
- },
-
- category: {
- validator: $.optional.nullable.str,
- },
-
- aliases: {
- validator: $.arr($.str),
- },
- },
-
errors: {
noSuchEmoji: {
message: 'No such emoji.',
@@ -38,8 +18,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ id: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string' },
+ category: { type: 'string', nullable: true },
+ aliases: { type: 'array', items: {
+ type: 'string',
+ } },
+ },
+ required: ['id', 'name', 'aliases'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const emoji = await Emojis.findOne(ps.id);
if (emoji == null) throw new ApiError(meta.errors.noSuchEmoji);
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
index db023c6f0b..d4251f2feb 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/delete-all-files.ts
@@ -1,23 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { deleteFile } from '@/services/drive/delete-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const files = await DriveFiles.find({
userHost: ps.host,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
index b68252ef2e..86978cc309 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/refresh-remote-instance-metadata.ts
@@ -1,24 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
-import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata';
+import define from '../../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances.findOne({ host: toPuny(ps.host) });
if (instance == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
index 4de8ad1336..ccd07489cb 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -1,23 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import deleteFollowing from '@/services/following/delete';
-import { Followings, Users } from '@/models/index';
+import define from '../../../define.js';
+import deleteFollowing from '@/services/following/delete.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const followings = await Followings.find({
followerHost: ps.host,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
index 6ac2f1f467..1981082428 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts
@@ -1,27 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
+import define from '../../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- host: {
- validator: $.str,
- },
-
- isSuspended: {
- validator: $.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ isSuspended: { type: 'boolean' },
},
+ required: ['host', 'isSuspended'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances.findOne({ host: toPuny(ps.host) });
if (instance == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
index 9a2bccec77..37878c4143 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-index-stats.ts
@@ -1,4 +1,4 @@
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
export const meta = {
@@ -6,13 +6,16 @@ export const meta = {
requireModerator: true,
tags: ['admin'],
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const stats = await
getConnection().query(`SELECT * FROM pg_indexes;`)
.then(recs => {
diff --git a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
index 1c5f250676..7cf2d5ffd4 100644
--- a/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/get-table-stats.ts
@@ -1,4 +1,4 @@
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
export const meta = {
@@ -7,9 +7,6 @@ export const meta = {
tags: ['admin'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -22,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const sizes = await
getConnection().query(`
SELECT relname AS "table", reltuples as "count", pg_total_relation_size(C.oid) AS "size"
diff --git a/packages/backend/src/server/api/endpoints/admin/invite.ts b/packages/backend/src/server/api/endpoints/admin/invite.ts
index 3428709c04..7e950cf87b 100644
--- a/packages/backend/src/server/api/endpoints/admin/invite.ts
+++ b/packages/backend/src/server/api/endpoints/admin/invite.ts
@@ -1,7 +1,7 @@
import rndstr from 'rndstr';
-import define from '../../define';
-import { RegistrationTickets } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { RegistrationTickets } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['admin'],
@@ -9,8 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -26,8 +24,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const code = rndstr({
length: 8,
chars: '2-9A-HJ-NP-Z', // [0-9A-Z] w/o [01IO] (32 patterns)
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
index 0308cf2761..4206e3a3c2 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/add.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Users } from '@/models/index';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
index bdb976e9ec..143119bfe4 100644
--- a/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/moderators/remove.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { Users } from '@/models/index';
+import define from '../../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/promo/create.ts b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
index f2735ac9f8..2eec5bf0db 100644
--- a/packages/backend/src/server/api/endpoints/admin/promo/create.ts
+++ b/packages/backend/src/server/api/endpoints/admin/promo/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { PromoNotes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { PromoNotes } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -11,16 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- expiresAt: {
- validator: $.num.int(),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ expiresAt: { type: 'integer' },
+ },
+ required: ['noteId', 'expiresAt'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -51,7 +48,6 @@ export default define(meta, async (ps, user) => {
await PromoNotes.insert({
noteId: note.id,
- createdAt: new Date(),
expiresAt: new Date(ps.expiresAt),
userId: note.userId,
});
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
index 3c8e7a27a2..8f015c280a 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts
@@ -1,18 +1,22 @@
-import define from '../../../define';
-import { destroy } from '@/queue/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../../define.js';
+import { destroy } from '@/queue/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {},
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
destroy();
insertModerationLog(me, 'clearQueue');
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
index 4760e2c310..70f7d77de4 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts
@@ -1,6 +1,6 @@
-import { deliverQueue } from '@/queue/queues';
-import { URL } from 'url';
-import define from '../../../define';
+import { deliverQueue } from '@/queue/queues.js';
+import { URL } from 'node:url';
+import define from '../../../define.js';
export const meta = {
tags: ['admin'],
@@ -8,9 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +32,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const jobs = await deliverQueue.getJobs(['delayed']);
const res = [] as [string, number][];
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
index a95aabc506..2235ce8f97 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts
@@ -1,6 +1,6 @@
-import { URL } from 'url';
-import define from '../../../define';
-import { inboxQueue } from '@/queue/queues';
+import { URL } from 'node:url';
+import define from '../../../define.js';
+import { inboxQueue } from '@/queue/queues.js';
export const meta = {
tags: ['admin'],
@@ -8,9 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +32,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const jobs = await inboxQueue.getJobs(['delayed']);
const res = [] as [string, number][];
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts b/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts
deleted file mode 100644
index df0b4a8f13..0000000000
--- a/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
-import $ from 'cafy';
-import define from '../../../define';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true,
- requireModerator: true,
-
- params: {
- domain: {
- validator: $.str.or(['deliver', 'inbox', 'db', 'objectStorage']),
- },
-
- state: {
- validator: $.str.or(['active', 'waiting', 'delayed']),
- },
-
- limit: {
- validator: $.optional.num,
- default: 50,
- },
- },
-
- res: {
- type: 'array',
- optional: false, nullable: false,
- items: {
- type: 'object',
- optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
- },
- data: {
- type: 'object',
- optional: false, nullable: false,
- },
- attempts: {
- type: 'number',
- optional: false, nullable: false,
- },
- maxAttempts: {
- type: 'number',
- optional: false, nullable: false,
- },
- timestamp: {
- type: 'number',
- optional: false, nullable: false,
- },
- },
- },
- },
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- const queue =
- ps.domain === 'deliver' ? deliverQueue :
- ps.domain === 'inbox' ? inboxQueue :
- ps.domain === 'db' ? dbQueue :
- ps.domain === 'objectStorage' ? objectStorageQueue :
- null as never;
-
- const jobs = await queue.getJobs([ps.state], 0, ps.limit!);
-
- return jobs.map(job => {
- const data = job.data;
- delete data.content;
- delete data.user;
- return {
- id: job.id,
- data,
- attempts: job.attemptsMade,
- maxAttempts: job.opts ? job.opts.attempts : 0,
- timestamp: job.timestamp,
- };
- });
-});
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
index dab0be5dbc..988b5a5e35 100644
--- a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
+++ b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts
@@ -1,5 +1,5 @@
-import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues';
-import define from '../../../define';
+import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues.js';
+import define from '../../../define.js';
export const meta = {
tags: ['admin'],
@@ -7,8 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -33,8 +31,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const deliverJobCounts = await deliverQueue.getJobCounts();
const inboxJobCounts = await inboxQueue.getJobCounts();
const dbJobCounts = await dbQueue.getJobCounts();
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/add.ts b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
index 65890a00f7..348e9baca1 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/add.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/add.ts
@@ -1,8 +1,7 @@
-import { URL } from 'url';
-import $ from 'cafy';
-import define from '../../../define';
-import { addRelay } from '@/services/relay';
-import { ApiError } from '../../../error';
+import { URL } from 'node:url';
+import define from '../../../define.js';
+import { addRelay } from '@/services/relay.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['admin'],
@@ -10,12 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- inbox: {
- validator: $.str,
- },
- },
-
errors: {
invalidUrl: {
message: 'Invalid URL',
@@ -52,8 +45,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ inbox: { type: 'string' },
+ },
+ required: ['inbox'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
try {
if (new URL(ps.inbox).protocol !== 'https:') throw 'https only';
} catch {
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/list.ts b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
index bdddf13374..89ec651e61 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/list.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { listRelay } from '@/services/relay';
+import define from '../../../define.js';
+import { listRelay } from '@/services/relay.js';
export const meta = {
tags: ['admin'],
@@ -7,9 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,7 +39,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return await listRelay();
});
diff --git a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
index 4b04e620c1..b59cf72c58 100644
--- a/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
+++ b/packages/backend/src/server/api/endpoints/admin/relays/remove.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { removeRelay } from '@/services/relay';
+import define from '../../../define.js';
+import { removeRelay } from '@/services/relay.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- inbox: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ inbox: { type: 'string' },
},
+ required: ['inbox'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return await removeRelay(ps.inbox);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/reset-password.ts b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
index b6cf1ee2d0..1fd5c8d5a5 100644
--- a/packages/backend/src/server/api/endpoints/admin/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/admin/reset-password.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import * as bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import bcrypt from 'bcryptjs';
import rndstr from 'rndstr';
-import { Users, UserProfiles } from '@/models/index';
+import { Users, UserProfiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -11,12 +9,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
index b00457f092..a9e5658413 100644
--- a/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
+++ b/packages/backend/src/server/api/endpoints/admin/resolve-abuse-user-report.ts
@@ -1,33 +1,28 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { AbuseUserReports, Users } from '@/models/index';
-import { getInstanceActor } from '@/services/instance-actor';
-import { deliver } from '@/queue/index';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { renderFlag } from '@/remote/activitypub/renderer/flag';
+import define from '../../define.js';
+import { AbuseUserReports, Users } from '@/models/index.js';
+import { getInstanceActor } from '@/services/instance-actor.js';
+import { deliver } from '@/queue/index.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { renderFlag } from '@/remote/activitypub/renderer/flag.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- reportId: {
- validator: $.type(ID),
- },
-
- forward: {
- validator: $.optional.boolean,
- required: false,
- default: false,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ reportId: { type: 'string', format: 'misskey:id' },
+ forward: { type: 'boolean', default: false },
},
+ required: ['reportId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const report = await AbuseUserReports.findOne(ps.reportId);
if (report == null) {
@@ -36,9 +31,9 @@ export default define(meta, async (ps, me) => {
if (ps.forward && report.targetUserHost != null) {
const actor = await getInstanceActor();
- const targetUser = await Users.findOne(report.targetUserId);
+ const targetUser = await Users.findOneOrFail(report.targetUserId);
- deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri], report.comment)), targetUser.inbox);
+ deliver(actor, renderActivity(renderFlag(actor, [targetUser.uri!], report.comment)), targetUser.inbox);
}
await AbuseUserReports.update(report.id, {
diff --git a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts b/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
deleted file mode 100644
index d80d2b0426..0000000000
--- a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import define from '../../define';
-import { driveChart, notesChart, usersChart } from '@/services/chart/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true,
- requireModerator: true,
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
- insertModerationLog(me, 'chartResync');
-
- driveChart.resync();
- notesChart.resync();
- usersChart.resync();
-
- // TODO: ユーザーごとのチャートもキューに入れて更新する
- // TODO: インスタンスごとのチャートもキューに入れて更新する
-});
diff --git a/packages/backend/src/server/api/endpoints/admin/send-email.ts b/packages/backend/src/server/api/endpoints/admin/send-email.ts
index c2972c35fa..bbdd66e4c9 100644
--- a/packages/backend/src/server/api/endpoints/admin/send-email.ts
+++ b/packages/backend/src/server/api/endpoints/admin/send-email.ts
@@ -1,27 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { sendEmail } from '@/services/send-email';
+import define from '../../define.js';
+import { sendEmail } from '@/services/send-email.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- to: {
- validator: $.str,
- },
- subject: {
- validator: $.str,
- },
- text: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ to: { type: 'string' },
+ subject: { type: 'string' },
+ text: { type: 'string' },
},
+ required: ['to', 'subject', 'text'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
await sendEmail(ps.to, ps.subject, ps.text, ps.text);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/server-info.ts b/packages/backend/src/server/api/endpoints/admin/server-info.ts
index cd282e364c..8bf1c4341c 100644
--- a/packages/backend/src/server/api/endpoints/admin/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/admin/server-info.ts
@@ -1,8 +1,8 @@
-import * as os from 'os';
-import * as si from 'systeminformation';
+import * as os from 'node:os';
+import si from 'systeminformation';
import { getConnection } from 'typeorm';
-import define from '../../define';
-import { redisClient } from '../../../../db/redis';
+import define from '../../define.js';
+import { redisClient } from '../../../../db/redis.js';
export const meta = {
requireCredential: true,
@@ -10,9 +10,6 @@ export const meta = {
tags: ['admin', 'meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -90,8 +87,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const memStats = await si.mem();
const fsStats = await si.fsSize();
const netInterface = await si.networkInterfaceDefault();
diff --git a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
index 84e2b84bb5..3545536aa2 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ModerationLogs } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { ModerationLogs } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['admin'],
@@ -10,21 +8,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -65,11 +48,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(ModerationLogs.createQueryBuilder('report'), ps.sinceId, ps.untilId);
- const reports = await query.take(ps.limit!).getMany();
+ const reports = await query.take(ps.limit).getMany();
return await ModerationLogs.packMany(reports);
});
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index c2a6a294b5..a435dcc288 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -9,158 +7,22 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
nullable: false, optional: false,
- properties: {
- id: {
- type: 'string',
- nullable: false, optional: false,
- format: 'id',
- },
- createdAt: {
- type: 'string',
- nullable: false, optional: false,
- format: 'date-time',
- },
- updatedAt: {
- type: 'string',
- nullable: true, optional: false,
- format: 'date-time',
- },
- lastFetchedAt: {
- type: 'string',
- nullable: true, optional: false,
- },
- username: {
- type: 'string',
- nullable: false, optional: false,
- },
- name: {
- type: 'string',
- nullable: true, optional: false,
- },
- folowersCount: {
- type: 'number',
- nullable: false, optional: true,
- },
- followingCount: {
- type: 'number',
- nullable: false, optional: false,
- },
- notesCount: {
- type: 'number',
- nullable: false, optional: false,
- },
- avatarId: {
- type: 'string',
- nullable: true, optional: false,
- },
- bannerId: {
- type: 'string',
- nullable: true, optional: false,
- },
- tags: {
- type: 'array',
- nullable: false, optional: false,
- items: {
- type: 'string',
- nullable: false, optional: false,
- },
- },
- avatarUrl: {
- type: 'string',
- nullable: true, optional: false,
- format: 'url',
- },
- bannerUrl: {
- type: 'string',
- nullable: true, optional: false,
- format: 'url',
- },
- avatarBlurhash: {
- type: 'any',
- nullable: true, optional: false,
- default: null,
- },
- bannerBlurhash: {
- type: 'any',
- nullable: true, optional: false,
- default: null,
- },
- isSuspended: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isSilenced: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isLocked: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isBot: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isCat: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isAdmin: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- isModerator: {
- type: 'boolean',
- nullable: false, optional: false,
- },
- emojis: {
- type: 'array',
- nullable: false, optional: false,
- items: {
- type: 'string',
- nullable: false, optional: false,
- },
- },
- host: {
- type: 'string',
- nullable: true, optional: false,
- },
- inbox: {
- type: 'string',
- nullable: true, optional: false,
- },
- sharedInbox: {
- type: 'string',
- nullable: true, optional: false,
- },
- featured: {
- type: 'string',
- nullable: true, optional: false,
- },
- uri: {
- type: 'string',
- nullable: true, optional: false,
- },
- token: {
- type: 'string',
- nullable: true, optional: false,
- default: '<MASKED>',
- },
- },
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/show-users.ts b/packages/backend/src/server/api/endpoints/admin/show-users.ts
index d3dde99b72..1ec86fef2e 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-users.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-users.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -8,61 +7,6 @@ export const meta = {
requireCredential: true,
requireModerator: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'available',
- 'admin',
- 'moderator',
- 'adminOrModerator',
- 'silenced',
- 'suspended',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
-
- username: {
- validator: $.optional.str,
- default: null,
- },
-
- hostname: {
- validator: $.optional.str,
- default: null,
- },
- },
-
res: {
type: 'array',
nullable: false, optional: false,
@@ -74,8 +18,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'available', 'admin', 'moderator', 'adminOrModerator', 'silenced', 'suspended'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ username: { type: 'string', default: null },
+ hostname: { type: 'string', default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user');
switch (ps.state) {
@@ -111,7 +69,7 @@ export default define(meta, async (ps, me) => {
default: query.orderBy('user.id', 'ASC'); break;
}
- query.take(ps.limit!);
+ query.take(ps.limit);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/packages/backend/src/server/api/endpoints/admin/silence-user.ts b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
index 872bd2a6ac..4a74c3fb00 100644
--- a/packages/backend/src/server/api/endpoints/admin/silence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/silence-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
index 2bb1875fc0..adaa7b86ce 100644
--- a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts
@@ -1,28 +1,28 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import deleteFollowing from '@/services/following/delete';
-import { Users, Followings, Notifications } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import deleteFollowing from '@/services/following/delete.js';
+import { Users, Followings, Notifications } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
index a4c6ff2ade..4e6366aa18 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsilence-user.ts
@@ -1,24 +1,24 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
index 5ab56d51c7..3b9e0a94e0 100644
--- a/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/unsuspend-user.ts
@@ -1,25 +1,25 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { doPostUnsuspend } from '@/services/unsuspend-user';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { doPostUnsuspend } from '@/services/unsuspend-user.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId as string);
if (user == null) {
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index aa2d1222f7..66b634c877 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -1,306 +1,107 @@
-import $ from 'cafy';
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
-import { Meta } from '@/models/entities/meta';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
-import { ID } from '@/misc/cafy-id';
+import { Meta } from '@/models/entities/meta.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireAdmin: true,
+} as const;
- params: {
- disableRegistration: {
- validator: $.optional.nullable.bool,
- },
-
- disableLocalTimeline: {
- validator: $.optional.nullable.bool,
- },
-
- disableGlobalTimeline: {
- validator: $.optional.nullable.bool,
- },
-
- useStarForReactionFallback: {
- validator: $.optional.nullable.bool,
- },
-
- pinnedUsers: {
- validator: $.optional.nullable.arr($.str),
- },
-
- hiddenTags: {
- validator: $.optional.nullable.arr($.str),
- },
-
- blockedHosts: {
- validator: $.optional.nullable.arr($.str),
- },
-
- mascotImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- bannerUrl: {
- validator: $.optional.nullable.str,
- },
-
- errorImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- iconUrl: {
- validator: $.optional.nullable.str,
- },
-
- backgroundImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- logoImageUrl: {
- validator: $.optional.nullable.str,
- },
-
- name: {
- validator: $.optional.nullable.str,
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- maxNoteTextLength: {
- validator: $.optional.num.min(0).max(DB_MAX_NOTE_TEXT_LENGTH),
- },
-
- localDriveCapacityMb: {
- validator: $.optional.num.min(0),
- },
-
- remoteDriveCapacityMb: {
- validator: $.optional.num.min(0),
- },
-
- cacheRemoteFiles: {
- validator: $.optional.bool,
- },
-
- proxyRemoteFiles: {
- validator: $.optional.bool,
- },
-
- emailRequiredForSignup: {
- validator: $.optional.bool,
- },
-
- enableHcaptcha: {
- validator: $.optional.bool,
- },
-
- hcaptchaSiteKey: {
- validator: $.optional.nullable.str,
- },
-
- hcaptchaSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- enableRecaptcha: {
- validator: $.optional.bool,
- },
-
- recaptchaSiteKey: {
- validator: $.optional.nullable.str,
- },
-
- recaptchaSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- proxyAccountId: {
- validator: $.optional.nullable.type(ID),
- },
-
- maintainerName: {
- validator: $.optional.nullable.str,
- },
-
- maintainerEmail: {
- validator: $.optional.nullable.str,
- },
-
- pinnedPages: {
- validator: $.optional.arr($.str),
- },
-
- pinnedClipId: {
- validator: $.optional.nullable.type(ID),
- },
-
- langs: {
- validator: $.optional.arr($.str),
- },
-
- summalyProxy: {
- validator: $.optional.nullable.str,
- },
-
- deeplAuthKey: {
- validator: $.optional.nullable.str,
- },
-
- deeplIsPro: {
- validator: $.optional.bool,
- },
-
- enableTwitterIntegration: {
- validator: $.optional.bool,
- },
-
- twitterConsumerKey: {
- validator: $.optional.nullable.str,
- },
-
- twitterConsumerSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableGithubIntegration: {
- validator: $.optional.bool,
- },
-
- githubClientId: {
- validator: $.optional.nullable.str,
- },
-
- githubClientSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableDiscordIntegration: {
- validator: $.optional.bool,
- },
-
- discordClientId: {
- validator: $.optional.nullable.str,
- },
-
- discordClientSecret: {
- validator: $.optional.nullable.str,
- },
-
- enableEmail: {
- validator: $.optional.bool,
- },
-
- email: {
- validator: $.optional.nullable.str,
- },
-
- smtpSecure: {
- validator: $.optional.bool,
- },
-
- smtpHost: {
- validator: $.optional.nullable.str,
- },
-
- smtpPort: {
- validator: $.optional.nullable.num,
- },
-
- smtpUser: {
- validator: $.optional.nullable.str,
- },
-
- smtpPass: {
- validator: $.optional.nullable.str,
- },
-
- enableServiceWorker: {
- validator: $.optional.bool,
- },
-
- swPublicKey: {
- validator: $.optional.nullable.str,
- },
-
- swPrivateKey: {
- validator: $.optional.nullable.str,
- },
-
- tosUrl: {
- validator: $.optional.nullable.str,
- },
-
- repositoryUrl: {
- validator: $.optional.str,
- },
-
- feedbackUrl: {
- validator: $.optional.str,
- },
-
- useObjectStorage: {
- validator: $.optional.bool,
- },
-
- objectStorageBaseUrl: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageBucket: {
- validator: $.optional.nullable.str,
- },
-
- objectStoragePrefix: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageEndpoint: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageRegion: {
- validator: $.optional.nullable.str,
- },
-
- objectStoragePort: {
- validator: $.optional.nullable.num,
- },
-
- objectStorageAccessKey: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageSecretKey: {
- validator: $.optional.nullable.str,
- },
-
- objectStorageUseSSL: {
- validator: $.optional.bool,
- },
-
- objectStorageUseProxy: {
- validator: $.optional.bool,
- },
-
- objectStorageSetPublicRead: {
- validator: $.optional.bool,
- },
-
- objectStorageS3ForcePathStyle: {
- validator: $.optional.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ disableRegistration: { type: 'boolean', nullable: true },
+ disableLocalTimeline: { type: 'boolean', nullable: true },
+ disableGlobalTimeline: { type: 'boolean', nullable: true },
+ useStarForReactionFallback: { type: 'boolean', nullable: true },
+ pinnedUsers: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ hiddenTags: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ blockedHosts: { type: 'array', nullable: true, items: {
+ type: 'string',
+ } },
+ themeColor: { type: 'string', nullable: true },
+ mascotImageUrl: { type: 'string', nullable: true },
+ bannerUrl: { type: 'string', nullable: true },
+ errorImageUrl: { type: 'string', nullable: true },
+ iconUrl: { type: 'string', nullable: true },
+ backgroundImageUrl: { type: 'string', nullable: true },
+ logoImageUrl: { type: 'string', nullable: true },
+ name: { type: 'string', nullable: true },
+ description: { type: 'string', nullable: true },
+ defaultLightTheme: { type: 'string', nullable: true },
+ defaultDarkTheme: { type: 'string', nullable: true },
+ localDriveCapacityMb: { type: 'integer' },
+ remoteDriveCapacityMb: { type: 'integer' },
+ cacheRemoteFiles: { type: 'boolean' },
+ emailRequiredForSignup: { type: 'boolean' },
+ enableHcaptcha: { type: 'boolean' },
+ hcaptchaSiteKey: { type: 'string', nullable: true },
+ hcaptchaSecretKey: { type: 'string', nullable: true },
+ enableRecaptcha: { type: 'boolean' },
+ recaptchaSiteKey: { type: 'string', nullable: true },
+ recaptchaSecretKey: { type: 'string', nullable: true },
+ proxyAccountId: { type: 'string', format: 'misskey:id', nullable: true },
+ maintainerName: { type: 'string', nullable: true },
+ maintainerEmail: { type: 'string', nullable: true },
+ pinnedPages: { type: 'array', items: {
+ type: 'string',
+ } },
+ pinnedClipId: { type: 'string', format: 'misskey:id', nullable: true },
+ langs: { type: 'array', items: {
+ type: 'string',
+ } },
+ summalyProxy: { type: 'string', nullable: true },
+ deeplAuthKey: { type: 'string', nullable: true },
+ deeplIsPro: { type: 'boolean' },
+ enableTwitterIntegration: { type: 'boolean' },
+ twitterConsumerKey: { type: 'string', nullable: true },
+ twitterConsumerSecret: { type: 'string', nullable: true },
+ enableGithubIntegration: { type: 'boolean' },
+ githubClientId: { type: 'string', nullable: true },
+ githubClientSecret: { type: 'string', nullable: true },
+ enableDiscordIntegration: { type: 'boolean' },
+ discordClientId: { type: 'string', nullable: true },
+ discordClientSecret: { type: 'string', nullable: true },
+ enableEmail: { type: 'boolean' },
+ email: { type: 'string', nullable: true },
+ smtpSecure: { type: 'boolean' },
+ smtpHost: { type: 'string', nullable: true },
+ smtpPort: { type: 'integer', nullable: true },
+ smtpUser: { type: 'string', nullable: true },
+ smtpPass: { type: 'string', nullable: true },
+ enableServiceWorker: { type: 'boolean' },
+ swPublicKey: { type: 'string', nullable: true },
+ swPrivateKey: { type: 'string', nullable: true },
+ tosUrl: { type: 'string', nullable: true },
+ repositoryUrl: { type: 'string' },
+ feedbackUrl: { type: 'string' },
+ useObjectStorage: { type: 'boolean' },
+ objectStorageBaseUrl: { type: 'string', nullable: true },
+ objectStorageBucket: { type: 'string', nullable: true },
+ objectStoragePrefix: { type: 'string', nullable: true },
+ objectStorageEndpoint: { type: 'string', nullable: true },
+ objectStorageRegion: { type: 'string', nullable: true },
+ objectStoragePort: { type: 'integer', nullable: true },
+ objectStorageAccessKey: { type: 'string', nullable: true },
+ objectStorageSecretKey: { type: 'string', nullable: true },
+ objectStorageUseSSL: { type: 'boolean' },
+ objectStorageUseProxy: { type: 'boolean' },
+ objectStorageSetPublicRead: { type: 'boolean' },
+ objectStorageS3ForcePathStyle: { type: 'boolean' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const set = {} as Partial<Meta>;
if (typeof ps.disableRegistration === 'boolean') {
@@ -331,6 +132,10 @@ export default define(meta, async (ps, me) => {
set.blockedHosts = ps.blockedHosts.filter(Boolean);
}
+ if (ps.themeColor !== undefined) {
+ set.themeColor = ps.themeColor;
+ }
+
if (ps.mascotImageUrl !== undefined) {
set.mascotImageUrl = ps.mascotImageUrl;
}
@@ -359,8 +164,12 @@ export default define(meta, async (ps, me) => {
set.description = ps.description;
}
- if (ps.maxNoteTextLength) {
- set.maxNoteTextLength = ps.maxNoteTextLength;
+ if (ps.defaultLightTheme !== undefined) {
+ set.defaultLightTheme = ps.defaultLightTheme;
+ }
+
+ if (ps.defaultDarkTheme !== undefined) {
+ set.defaultDarkTheme = ps.defaultDarkTheme;
}
if (ps.localDriveCapacityMb !== undefined) {
@@ -375,10 +184,6 @@ export default define(meta, async (ps, me) => {
set.cacheRemoteFiles = ps.cacheRemoteFiles;
}
- if (ps.proxyRemoteFiles !== undefined) {
- set.proxyRemoteFiles = ps.proxyRemoteFiles;
- }
-
if (ps.emailRequiredForSignup !== undefined) {
set.emailRequiredForSignup = ps.emailRequiredForSignup;
}
diff --git a/packages/backend/src/server/api/endpoints/admin/vacuum.ts b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
index 4229ef0d29..4c04e019da 100644
--- a/packages/backend/src/server/api/endpoints/admin/vacuum.ts
+++ b/packages/backend/src/server/api/endpoints/admin/vacuum.ts
@@ -1,26 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
+import define from '../../define.js';
import { getConnection } from 'typeorm';
-import { insertModerationLog } from '@/services/insert-moderation-log';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
export const meta = {
tags: ['admin'],
requireCredential: true,
requireModerator: true,
+} as const;
- params: {
- full: {
- validator: $.bool,
- },
- analyze: {
- validator: $.bool,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ full: { type: 'boolean' },
+ analyze: { type: 'boolean' },
},
+ required: ['full', 'analyze'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const params: string[] = [];
if (ps.full) {
diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts
index 0bd29607d6..bba66e98cf 100644
--- a/packages/backend/src/server/api/endpoints/announcements.ts
+++ b/packages/backend/src/server/api/endpoints/announcements.ts
@@ -1,34 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../define';
-import { Announcements, AnnouncementReads } from '@/models/index';
-import { makePaginationQuery } from '../common/make-pagination-query';
+import define from '../define.js';
+import { Announcements, AnnouncementReads } from '@/models/index.js';
+import { makePaginationQuery } from '../common/make-pagination-query.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- withUnreads: {
- validator: $.optional.boolean,
- default: false,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -73,11 +51,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ withUnreads: { type: 'boolean', default: false },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Announcements.createQueryBuilder('announcement'), ps.sinceId, ps.untilId);
- const announcements = await query.take(ps.limit!).getMany();
+ const announcements = await query.take(ps.limit).getMany();
if (user) {
const reads = (await AnnouncementReads.find({
@@ -89,5 +78,9 @@ export default define(meta, async (ps, user) => {
}
}
- return ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements;
+ return (ps.withUnreads ? announcements.filter((a: any) => !a.isRead) : announcements).map((a) => ({
+ ...a,
+ createdAt: a.createdAt.toISOString(),
+ updatedAt: a.updatedAt?.toISOString() ?? null,
+ }));
});
diff --git a/packages/backend/src/server/api/endpoints/antennas/create.ts b/packages/backend/src/server/api/endpoints/antennas/create.ts
index 2092d177ba..92cbba817e 100644
--- a/packages/backend/src/server/api/endpoints/antennas/create.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../define';
-import { genId } from '@/misc/gen-id';
-import { Antennas, UserLists, UserGroupJoinings } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { ApiError } from '../../error';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { genId } from '@/misc/gen-id.js';
+import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
+import { ApiError } from '../../error.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -13,52 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
-
- src: {
- validator: $.str.or(['home', 'all', 'users', 'list', 'group']),
- },
-
- userListId: {
- validator: $.nullable.optional.type(ID),
- },
-
- userGroupId: {
- validator: $.nullable.optional.type(ID),
- },
-
- keywords: {
- validator: $.arr($.arr($.str)),
- },
-
- excludeKeywords: {
- validator: $.arr($.arr($.str)),
- },
-
- users: {
- validator: $.arr($.str),
- },
-
- caseSensitive: {
- validator: $.bool,
- },
-
- withReplies: {
- validator: $.bool,
- },
-
- withFile: {
- validator: $.bool,
- },
-
- notify: {
- validator: $.bool,
- },
- },
-
errors: {
noSuchUserList: {
message: 'No such user list.',
@@ -80,8 +32,36 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'group'] },
+ userListId: { type: 'string', format: 'misskey:id', nullable: true },
+ userGroupId: { type: 'string', format: 'misskey:id', nullable: true },
+ keywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ excludeKeywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ users: { type: 'array', items: {
+ type: 'string',
+ } },
+ caseSensitive: { type: 'boolean' },
+ withReplies: { type: 'boolean' },
+ withFile: { type: 'boolean' },
+ notify: { type: 'boolean' },
+ },
+ required: ['name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let userList;
let userGroupJoining;
diff --git a/packages/backend/src/server/api/endpoints/antennas/delete.ts b/packages/backend/src/server/api/endpoints/antennas/delete.ts
index b2793fc70d..4e6b8b3d2e 100644
--- a/packages/backend/src/server/api/endpoints/antennas/delete.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas } from '@/models/index';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas } from '@/models/index.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const antenna = await Antennas.findOne({
id: ps.antennaId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/antennas/list.ts b/packages/backend/src/server/api/endpoints/antennas/list.ts
index bb58912612..accca5de76 100644
--- a/packages/backend/src/server/api/endpoints/antennas/list.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/list.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Antennas } from '@/models/index';
+import define from '../../define.js';
+import { Antennas } from '@/models/index.js';
export const meta = {
tags: ['antennas', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const antennas = await Antennas.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/antennas/notes.ts b/packages/backend/src/server/api/endpoints/antennas/notes.ts
index eb7de901c5..f0cb2ba3c0 100644
--- a/packages/backend/src/server/api/endpoints/antennas/notes.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/notes.ts
@@ -1,13 +1,11 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import readNote from '@/services/note/read';
-import { Antennas, Notes, AntennaNotes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { ApiError } from '../../error';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import readNote from '@/services/note/read.js';
+import { Antennas, Notes, AntennaNotes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { ApiError } from '../../error.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['antennas', 'account', 'notes'],
@@ -16,33 +14,6 @@ export const meta = {
kind: 'read:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -62,8 +33,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const antenna = await Antennas.findOne({
id: ps.antennaId,
userId: user.id,
@@ -81,10 +65,16 @@ export default define(meta, async (ps, user) => {
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere(`note.id IN (${ antennaQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(antennaQuery.getParameters());
generateVisibilityQuery(query, user);
@@ -92,7 +82,7 @@ export default define(meta, async (ps, user) => {
generateBlockedUserQuery(query, user);
const notes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
if (notes.length > 0) {
diff --git a/packages/backend/src/server/api/endpoints/antennas/show.ts b/packages/backend/src/server/api/endpoints/antennas/show.ts
index a37d37d31c..36c4da81b7 100644
--- a/packages/backend/src/server/api/endpoints/antennas/show.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas } from '@/models/index.js';
export const meta = {
tags: ['antennas', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['antennaId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the antenna
const antenna = await Antennas.findOne({
id: ps.antennaId,
diff --git a/packages/backend/src/server/api/endpoints/antennas/update.ts b/packages/backend/src/server/api/endpoints/antennas/update.ts
index 900f725505..a99964555b 100644
--- a/packages/backend/src/server/api/endpoints/antennas/update.ts
+++ b/packages/backend/src/server/api/endpoints/antennas/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Antennas, UserLists, UserGroupJoinings } from '@/models/index';
-import { publishInternalEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
+import { publishInternalEvent } from '@/services/stream.js';
export const meta = {
tags: ['antennas'],
@@ -12,56 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- antennaId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
-
- src: {
- validator: $.str.or(['home', 'all', 'users', 'list', 'group']),
- },
-
- userListId: {
- validator: $.nullable.optional.type(ID),
- },
-
- userGroupId: {
- validator: $.nullable.optional.type(ID),
- },
-
- keywords: {
- validator: $.arr($.arr($.str)),
- },
-
- excludeKeywords: {
- validator: $.arr($.arr($.str)),
- },
-
- users: {
- validator: $.arr($.str),
- },
-
- caseSensitive: {
- validator: $.bool,
- },
-
- withReplies: {
- validator: $.bool,
- },
-
- withFile: {
- validator: $.bool,
- },
-
- notify: {
- validator: $.bool,
- },
- },
-
errors: {
noSuchAntenna: {
message: 'No such antenna.',
@@ -89,8 +37,37 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ antennaId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ src: { type: 'string', enum: ['home', 'all', 'users', 'list', 'group'] },
+ userListId: { type: 'string', format: 'misskey:id', nullable: true },
+ userGroupId: { type: 'string', format: 'misskey:id', nullable: true },
+ keywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ excludeKeywords: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ users: { type: 'array', items: {
+ type: 'string',
+ } },
+ caseSensitive: { type: 'boolean' },
+ withReplies: { type: 'boolean' },
+ withFile: { type: 'boolean' },
+ notify: { type: 'boolean' },
+ },
+ required: ['antennaId', 'name', 'src', 'keywords', 'excludeKeywords', 'users', 'caseSensitive', 'withReplies', 'withFile', 'notify'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the antenna
const antenna = await Antennas.findOne({
id: ps.antennaId,
diff --git a/packages/backend/src/server/api/endpoints/ap/get.ts b/packages/backend/src/server/api/endpoints/ap/get.ts
index ff8c677b91..0cbe7ebc67 100644
--- a/packages/backend/src/server/api/endpoints/ap/get.ts
+++ b/packages/backend/src/server/api/endpoints/ap/get.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import Resolver from '@/remote/activitypub/resolver';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import Resolver from '@/remote/activitypub/resolver.js';
+import { ApiError } from '../../error.js';
import ms from 'ms';
export const meta = {
@@ -14,12 +13,6 @@ export const meta = {
max: 30,
},
- params: {
- uri: {
- validator: $.str,
- },
- },
-
errors: {
},
@@ -29,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ uri: { type: 'string' },
+ },
+ required: ['uri'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const resolver = new Resolver();
const object = await resolver.resolve(ps.uri);
return object;
diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts
index 7d17d8edce..7595c38e8a 100644
--- a/packages/backend/src/server/api/endpoints/ap/show.ts
+++ b/packages/backend/src/server/api/endpoints/ap/show.ts
@@ -1,18 +1,17 @@
-import $ from 'cafy';
-import define from '../../define';
-import config from '@/config/index';
-import { createPerson } from '@/remote/activitypub/models/person';
-import { createNote } from '@/remote/activitypub/models/note';
-import Resolver from '@/remote/activitypub/resolver';
-import { ApiError } from '../../error';
-import { extractDbHost } from '@/misc/convert-host';
-import { Users, Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { isActor, isPost, getApId } from '@/remote/activitypub/type';
+import define from '../../define.js';
+import config from '@/config/index.js';
+import { createPerson } from '@/remote/activitypub/models/person.js';
+import { createNote } from '@/remote/activitypub/models/note.js';
+import Resolver from '@/remote/activitypub/resolver.js';
+import { ApiError } from '../../error.js';
+import { extractDbHost } from '@/misc/convert-host.js';
+import { Users, Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { isActor, isPost, getApId } from '@/remote/activitypub/type.js';
import ms from 'ms';
-import { SchemaType } from '@/misc/schema';
+import { SchemaType } from '@/misc/schema.js';
export const meta = {
tags: ['federation'],
@@ -24,12 +23,6 @@ export const meta = {
max: 30,
},
- params: {
- uri: {
- validator: $.str,
- },
- },
-
errors: {
noSuchObject: {
message: 'No such object.',
@@ -75,8 +68,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ uri: { type: 'string' },
+ },
+ required: ['uri'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const object = await fetchAny(ps.uri);
if (object) {
return object;
diff --git a/packages/backend/src/server/api/endpoints/app/create.ts b/packages/backend/src/server/api/endpoints/app/create.ts
index fbe6690f1d..e0cf8632fb 100644
--- a/packages/backend/src/server/api/endpoints/app/create.ts
+++ b/packages/backend/src/server/api/endpoints/app/create.ts
@@ -1,35 +1,14 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Apps } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { unique } from '@/prelude/array';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import define from '../../define.js';
+import { Apps } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { unique } from '@/prelude/array.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['app'],
requireCredential: false,
- params: {
- name: {
- validator: $.str,
- },
-
- description: {
- validator: $.str,
- },
-
- permission: {
- validator: $.arr($.str).unique(),
- },
-
- // TODO: Check it is valid url
- callbackUrl: {
- validator: $.optional.nullable.str,
- default: null,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -37,8 +16,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ description: { type: 'string' },
+ permission: { type: 'array', uniqueItems: true, items: {
+ type: 'string',
+ } },
+ callbackUrl: { type: 'string', nullable: true },
+ },
+ required: ['name', 'description', 'permission'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Generate secret
const secret = secureRndstr(32, true);
diff --git a/packages/backend/src/server/api/endpoints/app/show.ts b/packages/backend/src/server/api/endpoints/app/show.ts
index 9f4777b383..54e714e193 100644
--- a/packages/backend/src/server/api/endpoints/app/show.ts
+++ b/packages/backend/src/server/api/endpoints/app/show.ts
@@ -1,18 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Apps } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Apps } from '@/models/index.js';
export const meta = {
tags: ['app'],
- params: {
- appId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchApp: {
message: 'No such app.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['appId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
const isSecure = user != null && token == null;
// Lookup app
diff --git a/packages/backend/src/server/api/endpoints/auth/accept.ts b/packages/backend/src/server/api/endpoints/auth/accept.ts
index f028135ca5..0760eef52b 100644
--- a/packages/backend/src/server/api/endpoints/auth/accept.ts
+++ b/packages/backend/src/server/api/endpoints/auth/accept.ts
@@ -1,10 +1,9 @@
-import * as crypto from 'crypto';
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { AuthSessions, AccessTokens, Apps } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import * as crypto from 'node:crypto';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { AuthSessions, AccessTokens, Apps } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['auth'],
@@ -13,12 +12,6 @@ export const meta = {
secure: true,
- params: {
- token: {
- validator: $.str,
- },
- },
-
errors: {
noSuchSession: {
message: 'No such session.',
@@ -28,8 +21,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ },
+ required: ['token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch token
const session = await AuthSessions
.findOne({ token: ps.token });
diff --git a/packages/backend/src/server/api/endpoints/auth/session/generate.ts b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
index 98987eba5b..bd571327d2 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/generate.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/generate.ts
@@ -1,22 +1,15 @@
import { v4 as uuid } from 'uuid';
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { Apps, AuthSessions } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import config from '@/config/index.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { Apps, AuthSessions } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- appSecret: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -42,8 +35,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appSecret: { type: 'string' },
+ },
+ required: ['appSecret'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Lookup app
const app = await Apps.findOne({
secret: ps.appSecret,
diff --git a/packages/backend/src/server/api/endpoints/auth/session/show.ts b/packages/backend/src/server/api/endpoints/auth/session/show.ts
index ae0d016cea..d40c9363c6 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/show.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/show.ts
@@ -1,19 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { AuthSessions } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { AuthSessions } from '@/models/index.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- token: {
- validator: $.str,
- },
- },
-
errors: {
noSuchSession: {
message: 'No such session.',
@@ -44,8 +37,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ },
+ required: ['token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Lookup session
const session = await AuthSessions.findOne({
token: ps.token,
diff --git a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
index fe0211ebe3..b699c6fa25 100644
--- a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
+++ b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts
@@ -1,23 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { Apps, AuthSessions, AccessTokens, Users } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { Apps, AuthSessions, AccessTokens, Users } from '@/models/index.js';
export const meta = {
tags: ['auth'],
requireCredential: false,
- params: {
- appSecret: {
- validator: $.str,
- },
-
- token: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -56,8 +45,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ appSecret: { type: 'string' },
+ token: { type: 'string' },
+ },
+ required: ['appSecret', 'token'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Lookup app
const app = await Apps.findOne({
secret: ps.appSecret,
diff --git a/packages/backend/src/server/api/endpoints/blocking/create.ts b/packages/backend/src/server/api/endpoints/blocking/create.ts
index 6d555ff569..c5e73c0131 100644
--- a/packages/backend/src/server/api/endpoints/blocking/create.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import create from '@/services/blocking/create';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Blockings, NoteWatchings, Users } from '@/models/index';
+import create from '@/services/blocking/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Blockings, NoteWatchings, Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:blocks',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const blocker = await Users.findOneOrFail(user.id);
// 自分自身
diff --git a/packages/backend/src/server/api/endpoints/blocking/delete.ts b/packages/backend/src/server/api/endpoints/blocking/delete.ts
index 942cddaedf..a45547290c 100644
--- a/packages/backend/src/server/api/endpoints/blocking/delete.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import deleteBlocking from '@/services/blocking/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Blockings, Users } from '@/models/index';
+import deleteBlocking from '@/services/blocking/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Blockings, Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:blocks',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const blocker = await Users.findOneOrFail(user.id);
// Check if the blockee is yourself
diff --git a/packages/backend/src/server/api/endpoints/blocking/list.ts b/packages/backend/src/server/api/endpoints/blocking/list.ts
index 9a4f662140..29095ebe21 100644
--- a/packages/backend/src/server/api/endpoints/blocking/list.ts
+++ b/packages/backend/src/server/api/endpoints/blocking/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Blockings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Blockings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:blocks',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Blockings.createQueryBuilder('blocking'), ps.sinceId, ps.untilId)
.andWhere(`blocking.blockerId = :meId`, { meId: me.id });
const blockings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Blockings.packMany(blockings, me);
diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts
index 68cdf1143e..16456b9c01 100644
--- a/packages/backend/src/server/api/endpoints/channels/create.ts
+++ b/packages/backend/src/server/api/endpoints/channels/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, DriveFiles } from '@/models/index';
-import { Channel } from '@/models/entities/channel';
-import { genId } from '@/misc/gen-id';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, DriveFiles } from '@/models/index.js';
+import { Channel } from '@/models/entities/channel.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['channels'],
@@ -13,20 +11,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- name: {
- validator: $.str.range(1, 128),
- },
-
- description: {
- validator: $.nullable.optional.str.range(1, 2048),
- },
-
- bannerId: {
- validator: $.nullable.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -42,8 +26,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 128 },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let banner = null;
if (ps.bannerId != null) {
banner = await DriveFiles.findOne({
diff --git a/packages/backend/src/server/api/endpoints/channels/featured.ts b/packages/backend/src/server/api/endpoints/channels/featured.ts
index ceadde907c..73980c0fad 100644
--- a/packages/backend/src/server/api/endpoints/channels/featured.ts
+++ b/packages/backend/src/server/api/endpoints/channels/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Channels } from '@/models/index';
+import define from '../../define.js';
+import { Channels } from '@/models/index.js';
export const meta = {
tags: ['channels'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Channels.createQueryBuilder('channel')
.where('channel.lastNotedAt IS NOT NULL')
.orderBy('channel.lastNotedAt', 'DESC');
diff --git a/packages/backend/src/server/api/endpoints/channels/follow.ts b/packages/backend/src/server/api/endpoints/channels/follow.ts
index bf580eea60..4372c283cb 100644
--- a/packages/backend/src/server/api/endpoints/channels/follow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/follow.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['channels'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchChannel: {
message: 'No such channel.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/followed.ts b/packages/backend/src/server/api/endpoints/channels/followed.ts
index 9e4c942af2..e4aa4d1614 100644
--- a/packages/backend/src/server/api/endpoints/channels/followed.ts
+++ b/packages/backend/src/server/api/endpoints/channels/followed.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['channels', 'account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:channels',
- params: {
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 5,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 5 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(ChannelFollowings.createQueryBuilder(), ps.sinceId, ps.untilId)
.andWhere({ followerId: me.id });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(followings.map(x => Channels.pack(x.followeeId, me)));
diff --git a/packages/backend/src/server/api/endpoints/channels/owned.ts b/packages/backend/src/server/api/endpoints/channels/owned.ts
index 5473636a85..ed7e41cac2 100644
--- a/packages/backend/src/server/api/endpoints/channels/owned.ts
+++ b/packages/backend/src/server/api/endpoints/channels/owned.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Channels } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Channels } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['channels', 'account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:channels',
- params: {
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 5,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 5 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Channels.createQueryBuilder(), ps.sinceId, ps.untilId)
.andWhere({ userId: me.id });
const channels = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(channels.map(x => Channels.pack(x, me)));
diff --git a/packages/backend/src/server/api/endpoints/channels/show.ts b/packages/backend/src/server/api/endpoints/channels/show.ts
index 598a87ec4e..ea4e013073 100644
--- a/packages/backend/src/server/api/endpoints/channels/show.ts
+++ b/packages/backend/src/server/api/endpoints/channels/show.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels } from '@/models/index.js';
export const meta = {
tags: ['channels'],
requireCredential: false,
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts
index 927ce7c741..57a9fa44b8 100644
--- a/packages/backend/src/server/api/endpoints/channels/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Notes, Channels } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Notes, Channels } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['notes', 'channels'],
requireCredential: false,
- params: {
- channelId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +28,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
@@ -71,16 +55,22 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.channelId = :channelId', { channelId: channel.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.leftJoinAndSelect('note.channel', 'channel');
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
- if (user) activeUsersChart.update(user);
+ if (user) activeUsersChart.read(user);
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/channels/unfollow.ts b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
index ada0cb29fd..32beb24d6f 100644
--- a/packages/backend/src/server/api/endpoints/channels/unfollow.ts
+++ b/packages/backend/src/server/api/endpoints/channels/unfollow.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, ChannelFollowings } from '@/models/index';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, ChannelFollowings } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['channels'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchChannel: {
message: 'No such channel.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/channels/update.ts b/packages/backend/src/server/api/endpoints/channels/update.ts
index 1f7108a1cb..2f2b4aeeb2 100644
--- a/packages/backend/src/server/api/endpoints/channels/update.ts
+++ b/packages/backend/src/server/api/endpoints/channels/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Channels, DriveFiles } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Channels, DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['channels'],
@@ -11,24 +9,6 @@ export const meta = {
kind: 'write:channels',
- params: {
- channelId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.optional.str.range(1, 128),
- },
-
- description: {
- validator: $.nullable.optional.str.range(1, 2048),
- },
-
- bannerId: {
- validator: $.nullable.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -56,8 +36,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ channelId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 128 },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['channelId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const channel = await Channels.findOne({
id: ps.channelId,
});
diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts
index f7eadc7089..97f7885dbe 100644
--- a/packages/backend/src/server/api/endpoints/charts/active-users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { activeUsersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(activeUsersChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(activeUsersChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await activeUsersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await activeUsersChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/ap-request.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
new file mode 100644
index 0000000000..4477bfc987
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
@@ -0,0 +1,24 @@
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { apRequestChart } from '@/services/chart/index.js';
+
+export const meta = {
+ tags: ['charts'],
+
+ res: getJsonSchema(apRequestChart.schema),
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ },
+ required: ['span'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps) => {
+ return await apRequestChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
+});
diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts
index 364279da95..fd6033392f 100644
--- a/packages/backend/src/server/api/endpoints/charts/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/drive.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { driveChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { driveChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'drive'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(driveChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(driveChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await driveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await driveChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts
index 6feb82b6d9..f842f574ec 100644
--- a/packages/backend/src/server/api/endpoints/charts/federation.ts
+++ b/packages/backend/src/server/api/endpoints/charts/federation.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { federationChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { federationChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(federationChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(federationChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await federationChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await federationChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
index 99dc77998e..01407defdd 100644
--- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts
+++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
@@ -1,35 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { hashtagChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { hashtagChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'hashtags'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(hashtagChart.schema),
+} as const;
- tag: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ tag: { type: 'string' },
},
-
- res: convertLog(hashtagChart.schema),
+ required: ['span', 'tag'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.tag);
+export default define(meta, paramDef, async (ps) => {
+ return await hashtagChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.tag);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts
index 23e6fbf2b0..2d12951c6c 100644
--- a/packages/backend/src/server/api/endpoints/charts/instance.ts
+++ b/packages/backend/src/server/api/endpoints/charts/instance.ts
@@ -1,35 +1,25 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { instanceChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { instanceChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(instanceChart.schema),
+} as const;
- host: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ host: { type: 'string' },
},
-
- res: convertLog(instanceChart.schema),
+ required: ['span', 'host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await instanceChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.host);
+export default define(meta, paramDef, async (ps) => {
+ return await instanceChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.host);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/network.ts b/packages/backend/src/server/api/endpoints/charts/network.ts
deleted file mode 100644
index c5a39bbd76..0000000000
--- a/packages/backend/src/server/api/endpoints/charts/network.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { networkChart } from '@/services/chart/index';
-
-export const meta = {
- tags: ['charts'],
-
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
- },
-
- res: convertLog(networkChart.schema),
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
-});
diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts
index dcbd80c3e9..b6089f67ef 100644
--- a/packages/backend/src/server/api/endpoints/charts/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/notes.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { notesChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { notesChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'notes'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(notesChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(notesChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await notesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await notesChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
index 94787b4a57..e5db7131a8 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserDriveChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserDriveChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'drive', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserDriveChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserDriveChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserDriveChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts
index effe0c54b9..9b72de745d 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/following.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserFollowingChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserFollowingChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'following'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserFollowingChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserFollowingChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserFollowingChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
index df68a5fe52..7cc6cbf316 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserNotesChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserNotesChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'notes'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserNotesChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserNotesChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserNotesChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
index dcd067305f..5c58a7f152 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,36 +1,25 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ID } from '@/misc/cafy-id';
-import { convertLog } from '@/services/chart/core';
-import { perUserReactionsChart } from '@/services/chart/index';
+import define from '../../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { perUserReactionsChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users', 'reactions'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
-
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+ res: getJsonSchema(perUserReactionsChart.schema),
+} as const;
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
+ userId: { type: 'string', format: 'misskey:id' },
},
-
- res: convertLog(perUserReactionsChart.schema),
+ required: ['span', 'userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
+export default define(meta, paramDef, async (ps) => {
+ return await perUserReactionsChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null, ps.userId);
});
diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts
index d32e14ad61..49c762b2e4 100644
--- a/packages/backend/src/server/api/endpoints/charts/users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/users.ts
@@ -1,31 +1,24 @@
-import $ from 'cafy';
-import define from '../../define';
-import { convertLog } from '@/services/chart/core';
-import { usersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { getJsonSchema } from '@/services/chart/core.js';
+import { usersChart } from '@/services/chart/index.js';
export const meta = {
tags: ['charts', 'users'],
- params: {
- span: {
- validator: $.str.or(['day', 'hour']),
- },
-
- limit: {
- validator: $.optional.num.range(1, 500),
- default: 30,
- },
+ res: getJsonSchema(usersChart.schema),
+} as const;
- offset: {
- validator: $.optional.nullable.num,
- default: null,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ span: { type: 'string', enum: ['day', 'hour'] },
+ limit: { type: 'integer', minimum: 1, maximum: 500, default: 30 },
+ offset: { type: 'integer', nullable: true, default: null },
},
-
- res: convertLog(usersChart.schema),
+ required: ['span'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
- return await usersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
+export default define(meta, paramDef, async (ps) => {
+ return await usersChart.getChart(ps.span, ps.limit, ps.offset ? new Date(ps.offset) : null);
});
diff --git a/packages/backend/src/server/api/endpoints/clips/add-note.ts b/packages/backend/src/server/api/endpoints/clips/add-note.ts
index 4a740b6cfe..c630302b98 100644
--- a/packages/backend/src/server/api/endpoints/clips/add-note.ts
+++ b/packages/backend/src/server/api/endpoints/clips/add-note.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips } from '@/models/index';
-import { ApiError } from '../../error';
-import { genId } from '@/misc/gen-id';
-import { getNote } from '../../common/getters';
+import define from '../../define.js';
+import { ClipNotes, Clips } from '@/models/index.js';
+import { ApiError } from '../../error.js';
+import { genId } from '@/misc/gen-id.js';
+import { getNote } from '../../common/getters.js';
export const meta = {
tags: ['account', 'notes', 'clips'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -44,8 +32,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId', 'noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/clips/create.ts b/packages/backend/src/server/api/endpoints/clips/create.ts
index 852e66c9e4..531847d15c 100644
--- a/packages/backend/src/server/api/endpoints/clips/create.ts
+++ b/packages/backend/src/server/api/endpoints/clips/create.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { genId } from '@/misc/gen-id';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { genId } from '@/misc/gen-id.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -10,20 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
-
- isPublic: {
- validator: $.optional.bool,
- },
-
- description: {
- validator: $.optional.nullable.str.range(1, 2048),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +16,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ isPublic: { type: 'boolean' },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/clips/delete.ts b/packages/backend/src/server/api/endpoints/clips/delete.ts
index 85c64a115d..675db1d57f 100644
--- a/packages/backend/src/server/api/endpoints/clips/delete.ts
+++ b/packages/backend/src/server/api/endpoints/clips/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/clips/list.ts b/packages/backend/src/server/api/endpoints/clips/list.ts
index d88897d164..1c955d64fc 100644
--- a/packages/backend/src/server/api/endpoints/clips/list.ts
+++ b/packages/backend/src/server/api/endpoints/clips/list.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const clips = await Clips.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/clips/notes.ts b/packages/backend/src/server/api/endpoints/clips/notes.ts
index eeb20631c1..2627884ee1 100644
--- a/packages/backend/src/server/api/endpoints/clips/notes.ts
+++ b/packages/backend/src/server/api/endpoints/clips/notes.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips, Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { ApiError } from '../../error';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { ClipNotes, Clips, Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { ApiError } from '../../error.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['account', 'notes', 'clips'],
@@ -15,25 +13,6 @@ export const meta = {
kind: 'read:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -53,8 +32,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const clip = await Clips.findOne({
id: ps.clipId,
});
@@ -74,10 +64,16 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.id IN (${ clipQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(clipQuery.getParameters());
if (user) {
@@ -87,7 +83,7 @@ export default define(meta, async (ps, user) => {
}
const notes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Notes.packMany(notes, user);
diff --git a/packages/backend/src/server/api/endpoints/clips/show.ts b/packages/backend/src/server/api/endpoints/clips/show.ts
index 0a45672019..0a3b25c94e 100644
--- a/packages/backend/src/server/api/endpoints/clips/show.ts
+++ b/packages/backend/src/server/api/endpoints/clips/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the clip
const clip = await Clips.findOne({
id: ps.clipId,
diff --git a/packages/backend/src/server/api/endpoints/clips/update.ts b/packages/backend/src/server/api/endpoints/clips/update.ts
index 795483d5b2..0ac5ccd047 100644
--- a/packages/backend/src/server/api/endpoints/clips/update.ts
+++ b/packages/backend/src/server/api/endpoints/clips/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Clips } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Clips } from '@/models/index.js';
export const meta = {
tags: ['clips'],
@@ -11,24 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- clipId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
-
- isPublic: {
- validator: $.optional.bool,
- },
-
- description: {
- validator: $.optional.nullable.str.range(1, 2048),
- },
- },
-
errors: {
noSuchClip: {
message: 'No such clip.',
@@ -44,8 +24,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ isPublic: { type: 'boolean' },
+ description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
+ },
+ required: ['clipId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the clip
const clip = await Clips.findOne({
id: ps.clipId,
diff --git a/packages/backend/src/server/api/endpoints/drive.ts b/packages/backend/src/server/api/endpoints/drive.ts
index d9ab9883ca..c599d96ca4 100644
--- a/packages/backend/src/server/api/endpoints/drive.ts
+++ b/packages/backend/src/server/api/endpoints/drive.ts
@@ -1,6 +1,6 @@
-import define from '../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { DriveFiles } from '@/models/index';
+import define from '../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive', 'account'],
@@ -25,8 +25,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const instance = await fetchMeta(true);
// Calculate drive usage
diff --git a/packages/backend/src/server/api/endpoints/drive/files.ts b/packages/backend/src/server/api/endpoints/drive/files.ts
index a5c0a626a1..40e6c16c9c 100644
--- a/packages/backend/src/server/api/endpoints/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,30 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- type: {
- validator: $.optional.nullable.str.match(/^[a-zA-Z\/\-*]+$/),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +20,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ type: { type: 'string', nullable: true, pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -65,7 +51,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
index 835dde8058..3c68beee17 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/attached-notes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles, Notes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles, Notes } from '@/models/index.js';
export const meta = {
tags: ['drive', 'notes'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -36,8 +28,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch file
const file = await DriveFiles.findOne({
id: ps.fileId,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
index a45d357ee8..7e5cb2498e 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/check-existence.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -9,20 +8,22 @@ export const meta = {
kind: 'read:drive',
- params: {
- md5: {
- validator: $.str,
- },
- },
-
res: {
type: 'boolean',
optional: false, nullable: false,
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ md5: { type: 'string' },
+ },
+ required: ['md5'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne({
md5: ps.md5,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts
index dd65ab0611..b6a2cf7200 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts
@@ -1,12 +1,10 @@
import ms from 'ms';
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { addFile } from '@/services/drive/add-file';
-import define from '../../../define';
-import { apiLogger } from '../../../logger';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { addFile } from '@/services/drive/add-file.js';
+import define from '../../../define.js';
+import { apiLogger } from '../../../logger.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -22,35 +20,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- name: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: null,
- },
-
- isSensitive: {
- validator: $.optional.either($.bool, $.str),
- default: false,
- transform: (v: any): boolean => v === true || v === 'true',
- },
-
- force: {
- validator: $.optional.either($.bool, $.str),
- default: false,
- transform: (v: any): boolean => v === true || v === 'true',
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -66,8 +35,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ name: { type: 'string', nullable: true, default: null },
+ comment: { type: 'string', nullable: true, maxLength: DB_MAX_IMAGE_COMMENT_LENGTH, default: null },
+ isSensitive: { type: 'boolean', default: false },
+ force: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, _, file, cleanup) => {
+// @ts-ignore
+export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
// Get 'name' parameter
let name = ps.name || file.originalname;
if (name !== undefined && name !== null) {
@@ -88,7 +70,9 @@ export default define(meta, async (ps, user, _, file, cleanup) => {
const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive });
return await DriveFiles.pack(driveFile, { self: true });
} catch (e) {
- apiLogger.error(e);
+ if (e instanceof Error || typeof e === 'string') {
+ apiLogger.error(e);
+ }
throw new ApiError();
} finally {
cleanup!();
diff --git a/packages/backend/src/server/api/endpoints/drive/files/delete.ts b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
index 308beb58a4..5f565a63fb 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { deleteFile } from '@/services/drive/delete-file';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles } from '@/models/index';
+import { deleteFile } from '@/services/drive/delete-file.js';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
index dc74dcb7e6..e45ec633d3 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find-by-hash.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -9,12 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- md5: {
- validator: $.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -26,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ md5: { type: 'string' },
+ },
+ required: ['md5'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
md5: ps.md5,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/find.ts b/packages/backend/src/server/api/endpoints/drive/files/find.ts
index 2244df13cd..974fc9fbad 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/find.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- name: {
- validator: $.str,
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = await DriveFiles.find({
name: ps.name,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/files/show.ts b/packages/backend/src/server/api/endpoints/drive/files/show.ts
index 18b17c4653..181365c7e6 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/show.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- fileId: {
- validator: $.optional.type(ID),
- },
-
- url: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -49,8 +37,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ url: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let file: DriveFile | undefined;
if (ps.fileId) {
diff --git a/packages/backend/src/server/api/endpoints/drive/files/update.ts b/packages/backend/src/server/api/endpoints/drive/files/update.ts
index b7ca80e83c..ab8e4aeeb2 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/update.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFiles, DriveFolders } from '@/models/index';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFiles, DriveFolders } from '@/models/index.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -13,33 +11,13 @@ export const meta = {
kind: 'write:drive',
- params: {
- fileId: {
- validator: $.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: undefined as any,
- },
-
- name: {
- validator: $.optional.str.pipe(DriveFiles.validateFileName),
- default: undefined as any,
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: undefined as any,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: undefined as any,
+ errors: {
+ invalidFileName: {
+ message: 'Invalid file name.',
+ code: 'INVALID_FILE_NAME',
+ id: '395e7156-f9f0-475e-af89-53c3c23080c2',
},
- },
- errors: {
noSuchFile: {
message: 'No such file.',
code: 'NO_SUCH_FILE',
@@ -66,8 +44,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true },
+ name: { type: 'string' },
+ isSensitive: { type: 'boolean' },
+ comment: { type: 'string', nullable: true, maxLength: 512 },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) {
@@ -79,6 +69,9 @@ export default define(meta, async (ps, user) => {
}
if (ps.name) file.name = ps.name;
+ if (!DriveFiles.validateFileName(file.name)) {
+ throw new ApiError(meta.errors.invalidFileName);
+ }
if (ps.comment !== undefined) file.comment = ps.comment;
diff --git a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
index 40da1a4fb4..3bfecac802 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import { uploadFromUrl } from '@/services/drive/upload-from-url';
-import define from '../../../define';
-import { DriveFiles } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
+import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
+import define from '../../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -18,42 +16,23 @@ export const meta = {
requireCredential: true,
kind: 'write:drive',
+} as const;
- params: {
- url: {
- // TODO: Validate this url
- validator: $.str,
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
-
- comment: {
- validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
- default: null,
- },
-
- marker: {
- validator: $.optional.nullable.str,
- default: null,
- },
-
- force: {
- validator: $.optional.bool,
- default: false,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ url: { type: 'string' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ isSensitive: { type: 'boolean', default: false },
+ comment: { type: 'string', nullable: true, maxLength: 512, default: null },
+ marker: { type: 'string', nullable: true, default: null },
+ force: { type: 'boolean', default: false },
},
+ required: ['url'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment }).then(file => {
DriveFiles.pack(file, { self: true }).then(packedFile => {
publishMainStream(user.id, 'urlUploadFinished', {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders.ts b/packages/backend/src/server/api/endpoints/drive/folders.ts
index 8f8d1d2c0a..d4d530ba9e 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFolders } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFolders } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,26 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- folderId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,8 +20,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ folderId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFolders.createQueryBuilder('folder'), ps.sinceId, ps.untilId)
.andWhere('folder.userId = :userId', { userId: user.id });
@@ -53,7 +42,7 @@ export default define(meta, async (ps, user) => {
query.andWhere('folder.parentId IS NULL');
}
- const folders = await query.take(ps.limit!).getMany();
+ const folders = await query.take(ps.limit).getMany();
return await Promise.all(folders.map(folder => DriveFolders.pack(folder)));
});
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/create.ts b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
index 38ed17e0e5..4ae10f0621 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['drive'],
@@ -13,17 +11,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- name: {
- validator: $.optional.str.pipe(DriveFolders.validateFolderName),
- default: 'Untitled',
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -39,8 +26,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', default: "Untitled", maxLength: 200 },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// If the parent folder is specified
let parent = null;
if (ps.parentId) {
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
index 13716fccea..4994615cc6 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { publishDriveStream } from '@/services/stream';
-import { ApiError } from '../../../error';
-import { DriveFolders, DriveFiles } from '@/models/index';
+import define from '../../../define.js';
+import { publishDriveStream } from '@/services/stream.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders, DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/find.ts b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
index 911f51d78b..9bf0e3d61b 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/find.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/find.ts
@@ -1,7 +1,5 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { DriveFolders } from '@/models/index';
+import define from '../../../define.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -10,17 +8,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- name: {
- validator: $.str,
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const folders = await DriveFolders.find({
name: ps.name,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/show.ts b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
index 58a6dd3c06..f09816d57a 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/show.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/folders/update.ts b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
index 5b0cccd1c6..c020b243ef 100644
--- a/packages/backend/src/server/api/endpoints/drive/folders/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/folders/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishDriveStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { DriveFolders } from '@/models/index';
+import { publishDriveStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { DriveFolders } from '@/models/index.js';
export const meta = {
tags: ['drive'],
@@ -12,20 +10,6 @@ export const meta = {
kind: 'write:drive',
- params: {
- folderId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.optional.str.pipe(DriveFolders.validateFolderName),
- },
-
- parentId: {
- validator: $.optional.nullable.type(ID),
- },
- },
-
errors: {
noSuchFolder: {
message: 'No such folder.',
@@ -53,8 +37,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ folderId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', maxLength: 200 },
+ parentId: { type: 'string', format: 'misskey:id', nullable: true },
+ },
+ required: ['folderId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch folder
const folder = await DriveFolders.findOne({
id: ps.folderId,
diff --git a/packages/backend/src/server/api/endpoints/drive/stream.ts b/packages/backend/src/server/api/endpoints/drive/stream.ts
index 9ba7804946..99e8d024fb 100644
--- a/packages/backend/src/server/api/endpoints/drive/stream.ts
+++ b/packages/backend/src/server/api/endpoints/drive/stream.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { DriveFiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { DriveFiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['drive'],
@@ -11,25 +9,6 @@ export const meta = {
kind: 'read:drive',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- type: {
- validator: $.optional.str.match(/^[a-zA-Z\/\-*]+$/),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -41,8 +20,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', pattern: /^[a-zA-Z\/\-*]+$/.toString().slice(1, -1) },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId)
.andWhere('file.userId = :userId', { userId: user.id });
@@ -54,7 +44,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit!).getMany();
+ const files = await query.take(ps.limit).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/packages/backend/src/server/api/endpoints/email-address/available.ts b/packages/backend/src/server/api/endpoints/email-address/available.ts
index 19f9b7ccdc..07064ce9fa 100644
--- a/packages/backend/src/server/api/endpoints/email-address/available.ts
+++ b/packages/backend/src/server/api/endpoints/email-address/available.ts
@@ -1,18 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { validateEmailForAccount } from '@/services/validate-email-for-account';
+import define from '../../define.js';
+import { validateEmailForAccount } from '@/services/validate-email-for-account.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- emailAddress: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -29,7 +22,15 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ emailAddress: { type: 'string' },
+ },
+ required: ['emailAddress'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
return await validateEmailForAccount(ps.emailAddress);
});
diff --git a/packages/backend/src/server/api/endpoints/endpoint.ts b/packages/backend/src/server/api/endpoints/endpoint.ts
index 42fd468838..9db140183c 100644
--- a/packages/backend/src/server/api/endpoints/endpoint.ts
+++ b/packages/backend/src/server/api/endpoints/endpoint.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../define';
-import endpoints from '../endpoints';
+import define from '../define.js';
+import endpoints from '../endpoints.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
+} as const;
- params: {
- endpoint: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
},
+ required: ['endpoint'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const ep = endpoints.find(x => x.name === ps.endpoint);
if (ep == null) return null;
return {
diff --git a/packages/backend/src/server/api/endpoints/endpoints.ts b/packages/backend/src/server/api/endpoints/endpoints.ts
index ebb78de337..b20da96eb3 100644
--- a/packages/backend/src/server/api/endpoints/endpoints.ts
+++ b/packages/backend/src/server/api/endpoints/endpoints.ts
@@ -1,14 +1,11 @@
-import define from '../define';
-import endpoints from '../endpoints';
+import define from '../define.js';
+import endpoints from '../endpoints.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -25,7 +22,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
return endpoints.map(x => x.name);
});
diff --git a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
index 24c9f56aa6..bc8d2e2ac0 100644
--- a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
+++ b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../define';
-import { createExportCustomEmojisJob } from '@/queue/index';
+import define from '../define.js';
+import { createExportCustomEmojisJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -12,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportCustomEmojisJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/followers.ts b/packages/backend/src/server/api/endpoints/federation/followers.ts
index c0a85f166c..7b1197d1e5 100644
--- a/packages/backend/src/server/api/endpoints/federation/followers.ts
+++ b/packages/backend/src/server/api/endpoints/federation/followers.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Followings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Followings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
.andWhere(`following.followeeHost = :host`, { host: ps.host });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/federation/following.ts b/packages/backend/src/server/api/endpoints/federation/following.ts
index 147f0aedb2..ed1f142d88 100644
--- a/packages/backend/src/server/api/endpoints/federation/following.ts
+++ b/packages/backend/src/server/api/endpoints/federation/following.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Followings } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Followings } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
.andWhere(`following.followerHost = :host`, { host: ps.host });
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/federation/instances.ts b/packages/backend/src/server/api/endpoints/federation/instances.ts
index 11df7ed6b6..70fef051ba 100644
--- a/packages/backend/src/server/api/endpoints/federation/instances.ts
+++ b/packages/backend/src/server/api/endpoints/federation/instances.ts
@@ -1,58 +1,13 @@
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../../define';
-import { Instances } from '@/models/index';
-import { fetchMeta } from '@/misc/fetch-meta';
+import config from '@/config/index.js';
+import define from '../../define.js';
+import { Instances } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.optional.nullable.str,
- },
-
- blocked: {
- validator: $.optional.nullable.bool,
- },
-
- notResponding: {
- validator: $.optional.nullable.bool,
- },
-
- suspended: {
- validator: $.optional.nullable.bool,
- },
-
- federating: {
- validator: $.optional.nullable.bool,
- },
-
- subscribing: {
- validator: $.optional.nullable.bool,
- },
-
- publishing: {
- validator: $.optional.nullable.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -64,8 +19,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string', nullable: true },
+ blocked: { type: 'boolean', nullable: true },
+ notResponding: { type: 'boolean', nullable: true },
+ suspended: { type: 'boolean', nullable: true },
+ federating: { type: 'boolean', nullable: true },
+ subscribing: { type: 'boolean', nullable: true },
+ publishing: { type: 'boolean', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Instances.createQueryBuilder('instance');
switch (ps.sort) {
@@ -144,7 +116,7 @@ export default define(meta, async (ps, me) => {
query.andWhere('instance.host like :host', { host: '%' + ps.host.toLowerCase() + '%' });
}
- const instances = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const instances = await query.take(ps.limit).skip(ps.offset).getMany();
- return instances;
+ return await Instances.packMany(instances);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/show-instance.ts b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
index 6f13b28cae..5bfe43fc9c 100644
--- a/packages/backend/src/server/api/endpoints/federation/show-instance.ts
+++ b/packages/backend/src/server/api/endpoints/federation/show-instance.ts
@@ -1,30 +1,34 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Instances } from '@/models/index';
-import { toPuny } from '@/misc/convert-host';
+import define from '../../define.js';
+import { Instances } from '@/models/index.js';
+import { toPuny } from '@/misc/convert-host.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
+ res: {
+ oneOf: [{
+ type: 'object',
+ ref: 'FederationInstance',
+ }, {
+ type: 'null',
+ }],
},
+} as const;
- res: {
- type: 'object',
- optional: true, nullable: false,
- ref: 'FederationInstance',
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
},
+ required: ['host'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await Instances
.findOne({ host: toPuny(ps.host) });
- return instance;
+ return instance ? await Instances.pack(instance) : null;
});
diff --git a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
index 092f805bc2..409cc7695e 100644
--- a/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
+++ b/packages/backend/src/server/api/endpoints/federation/update-remote-user.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getRemoteUser } from '../../common/getters';
-import { updatePerson } from '@/remote/activitypub/models/person';
+import define from '../../define.js';
+import { getRemoteUser } from '../../common/getters.js';
+import { updatePerson } from '@/remote/activitypub/models/person.js';
export const meta = {
tags: ['federation'],
requireCredential: true,
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await getRemoteUser(ps.userId);
await updatePerson(user.uri!);
});
diff --git a/packages/backend/src/server/api/endpoints/federation/users.ts b/packages/backend/src/server/api/endpoints/federation/users.ts
index 9a8f749936..65ad9f88d3 100644
--- a/packages/backend/src/server/api/endpoints/federation/users.ts
+++ b/packages/backend/src/server/api/endpoints/federation/users.ts
@@ -1,33 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['federation'],
requireCredential: false,
- params: {
- host: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -39,13 +18,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ host: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['host'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Users.createQueryBuilder('user'), ps.sinceId, ps.untilId)
.andWhere(`user.host = :host`, { host: ps.host });
const users = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Users.packMany(users, me, { detail: true });
diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts
index 96aede4550..8758a64a39 100644
--- a/packages/backend/src/server/api/endpoints/following/create.ts
+++ b/packages/backend/src/server/api/endpoints/following/create.ts
@@ -1,11 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import create from '@/services/following/create';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import create from '@/services/following/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +18,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -64,8 +57,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const follower = user;
// 自分自身
@@ -92,8 +93,10 @@ export default define(meta, async (ps, user) => {
try {
await create(follower, followee);
} catch (e) {
- if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking);
- if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked);
+ if (e instanceof IdentifiableError) {
+ if (e.id === '710e8fb0-b8c3-4922-be49-d5d93d8e6a6e') throw new ApiError(meta.errors.blocking);
+ if (e.id === '3338392a-f764-498d-8855-db939dcf8c48') throw new ApiError(meta.errors.blocked);
+ }
throw e;
}
diff --git a/packages/backend/src/server/api/endpoints/following/delete.ts b/packages/backend/src/server/api/endpoints/following/delete.ts
index 4cd0c49452..47efc59b81 100644
--- a/packages/backend/src/server/api/endpoints/following/delete.ts
+++ b/packages/backend/src/server/api/endpoints/following/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
import ms from 'ms';
-import deleteFollowing from '@/services/following/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import deleteFollowing from '@/services/following/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const follower = user;
// Check if the followee is yourself
diff --git a/packages/backend/src/server/api/endpoints/following/invalidate.ts b/packages/backend/src/server/api/endpoints/following/invalidate.ts
index 92e887e00b..24d8256ca6 100644
--- a/packages/backend/src/server/api/endpoints/following/invalidate.ts
+++ b/packages/backend/src/server/api/endpoints/following/invalidate.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import * as ms from 'ms';
-import deleteFollowing from '@/services/following/delete';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Followings, Users } from '@/models/index';
+import ms from 'ms';
+import deleteFollowing from '@/services/following/delete.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Followings, Users } from '@/models/index.js';
export const meta = {
tags: ['following', 'users'],
@@ -19,12 +17,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -52,8 +44,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const followee = user;
// Check if the follower is yourself
diff --git a/packages/backend/src/server/api/endpoints/following/requests/accept.ts b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
index 7e7c056f55..e5df55375e 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/accept.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/accept.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import acceptFollowRequest from '@/services/following/requests/accept';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
+import acceptFollowRequest from '@/services/following/requests/accept.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['following', 'account'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch follower
const follower = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
index 19ed02c152..80d37fb075 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts
@@ -1,10 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import cancelFollowRequest from '@/services/following/requests/cancel';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { Users } from '@/models/index';
+import cancelFollowRequest from '@/services/following/requests/cancel.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { Users } from '@/models/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export const meta = {
tags: ['following', 'account'],
@@ -13,12 +12,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -40,8 +33,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch followee
const followee = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -51,7 +52,9 @@ export default define(meta, async (ps, user) => {
try {
await cancelFollowRequest(followee, user);
} catch (e) {
- if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound);
+ if (e instanceof IdentifiableError) {
+ if (e.id === '17447091-ce07-46dd-b331-c1fd4f15b1e7') throw new ApiError(meta.errors.followRequestNotFound);
+ }
throw e;
}
diff --git a/packages/backend/src/server/api/endpoints/following/requests/list.ts b/packages/backend/src/server/api/endpoints/following/requests/list.ts
index ec0c76502c..3b60b89b3c 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/list.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { FollowRequests } from '@/models/index';
+import define from '../../../define.js';
+import { FollowRequests } from '@/models/index.js';
export const meta = {
tags: ['following', 'account'],
@@ -35,8 +35,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const reqs = await FollowRequests.find({
followeeId: user.id,
});
diff --git a/packages/backend/src/server/api/endpoints/following/requests/reject.ts b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
index a5ce1e7c77..cebe604284 100644
--- a/packages/backend/src/server/api/endpoints/following/requests/reject.ts
+++ b/packages/backend/src/server/api/endpoints/following/requests/reject.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { rejectFollowRequest } from '@/services/following/reject';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
+import { rejectFollowRequest } from '@/services/following/reject.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
export const meta = {
tags: ['following', 'account'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:following',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch follower
const follower = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/gallery/featured.ts b/packages/backend/src/server/api/endpoints/gallery/featured.ts
index ff7c16889f..e6acd36911 100644
--- a/packages/backend/src/server/api/endpoints/gallery/featured.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = GalleryPosts.createQueryBuilder('post')
.andWhere('post.createdAt > :date', { date: new Date(Date.now() - (1000 * 60 * 60 * 24 * 3)) })
.andWhere('post.likedCount > 0')
diff --git a/packages/backend/src/server/api/endpoints/gallery/popular.ts b/packages/backend/src/server/api/endpoints/gallery/popular.ts
index 2c3368a19d..c4c8982fcc 100644
--- a/packages/backend/src/server/api/endpoints/gallery/popular.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/popular.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = GalleryPosts.createQueryBuilder('post')
.andWhere('post.likedCount > 0')
.orderBy('post.likedCount', 'DESC');
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts.ts b/packages/backend/src/server/api/endpoints/gallery/posts.ts
index 9d2601c7e9..428ba9cc71 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts.ts
@@ -1,27 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { GalleryPosts } from '@/models/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -33,12 +16,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.innerJoinAndSelect('post.user', 'user');
- const posts = await query.take(ps.limit!).getMany();
+ const posts = await query.take(ps.limit).getMany();
return await GalleryPosts.packMany(posts, me);
});
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
index e9d5df1ab6..eb6c0f3eb1 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
-import { DriveFiles, GalleryPosts } from '@/models/index';
-import { genId } from '../../../../../misc/gen-id';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
+import define from '../../../define.js';
+import { DriveFiles, GalleryPosts } from '@/models/index.js';
+import { genId } from '../../../../../misc/gen-id.js';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
export const meta = {
tags: ['gallery'],
@@ -20,25 +18,6 @@ export const meta = {
max: 300,
},
- params: {
- title: {
- validator: $.str.min(1),
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- fileIds: {
- validator: $.arr($.type(ID)).unique().range(1, 32),
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -50,8 +29,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string', minLength: 1 },
+ description: { type: 'string', nullable: true },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 32, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ isSensitive: { type: 'boolean', default: false },
+ },
+ required: ['title', 'fileIds'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = (await Promise.all(ps.fileIds.map(fileId =>
DriveFiles.findOne({
id: fileId,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
index 2a13b9ed58..f8bf785ee6 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:gallery',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne({
id: ps.postId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
index 0fb408fa5f..d154bfc3c6 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/like.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts, GalleryLikes } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts, GalleryLikes } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['gallery'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:gallery-likes',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -39,8 +31,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne(ps.postId);
if (post == null) {
throw new ApiError(meta.errors.noSuchPost);
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
index 4325d2ad37..5b4594070c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
requireCredential: false,
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -30,8 +22,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const post = await GalleryPosts.findOne({
id: ps.postId,
});
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
index 9cca09bddc..b00008a864 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/unlike.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { GalleryPosts, GalleryLikes } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { GalleryPosts, GalleryLikes } from '@/models/index.js';
export const meta = {
tags: ['gallery'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:gallery-likes',
- params: {
- postId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPost: {
message: 'No such post.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['postId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const post = await GalleryPosts.findOne(ps.postId);
if (post == null) {
throw new ApiError(meta.errors.noSuchPost);
diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
index c35e1bbf58..123794d08c 100644
--- a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
+++ b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../../define';
-import { ID } from '../../../../../misc/cafy-id';
-import { DriveFiles, GalleryPosts } from '@/models/index';
-import { GalleryPost } from '@/models/entities/gallery-post';
-import { ApiError } from '../../../error';
-import { DriveFile } from '@/models/entities/drive-file';
+import define from '../../../define.js';
+import { DriveFiles, GalleryPosts } from '@/models/index.js';
+import { GalleryPost } from '@/models/entities/gallery-post.js';
+import { ApiError } from '../../../error.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
export const meta = {
tags: ['gallery'],
@@ -19,29 +17,6 @@ export const meta = {
max: 300,
},
- params: {
- postId: {
- validator: $.type(ID),
- },
-
- title: {
- validator: $.str.min(1),
- },
-
- description: {
- validator: $.optional.nullable.str,
- },
-
- fileIds: {
- validator: $.arr($.type(ID)).unique().range(1, 32),
- },
-
- isSensitive: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -53,8 +28,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ postId: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string', minLength: 1 },
+ description: { type: 'string', nullable: true },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 32, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ isSensitive: { type: 'boolean', default: false },
+ },
+ required: ['postId', 'title', 'fileIds'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const files = (await Promise.all(ps.fileIds.map(fileId =>
DriveFiles.findOne({
id: fileId,
diff --git a/packages/backend/src/server/api/endpoints/get-online-users-count.ts b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
index 5b13d5a3b8..80a2334cfa 100644
--- a/packages/backend/src/server/api/endpoints/get-online-users-count.ts
+++ b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
@@ -1,19 +1,22 @@
-import { USER_ONLINE_THRESHOLD } from '@/const';
-import { Users } from '@/models/index';
+import { USER_ONLINE_THRESHOLD } from '@/const.js';
+import { Users } from '@/models/index.js';
import { MoreThan } from 'typeorm';
-import define from '../define';
+import define from '../define.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const count = await Users.count({
lastActiveDate: MoreThan(new Date(Date.now() - USER_ONLINE_THRESHOLD)),
});
diff --git a/packages/backend/src/server/api/endpoints/hashtags/list.ts b/packages/backend/src/server/api/endpoints/hashtags/list.ts
index 9fa9b3edc6..50e36386cf 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/list.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/list.ts
@@ -1,51 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Hashtags } from '@/models/index';
+import define from '../../define.js';
+import { Hashtags } from '@/models/index.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- attachedToUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- attachedToLocalUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- attachedToRemoteUserOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- sort: {
- validator: $.str.or([
- '+mentionedUsers',
- '-mentionedUsers',
- '+mentionedLocalUsers',
- '-mentionedLocalUsers',
- '+mentionedRemoteUsers',
- '-mentionedRemoteUsers',
- '+attachedUsers',
- '-attachedUsers',
- '+attachedLocalUsers',
- '-attachedLocalUsers',
- '+attachedRemoteUsers',
- '-attachedRemoteUsers',
- ]),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +17,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ attachedToUserOnly: { type: 'boolean', default: false },
+ attachedToLocalUserOnly: { type: 'boolean', default: false },
+ attachedToRemoteUserOnly: { type: 'boolean', default: false },
+ sort: { type: 'string', enum: ['+mentionedUsers', '-mentionedUsers', '+mentionedLocalUsers', '-mentionedLocalUsers', '+mentionedRemoteUsers', '-mentionedRemoteUsers', '+attachedUsers', '-attachedUsers', '+attachedLocalUsers', '-attachedLocalUsers', '+attachedRemoteUsers', '-attachedRemoteUsers'] },
+ },
+ required: ['sort'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Hashtags.createQueryBuilder('tag');
if (ps.attachedToUserOnly) query.andWhere('tag.attachedUsersCount != 0');
@@ -90,7 +62,7 @@ export default define(meta, async (ps, me) => {
'tag.attachedRemoteUsersCount',
]);
- const tags = await query.take(ps.limit!).getMany();
+ const tags = await query.take(ps.limit).getMany();
return Hashtags.packMany(tags);
});
diff --git a/packages/backend/src/server/api/endpoints/hashtags/search.ts b/packages/backend/src/server/api/endpoints/hashtags/search.ts
index 0d646c64f5..c289844775 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/search.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/search.ts
@@ -1,28 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Hashtags } from '@/models/index';
+import define from '../../define.js';
+import { Hashtags } from '@/models/index.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- query: {
- validator: $.str,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -33,13 +16,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ query: { type: 'string' },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const hashtags = await Hashtags.createQueryBuilder('tag')
.where('tag.name like :q', { q: ps.query.toLowerCase() + '%' })
.orderBy('tag.count', 'DESC')
.groupBy('tag.id')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
diff --git a/packages/backend/src/server/api/endpoints/hashtags/show.ts b/packages/backend/src/server/api/endpoints/hashtags/show.ts
index 242cef99d4..6e6afa4f13 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/show.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/show.ts
@@ -1,20 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Hashtags } from '@/models/index';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Hashtags } from '@/models/index.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
export const meta = {
tags: ['hashtags'],
requireCredential: false,
- params: {
- tag: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -30,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ },
+ required: ['tag'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const hashtag = await Hashtags.findOne({ name: normalizeForSearch(ps.tag) });
if (hashtag == null) {
throw new ApiError(meta.errors.noSuchHashtag);
diff --git a/packages/backend/src/server/api/endpoints/hashtags/trend.ts b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
index be964ad639..9cdbc8941c 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/trend.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/trend.ts
@@ -1,10 +1,10 @@
import { Brackets } from 'typeorm';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { safeForSql } from '@/misc/safe-for-sql';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { safeForSql } from '@/misc/safe-for-sql.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
/*
トレンドに載るためには「『直近a分間のユニーク投稿数が今からa分前~今からb分前の間のユニーク投稿数のn倍以上』のハッシュタグの上位5位以内に入る」ことが必要
@@ -53,8 +53,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const instance = await fetchMeta(true);
const hiddenTags = instance.hiddenTags.map(t => normalizeForSearch(t));
diff --git a/packages/backend/src/server/api/endpoints/hashtags/users.ts b/packages/backend/src/server/api/endpoints/hashtags/users.ts
index 2158dc4349..a5df21a7e3 100644
--- a/packages/backend/src/server/api/endpoints/hashtags/users.ts
+++ b/packages/backend/src/server/api/endpoints/hashtags/users.ts
@@ -1,52 +1,12 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users } from '@/models/index';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
export const meta = {
requireCredential: false,
tags: ['hashtags', 'users'],
- params: {
- tag: {
- validator: $.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sort: {
- validator: $.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'alive',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -58,8 +18,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'alive'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ },
+ required: ['tag', 'sort'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user')
.where(':tag = ANY(user.tags)', { tag: normalizeForSearch(ps.tag) });
@@ -84,7 +56,7 @@ export default define(meta, async (ps, me) => {
case '-updatedAt': query.orderBy('user.updatedAt', 'ASC'); break;
}
- const users = await query.take(ps.limit!).getMany();
+ const users = await query.take(ps.limit).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/packages/backend/src/server/api/endpoints/i.ts b/packages/backend/src/server/api/endpoints/i.ts
index d69c118cfc..5b1ad2b098 100644
--- a/packages/backend/src/server/api/endpoints/i.ts
+++ b/packages/backend/src/server/api/endpoints/i.ts
@@ -1,13 +1,11 @@
-import define from '../define';
-import { Users } from '@/models/index';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
- params: {},
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -15,8 +13,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
const isSecure = token == null;
// ここで渡ってきている user はキャッシュされていて古い可能性もあるので id だけ渡す
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/done.ts b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
index 4853908693..70478430db 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/done.ts
@@ -1,22 +1,23 @@
-import $ from 'cafy';
import * as speakeasy from 'speakeasy';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- token: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
},
+ required: ['token'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const token = ps.token.replace(/\s/g, '');
const profile = await UserProfiles.findOneOrFail(user.id);
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
index 26e9a60886..f33237c8bf 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts
@@ -1,48 +1,40 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { promisify } from 'util';
+import bcrypt from 'bcryptjs';
+import { promisify } from 'node:util';
import * as cbor from 'cbor';
-import define from '../../../define';
+import define from '../../../define.js';
import {
UserProfiles,
UserSecurityKeys,
AttestationChallenges,
Users,
-} from '@/models/index';
-import config from '@/config/index';
-import { procedures, hash } from '../../../2fa';
-import { publishMainStream } from '@/services/stream';
+} from '@/models/index.js';
+import config from '@/config/index.js';
+import { procedures, hash } from '../../../2fa.js';
+import { publishMainStream } from '@/services/stream.js';
const cborDecodeFirst = promisify(cbor.decodeFirst) as any;
+const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8'));
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- clientDataJSON: {
- validator: $.str,
- },
- attestationObject: {
- validator: $.str,
- },
- password: {
- validator: $.str,
- },
- challengeId: {
- validator: $.str,
- },
- name: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clientDataJSON: { type: 'string' },
+ attestationObject: { type: 'string' },
+ password: { type: 'string' },
+ challengeId: { type: 'string' },
+ name: { type: 'string' },
},
+ required: ['clientDataJSON', 'attestationObject', 'password', 'challengeId', 'name'],
} as const;
-const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8'));
-
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
index 854848a434..4bfa24f97f 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- value: {
- validator: $.boolean,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ value: { type: 'boolean' },
},
+ required: ['value'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await UserProfiles.update(user.id, {
usePasswordLessLogin: ps.value,
});
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
index 057e54c69b..0c4c99271e 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts
@@ -1,11 +1,10 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles, AttestationChallenges } from '@/models/index';
-import { promisify } from 'util';
-import * as crypto from 'crypto';
-import { genId } from '@/misc/gen-id';
-import { hash } from '../../../2fa';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles, AttestationChallenges } from '@/models/index.js';
+import { promisify } from 'node:util';
+import * as crypto from 'node:crypto';
+import { genId } from '@/misc/gen-id.js';
+import { hash } from '../../../2fa.js';
const randomBytes = promisify(crypto.randomBytes);
@@ -13,16 +12,18 @@ export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register.ts b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
index c5cfb9dfad..7951e393b8 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/register.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/register.ts
@@ -1,25 +1,26 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
+import bcrypt from 'bcryptjs';
import * as speakeasy from 'speakeasy';
import * as QRCode from 'qrcode';
-import config from '@/config/index';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import config from '@/config/index.js';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
index 03e1d0434d..2b69b1f8c3 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts
@@ -1,26 +1,25 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles, UserSecurityKeys, Users } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles, UserSecurityKeys, Users } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
- credentialId: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
+ credentialId: { type: 'string' },
},
+ required: ['password', 'credentialId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
index a19ad6810d..c5633f68b1 100644
--- a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts
@@ -1,22 +1,23 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../../define';
-import { UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import define from '../../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/apps.ts b/packages/backend/src/server/api/endpoints/i/apps.ts
index 63999b0981..eca9558847 100644
--- a/packages/backend/src/server/api/endpoints/i/apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/apps.ts
@@ -1,26 +1,22 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- sort: {
- validator: $.optional.str.or([
- '+createdAt',
- '-createdAt',
- '+lastUsedAt',
- '-lastUsedAt',
- ]),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sort: { type: 'string', enum: ['+createdAt', '-createdAt', '+lastUsedAt', '-lastUsedAt'] },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = AccessTokens.createQueryBuilder('token')
.where('token.userId = :userId', { userId: user.id });
diff --git a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
index 52122b851b..3301808e75 100644
--- a/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
+++ b/packages/backend/src/server/api/endpoints/i/authorized-apps.ts
@@ -1,38 +1,30 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens, Apps } from '@/models/index';
+import define from '../../define.js';
+import { AccessTokens, Apps } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or('desc|asc'),
- default: 'desc',
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['desc', 'asc'], default: "desc" },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get tokens
const tokens = await AccessTokens.find({
where: {
userId: user.id,
},
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
order: {
id: ps.sort == 'asc' ? 1 : -1,
diff --git a/packages/backend/src/server/api/endpoints/i/change-password.ts b/packages/backend/src/server/api/endpoints/i/change-password.ts
index 7b6c137737..16509d2dcf 100644
--- a/packages/backend/src/server/api/endpoints/i/change-password.ts
+++ b/packages/backend/src/server/api/endpoints/i/change-password.ts
@@ -1,26 +1,24 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../define';
-import { UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import { UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- currentPassword: {
- validator: $.str,
- },
-
- newPassword: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ currentPassword: { type: 'string' },
+ newPassword: { type: 'string', minLength: 1 },
},
+ required: ['currentPassword', 'newPassword'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/delete-account.ts b/packages/backend/src/server/api/endpoints/i/delete-account.ts
index e1eee949fc..8cb6b6a631 100644
--- a/packages/backend/src/server/api/endpoints/i/delete-account.ts
+++ b/packages/backend/src/server/api/endpoints/i/delete-account.ts
@@ -1,25 +1,26 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import define from '../../define';
-import { UserProfiles, Users } from '@/models/index';
-import { doPostSuspend } from '@/services/suspend-user';
-import { publishUserEvent } from '@/services/stream';
-import { createDeleteAccountJob } from '@/queue';
+import bcrypt from 'bcryptjs';
+import define from '../../define.js';
+import { UserProfiles, Users } from '@/models/index.js';
+import { doPostSuspend } from '@/services/suspend-user.js';
+import { publishUserEvent } from '@/services/stream.js';
+import { createDeleteAccountJob } from '@/queue/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
const userDetailed = await Users.findOneOrFail(user.id);
if (userDetailed.isDeleted) {
diff --git a/packages/backend/src/server/api/endpoints/i/export-blocking.ts b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
index 44d8a1cb38..aed4c2e0a3 100644
--- a/packages/backend/src/server/api/endpoints/i/export-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-blocking.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportBlockingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportBlockingJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportBlockingJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-following.ts b/packages/backend/src/server/api/endpoints/i/export-following.ts
index 5d1617d57b..058d77b3c2 100644
--- a/packages/backend/src/server/api/endpoints/i/export-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-following.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { createExportFollowingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportFollowingJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -10,19 +9,18 @@ export const meta = {
duration: ms('1hour'),
max: 1,
},
- params: {
- excludeMuting: {
- validator: $.optional.bool,
- default: false,
- },
- excludeInactive: {
- validator: $.optional.bool,
- default: false,
- },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ excludeMuting: { type: 'boolean', default: false },
+ excludeInactive: { type: 'boolean', default: false },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportFollowingJob(user, ps.excludeMuting, ps.excludeInactive);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-mute.ts b/packages/backend/src/server/api/endpoints/i/export-mute.ts
index 27ce8f0b29..c0216fac0c 100644
--- a/packages/backend/src/server/api/endpoints/i/export-mute.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-mute.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportMuteJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportMuteJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportMuteJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-notes.ts b/packages/backend/src/server/api/endpoints/i/export-notes.ts
index 25b1849e80..4b85a45554 100644
--- a/packages/backend/src/server/api/endpoints/i/export-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-notes.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportNotesJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportNotesJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportNotesJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
index d28b699c5a..fa5c1f5e5a 100644
--- a/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/export-user-lists.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { createExportUserListsJob } from '@/queue/index';
+import define from '../../define.js';
+import { createExportUserListsJob } from '@/queue/index.js';
import ms from 'ms';
export const meta = {
@@ -11,7 +11,13 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
createExportUserListsJob(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/favorites.ts b/packages/backend/src/server/api/endpoints/i/favorites.ts
index 92c767876b..3c420e4d0f 100644
--- a/packages/backend/src/server/api/endpoints/i/favorites.ts
+++ b/packages/backend/src/server/api/endpoints/i/favorites.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteFavorites } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { NoteFavorites } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'notes', 'favorites'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:favorites',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,14 +20,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(NoteFavorites.createQueryBuilder('favorite'), ps.sinceId, ps.untilId)
.andWhere(`favorite.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('favorite.note', 'note');
const favorites = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await NoteFavorites.packMany(favorites, user);
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
index f1c5763593..a38383f30e 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryLikes } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryLikes } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'gallery'],
@@ -11,47 +9,46 @@ export const meta = {
kind: 'read:gallery-likes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
- type: 'object',
+ type: 'array',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ post: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'GalleryPost',
+ },
},
- page: {
- type: 'object',
- optional: false, nullable: false,
- ref: 'GalleryPost',
- },
- },
+ }
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryLikes.createQueryBuilder('like'), ps.sinceId, ps.untilId)
.andWhere(`like.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('like.post', 'post');
const likes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryLikes.packMany(likes, user);
diff --git a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
index d46d42f633..b4edb5f73d 100644
--- a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryPosts } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryPosts } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'gallery'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:gallery',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.andWhere(`post.userId = :meId`, { meId: user.id });
const posts = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryPosts.packMany(posts, user);
diff --git a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
index 4e1a4d3db9..bc3e0aff47 100644
--- a/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
+++ b/packages/backend/src/server/api/endpoints/i/get-word-muted-notes-count.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { MutedNotes } from '@/models/index';
+import define from '../../define.js';
+import { MutedNotes } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -8,9 +8,6 @@ export const meta = {
kind: 'read:account',
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -23,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
return {
count: await MutedNotes.count({
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/import-blocking.ts b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
index acc5797420..c70704f9a8 100644
--- a/packages/backend/src/server/api/endpoints/i/import-blocking.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-blocking.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportBlockingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportBlockingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -15,12 +13,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -48,8 +40,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-following.ts b/packages/backend/src/server/api/endpoints/i/import-following.ts
index 35006746fb..7e9175cbf8 100644
--- a/packages/backend/src/server/api/endpoints/i/import-following.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-following.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportFollowingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportFollowingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -14,12 +12,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -47,8 +39,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-muting.ts b/packages/backend/src/server/api/endpoints/i/import-muting.ts
index 7bbb2e008e..abbf07212e 100644
--- a/packages/backend/src/server/api/endpoints/i/import-muting.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-muting.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportMutingJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportMutingJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -15,12 +13,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -48,8 +40,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
index 759d41b6cd..be162817f1 100644
--- a/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
+++ b/packages/backend/src/server/api/endpoints/i/import-user-lists.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { createImportUserListsJob } from '@/queue/index';
+import define from '../../define.js';
+import { createImportUserListsJob } from '@/queue/index.js';
import ms from 'ms';
-import { ApiError } from '../../error';
-import { DriveFiles } from '@/models/index';
+import { ApiError } from '../../error.js';
+import { DriveFiles } from '@/models/index.js';
export const meta = {
secure: true,
@@ -14,12 +12,6 @@ export const meta = {
max: 1,
},
- params: {
- fileId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchFile: {
message: 'No such file.',
@@ -47,8 +39,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const file = await DriveFiles.findOne(ps.fileId);
if (file == null) throw new ApiError(meta.errors.noSuchFile);
diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts
index 59efd32bb2..7d9bd44d1d 100644
--- a/packages/backend/src/server/api/endpoints/i/notifications.ts
+++ b/packages/backend/src/server/api/endpoints/i/notifications.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { readNotification } from '../../common/read-notification';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query';
-import { Notifications, Followings, Mutings, Users } from '@/models/index';
-import { notificationTypes } from '@/types';
-import read from '@/services/note/read';
+import { readNotification } from '../../common/read-notification.js';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query.js';
+import { Notifications, Followings, Mutings, Users } from '@/models/index.js';
+import { notificationTypes } from '@/types.js';
+import read from '@/services/note/read.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -16,44 +14,6 @@ export const meta = {
kind: 'read:notifications',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- following: {
- validator: $.optional.bool,
- default: false,
- },
-
- unreadOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- markAsRead: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
-
- excludeTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -65,8 +25,27 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ following: { type: 'boolean', default: false },
+ unreadOnly: { type: 'boolean', default: false },
+ markAsRead: { type: 'boolean', default: true },
+ includeTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ excludeTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// includeTypes が空の場合はクエリしない
if (ps.includeTypes && ps.includeTypes.length === 0) {
return [];
@@ -92,10 +71,16 @@ export default define(meta, async (ps, user) => {
.leftJoinAndSelect('notification.notifier', 'notifier')
.leftJoinAndSelect('notification.note', 'note')
.leftJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
query.andWhere(new Brackets(qb => { qb
.where(`notification.notifierId NOT IN (${ mutingQuery.getQuery() })`)
@@ -125,7 +110,7 @@ export default define(meta, async (ps, user) => {
query.andWhere(`notification.isRead = false`);
}
- const notifications = await query.take(ps.limit!).getMany();
+ const notifications = await query.take(ps.limit).getMany();
// Mark all as read
if (notifications.length > 0 && ps.markAsRead) {
diff --git a/packages/backend/src/server/api/endpoints/i/page-likes.ts b/packages/backend/src/server/api/endpoints/i/page-likes.ts
index 59239c7446..71e326e2f0 100644
--- a/packages/backend/src/server/api/endpoints/i/page-likes.ts
+++ b/packages/backend/src/server/api/endpoints/i/page-likes.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { PageLikes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { PageLikes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'pages'],
@@ -11,48 +9,46 @@ export const meta = {
kind: 'read:page-likes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
- type: 'object',
+ type: 'array',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- format: 'id',
+ items: {
+ type: 'object',
+ properties: {
+ id: {
+ type: 'string',
+ optional: false, nullable: false,
+ format: 'id',
+ },
+ page: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Page',
+ },
},
- page: {
- type: 'object',
- optional: false, nullable: false,
- ref: 'Page',
- },
- },
+ }
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(PageLikes.createQueryBuilder('like'), ps.sinceId, ps.untilId)
.andWhere(`like.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('like.page', 'page');
const likes = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
- return await PageLikes.packMany(likes, user);
+ return PageLikes.packMany(likes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/pages.ts b/packages/backend/src/server/api/endpoints/i/pages.ts
index bef775d063..f28aed3fd4 100644
--- a/packages/backend/src/server/api/endpoints/i/pages.ts
+++ b/packages/backend/src/server/api/endpoints/i/pages.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Pages } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'pages'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:pages',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Pages.createQueryBuilder('page'), ps.sinceId, ps.untilId)
.andWhere(`page.userId = :meId`, { meId: user.id });
const pages = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Pages.packMany(pages);
diff --git a/packages/backend/src/server/api/endpoints/i/pin.ts b/packages/backend/src/server/api/endpoints/i/pin.ts
index a940d1b99b..67b7026be1 100644
--- a/packages/backend/src/server/api/endpoints/i/pin.ts
+++ b/packages/backend/src/server/api/endpoints/i/pin.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { addPinned } from '@/services/i/pin';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { addPinned } from '@/services/i/pin.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account', 'notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -45,8 +37,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await addPinned(user, ps.noteId).catch(e => {
if (e.id === '70c4e51f-5bea-449c-a030-53bee3cce202') throw new ApiError(meta.errors.noSuchNote);
if (e.id === '15a018eb-58e5-4da1-93be-330fcc5e4e1a') throw new ApiError(meta.errors.pinLimitExceeded);
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
index 4e4fb3840f..2e291a34a0 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-messaging-messages.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { MessagingMessages, UserGroupJoinings } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { MessagingMessages, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['account', 'messaging'],
@@ -8,13 +8,16 @@ export const meta = {
requireCredential: true,
kind: 'write:account',
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Update documents
await MessagingMessages.update({
recipientId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
index 99f17ddfc9..49f3deb331 100644
--- a/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-all-unread-notes.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { NoteUnreads } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { NoteUnreads } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -8,13 +8,16 @@ export const meta = {
requireCredential: true,
kind: 'write:account',
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Remove documents
await NoteUnreads.delete({
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/i/read-announcement.ts b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
index e9bb66264b..647fa77fa4 100644
--- a/packages/backend/src/server/api/endpoints/i/read-announcement.ts
+++ b/packages/backend/src/server/api/endpoints/i/read-announcement.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { genId } from '@/misc/gen-id';
-import { AnnouncementReads, Announcements, Users } from '@/models/index';
-import { publishMainStream } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { genId } from '@/misc/gen-id.js';
+import { AnnouncementReads, Announcements, Users } from '@/models/index.js';
+import { publishMainStream } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- announcementId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchAnnouncement: {
message: 'No such announcement.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ announcementId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['announcementId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Check if announcement exists
const announcement = await Announcements.findOne(ps.announcementId);
diff --git a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
index a20719363b..771c98b212 100644
--- a/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/regenerate-token.ts
@@ -1,24 +1,25 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import generateUserToken from '../../common/generate-native-user-token';
-import define from '../../define';
-import { Users, UserProfiles } from '@/models/index';
+import bcrypt from 'bcryptjs';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import generateUserToken from '../../common/generate-native-user-token.js';
+import define from '../../define.js';
+import { Users, UserProfiles } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- password: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
},
+ required: ['password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
index 2941b441e2..d0b16dbc48 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-all.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
index 51371353c9..cc5d5a8c6f 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get-detail.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/get.ts b/packages/backend/src/server/api/endpoints/i/registry/get.ts
index ac617defb0..a79319744c 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/get.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/get.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
index 0445922188..ac209c06a6 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys-with-type.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/keys.ts b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
index a3c9d0e5ee..5ea1a9d344 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/keys.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/keys.ts
@@ -1,22 +1,24 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.select('item.key')
.where('item.domain IS NULL')
diff --git a/packages/backend/src/server/api/endpoints/i/registry/remove.ts b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
index 08185f224b..92473654c6 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/remove.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/remove.ts
@@ -1,24 +1,12 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { ApiError } from '../../../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- key: {
- validator: $.str,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
- },
-
errors: {
noSuchKey: {
message: 'No such key.',
@@ -28,8 +16,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string' },
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
+ },
+ required: ['key'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
index 9de68ac6e8..de4b313e25 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/scopes.ts
@@ -1,17 +1,20 @@
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.select('item.scope')
.where('item.domain IS NULL')
diff --git a/packages/backend/src/server/api/endpoints/i/registry/set.ts b/packages/backend/src/server/api/endpoints/i/registry/set.ts
index 27884046b4..d380b428a3 100644
--- a/packages/backend/src/server/api/endpoints/i/registry/set.ts
+++ b/packages/backend/src/server/api/endpoints/i/registry/set.ts
@@ -1,32 +1,28 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../../../define';
-import { RegistryItems } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { RegistryItems } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- key: {
- validator: $.str.min(1),
- },
-
- value: {
- validator: $.nullable.any,
- },
-
- scope: {
- validator: $.optional.arr($.str.match(/^[a-zA-Z0-9_]+$/)),
- default: [],
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ key: { type: 'string', minLength: 1 },
+ value: {},
+ scope: { type: 'array', default: [], items: {
+ type: 'string', pattern: /^[a-zA-Z0-9_]+$/.toString().slice(1, -1),
+ } },
},
+ required: ['key', 'value'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = RegistryItems.createQueryBuilder('item')
.where('item.domain IS NULL')
.andWhere('item.userId = :userId', { userId: user.id })
diff --git a/packages/backend/src/server/api/endpoints/i/revoke-token.ts b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
index 51721c5b58..b957fd0796 100644
--- a/packages/backend/src/server/api/endpoints/i/revoke-token.ts
+++ b/packages/backend/src/server/api/endpoints/i/revoke-token.ts
@@ -1,23 +1,23 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- tokenId: {
- validator: $.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tokenId: { type: 'string', format: 'misskey:id' },
},
+ required: ['tokenId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const token = await AccessTokens.findOne(ps.tokenId);
if (token) {
diff --git a/packages/backend/src/server/api/endpoints/i/signin-history.ts b/packages/backend/src/server/api/endpoints/i/signin-history.ts
index 796e2ec309..ca37411662 100644
--- a/packages/backend/src/server/api/endpoints/i/signin-history.ts
+++ b/packages/backend/src/server/api/endpoints/i/signin-history.ts
@@ -1,36 +1,29 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Signins } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Signins } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
requireCredential: true,
secure: true,
+} as const;
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Signins.createQueryBuilder('signin'), ps.sinceId, ps.untilId)
.andWhere(`signin.userId = :meId`, { meId: user.id });
- const history = await query.take(ps.limit!).getMany();
+ const history = await query.take(ps.limit).getMany();
return await Promise.all(history.map(record => Signins.pack(record)));
});
diff --git a/packages/backend/src/server/api/endpoints/i/unpin.ts b/packages/backend/src/server/api/endpoints/i/unpin.ts
index 9c82b74960..9912689da5 100644
--- a/packages/backend/src/server/api/endpoints/i/unpin.ts
+++ b/packages/backend/src/server/api/endpoints/i/unpin.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { removePinned } from '@/services/i/pin';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { removePinned } from '@/services/i/pin.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['account', 'notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await removePinned(user, ps.noteId).catch(e => {
if (e.id === 'b302d4cf-c050-400a-bbb3-be208681f40c') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts
index b4479aa50d..389ff1b81d 100644
--- a/packages/backend/src/server/api/endpoints/i/update-email.ts
+++ b/packages/backend/src/server/api/endpoints/i/update-email.ts
@@ -1,14 +1,13 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
import rndstr from 'rndstr';
-import config from '@/config/index';
+import config from '@/config/index.js';
import ms from 'ms';
-import * as bcrypt from 'bcryptjs';
-import { Users, UserProfiles } from '@/models/index';
-import { sendEmail } from '@/services/send-email';
-import { ApiError } from '../../error';
-import { validateEmailForAccount } from '@/services/validate-email-for-account';
+import bcrypt from 'bcryptjs';
+import { Users, UserProfiles } from '@/models/index.js';
+import { sendEmail } from '@/services/send-email.js';
+import { ApiError } from '../../error.js';
+import { validateEmailForAccount } from '@/services/validate-email-for-account.js';
export const meta = {
requireCredential: true,
@@ -20,16 +19,6 @@ export const meta = {
max: 3,
},
- params: {
- password: {
- validator: $.str,
- },
-
- email: {
- validator: $.optional.nullable.str,
- },
- },
-
errors: {
incorrectPassword: {
message: 'Incorrect password.',
@@ -45,8 +34,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ password: { type: 'string' },
+ email: { type: 'string', nullable: true },
+ },
+ required: ['password'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index 6b7e53aa1f..85d0a62548 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -1,20 +1,19 @@
-import $ from 'cafy';
+import RE2 from 're2';
import * as mfm from 'mfm-js';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import acceptAllFollowRequests from '@/services/following/requests/accept-all';
-import { publishToFollowers } from '@/services/i/update';
-import define from '../../define';
-import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm';
-import { extractHashtags } from '@/misc/extract-hashtags';
-import * as langmap from 'langmap';
-import { updateUsertags } from '@/services/update-hashtag';
-import { ApiError } from '../../error';
-import { Users, DriveFiles, UserProfiles, Pages } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { UserProfile } from '@/models/entities/user-profile';
-import { notificationTypes } from '@/types';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import acceptAllFollowRequests from '@/services/following/requests/accept-all.js';
+import { publishToFollowers } from '@/services/i/update.js';
+import define from '../../define.js';
+import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
+import { extractHashtags } from '@/misc/extract-hashtags.js';
+import { updateUsertags } from '@/services/update-hashtag.js';
+import { ApiError } from '../../error.js';
+import { Users, DriveFiles, UserProfiles, Pages } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { notificationTypes } from '@/types.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { langmap } from '@/misc/langmap.js';
export const meta = {
tags: ['account'],
@@ -23,112 +22,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.optional.nullable.use(Users.validateName),
- },
-
- description: {
- validator: $.optional.nullable.use(Users.validateDescription),
- },
-
- lang: {
- validator: $.optional.nullable.str.or(Object.keys(langmap)),
- },
-
- location: {
- validator: $.optional.nullable.use(Users.validateLocation),
- },
-
- birthday: {
- validator: $.optional.nullable.use(Users.validateBirthday),
- },
-
- avatarId: {
- validator: $.optional.nullable.type(ID),
- },
-
- bannerId: {
- validator: $.optional.nullable.type(ID),
- },
-
- fields: {
- validator: $.optional.arr($.object()).range(1, 4),
- },
-
- isLocked: {
- validator: $.optional.bool,
- },
-
- isExplorable: {
- validator: $.optional.bool,
- },
-
- hideOnlineStatus: {
- validator: $.optional.bool,
- },
-
- publicReactions: {
- validator: $.optional.bool,
- },
-
- ffVisibility: {
- validator: $.optional.str,
- },
-
- carefulBot: {
- validator: $.optional.bool,
- },
-
- autoAcceptFollowed: {
- validator: $.optional.bool,
- },
-
- noCrawle: {
- validator: $.optional.bool,
- },
-
- isBot: {
- validator: $.optional.bool,
- },
-
- isCat: {
- validator: $.optional.bool,
- },
-
- injectFeaturedNote: {
- validator: $.optional.bool,
- },
-
- receiveAnnouncementEmail: {
- validator: $.optional.bool,
- },
-
- alwaysMarkNsfw: {
- validator: $.optional.bool,
- },
-
- pinnedPageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- mutedWords: {
- validator: $.optional.arr($.arr($.str)),
- },
-
- mutedInstances: {
- validator: $.optional.arr($.str),
- },
-
- mutingNotificationTypes: {
- validator: $.optional.arr($.str.or(notificationTypes as unknown as string[])),
- },
-
- emailNotificationTypes: {
- validator: $.optional.arr($.str),
- },
- },
-
errors: {
noSuchAvatar: {
message: 'No such avatar file.',
@@ -159,6 +52,12 @@ export const meta = {
code: 'NO_SUCH_PAGE',
id: '8e01b590-7eb9-431b-a239-860e086c408e',
},
+
+ invalidRegexp: {
+ message: 'Invalid Regular Expression.',
+ code: 'INVALID_REGEXP',
+ id: '0d786918-10df-41cd-8f33-8dec7d9a89a5',
+ }
},
res: {
@@ -168,8 +67,60 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { ...Users.nameSchema, nullable: true },
+ description: { ...Users.descriptionSchema, nullable: true },
+ location: { ...Users.locationSchema, nullable: true },
+ birthday: { ...Users.birthdaySchema, nullable: true },
+ lang: { type: 'string', enum: [null, ...Object.keys(langmap)], nullable: true },
+ avatarId: { type: 'string', format: 'misskey:id', nullable: true },
+ bannerId: { type: 'string', format: 'misskey:id', nullable: true },
+ fields: { type: 'array',
+ minItems: 0,
+ maxItems: 16,
+ items: {
+ type: 'object',
+ properties: {
+ name: { type: 'string' },
+ value: { type: 'string' },
+ },
+ required: ['name', 'value'],
+ },
+ },
+ isLocked: { type: 'boolean' },
+ isExplorable: { type: 'boolean' },
+ hideOnlineStatus: { type: 'boolean' },
+ publicReactions: { type: 'boolean' },
+ carefulBot: { type: 'boolean' },
+ autoAcceptFollowed: { type: 'boolean' },
+ noCrawle: { type: 'boolean' },
+ isBot: { type: 'boolean' },
+ isCat: { type: 'boolean' },
+ showTimelineReplies: { type: 'boolean' },
+ injectFeaturedNote: { type: 'boolean' },
+ receiveAnnouncementEmail: { type: 'boolean' },
+ alwaysMarkNsfw: { type: 'boolean' },
+ ffVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
+ pinnedPageId: { type: 'array', items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ mutedWords: { type: 'array' },
+ mutedInstances: { type: 'array', items: {
+ type: 'string',
+ } },
+ mutingNotificationTypes: { type: 'array', items: {
+ type: 'string', enum: notificationTypes,
+ } },
+ emailNotificationTypes: { type: 'array', items: {
+ type: 'string',
+ } },
+ },
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, _user, token) => {
+export default define(meta, paramDef, async (ps, _user, token) => {
const user = await Users.findOneOrFail(_user.id);
const isSecure = token == null;
@@ -187,6 +138,18 @@ export default define(meta, async (ps, _user, token) => {
if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId;
if (ps.bannerId !== undefined) updates.bannerId = ps.bannerId;
if (ps.mutedWords !== undefined) {
+ // validate regular expression syntax
+ ps.mutedWords.filter(x => !Array.isArray(x)).forEach(x => {
+ const regexp = x.match(/^\/(.+)\/(.*)$/);
+ if (!regexp) throw new ApiError(meta.errors.invalidRegexp);
+
+ try {
+ new RE2(regexp[1], regexp[2]);
+ } catch (err) {
+ throw new ApiError(meta.errors.invalidRegexp);
+ }
+ });
+
profileUpdates.mutedWords = ps.mutedWords;
profileUpdates.enableWordMute = ps.mutedWords.length > 0;
}
@@ -197,6 +160,7 @@ export default define(meta, async (ps, _user, token) => {
if (typeof ps.hideOnlineStatus === 'boolean') updates.hideOnlineStatus = ps.hideOnlineStatus;
if (typeof ps.publicReactions === 'boolean') profileUpdates.publicReactions = ps.publicReactions;
if (typeof ps.isBot === 'boolean') updates.isBot = ps.isBot;
+ if (typeof ps.showTimelineReplies === 'boolean') updates.showTimelineReplies = ps.showTimelineReplies;
if (typeof ps.carefulBot === 'boolean') profileUpdates.carefulBot = ps.carefulBot;
if (typeof ps.autoAcceptFollowed === 'boolean') profileUpdates.autoAcceptFollowed = ps.autoAcceptFollowed;
if (typeof ps.noCrawle === 'boolean') profileUpdates.noCrawle = ps.noCrawle;
@@ -211,12 +175,6 @@ export default define(meta, async (ps, _user, token) => {
if (avatar == null || avatar.userId !== user.id) throw new ApiError(meta.errors.noSuchAvatar);
if (!avatar.type.startsWith('image/')) throw new ApiError(meta.errors.avatarNotAnImage);
-
- updates.avatarUrl = DriveFiles.getPublicUrl(avatar, true);
-
- if (avatar.blurhash) {
- updates.avatarBlurhash = avatar.blurhash;
- }
}
if (ps.bannerId) {
@@ -224,12 +182,6 @@ export default define(meta, async (ps, _user, token) => {
if (banner == null || banner.userId !== user.id) throw new ApiError(meta.errors.noSuchBanner);
if (!banner.type.startsWith('image/')) throw new ApiError(meta.errors.bannerNotAnImage);
-
- updates.bannerUrl = DriveFiles.getPublicUrl(banner, false);
-
- if (banner.blurhash) {
- updates.bannerBlurhash = banner.blurhash;
- }
}
if (ps.pinnedPageId) {
diff --git a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
index 76a3131e6d..1d7e4a16b3 100644
--- a/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
+++ b/packages/backend/src/server/api/endpoints/i/user-group-invites.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { UserGroupInvitations } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { UserGroupInvitations } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['account', 'groups'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:user-groups',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -48,14 +31,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(UserGroupInvitations.createQueryBuilder('invitation'), ps.sinceId, ps.untilId)
.andWhere(`invitation.userId = :meId`, { meId: user.id })
.leftJoinAndSelect('invitation.userGroup', 'user_group');
const invitations = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await UserGroupInvitations.packMany(invitations);
diff --git a/packages/backend/src/server/api/endpoints/messaging/history.ts b/packages/backend/src/server/api/endpoints/messaging/history.ts
index 5ac49cf96b..14de4e1028 100644
--- a/packages/backend/src/server/api/endpoints/messaging/history.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/history.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { MessagingMessages, Mutings, UserGroupJoinings } from '@/models/index';
+import define from '../../define.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { MessagingMessages, Mutings, UserGroupJoinings } from '@/models/index.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -11,18 +10,6 @@ export const meta = {
kind: 'read:messaging',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- group: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -34,8 +21,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ group: { type: 'boolean', default: false },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const mute = await Mutings.find({
muterId: user.id,
});
@@ -50,7 +46,7 @@ export default define(meta, async (ps, user) => {
const history: MessagingMessage[] = [];
- for (let i = 0; i < ps.limit!; i++) {
+ for (let i = 0; i < ps.limit; i++) {
const found = ps.group
? history.map(m => m.groupId!)
: history.map(m => (m.userId === user.id) ? m.recipientId! : m.userId!);
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages.ts b/packages/backend/src/server/api/endpoints/messaging/messages.ts
index 7dbddd80e2..49ace21600 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { MessagingMessages, UserGroups, UserGroupJoinings, Users } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { MessagingMessages, UserGroups, UserGroupJoinings, Users } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { Brackets } from 'typeorm';
-import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message';
+import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message.js';
export const meta = {
tags: ['messaging'],
@@ -15,34 +13,6 @@ export const meta = {
kind: 'read:messaging',
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- groupId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- markAsRead: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -74,8 +44,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ groupId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ markAsRead: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
if (ps.userId != null) {
// Fetch recipient (user)
const recipient = await getUser(ps.userId).catch(e => {
@@ -97,7 +80,7 @@ export default define(meta, async (ps, user) => {
.setParameter('meId', user.id)
.setParameter('recipientId', recipient.id);
- const messages = await query.take(ps.limit!).getMany();
+ const messages = await query.take(ps.limit).getMany();
// Mark all as read
if (ps.markAsRead) {
@@ -133,7 +116,7 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(MessagingMessages.createQueryBuilder('message'), ps.sinceId, ps.untilId)
.andWhere(`message.groupId = :groupId`, { groupId: recipientGroup.id });
- const messages = await query.take(ps.limit!).getMany();
+ const messages = await query.take(ps.limit).getMany();
// Mark all as read
if (ps.markAsRead) {
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
index 5ec16f5e5a..a9b926c4fb 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { MessagingMessages, DriveFiles, UserGroups, UserGroupJoinings, Blockings } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { UserGroup } from '@/models/entities/user-group';
-import { createMessage } from '@/services/messages/create';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { MessagingMessages, DriveFiles, UserGroups, UserGroupJoinings, Blockings } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { createMessage } from '@/services/messages/create.js';
export const meta = {
tags: ['messaging'],
@@ -15,24 +13,6 @@ export const meta = {
kind: 'write:messaging',
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- groupId: {
- validator: $.optional.type(ID),
- },
-
- text: {
- validator: $.optional.str.pipe(MessagingMessages.validateText),
- },
-
- fileId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -84,8 +64,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ groupId: { type: 'string', format: 'misskey:id' },
+ text: { type: 'string', nullable: true, maxLength: 3000 },
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let recipientUser: User | undefined;
let recipientGroup: UserGroup | undefined;
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
index 2975419cef..a0945af510 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
+import define from '../../../define.js';
import ms from 'ms';
-import { ApiError } from '../../../error';
-import { MessagingMessages } from '@/models/index';
-import { deleteMessage } from '@/services/messages/delete';
+import { ApiError } from '../../../error.js';
+import { MessagingMessages } from '@/models/index.js';
+import { deleteMessage } from '@/services/messages/delete.js';
export const meta = {
tags: ['messaging'],
@@ -19,12 +17,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- messageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchMessage: {
message: 'No such message.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ messageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['messageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const message = await MessagingMessages.findOne({
id: ps.messageId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
index 42c3f49f6f..8d38e509ac 100644
--- a/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
+++ b/packages/backend/src/server/api/endpoints/messaging/messages/read.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { MessagingMessages } from '@/models/index';
-import { readUserMessagingMessage, readGroupMessagingMessage } from '../../../common/read-messaging-message';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { MessagingMessages } from '@/models/index.js';
+import { readUserMessagingMessage, readGroupMessagingMessage } from '../../../common/read-messaging-message.js';
export const meta = {
tags: ['messaging'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:messaging',
- params: {
- messageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchMessage: {
message: 'No such message.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ messageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['messageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const message = await MessagingMessages.findOne(ps.messageId);
if (message == null) {
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 693a7a04ec..6231c35ab9 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -1,23 +1,16 @@
-import $ from 'cafy';
-import config from '@/config/index';
-import define from '../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Ads, Emojis, Users } from '@/models/index';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
+import config from '@/config/index.js';
+import define from '../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Ads, Emojis, Users } from '@/models/index.js';
+import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
import { MoreThan } from 'typeorm';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
export const meta = {
tags: ['meta'],
requireCredential: false,
- params: {
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -76,6 +69,14 @@ export const meta = {
optional: false, nullable: false,
default: false,
},
+ defaultDarkTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
+ defaultLightTheme: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
disableRegistration: {
type: 'boolean',
optional: false, nullable: false,
@@ -100,10 +101,6 @@ export const meta = {
type: 'boolean',
optional: false, nullable: false,
},
- proxyRemoteFiles: {
- type: 'boolean',
- optional: false, nullable: false,
- },
emailRequiredForSignup: {
type: 'boolean',
optional: false, nullable: false,
@@ -149,7 +146,6 @@ export const meta = {
maxNoteTextLength: {
type: 'number',
optional: false, nullable: false,
- default: 500,
},
emojis: {
type: 'array',
@@ -448,8 +444,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ detail: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const instance = await fetchMeta(true);
const emojis = await Emojis.find({
@@ -499,14 +503,17 @@ export default define(meta, async (ps, me) => {
enableRecaptcha: instance.enableRecaptcha,
recaptchaSiteKey: instance.recaptchaSiteKey,
swPublickey: instance.swPublicKey,
+ themeColor: instance.themeColor,
mascotImageUrl: instance.mascotImageUrl,
bannerUrl: instance.bannerUrl,
errorImageUrl: instance.errorImageUrl,
iconUrl: instance.iconUrl,
backgroundImageUrl: instance.backgroundImageUrl,
logoImageUrl: instance.logoImageUrl,
- maxNoteTextLength: Math.min(instance.maxNoteTextLength, DB_MAX_NOTE_TEXT_LENGTH),
+ maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため
emojis: await Emojis.packMany(emojis),
+ defaultLightTheme: instance.defaultLightTheme,
+ defaultDarkTheme: instance.defaultDarkTheme,
ads: ads.map(ad => ({
id: ad.id,
url: ad.url,
@@ -528,7 +535,6 @@ export default define(meta, async (ps, me) => {
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
- proxyRemoteFiles: instance.proxyRemoteFiles,
requireSetup: (await Users.count({
host: null,
})) === 0,
diff --git a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
index 158c8877e9..73ecdaeb03 100644
--- a/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
+++ b/packages/backend/src/server/api/endpoints/miauth/gen-token.ts
@@ -1,8 +1,7 @@
-import $ from 'cafy';
-import define from '../../define';
-import { AccessTokens } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { secureRndstr } from '@/misc/secure-rndstr';
+import define from '../../define.js';
+import { AccessTokens } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { secureRndstr } from '@/misc/secure-rndstr.js';
export const meta = {
tags: ['auth'],
@@ -11,28 +10,6 @@ export const meta = {
secure: true,
- params: {
- session: {
- validator: $.nullable.str,
- },
-
- name: {
- validator: $.nullable.optional.str,
- },
-
- description: {
- validator: $.nullable.optional.str,
- },
-
- iconUrl: {
- validator: $.nullable.optional.str,
- },
-
- permission: {
- validator: $.arr($.str).unique(),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -45,8 +22,22 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ session: { type: 'string', nullable: true },
+ name: { type: 'string', nullable: true },
+ description: { type: 'string', nullable: true },
+ iconUrl: { type: 'string', nullable: true },
+ permission: { type: 'array', uniqueItems: true, items: {
+ type: 'string',
+ } },
+ },
+ required: ['session', 'permission'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Generate access token
const accessToken = secureRndstr(32, true);
diff --git a/packages/backend/src/server/api/endpoints/mute/create.ts b/packages/backend/src/server/api/endpoints/mute/create.ts
index 6ba5a453c3..0178aab143 100644
--- a/packages/backend/src/server/api/endpoints/mute/create.ts
+++ b/packages/backend/src/server/api/endpoints/mute/create.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { genId } from '@/misc/gen-id';
-import { Mutings, NoteWatchings } from '@/models/index';
-import { Muting } from '@/models/entities/muting';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { genId } from '@/misc/gen-id.js';
+import { Mutings, NoteWatchings } from '@/models/index.js';
+import { Muting } from '@/models/entities/muting.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -15,12 +13,6 @@ export const meta = {
kind: 'write:mutes',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -42,8 +34,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const muter = user;
// 自分自身
diff --git a/packages/backend/src/server/api/endpoints/mute/delete.ts b/packages/backend/src/server/api/endpoints/mute/delete.ts
index 21948dc3d1..a8cf2a6667 100644
--- a/packages/backend/src/server/api/endpoints/mute/delete.ts
+++ b/packages/backend/src/server/api/endpoints/mute/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { Mutings } from '@/models/index';
-import { publishUserEvent } from '@/services/stream';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { Mutings } from '@/models/index.js';
+import { publishUserEvent } from '@/services/stream.js';
export const meta = {
tags: ['account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:mutes',
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -40,8 +32,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const muter = user;
// Check if the mutee is yourself
diff --git a/packages/backend/src/server/api/endpoints/mute/list.ts b/packages/backend/src/server/api/endpoints/mute/list.ts
index 4c6a81b63c..31283cf4c1 100644
--- a/packages/backend/src/server/api/endpoints/mute/list.ts
+++ b/packages/backend/src/server/api/endpoints/mute/list.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Mutings } from '@/models/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Mutings } from '@/models/index.js';
export const meta = {
tags: ['account'],
@@ -11,21 +9,6 @@ export const meta = {
kind: 'read:mutes',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 30,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -37,13 +20,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 30 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Mutings.createQueryBuilder('muting'), ps.sinceId, ps.untilId)
.andWhere(`muting.muterId = :meId`, { meId: me.id });
const mutings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Mutings.packMany(mutings, me);
diff --git a/packages/backend/src/server/api/endpoints/my/apps.ts b/packages/backend/src/server/api/endpoints/my/apps.ts
index 42bd5c5f75..85b75c15df 100644
--- a/packages/backend/src/server/api/endpoints/my/apps.ts
+++ b/packages/backend/src/server/api/endpoints/my/apps.ts
@@ -1,83 +1,40 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Apps } from '@/models/index';
+import define from '../../define.js';
+import { Apps } from '@/models/index.js';
export const meta = {
tags: ['account', 'app'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
items: {
type: 'object',
optional: false, nullable: false,
- properties: {
- id: {
- type: 'string',
- optional: false, nullable: false,
- },
- name: {
- type: 'string',
- optional: false, nullable: false,
- },
- callbackUrl: {
- type: 'string',
- optional: false, nullable: false,
- },
- permission: {
- type: 'array',
- optional: false, nullable: false,
- items: {
- type: 'string',
- optional: false, nullable: false,
- },
- },
- secret: {
- type: 'string',
- optional: true, nullable: false,
- },
- isAuthorized: {
- type: 'object',
- optional: true, nullable: false,
- properties: {
- appId: {
- type: 'string',
- optional: false, nullable: false,
- },
- userId: {
- type: 'string',
- optional: false, nullable: false,
- },
- },
- },
- },
+ ref: 'App',
},
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = {
userId: user.id,
};
const apps = await Apps.find({
where: query,
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
});
diff --git a/packages/backend/src/server/api/endpoints/notes.ts b/packages/backend/src/server/api/endpoints/notes.ts
index 9edc6cb11c..96657f8d3f 100644
--- a/packages/backend/src/server/api/endpoints/notes.ts
+++ b/packages/backend/src/server/api/endpoints/notes.ts
@@ -1,47 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../define';
-import { makePaginationQuery } from '../common/make-pagination-query';
-import { Notes } from '@/models/index';
+import define from '../define.js';
+import { makePaginationQuery } from '../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
- params: {
- local: {
- validator: $.optional.bool,
- },
-
- reply: {
- validator: $.optional.bool,
- },
-
- renote: {
- validator: $.optional.bool,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
-
- poll: {
- validator: $.optional.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -53,16 +16,37 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ local: { type: 'boolean' },
+ reply: { type: 'boolean' },
+ renote: { type: 'boolean' },
+ withFiles: { type: 'boolean' },
+ poll: { type: 'boolean' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.visibility = 'public'`)
.andWhere(`note.localOnly = FALSE`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
if (ps.local) {
query.andWhere('note.userHost IS NULL');
@@ -89,7 +73,7 @@ export default define(meta, async (ps) => {
// query.isBot = bot;
//}
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/children.ts b/packages/backend/src/server/api/endpoints/notes/children.ts
index 088ef65e96..86dde30d64 100644
--- a/packages/backend/src/server/api/endpoints/notes/children.ts
+++ b/packages/backend/src/server/api/endpoints/notes/children.ts
@@ -1,38 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { Brackets } from 'typeorm';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -44,8 +23,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(new Brackets(qb => { qb
.where(`note.replyId = :noteId`, { noteId: ps.noteId })
@@ -59,17 +49,23 @@ export default define(meta, async (ps, user) => {
}));
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
if (user) generateMutedInstanceQuery(query, user);
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/clips.ts b/packages/backend/src/server/api/endpoints/notes/clips.ts
index b89c6db4a8..9a863b7148 100644
--- a/packages/backend/src/server/api/endpoints/notes/clips.ts
+++ b/packages/backend/src/server/api/endpoints/notes/clips.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ClipNotes, Clips } from '@/models/index';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { ClipNotes, Clips } from '@/models/index.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
import { In } from 'typeorm';
export const meta = {
@@ -11,12 +9,6 @@ export const meta = {
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -36,8 +28,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/conversation.ts b/packages/backend/src/server/api/endpoints/notes/conversation.ts
index 4bd89c32e7..2552c0f99d 100644
--- a/packages/backend/src/server/api/endpoints/notes/conversation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/conversation.ts
@@ -1,32 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getNote } from '../../common/getters';
-import { Note } from '@/models/entities/note';
-import { Notes } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getNote } from '../../common/getters.js';
+import { Note } from '@/models/entities/note.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +28,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -65,7 +57,7 @@ export default define(meta, async (ps, user) => {
conversation.push(p);
}
- if (conversation.length == ps.limit!) {
+ if (conversation.length == ps.limit) {
return;
}
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 4efa76b248..e4a9b28891 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -1,26 +1,14 @@
-import $ from 'cafy';
import ms from 'ms';
-import { length } from 'stringz';
-import create from '@/services/note/create';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { User } from '@/models/entities/user';
-import { Users, DriveFiles, Notes, Channels, Blockings } from '@/models/index';
-import { DriveFile } from '@/models/entities/drive-file';
-import { Note } from '@/models/entities/note';
-import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits';
-import { noteVisibilities } from '../../../../types';
-import { Channel } from '@/models/entities/channel';
-
-let maxNoteTextLength = 500;
-
-setInterval(() => {
- fetchMeta().then(m => {
- maxNoteTextLength = m.maxNoteTextLength;
- });
-}, 3000);
+import create from '@/services/note/create.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { User } from '@/models/entities/user.js';
+import { Users, DriveFiles, Notes, Channels, Blockings } from '@/models/index.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { Note } from '@/models/entities/note.js';
+import { noteVisibilities } from '../../../../types.js';
+import { Channel } from '@/models/entities/channel.js';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
export const meta = {
tags: ['notes'],
@@ -34,84 +22,6 @@ export const meta = {
kind: 'write:notes',
- params: {
- visibility: {
- validator: $.optional.str.or(noteVisibilities as unknown as string[]),
- default: 'public',
- },
-
- visibleUserIds: {
- validator: $.optional.arr($.type(ID)).unique().min(0),
- },
-
- text: {
- validator: $.optional.nullable.str.pipe(text =>
- text.trim() != ''
- && length(text.trim()) <= maxNoteTextLength
- && Array.from(text.trim()).length <= DB_MAX_NOTE_TEXT_LENGTH, // DB limit
- ),
- default: null,
- },
-
- cw: {
- validator: $.optional.nullable.str.pipe(Notes.validateCw),
- },
-
- localOnly: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractMentions: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractHashtags: {
- validator: $.optional.bool,
- default: false,
- },
-
- noExtractEmojis: {
- validator: $.optional.bool,
- default: false,
- },
-
- fileIds: {
- validator: $.optional.arr($.type(ID)).unique().range(1, 16),
- },
-
- mediaIds: {
- validator: $.optional.arr($.type(ID)).unique().range(1, 16),
- deprecated: true,
- },
-
- replyId: {
- validator: $.optional.nullable.type(ID),
- },
-
- renoteId: {
- validator: $.optional.nullable.type(ID),
- },
-
- channelId: {
- validator: $.optional.nullable.type(ID),
- },
-
- poll: {
- validator: $.optional.nullable.obj({
- choices: $.arr($.str)
- .unique()
- .range(2, 10)
- .each(c => c.length > 0 && c.length < 50),
- multiple: $.optional.bool,
- expiresAt: $.optional.nullable.num.int(),
- expiredAfter: $.optional.nullable.num.int().min(1),
- }).strict(),
- ref: 'poll',
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -175,8 +85,49 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ visibility: { type: 'string', enum: ['public', 'home', 'followers', 'specified'], default: "public" },
+ visibleUserIds: { type: 'array', uniqueItems: true, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ text: { type: 'string', nullable: true, maxLength: MAX_NOTE_TEXT_LENGTH, default: null },
+ cw: { type: 'string', nullable: true, maxLength: 100 },
+ localOnly: { type: 'boolean', default: false },
+ noExtractMentions: { type: 'boolean', default: false },
+ noExtractHashtags: { type: 'boolean', default: false },
+ noExtractEmojis: { type: 'boolean', default: false },
+ fileIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 16, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ mediaIds: { type: 'array', uniqueItems: true, minItems: 1, maxItems: 16, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ replyId: { type: 'string', format: 'misskey:id', nullable: true },
+ renoteId: { type: 'string', format: 'misskey:id', nullable: true },
+ channelId: { type: 'string', format: 'misskey:id', nullable: true },
+ poll: {
+ type: 'object', nullable: true,
+ properties: {
+ choices: {
+ type: 'array', uniqueItems: true, minItems: 2, maxItems: 10,
+ items: {
+ type: 'string', minLength: 1, maxLength: 50,
+ },
+ },
+ multiple: { type: 'boolean', default: false },
+ expiresAt: { type: 'integer', nullable: true },
+ expiredAfter: { type: 'integer', nullable: true, minimum: 1 },
+ },
+ required: ['choices'],
+ },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let visibleUsers: User[] = [];
if (ps.visibleUserIds) {
visibleUsers = (await Promise.all(ps.visibleUserIds.map(id => Users.findOne(id))))
diff --git a/packages/backend/src/server/api/endpoints/notes/delete.ts b/packages/backend/src/server/api/endpoints/notes/delete.ts
index 9e080d9e99..22ff2275ca 100644
--- a/packages/backend/src/server/api/endpoints/notes/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/delete.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import deleteNote from '@/services/note/delete';
-import define from '../../define';
+import deleteNote from '@/services/note/delete.js';
+import define from '../../define.js';
import ms from 'ms';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Users } from '@/models/index';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -20,12 +18,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -41,8 +33,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
index 78da6a3b00..bcc2c44c02 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { NoteFavorites } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { NoteFavorites } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes', 'favorites'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:favorites',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get favoritee
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
index 3f3d50f0d5..d41fab22d3 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { NoteFavorites } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { NoteFavorites } from '@/models/index.js';
export const meta = {
tags: ['notes', 'favorites'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:favorites',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -33,8 +25,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Get favoritee
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts
index 5a47fb9e08..6308d23696 100644
--- a/packages/backend/src/server/api/endpoints/notes/featured.ts
+++ b/packages/backend/src/server/api/endpoints/notes/featured.ts
@@ -1,26 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -32,8 +19,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const max = 30;
const day = 1000 * 60 * 60 * 24 * 3; // 3日前まで
@@ -44,10 +40,16 @@ export default define(meta, async (ps, user) => {
.andWhere(`note.createdAt > :date`, { date: new Date(Date.now() - day) })
.andWhere(`note.visibility = 'public'`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
index cac8b7d8a9..26aaa0919c 100644
--- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,47 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
- params: {
- withFiles: {
- validator: $.optional.bool,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -61,8 +32,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ withFiles: { type: 'boolean' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableGlobalTimeline) {
if (user == null || (!user.isAdmin && !user.isModerator)) {
@@ -76,10 +60,16 @@ export default define(meta, async (ps, user) => {
.andWhere('note.visibility = \'public\'')
.andWhere('note.channelId IS NULL')
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateRepliesQuery(query, user);
if (user) generateMutedUserQuery(query, user);
@@ -92,11 +82,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
index 9683df4611..9bcb64b656 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -1,67 +1,23 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Followings, Notes } from '@/models/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Followings, Notes } from '@/models/index.js';
import { Brackets } from 'typeorm';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -81,8 +37,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableLocalTimeline && !user.isAdmin && !user.isModerator) {
throw new ApiError(meta.errors.stlDisabled);
@@ -100,10 +72,16 @@ export default define(meta, async (ps, user) => {
.orWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)');
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(followingQuery.getParameters());
generateChannelQuery(query, user);
@@ -149,11 +127,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
index 7776644124..12fc88b1fd 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,58 +1,20 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { ApiError } from '../../error';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { ApiError } from '../../error.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
- params: {
- withFiles: {
- validator: $.optional.bool,
- },
-
- fileType: {
- validator: $.optional.arr($.str),
- },
-
- excludeNsfw: {
- validator: $.optional.bool,
- default: false,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -72,8 +34,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ withFiles: { type: 'boolean' },
+ fileType: { type: 'array', items: {
+ type: 'string',
+ } },
+ excludeNsfw: { type: 'boolean', default: false },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const m = await fetchMeta();
if (m.disableLocalTimeline) {
if (user == null || (!user.isAdmin && !user.isModerator)) {
@@ -86,10 +65,16 @@ export default define(meta, async (ps, user) => {
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)')
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateChannelQuery(query, user);
generateRepliesQuery(query, user);
@@ -118,11 +103,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts
index 81b3844365..eafbba322d 100644
--- a/packages/backend/src/server/api/endpoints/notes/mentions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts
@@ -1,44 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import read from '@/services/note/read';
-import { Notes, Followings } from '@/models/index';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import read from '@/services/note/read.js';
+import { Notes, Followings } from '@/models/index.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { Brackets } from 'typeorm';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- following: {
- validator: $.optional.bool,
- default: false,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- visibility: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -50,8 +24,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ following: { type: 'boolean', default: false },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ visibility: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const followingQuery = Followings.createQueryBuilder('following')
.select('following.followeeId')
.where('following.followerId = :followerId', { followerId: user.id });
@@ -62,10 +48,16 @@ export default define(meta, async (ps, user) => {
.orWhere(`'{"${user.id}"}' <@ note.visibleUserIds`);
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user);
@@ -81,7 +73,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(followingQuery.getParameters());
}
- const mentions = await query.take(ps.limit!).getMany();
+ const mentions = await query.take(ps.limit).getMany();
read(user.id, mentions);
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
index 79b558e65e..bdd1aeecd4 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { Polls, Mutings, Notes, PollVotes } from '@/models/index';
+import define from '../../../define.js';
+import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
import { Brackets, In } from 'typeorm';
export const meta = {
@@ -8,18 +7,6 @@ export const meta = {
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -31,8 +18,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = Polls.createQueryBuilder('poll')
.where('poll.userHost IS NULL')
.andWhere(`poll.userId != :meId`, { meId: user.id })
@@ -64,7 +60,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(mutingQuery.getParameters());
//#endregion
- const polls = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const polls = await query.take(ps.limit).skip(ps.offset).getMany();
if (polls.length === 0) return [];
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
index 77387cacb2..ef52d03664 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
@@ -1,18 +1,16 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishNoteStream } from '@/services/stream';
-import { createNotification } from '@/services/create-notification';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getNote } from '../../../common/getters';
-import { deliver } from '@/queue/index';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderVote from '@/remote/activitypub/renderer/vote';
-import { deliverQuestionUpdate } from '@/services/note/polls/update';
-import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index';
+import { publishNoteStream } from '@/services/stream.js';
+import { createNotification } from '@/services/create-notification.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getNote } from '../../../common/getters.js';
+import { deliver } from '@/queue/index.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderVote from '@/remote/activitypub/renderer/vote.js';
+import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
+import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index.js';
import { Not } from 'typeorm';
-import { IRemoteUser } from '@/models/entities/user';
-import { genId } from '@/misc/gen-id';
+import { IRemoteUser } from '@/models/entities/user.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes'],
@@ -21,16 +19,6 @@ export const meta = {
kind: 'write:votes',
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- choice: {
- validator: $.num,
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -70,8 +58,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ choice: { type: 'integer' },
+ },
+ required: ['noteId', 'choice'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const createdAt = new Date();
// Get votee
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions.ts b/packages/backend/src/server/api/endpoints/notes/reactions.ts
index 5205a78171..43e5d1ef6f 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions.ts
@@ -1,45 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { NoteReactions } from '@/models/index';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { NoteReactions } from '@/models/index.js';
import { DeepPartial } from 'typeorm';
-import { NoteReaction } from '@/models/entities/note-reaction';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
export const meta = {
tags: ['notes', 'reactions'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- type: {
- validator: $.optional.nullable.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num,
- default: 0,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -59,8 +29,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ type: { type: 'string', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -80,11 +63,12 @@ export default define(meta, async (ps, user) => {
const reactions = await NoteReactions.find({
where: query,
- take: ps.limit!,
+ take: ps.limit,
skip: ps.offset,
order: {
id: -1,
},
+ relations: ['user', 'user.avatar', 'user.banner', 'note'],
});
return await Promise.all(reactions.map(reaction => NoteReactions.pack(reaction, user)));
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
index 1b42781ceb..07e52a9266 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import createReaction from '@/services/note/reaction/create';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import createReaction from '@/services/note/reaction/create.js';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['reactions', 'notes'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:reactions',
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- reaction: {
- validator: $.str,
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -43,8 +31,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ reaction: { type: 'string' },
+ },
+ required: ['noteId', 'reaction'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
index 1d686b5971..639ecae264 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
+import define from '../../../define.js';
import ms from 'ms';
-import deleteReaction from '@/services/note/reaction/delete';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import deleteReaction from '@/services/note/reaction/delete.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['reactions', 'notes'],
@@ -19,12 +17,6 @@ export const meta = {
minInterval: ms('3sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -40,8 +32,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts
index f71d23146a..87c855a5e8 100644
--- a/packages/backend/src/server/api/endpoints/notes/renotes.ts
+++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts
@@ -1,38 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -52,8 +31,19 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
@@ -62,16 +52,22 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.renoteId = :renoteId`, { renoteId: note.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
- const renotes = await query.take(ps.limit!).getMany();
+ const renotes = await query.take(ps.limit).getMany();
return await Notes.packMany(renotes, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts
index 62c56534e1..3053eabe33 100644
--- a/packages/backend/src/server/api/endpoints/notes/replies.ts
+++ b/packages/backend/src/server/api/endpoints/notes/replies.ts
@@ -1,36 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -42,21 +21,38 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere('note.replyId = :replyId', { replyId: ps.noteId })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
if (user) generateMutedUserQuery(query, user);
if (user) generateBlockedUserQuery(query, user);
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
index 87eaffe2f1..c6503eb057 100644
--- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
@@ -1,60 +1,16 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { Brackets } from 'typeorm';
-import { safeForSql } from '@/misc/safe-for-sql';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { safeForSql } from '@/misc/safe-for-sql.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes', 'hashtags'],
- params: {
- tag: {
- validator: $.optional.str,
- },
-
- query: {
- validator: $.optional.arr($.arr($.str)),
- },
-
- reply: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- renote: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
-
- poll: {
- validator: $.optional.nullable.bool,
- default: null,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -66,14 +22,40 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ tag: { type: 'string' },
+ query: { type: 'array', items: {
+ type: 'array', items: {
+ type: 'string',
+ },
+ } },
+ reply: { type: 'boolean', nullable: true, default: null },
+ renote: { type: 'boolean', nullable: true, default: null },
+ withFiles: { type: 'boolean' },
+ poll: { type: 'boolean', nullable: true, default: null },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me);
@@ -129,7 +111,7 @@ export default define(meta, async (ps, me) => {
}
// Search notes
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, me);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts
index e75212b14b..e77892b150 100644
--- a/packages/backend/src/server/api/endpoints/notes/search.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search.ts
@@ -1,54 +1,18 @@
-import $ from 'cafy';
-import es from '../../../../db/elasticsearch';
-import define from '../../define';
-import { Notes } from '@/models/index';
+import es from '../../../../db/elasticsearch.js';
+import define from '../../define.js';
+import { Notes } from '@/models/index.js';
import { In } from 'typeorm';
-import { ID } from '@/misc/cafy-id';
-import config from '@/config/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import config from '@/config/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- query: {
- validator: $.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- host: {
- validator: $.optional.nullable.str,
- default: undefined,
- },
-
- userId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
-
- channelId: {
- validator: $.optional.nullable.type(ID),
- default: null,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +27,23 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ host: { type: 'string', nullable: true },
+ userId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ channelId: { type: 'string', format: 'misskey:id', nullable: true, default: null },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
if (es == null) {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId);
@@ -77,16 +56,22 @@ export default define(meta, async (ps, me) => {
query
.andWhere('note.text ILIKE :q', { q: `%${ps.query}%` })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me);
if (me) generateBlockedUserQuery(query, me);
- const notes = await query.take(ps.limit!).getMany();
+ const notes = await query.take(ps.limit).getMany();
return await Notes.packMany(notes, me);
} else {
@@ -115,7 +100,7 @@ export default define(meta, async (ps, me) => {
const result = await es.search({
index: config.elasticsearch.index || 'misskey_note',
body: {
- size: ps.limit!,
+ size: ps.limit,
from: ps.offset,
query: {
bool: {
diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts
index feb94be1a1..d6692923c3 100644
--- a/packages/backend/src/server/api/endpoints/notes/show.ts
+++ b/packages/backend/src/server/api/endpoints/notes/show.ts
@@ -1,21 +1,13 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Notes } from '@/models/index';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -31,8 +23,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/state.ts b/packages/backend/src/server/api/endpoints/notes/state.ts
index c3e9090bbf..6fdb8e88fb 100644
--- a/packages/backend/src/server/api/endpoints/notes/state.ts
+++ b/packages/backend/src/server/api/endpoints/notes/state.ts
@@ -1,19 +1,11 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index';
+import define from '../../define.js';
+import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -34,8 +26,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await Notes.findOneOrFail(ps.noteId);
const [favorite, watching, threadMuting] = await Promise.all([
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
index a8b50d90f6..e48a2cf576 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
-import { Notes, NoteThreadMutings } from '@/models';
-import { genId } from '@/misc/gen-id';
-import readNote from '@/services/note/read';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import { Notes, NoteThreadMutings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import readNote from '@/services/note/read.js';
export const meta = {
tags: ['notes'],
@@ -14,12 +12,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -29,8 +21,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
index f76b526ce1..4fb3137a5e 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
-import { NoteThreadMutings } from '@/models';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import { NoteThreadMutings } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 8be2861aec..fde66b241b 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -1,65 +1,21 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { Notes, Followings } from '@/models/index';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { Notes, Followings } from '@/models/index.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
-import { generateRepliesQuery } from '../../common/generate-replies-query';
-import { generateMutedNoteQuery } from '../../common/generate-muted-note-query';
-import { generateChannelQuery } from '../../common/generate-channel-query';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
+import { generateRepliesQuery } from '../../common/generate-replies-query.js';
+import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
+import { generateChannelQuery } from '../../common/generate-channel-query.js';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -71,8 +27,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const hasFollowing = (await Followings.count({
where: {
followerId: user.id,
@@ -92,10 +64,16 @@ export default define(meta, async (ps, user) => {
if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
}))
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(followingQuery.getParameters());
generateChannelQuery(query, user);
@@ -141,11 +119,11 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
if (user) {
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
}
});
diff --git a/packages/backend/src/server/api/endpoints/notes/translate.ts b/packages/backend/src/server/api/endpoints/notes/translate.ts
index ed069cb75a..068df6940b 100644
--- a/packages/backend/src/server/api/endpoints/notes/translate.ts
+++ b/packages/backend/src/server/api/endpoints/notes/translate.ts
@@ -1,29 +1,18 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
import fetch from 'node-fetch';
-import config from '@/config/index';
-import { getAgentByUrl } from '@/misc/fetch';
-import { URLSearchParams } from 'url';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models';
+import config from '@/config/index.js';
+import { getAgentByUrl } from '@/misc/fetch.js';
+import { URLSearchParams } from 'node:url';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
requireCredential: false,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- targetLang: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -38,8 +27,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ targetLang: { type: 'string' },
+ },
+ required: ['noteId', 'targetLang'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/unrenote.ts b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
index 8db543d328..a9aadba338 100644
--- a/packages/backend/src/server/api/endpoints/notes/unrenote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import deleteNote from '@/services/note/delete';
-import define from '../../define';
+import deleteNote from '@/services/note/delete.js';
+import define from '../../define.js';
import ms from 'ms';
-import { getNote } from '../../common/getters';
-import { ApiError } from '../../error';
-import { Notes, Users } from '@/models/index';
+import { getNote } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -20,12 +18,6 @@ export const meta = {
minInterval: ms('1sec'),
},
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -35,8 +27,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
index 89de73fb9d..0829d0e4c1 100644
--- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { UserLists, UserListJoinings, Notes } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { activeUsersChart } from '@/services/chart/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -13,52 +11,6 @@ export const meta = {
requireCredential: true,
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeRenotedMyNotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- includeLocalRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -78,8 +30,25 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ includeRenotedMyNotes: { type: 'boolean', default: true },
+ includeLocalRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const list = await UserLists.findOne({
id: ps.listId,
userId: user.id,
@@ -97,10 +66,16 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(`note.userId IN (${ listQuery.getQuery() })`)
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.setParameters(listQuery.getParameters());
generateVisibilityQuery(query, user);
@@ -140,9 +115,9 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
- activeUsersChart.update(user);
+ activeUsersChart.read(user);
return await Notes.packMany(timeline, user);
});
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/create.ts b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
index 6433c6bc2a..8fdf84624e 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import watch from '@/services/note/watch';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import watch from '@/services/note/watch.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
index 3e9faa2b23..d58f09797c 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import unwatch from '@/services/note/unwatch';
-import { getNote } from '../../../common/getters';
-import { ApiError } from '../../../error';
+import define from '../../../define.js';
+import unwatch from '@/services/note/unwatch.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['notes'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -27,8 +19,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/notifications/create.ts b/packages/backend/src/server/api/endpoints/notifications/create.ts
index bd8a7ba1b7..b339c8723d 100644
--- a/packages/backend/src/server/api/endpoints/notifications/create.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/create.ts
@@ -1,6 +1,5 @@
-import $ from 'cafy';
-import define from '../../define';
-import { createNotification } from '@/services/create-notification';
+import define from '../../define.js';
+import { createNotification } from '@/services/create-notification.js';
export const meta = {
tags: ['notifications'],
@@ -9,26 +8,22 @@ export const meta = {
kind: 'write:notifications',
- params: {
- body: {
- validator: $.str,
- },
-
- header: {
- validator: $.optional.nullable.str,
- },
-
- icon: {
- validator: $.optional.nullable.str,
- },
+ errors: {
},
+} as const;
- errors: {
+export const paramDef = {
+ type: 'object',
+ properties: {
+ body: { type: 'string' },
+ header: { type: 'string', nullable: true },
+ icon: { type: 'string', nullable: true },
},
+ required: ['body'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user, token) => {
+export default define(meta, paramDef, async (ps, user, token) => {
createNotification(user.id, 'app', {
appAccessTokenId: token ? token.id : null,
customBody: ps.body,
diff --git a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
index 4cec38a95d..abefe07be6 100644
--- a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
@@ -1,6 +1,6 @@
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { Notifications } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { Notifications } from '@/models/index.js';
export const meta = {
tags: ['notifications', 'account'],
@@ -10,8 +10,14 @@ export const meta = {
kind: 'write:notifications',
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Update documents
await Notifications.update({
notifieeId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/notifications/read.ts b/packages/backend/src/server/api/endpoints/notifications/read.ts
index 7e23bc234d..34f4c155fa 100644
--- a/packages/backend/src/server/api/endpoints/notifications/read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/read.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream } from '@/services/stream';
-import define from '../../define';
-import { Notifications } from '@/models/index';
-import { readNotification } from '../../common/read-notification';
-import { ApiError } from '../../error';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../../define.js';
+import { Notifications } from '@/models/index.js';
+import { readNotification } from '../../common/read-notification.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['notifications', 'account'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:notifications',
- params: {
- notificationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNotification: {
message: 'No such notification.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ notificationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['notificationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const notification = await Notifications.findOne({
notifieeId: user.id,
id: ps.notificationId,
diff --git a/packages/backend/src/server/api/endpoints/page-push.ts b/packages/backend/src/server/api/endpoints/page-push.ts
index 61c0160f83..acaa118470 100644
--- a/packages/backend/src/server/api/endpoints/page-push.ts
+++ b/packages/backend/src/server/api/endpoints/page-push.ts
@@ -1,28 +1,12 @@
-import $ from 'cafy';
-import define from '../define';
-import { ID } from '@/misc/cafy-id';
-import { publishMainStream } from '@/services/stream';
-import { Users, Pages } from '@/models/index';
-import { ApiError } from '../error';
+import define from '../define.js';
+import { publishMainStream } from '@/services/stream.js';
+import { Users, Pages } from '@/models/index.js';
+import { ApiError } from '../error.js';
export const meta = {
requireCredential: true,
secure: true,
- params: {
- pageId: {
- validator: $.type(ID),
- },
-
- event: {
- validator: $.str,
- },
-
- var: {
- validator: $.optional.nullable.any,
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +16,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ event: { type: 'string' },
+ var: {},
+ },
+ required: ['pageId', 'event'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts
index 7ee50fbdfa..7cac530606 100644
--- a/packages/backend/src/server/api/endpoints/pages/create.ts
+++ b/packages/backend/src/server/api/endpoints/pages/create.ts
@@ -1,11 +1,9 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../define';
-import { ID } from '@/misc/cafy-id';
-import { Pages, DriveFiles } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { Page } from '@/models/entities/page';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { Pages, DriveFiles } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { Page } from '@/models/entities/page.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['pages'],
@@ -19,51 +17,6 @@ export const meta = {
max: 300,
},
- params: {
- title: {
- validator: $.str,
- },
-
- name: {
- validator: $.str.min(1),
- },
-
- summary: {
- validator: $.optional.nullable.str,
- },
-
- content: {
- validator: $.arr($.obj()),
- },
-
- variables: {
- validator: $.arr($.obj()),
- },
-
- script: {
- validator: $.str,
- },
-
- eyeCatchingImageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- font: {
- validator: $.optional.str.or(['serif', 'sans-serif']),
- default: 'sans-serif',
- },
-
- alignCenter: {
- validator: $.optional.bool,
- default: false,
- },
-
- hideTitleWhenPinned: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -84,8 +37,29 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ title: { type: 'string' },
+ name: { type: 'string', minLength: 1 },
+ summary: { type: 'string', nullable: true },
+ content: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ variables: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ script: { type: 'string' },
+ eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
+ font: { type: 'string', enum: ['serif', 'sans-serif'], default: "sans-serif" },
+ alignCenter: { type: 'boolean', default: false },
+ hideTitleWhenPinned: { type: 'boolean', default: false },
+ },
+ required: ['title', 'name', 'content', 'variables', 'script'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let eyeCatchingImage = null;
if (ps.eyeCatchingImageId != null) {
eyeCatchingImage = await DriveFiles.findOne({
diff --git a/packages/backend/src/server/api/endpoints/pages/delete.ts b/packages/backend/src/server/api/endpoints/pages/delete.ts
index aeda823e52..ddf691f53c 100644
--- a/packages/backend/src/server/api/endpoints/pages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/pages/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:pages',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/featured.ts b/packages/backend/src/server/api/endpoints/pages/featured.ts
index 7f0d58b350..eeb6d509ca 100644
--- a/packages/backend/src/server/api/endpoints/pages/featured.ts
+++ b/packages/backend/src/server/api/endpoints/pages/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define';
-import { Pages } from '@/models/index';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -17,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Pages.createQueryBuilder('page')
.where('page.visibility = \'public\'')
.andWhere('page.likedCount > 0')
diff --git a/packages/backend/src/server/api/endpoints/pages/like.ts b/packages/backend/src/server/api/endpoints/pages/like.ts
index c479f637a9..cab78e576c 100644
--- a/packages/backend/src/server/api/endpoints/pages/like.ts
+++ b/packages/backend/src/server/api/endpoints/pages/like.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, PageLikes } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, PageLikes } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['pages'],
@@ -12,12 +10,6 @@ export const meta = {
kind: 'write:page-likes',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -39,8 +31,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/show.ts b/packages/backend/src/server/api/endpoints/pages/show.ts
index 5cda5386d5..4e3facae5b 100644
--- a/packages/backend/src/server/api/endpoints/pages/show.ts
+++ b/packages/backend/src/server/api/endpoints/pages/show.ts
@@ -1,29 +1,13 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, Users } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
-import { Page } from '@/models/entities/page';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, Users } from '@/models/index.js';
+import { Page } from '@/models/entities/page.js';
export const meta = {
tags: ['pages'],
requireCredential: false,
- params: {
- pageId: {
- validator: $.optional.type(ID),
- },
-
- name: {
- validator: $.optional.str,
- },
-
- username: {
- validator: $.optional.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -39,8 +23,18 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string' },
+ username: { type: 'string' },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
let page: Page | undefined;
if (ps.pageId) {
diff --git a/packages/backend/src/server/api/endpoints/pages/unlike.ts b/packages/backend/src/server/api/endpoints/pages/unlike.ts
index cca5e5b5a9..31cd1a3359 100644
--- a/packages/backend/src/server/api/endpoints/pages/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/pages/unlike.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, PageLikes } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, PageLikes } from '@/models/index.js';
export const meta = {
tags: ['pages'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:page-likes',
- params: {
- pageId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['pageId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/pages/update.ts b/packages/backend/src/server/api/endpoints/pages/update.ts
index 991085ee09..24c8f467e6 100644
--- a/packages/backend/src/server/api/endpoints/pages/update.ts
+++ b/packages/backend/src/server/api/endpoints/pages/update.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
import ms from 'ms';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Pages, DriveFiles } from '@/models/index';
-import { ID } from '@/misc/cafy-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Pages, DriveFiles } from '@/models/index.js';
import { Not } from 'typeorm';
export const meta = {
@@ -18,52 +16,6 @@ export const meta = {
max: 300,
},
- params: {
- pageId: {
- validator: $.type(ID),
- },
-
- title: {
- validator: $.str,
- },
-
- name: {
- validator: $.str.min(1),
- },
-
- summary: {
- validator: $.optional.nullable.str,
- },
-
- content: {
- validator: $.arr($.obj()),
- },
-
- variables: {
- validator: $.arr($.obj()),
- },
-
- script: {
- validator: $.str,
- },
-
- eyeCatchingImageId: {
- validator: $.optional.nullable.type(ID),
- },
-
- font: {
- validator: $.optional.str.or(['serif', 'sans-serif']),
- },
-
- alignCenter: {
- validator: $.optional.bool,
- },
-
- hideTitleWhenPinned: {
- validator: $.optional.bool,
- },
- },
-
errors: {
noSuchPage: {
message: 'No such page.',
@@ -90,8 +42,30 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ pageId: { type: 'string', format: 'misskey:id' },
+ title: { type: 'string' },
+ name: { type: 'string', minLength: 1 },
+ summary: { type: 'string', nullable: true },
+ content: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ variables: { type: 'array', items: {
+ type: 'object', additionalProperties: true,
+ } },
+ script: { type: 'string' },
+ eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
+ font: { type: 'string', enum: ['serif', 'sans-serif'] },
+ alignCenter: { type: 'boolean' },
+ hideTitleWhenPinned: { type: 'boolean' },
+ },
+ required: ['pageId', 'title', 'name', 'content', 'variables', 'script'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const page = await Pages.findOne(ps.pageId);
if (page == null) {
throw new ApiError(meta.errors.noSuchPage);
diff --git a/packages/backend/src/server/api/endpoints/ping.ts b/packages/backend/src/server/api/endpoints/ping.ts
index 3eab70ae2e..2891a0860a 100644
--- a/packages/backend/src/server/api/endpoints/ping.ts
+++ b/packages/backend/src/server/api/endpoints/ping.ts
@@ -1,13 +1,10 @@
-import define from '../define';
+import define from '../define.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -20,8 +17,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
return {
pong: Date.now(),
};
diff --git a/packages/backend/src/server/api/endpoints/pinned-users.ts b/packages/backend/src/server/api/endpoints/pinned-users.ts
index ff0e22555f..1d26ab266e 100644
--- a/packages/backend/src/server/api/endpoints/pinned-users.ts
+++ b/packages/backend/src/server/api/endpoints/pinned-users.ts
@@ -1,17 +1,14 @@
-import define from '../define';
-import { Users } from '@/models/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import * as Acct from 'misskey-js/built/acct';
-import { User } from '@/models/entities/user';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import * as Acct from '@/misc/acct.js';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -23,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const meta = await fetchMeta();
const users = await Promise.all(meta.pinnedUsers.map(acct => Users.findOne(Acct.parse(acct))));
diff --git a/packages/backend/src/server/api/endpoints/promo/read.ts b/packages/backend/src/server/api/endpoints/promo/read.ts
index 8d8c60d755..ea34ca3aad 100644
--- a/packages/backend/src/server/api/endpoints/promo/read.ts
+++ b/packages/backend/src/server/api/endpoints/promo/read.ts
@@ -1,22 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getNote } from '../../common/getters';
-import { PromoReads } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getNote } from '../../common/getters.js';
+import { PromoReads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes'],
requireCredential: true,
- params: {
- noteId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchNote: {
message: 'No such note.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['noteId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const note = await getNote(ps.noteId).catch(e => {
if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
throw e;
diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts
index af1aeb4311..18cd98b164 100644
--- a/packages/backend/src/server/api/endpoints/request-reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts
@@ -1,13 +1,12 @@
-import $ from 'cafy';
-import { publishMainStream } from '@/services/stream';
-import define from '../define';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../define.js';
import rndstr from 'rndstr';
-import config from '@/config/index';
+import config from '@/config/index.js';
import ms from 'ms';
-import { Users, UserProfiles, PasswordResetRequests } from '@/models/index';
-import { sendEmail } from '@/services/send-email';
-import { ApiError } from '../error';
-import { genId } from '@/misc/gen-id';
+import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
+import { sendEmail } from '@/services/send-email.js';
+import { ApiError } from '../error.js';
+import { genId } from '@/misc/gen-id.js';
import { IsNull } from 'typeorm';
export const meta = {
@@ -18,23 +17,22 @@ export const meta = {
max: 3,
},
- params: {
- username: {
- validator: $.str,
- },
+ errors: {
- email: {
- validator: $.str,
- },
},
+} as const;
- errors: {
-
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: { type: 'string' },
+ email: { type: 'string' },
},
+ required: ['username', 'email'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
const user = await Users.findOne({
usernameLower: ps.username.toLowerCase(),
host: IsNull(),
diff --git a/packages/backend/src/server/api/endpoints/reset-db.ts b/packages/backend/src/server/api/endpoints/reset-db.ts
index e99dc9db15..dbe64e9a13 100644
--- a/packages/backend/src/server/api/endpoints/reset-db.ts
+++ b/packages/backend/src/server/api/endpoints/reset-db.ts
@@ -1,21 +1,23 @@
-import $ from 'cafy';
-import define from '../define';
-import { ApiError } from '../error';
-import { resetDb } from '@/db/postgre';
+import define from '../define.js';
+import { ApiError } from '../error.js';
+import { resetDb } from '@/db/postgre.js';
export const meta = {
requireCredential: false,
- params: {
- },
-
errors: {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
if (process.env.NODE_ENV !== 'test') throw 'NODE_ENV is not a test';
await resetDb();
diff --git a/packages/backend/src/server/api/endpoints/reset-password.ts b/packages/backend/src/server/api/endpoints/reset-password.ts
index a7366584b1..3abf232af0 100644
--- a/packages/backend/src/server/api/endpoints/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/reset-password.ts
@@ -1,30 +1,28 @@
-import $ from 'cafy';
-import * as bcrypt from 'bcryptjs';
-import { publishMainStream } from '@/services/stream';
-import define from '../define';
-import { Users, UserProfiles, PasswordResetRequests } from '@/models/index';
-import { ApiError } from '../error';
+import bcrypt from 'bcryptjs';
+import { publishMainStream } from '@/services/stream.js';
+import define from '../define.js';
+import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
+import { ApiError } from '../error.js';
export const meta = {
requireCredential: false,
- params: {
- token: {
- validator: $.str,
- },
+ errors: {
- password: {
- validator: $.str,
- },
},
+} as const;
- errors: {
-
+export const paramDef = {
+ type: 'object',
+ properties: {
+ token: { type: 'string' },
+ password: { type: 'string' },
},
+ required: ['token', 'password'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const req = await PasswordResetRequests.findOneOrFail({
token: ps.token,
});
diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts
index 1ad2c54ab5..99f3730e97 100644
--- a/packages/backend/src/server/api/endpoints/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/server-info.ts
@@ -1,21 +1,21 @@
-import * as os from 'os';
-import * as si from 'systeminformation';
-import define from '../define';
+import * as os from 'node:os';
+import si from 'systeminformation';
+import define from '../define.js';
export const meta = {
requireCredential: false,
- desc: {
- },
-
tags: ['meta'],
+} as const;
- params: {
- },
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const memStats = await si.mem();
const fsStats = await si.fsSize();
diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts
index 9879ef2adf..92fea4de6a 100644
--- a/packages/backend/src/server/api/endpoints/stats.ts
+++ b/packages/backend/src/server/api/endpoints/stats.ts
@@ -1,15 +1,12 @@
-import define from '../define';
-import { NoteReactions, Notes, Users } from '@/models/index';
-import { federationChart, driveChart } from '@/services/chart/index';
+import define from '../define.js';
+import { Instances, NoteReactions, Notes, Users } from '@/models/index.js';
+import { } from '@/services/chart/index.js';
export const meta = {
requireCredential: false,
tags: ['meta'],
- params: {
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -46,8 +43,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async () => {
+export default define(meta, paramDef, async () => {
const [
notesCount,
originalNotesCount,
@@ -56,8 +59,6 @@ export default define(meta, async () => {
reactionsCount,
//originalReactionsCount,
instances,
- driveUsageLocal,
- driveUsageRemote,
] = await Promise.all([
Notes.count({ cache: 3600000 }), // 1 hour
Notes.count({ where: { userHost: null }, cache: 3600000 }),
@@ -65,9 +66,7 @@ export default define(meta, async () => {
Users.count({ where: { host: null }, cache: 3600000 }),
NoteReactions.count({ cache: 3600000 }), // 1 hour
//NoteReactions.count({ where: { userHost: null }, cache: 3600000 }),
- federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]),
- driveChart.getChart('hour', 1, null).then(chart => chart.local.totalSize[0]),
- driveChart.getChart('hour', 1, null).then(chart => chart.remote.totalSize[0]),
+ Instances.count({ cache: 3600000 }),
]);
return {
@@ -78,7 +77,7 @@ export default define(meta, async () => {
reactionsCount,
//originalReactionsCount,
instances,
- driveUsageLocal,
- driveUsageRemote,
+ driveUsageLocal: 0,
+ driveUsageRemote: 0,
};
});
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index ae3e9ce77a..6c7714e19b 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -1,47 +1,42 @@
-import $ from 'cafy';
-import define from '../../define';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { genId } from '@/misc/gen-id';
-import { SwSubscriptions } from '@/models/index';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { genId } from '@/misc/gen-id.js';
+import { SwSubscriptions } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
- params: {
- endpoint: {
- validator: $.str,
- },
-
- auth: {
- validator: $.str,
- },
-
- publickey: {
- validator: $.str,
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
properties: {
state: {
type: 'string',
- optional: false, nullable: false,
+ optional: true, nullable: false,
enum: ['already-subscribed', 'subscribed'],
},
key: {
type: 'string',
- optional: false, nullable: false,
+ optional: false, nullable: true,
},
},
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
+ auth: { type: 'string' },
+ publickey: { type: 'string' },
+ },
+ required: ['endpoint', 'auth', 'publickey'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// if already subscribed
const exist = await SwSubscriptions.findOne({
userId: user.id,
@@ -54,7 +49,7 @@ export default define(meta, async (ps, user) => {
if (exist != null) {
return {
- state: 'already-subscribed',
+ state: 'already-subscribed' as const,
key: instance.swPublicKey,
};
}
@@ -69,7 +64,7 @@ export default define(meta, async (ps, user) => {
});
return {
- state: 'subscribed',
+ state: 'subscribed' as const,
key: instance.swPublicKey,
};
});
diff --git a/packages/backend/src/server/api/endpoints/sw/unregister.ts b/packages/backend/src/server/api/endpoints/sw/unregister.ts
index 6f569e9417..9748f2a222 100644
--- a/packages/backend/src/server/api/endpoints/sw/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/sw/unregister.ts
@@ -1,21 +1,22 @@
-import $ from 'cafy';
-import define from '../../define';
-import { SwSubscriptions } from '../../../../models';
+import define from '../../define.js';
+import { SwSubscriptions } from '@/models/index.js';
export const meta = {
tags: ['account'],
requireCredential: true,
+} as const;
- params: {
- endpoint: {
- validator: $.str,
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ endpoint: { type: 'string' },
},
+ required: ['endpoint'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
await SwSubscriptions.delete({
userId: user.id,
endpoint: ps.endpoint,
diff --git a/packages/backend/src/server/api/endpoints/test.ts b/packages/backend/src/server/api/endpoints/test.ts
new file mode 100644
index 0000000000..256da1a66f
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/test.ts
@@ -0,0 +1,22 @@
+import define from '../define.js';
+
+export const meta = {
+ requireCredential: false,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ required: { type: 'boolean' },
+ string: { type: 'string' },
+ default: { type: 'string', default: 'hello' },
+ nullableDefault: { type: 'string', nullable: true, default: 'hello' },
+ id: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['required'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+ return ps;
+});
diff --git a/packages/backend/src/server/api/endpoints/username/available.ts b/packages/backend/src/server/api/endpoints/username/available.ts
index 74120fc406..5a1c4128ab 100644
--- a/packages/backend/src/server/api/endpoints/username/available.ts
+++ b/packages/backend/src/server/api/endpoints/username/available.ts
@@ -1,18 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Users, UsedUsernames } from '@/models/index';
+import define from '../../define.js';
+import { Users, UsedUsernames } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- username: {
- validator: $.use(Users.validateLocalUsername),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -25,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: Users.localUsernameSchema,
+ },
+ required: ['username'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps) => {
+export default define(meta, paramDef, async (ps) => {
// Get exist
const exist = await Users.count({
host: null,
diff --git a/packages/backend/src/server/api/endpoints/users.ts b/packages/backend/src/server/api/endpoints/users.ts
index 6b11ec0f01..10527d15cc 100644
--- a/packages/backend/src/server/api/endpoints/users.ts
+++ b/packages/backend/src/server/api/endpoints/users.ts
@@ -1,57 +1,13 @@
-import $ from 'cafy';
-import define from '../define';
-import { Users } from '@/models/index';
-import { generateMutedUserQueryForUsers } from '../common/generate-muted-user-query';
-import { generateBlockQueryForUsers } from '../common/generate-block-query';
+import define from '../define.js';
+import { Users } from '@/models/index.js';
+import { generateMutedUserQueryForUsers } from '../common/generate-muted-user-query.js';
+import { generateBlockQueryForUsers } from '../common/generate-block-query.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- sort: {
- validator: $.optional.str.or([
- '+follower',
- '-follower',
- '+createdAt',
- '-createdAt',
- '+updatedAt',
- '-updatedAt',
- ]),
- },
-
- state: {
- validator: $.optional.str.or([
- 'all',
- 'admin',
- 'moderator',
- 'adminOrModerator',
- 'alive',
- ]),
- default: 'all',
- },
-
- origin: {
- validator: $.optional.str.or([
- 'combined',
- 'local',
- 'remote',
- ]),
- default: 'local',
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +19,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
+ state: { type: 'string', enum: ['all', 'admin', 'moderator', 'adminOrModerator', 'alive'], default: "all" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user');
query.where('user.isExplorable = TRUE');
@@ -93,7 +61,7 @@ export default define(meta, async (ps, me) => {
if (me) generateMutedUserQueryForUsers(query, me);
if (me) generateBlockQueryForUsers(query, me);
- query.take(ps.limit!);
+ query.take(ps.limit);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts
index d4152fbf50..424c594749 100644
--- a/packages/backend/src/server/api/endpoints/users/clips.ts
+++ b/packages/backend/src/server/api/endpoints/users/clips.ts
@@ -1,40 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Clips } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Clips } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'clips'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Clips.createQueryBuilder('clip'), ps.sinceId, ps.untilId)
.andWhere(`clip.userId = :userId`, { userId: ps.userId })
.andWhere('clip.isPublic = true');
const clips = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Clips.packMany(clips);
diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts
index 6214ab40ba..1e104b6bcc 100644
--- a/packages/backend/src/server/api/endpoints/users/followers.ts
+++ b/packages/backend/src/server/api/endpoints/users/followers.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users, Followings, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '@/misc/convert-host';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +34,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
: { usernameLower: ps.username!.toLowerCase(), host: toPunyNullable(ps.host) });
@@ -98,7 +82,7 @@ export default define(meta, async (ps, me) => {
.innerJoinAndSelect('following.follower', 'follower');
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollower: true });
diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts
index 76112eab25..b0a1036c76 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { Users, Followings, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { toPunyNullable } from '@/misc/convert-host';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -63,8 +34,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
: { usernameLower: ps.username!.toLowerCase(), host: toPunyNullable(ps.host) });
@@ -98,7 +82,7 @@ export default define(meta, async (ps, me) => {
.innerJoinAndSelect('following.followee', 'followee');
const followings = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
index c5f08b4c94..d7c435256c 100644
--- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
@@ -1,39 +1,29 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { GalleryPosts } from '@/models/index';
-import { makePaginationQuery } from '../../../common/make-pagination-query';
+import define from '../../../define.js';
+import { GalleryPosts } from '@/models/index.js';
+import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'gallery'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(GalleryPosts.createQueryBuilder('post'), ps.sinceId, ps.untilId)
.andWhere(`post.userId = :userId`, { userId: ps.userId });
const posts = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await GalleryPosts.packMany(posts, user);
diff --git a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
index d886d3355a..73cadc0df7 100644
--- a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -1,28 +1,15 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { maximum } from '@/prelude/array';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
+import define from '../../define.js';
+import { maximum } from '@/prelude/array.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
import { Not, In, IsNull } from 'typeorm';
-import { Notes, Users } from '@/models/index';
+import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -52,8 +39,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -104,7 +100,7 @@ export default define(meta, async (ps, me) => {
const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]);
// Extract top replied users
- const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit!);
+ const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit);
// Make replies object (includes weights)
const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({
diff --git a/packages/backend/src/server/api/endpoints/users/groups/create.ts b/packages/backend/src/server/api/endpoints/users/groups/create.ts
index 25e29de01c..9f6d8464d8 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -1,9 +1,8 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroup } from '@/models/entities/user-group';
-import { UserGroupJoining } from '@/models/entities/user-group-joining';
+import define from '../../../define.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
export const meta = {
tags: ['groups'],
@@ -12,12 +11,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -25,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userGroup = await UserGroups.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/users/groups/delete.ts b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
index f30ab78ca0..f4898a3c7c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userGroup = await UserGroups.findOne({
id: ps.groupId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
index 7061db538b..efbdf968f6 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../../define';
-import { ApiError } from '../../../../error';
-import { UserGroupJoinings, UserGroupInvitations } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroupJoining } from '@/models/entities/user-group-joining';
+import define from '../../../../define.js';
+import { ApiError } from '../../../../error.js';
+import { UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
export const meta = {
tags: ['groups', 'users'],
@@ -13,12 +11,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- invitationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchInvitation: {
message: 'No such invitation.',
@@ -28,8 +20,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ invitationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['invitationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the invitation
const invitation = await UserGroupInvitations.findOne({
id: ps.invitationId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
index f5ca3dec8b..fe5d431eab 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../../define';
-import { ApiError } from '../../../../error';
-import { UserGroupInvitations } from '@/models/index';
+import define from '../../../../define.js';
+import { ApiError } from '../../../../error.js';
+import { UserGroupInvitations } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- invitationId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchInvitation: {
message: 'No such invitation.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ invitationId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['invitationId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the invitation
const invitation = await UserGroupInvitations.findOne({
id: ps.invitationId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invite.ts b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
index 3b7a4edb81..10bfb7eca1 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -1,12 +1,10 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserGroupInvitation } from '@/models/entities/user-group-invitation';
-import { createNotification } from '@/services/create-notification';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
+import { createNotification } from '@/services/create-notification.js';
export const meta = {
tags: ['groups', 'users'],
@@ -15,16 +13,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -52,8 +40,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/joined.ts b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
index ab48b1910d..e52de78595 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/joined.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import { Not, In } from 'typeorm';
export const meta = {
@@ -20,8 +20,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ownedGroups = await UserGroups.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/groups/leave.ts b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
index d2fcdab301..c1a8c2c024 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/owned.ts b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
index 6193a71019..11aad0f73c 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/owned.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const userGroups = await UserGroups.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/groups/pull.ts b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
index 785bea140d..55ec9f915b 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchGroup: {
message: 'No such group.',
@@ -43,8 +31,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/show.ts b/packages/backend/src/server/api/endpoints/users/groups/show.ts
index eb26eac2a8..28ca1162c8 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
index 4b1c8fbbdb..f48e1ddbf0 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,9 +1,7 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserGroups, UserGroupJoinings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -12,16 +10,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -49,8 +37,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['groupId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/update.ts b/packages/backend/src/server/api/endpoints/users/groups/update.ts
index 6caf903555..b3e17dfd9e 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserGroups } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -11,16 +9,6 @@ export const meta = {
kind: 'write:user-groups',
- params: {
- groupId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ groupId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['groupId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the group
const userGroup = await UserGroups.findOne({
id: ps.groupId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/create.ts b/packages/backend/src/server/api/endpoints/users/lists/create.ts
index 945b511628..1a0599f9e7 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/create.ts
@@ -1,8 +1,7 @@
-import $ from 'cafy';
-import define from '../../../define';
-import { UserLists } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { UserList } from '@/models/entities/user-list';
+import define from '../../../define.js';
+import { UserLists } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { UserList } from '@/models/entities/user-list.js';
export const meta = {
tags: ['lists'],
@@ -11,12 +10,6 @@ export const meta = {
kind: 'write:account',
- params: {
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -24,8 +17,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userList = await UserLists.insert({
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/server/api/endpoints/users/lists/delete.ts b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
index 3183d2a09c..aeefb98c83 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -26,8 +18,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const userList = await UserLists.findOne({
id: ps.listId,
userId: user.id,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/list.ts b/packages/backend/src/server/api/endpoints/users/lists/list.ts
index ae66b0aacc..a8663ada8a 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/list.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists', 'account'],
@@ -19,8 +19,14 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {},
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const userLists = await UserLists.find({
userId: me.id,
});
diff --git a/packages/backend/src/server/api/endpoints/users/lists/pull.ts b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
index 4c74aefa8a..2c4c61d51e 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import { publishUserListStream } from '@/services/stream';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { UserLists, UserListJoinings, Users } from '@/models/index';
+import { publishUserListStream } from '@/services/stream.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { UserLists, UserListJoinings, Users } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -38,8 +26,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/push.ts b/packages/backend/src/server/api/endpoints/users/lists/push.ts
index 8b50c475b0..034a9d2db6 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/push.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/push.ts
@@ -1,10 +1,8 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { getUser } from '../../../common/getters';
-import { pushUserToUserList } from '@/services/user-list/push';
-import { UserLists, UserListJoinings, Blockings } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { getUser } from '../../../common/getters.js';
+import { pushUserToUserList } from '@/services/user-list/push.js';
+import { UserLists, UserListJoinings, Blockings } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -13,16 +11,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchList: {
message: 'No such list.',
@@ -50,8 +38,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId', 'userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/show.ts b/packages/backend/src/server/api/endpoints/users/lists/show.ts
index 06555c1a88..fadb94c90e 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/show.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists', 'account'],
@@ -11,12 +9,6 @@ export const meta = {
kind: 'read:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -32,8 +24,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['listId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/update.ts b/packages/backend/src/server/api/endpoints/users/lists/update.ts
index 02b0d5fe18..5ec99031e1 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/update.ts
@@ -1,8 +1,6 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../../define';
-import { ApiError } from '../../../error';
-import { UserLists } from '@/models/index';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
+import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -11,16 +9,6 @@ export const meta = {
kind: 'write:account',
- params: {
- listId: {
- validator: $.type(ID),
- },
-
- name: {
- validator: $.str.range(1, 100),
- },
- },
-
res: {
type: 'object',
optional: false, nullable: false,
@@ -36,8 +24,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ listId: { type: 'string', format: 'misskey:id' },
+ name: { type: 'string', minLength: 1, maxLength: 100 },
+ },
+ required: ['listId', 'name'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
// Fetch the list
const userList = await UserLists.findOne({
id: ps.listId,
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 99158fb0ae..16318d2225 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -1,70 +1,17 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { Notes } from '@/models/index';
-import { generateMutedUserQuery } from '../../common/generate-muted-user-query';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { Notes } from '@/models/index.js';
+import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { Brackets } from 'typeorm';
-import { generateBlockedUserQuery } from '../../common/generate-block-query';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query';
+import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
+import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['users', 'notes'],
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- includeReplies: {
- validator: $.optional.bool,
- default: true,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
-
- includeMyRenotes: {
- validator: $.optional.bool,
- default: true,
- },
-
- withFiles: {
- validator: $.optional.bool,
- default: false,
- },
-
- fileType: {
- validator: $.optional.arr($.str),
- },
-
- excludeNsfw: {
- validator: $.optional.bool,
- default: false,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -84,8 +31,28 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ includeReplies: { type: 'boolean', default: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ includeMyRenotes: { type: 'boolean', default: true },
+ withFiles: { type: 'boolean', default: false },
+ fileType: { type: 'array', items: {
+ type: 'string',
+ } },
+ excludeNsfw: { type: 'boolean', default: false },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
@@ -96,10 +63,16 @@ export default define(meta, async (ps, me) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.userId = :userId', { userId: user.id })
.innerJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('user.avatar', 'avatar')
+ .leftJoinAndSelect('user.banner', 'banner')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
- .leftJoinAndSelect('renote.user', 'renoteUser');
+ .leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
+ .leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
+ .leftJoinAndSelect('renote.user', 'renoteUser')
+ .leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
if (me) generateMutedUserQuery(query, me, user);
@@ -141,7 +114,7 @@ export default define(meta, async (ps, me) => {
//#endregion
- const timeline = await query.take(ps.limit!).getMany();
+ const timeline = await query.take(ps.limit).getMany();
return await Notes.packMany(timeline, me);
});
diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts
index 6e003dd1af..b8b3e8192e 100644
--- a/packages/backend/src/server/api/endpoints/users/pages.ts
+++ b/packages/backend/src/server/api/endpoints/users/pages.ts
@@ -1,40 +1,30 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { Pages } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
+import define from '../../define.js';
+import { Pages } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'pages'],
+} as const;
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
},
+ required: ['userId'],
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, user) => {
+export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Pages.createQueryBuilder('page'), ps.sinceId, ps.untilId)
.andWhere(`page.userId = :userId`, { userId: ps.userId })
.andWhere('page.visibility = \'public\'');
const pages = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Pages.packMany(pages);
diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts
index 312d4dbf23..7b55a16711 100644
--- a/packages/backend/src/server/api/endpoints/users/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/users/reactions.ts
@@ -1,43 +1,14 @@
-import $ from 'cafy';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { NoteReactions, UserProfiles } from '@/models/index';
-import { makePaginationQuery } from '../../common/make-pagination-query';
-import { generateVisibilityQuery } from '../../common/generate-visibility-query';
-import { ApiError } from '../../error';
+import define from '../../define.js';
+import { NoteReactions, UserProfiles } from '@/models/index.js';
+import { makePaginationQuery } from '../../common/make-pagination-query.js';
+import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['users', 'reactions'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- sinceId: {
- validator: $.optional.type(ID),
- },
-
- untilId: {
- validator: $.optional.type(ID),
- },
-
- sinceDate: {
- validator: $.optional.num,
- },
-
- untilDate: {
- validator: $.optional.num,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -57,8 +28,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const profile = await UserProfiles.findOneOrFail(ps.userId);
if (me == null || (me.id !== ps.userId && !profile.publicReactions)) {
@@ -73,7 +57,7 @@ export default define(meta, async (ps, me) => {
generateVisibilityQuery(query, me);
const reactions = await query
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
return await Promise.all(reactions.map(reaction => NoteReactions.pack(reaction, me, { withNote: true })));
diff --git a/packages/backend/src/server/api/endpoints/users/recommendation.ts b/packages/backend/src/server/api/endpoints/users/recommendation.ts
index 9ea39eb2dd..a8f18de522 100644
--- a/packages/backend/src/server/api/endpoints/users/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/users/recommendation.ts
@@ -1,9 +1,8 @@
import ms from 'ms';
-import $ from 'cafy';
-import define from '../../define';
-import { Users, Followings } from '@/models/index';
-import { generateMutedUserQueryForUsers } from '../../common/generate-muted-user-query';
-import { generateBlockedUserQuery, generateBlockQueryForUsers } from '../../common/generate-block-query';
+import define from '../../define.js';
+import { Users, Followings } from '@/models/index.js';
+import { generateMutedUserQueryForUsers } from '../../common/generate-muted-user-query.js';
+import { generateBlockedUserQuery, generateBlockQueryForUsers } from '../../common/generate-block-query.js';
export const meta = {
tags: ['users'],
@@ -12,18 +11,6 @@ export const meta = {
kind: 'read:account',
- params: {
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -35,8 +22,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ offset: { type: 'integer', default: 0 },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user')
.where('user.isLocked = FALSE')
.andWhere('user.isExplorable = TRUE')
@@ -58,7 +54,7 @@ export default define(meta, async (ps, me) => {
query.setParameters(followingQuery.getParameters());
- const users = await query.take(ps.limit!).skip(ps.offset).getMany();
+ const users = await query.take(ps.limit).skip(ps.offset).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts
index 7e319ca105..c6262122d4 100644
--- a/packages/backend/src/server/api/endpoints/users/relation.ts
+++ b/packages/backend/src/server/api/endpoints/users/relation.ts
@@ -1,19 +1,11 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ID } from '@/misc/cafy-id';
-import { Users } from '@/models/index';
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: true,
- params: {
- userId: {
- validator: $.either($.type(ID), $.arr($.type(ID)).unique()),
- },
- },
-
res: {
optional: false, nullable: false,
oneOf: [
@@ -101,8 +93,24 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: {
+ anyOf: [
+ { type: 'string', format: 'misskey:id' },
+ {
+ type: 'array',
+ items: { type: 'string', format: 'misskey:id' },
+ },
+ ],
+ },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const ids = Array.isArray(ps.userId) ? ps.userId : [ps.userId];
const relations = await Promise.all(ids.map(id => Users.getRelation(me.id, id)));
diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
index ed2aa7bb26..e091b8e1b1 100644
--- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts
+++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
@@ -1,30 +1,18 @@
-import $ from 'cafy';
import * as sanitizeHtml from 'sanitize-html';
-import { ID } from '@/misc/cafy-id';
-import define from '../../define';
-import { publishAdminStream } from '@/services/stream';
-import { ApiError } from '../../error';
-import { getUser } from '../../common/getters';
-import { AbuseUserReports, Users } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { sendEmail } from '@/services/send-email';
-import { fetchMeta } from '@/misc/fetch-meta';
+import define from '../../define.js';
+import { publishAdminStream } from '@/services/stream.js';
+import { ApiError } from '../../error.js';
+import { getUser } from '../../common/getters.js';
+import { AbuseUserReports, Users } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { sendEmail } from '@/services/send-email.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
export const meta = {
tags: ['users'],
requireCredential: true,
- params: {
- userId: {
- validator: $.type(ID),
- },
-
- comment: {
- validator: $.str.range(1, 2048),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -46,8 +34,17 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ comment: { type: 'string', minLength: 1, maxLength: 2048 },
+ },
+ required: ['userId', 'comment'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
// Lookup user
const user = await getUser(ps.userId).catch(e => {
if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
index d67625e624..897b5de3fe 100644
--- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
+++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
@@ -1,35 +1,14 @@
-import $ from 'cafy';
-import define from '../../define';
-import { Followings, Users } from '@/models/index';
+import define from '../../define.js';
+import { Followings, Users } from '@/models/index.js';
import { Brackets } from 'typeorm';
-import { USER_ACTIVE_THRESHOLD } from '@/const';
-import { User } from '@/models/entities/user';
+import { USER_ACTIVE_THRESHOLD } from '@/const.js';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- username: {
- validator: $.optional.nullable.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -41,8 +20,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ username: { type: 'string', nullable: true },
+ host: { type: 'string', nullable: true },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ detail: { type: 'boolean', default: true },
+ },
+ required: [],
+} as const;
+
+// TODO: avatar,bannerをJOINしたいけどエラーになる
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日
if (ps.host) {
@@ -57,7 +49,7 @@ export default define(meta, async (ps, me) => {
q.andWhere('user.updatedAt IS NOT NULL');
q.orderBy('user.updatedAt', 'DESC');
- const users = await q.take(ps.limit!).getMany();
+ const users = await q.take(ps.limit).getMany();
return await Users.packMany(users, me, { detail: ps.detail });
} else if (ps.username) {
@@ -82,10 +74,10 @@ export default define(meta, async (ps, me) => {
users = await query
.orderBy('user.usernameLower', 'ASC')
- .take(ps.limit!)
+ .take(ps.limit)
.getMany();
- if (users.length < ps.limit!) {
+ if (users.length < ps.limit) {
const otherQuery = await Users.createQueryBuilder('user')
.where(`user.id NOT IN (${ followingQuery.getQuery() })`)
.andWhere(`user.id != :meId`, { meId: me.id })
@@ -97,7 +89,7 @@ export default define(meta, async (ps, me) => {
const otherUsers = await otherQuery
.orderBy('user.updatedAt', 'DESC')
- .take(ps.limit! - users.length)
+ .take(ps.limit - users.length)
.getMany();
users = users.concat(otherUsers);
@@ -108,10 +100,12 @@ export default define(meta, async (ps, me) => {
.andWhere('user.usernameLower LIKE :username', { username: ps.username.toLowerCase() + '%' })
.andWhere('user.updatedAt IS NOT NULL')
.orderBy('user.updatedAt', 'DESC')
- .take(ps.limit! - users.length)
+ .take(ps.limit - users.length)
.getMany();
}
return await Users.packMany(users, me, { detail: !!ps.detail });
}
+
+ return [];
});
diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts
index 26f818afcc..a72a58a843 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -1,7 +1,6 @@
-import $ from 'cafy';
-import define from '../../define';
-import { UserProfiles, Users } from '@/models/index';
-import { User } from '@/models/entities/user';
+import define from '../../define.js';
+import { UserProfiles, Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
import { Brackets } from 'typeorm';
export const meta = {
@@ -9,32 +8,6 @@ export const meta = {
requireCredential: false,
- params: {
- query: {
- validator: $.str,
- },
-
- offset: {
- validator: $.optional.num.min(0),
- default: 0,
- },
-
- limit: {
- validator: $.optional.num.range(1, 100),
- default: 10,
- },
-
- origin: {
- validator: $.optional.str.or(['local', 'remote', 'combined']),
- default: 'combined',
- },
-
- detail: {
- validator: $.optional.bool,
- default: true,
- },
- },
-
res: {
type: 'array',
optional: false, nullable: false,
@@ -46,8 +19,20 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ query: { type: 'string' },
+ offset: { type: 'integer', default: 0 },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ origin: { type: 'string', enum: ['local', 'remote', 'combined'], default: "combined" },
+ detail: { type: 'boolean', default: true },
+ },
+ required: ['query'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const activeThreshold = new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)); // 30日
const isUsername = ps.query.startsWith('@');
@@ -71,7 +56,7 @@ export default define(meta, async (ps, me) => {
users = await usernameQuery
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
} else {
@@ -91,11 +76,11 @@ export default define(meta, async (ps, me) => {
users = await nameQuery
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany();
- if (users.length < ps.limit!) {
+ if (users.length < ps.limit) {
const profQuery = UserProfiles.createQueryBuilder('prof')
.select('prof.userId')
.where('prof.description ILIKE :query', { query: '%' + ps.query + '%' });
@@ -117,7 +102,7 @@ export default define(meta, async (ps, me) => {
users = users.concat(await query
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
- .take(ps.limit!)
+ .take(ps.limit)
.skip(ps.offset)
.getMany()
);
diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts
index 92910e9ed8..263c102a7a 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -1,36 +1,16 @@
-import $ from 'cafy';
-import { resolveUser } from '@/remote/resolve-user';
-import define from '../../define';
-import { apiLogger } from '../../logger';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { Users } from '@/models/index';
+import { resolveUser } from '@/remote/resolve-user.js';
+import define from '../../define.js';
+import { apiLogger } from '../../logger.js';
+import { ApiError } from '../../error.js';
+import { Users } from '@/models/index.js';
import { In } from 'typeorm';
-import { User } from '@/models/entities/user';
+import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.optional.type(ID),
- },
-
- userIds: {
- validator: $.optional.arr($.type(ID)).unique(),
- },
-
- username: {
- validator: $.optional.str,
- },
-
- host: {
- validator: $.optional.nullable.str,
- },
- },
-
res: {
optional: false, nullable: false,
oneOf: [
@@ -64,8 +44,21 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ userIds: { type: 'array', uniqueItems: true, items: {
+ type: 'string', format: 'misskey:id',
+ } },
+ username: { type: 'string' },
+ host: { type: 'string', nullable: true },
+ },
+ required: [],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
let user;
const isAdminOrModerator = me && (me.isAdmin || me.isModerator);
diff --git a/packages/backend/src/server/api/endpoints/users/stats.ts b/packages/backend/src/server/api/endpoints/users/stats.ts
index 381e433479..180a9386d3 100644
--- a/packages/backend/src/server/api/endpoints/users/stats.ts
+++ b/packages/backend/src/server/api/endpoints/users/stats.ts
@@ -1,20 +1,12 @@
-import $ from 'cafy';
-import define from '../../define';
-import { ApiError } from '../../error';
-import { ID } from '@/misc/cafy-id';
-import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
+import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
- params: {
- userId: {
- validator: $.type(ID),
- },
- },
-
errors: {
noSuchUser: {
message: 'No such user.',
@@ -24,8 +16,16 @@ export const meta = {
},
} as const;
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
+export default define(meta, paramDef, async (ps, me) => {
const user = await Users.findOne(ps.userId);
if (user == null) {
throw new ApiError(meta.errors.noSuchUser);
diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts
index 8f8a9d999e..ba2a71951c 100644
--- a/packages/backend/src/server/api/index.ts
+++ b/packages/backend/src/server/api/index.ts
@@ -2,22 +2,22 @@
* API Server
*/
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
-import * as multer from '@koa/multer';
-import * as bodyParser from 'koa-bodyparser';
-import * as cors from '@koa/cors';
+import Koa from 'koa';
+import Router from '@koa/router';
+import multer from '@koa/multer';
+import bodyParser from 'koa-bodyparser';
+import cors from '@koa/cors';
-import endpoints from './endpoints';
-import handler from './api-handler';
-import signup from './private/signup';
-import signin from './private/signin';
-import signupPending from './private/signup-pending';
-import discord from './service/discord';
-import github from './service/github';
-import twitter from './service/twitter';
-import { Instances, AccessTokens, Users } from '@/models/index';
-import config from '@/config';
+import endpoints from './endpoints.js';
+import handler from './api-handler.js';
+import signup from './private/signup.js';
+import signin from './private/signin.js';
+import signupPending from './private/signup-pending.js';
+import discord from './service/discord.js';
+import github from './service/github.js';
+import twitter from './service/twitter.js';
+import { Instances, AccessTokens, Users } from '@/models/index.js';
+import config from '@/config/index.js';
// Init app
const app = new Koa();
diff --git a/packages/backend/src/server/api/limiter.ts b/packages/backend/src/server/api/limiter.ts
index 4721f6263a..7e6b93b39f 100644
--- a/packages/backend/src/server/api/limiter.ts
+++ b/packages/backend/src/server/api/limiter.ts
@@ -1,9 +1,9 @@
-import * as Limiter from 'ratelimiter';
-import { redisClient } from '../../db/redis';
-import { IEndpoint } from './endpoints';
-import * as Acct from 'misskey-js/built/acct';
-import { User } from '@/models/entities/user';
-import Logger from '@/services/logger';
+import Limiter from 'ratelimiter';
+import { redisClient } from '../../db/redis.js';
+import { IEndpoint } from './endpoints.js';
+import * as Acct from '@/misc/acct.js';
+import { User } from '@/models/entities/user.js';
+import Logger from '@/services/logger.js';
const logger = new Logger('limiter');
diff --git a/packages/backend/src/server/api/logger.ts b/packages/backend/src/server/api/logger.ts
index 750defe547..ec22d6c3e2 100644
--- a/packages/backend/src/server/api/logger.ts
+++ b/packages/backend/src/server/api/logger.ts
@@ -1,3 +1,3 @@
-import Logger from '@/services/logger';
+import Logger from '@/services/logger.js';
export const apiLogger = new Logger('api');
diff --git a/packages/backend/src/server/api/openapi/gen-spec.ts b/packages/backend/src/server/api/openapi/gen-spec.ts
index 1efef8d26d..c6e557aefb 100644
--- a/packages/backend/src/server/api/openapi/gen-spec.ts
+++ b/packages/backend/src/server/api/openapi/gen-spec.ts
@@ -1,8 +1,7 @@
-import endpoints from '../endpoints';
-import { Context } from 'cafy';
-import config from '@/config/index';
-import { errors as basicErrors } from './errors';
-import { schemas, convertSchemaToOpenApiSchema } from './schemas';
+import endpoints from '../endpoints.js';
+import config from '@/config/index.js';
+import { errors as basicErrors } from './errors.js';
+import { schemas, convertSchemaToOpenApiSchema } from './schemas.js';
export function genOpenapiSpec(lang = 'ja-JP') {
const spec = {
@@ -38,47 +37,7 @@ export function genOpenapiSpec(lang = 'ja-JP') {
},
};
- function genProps(props: { [key: string]: Context; }) {
- const properties = {} as any;
-
- for (const [k, v] of Object.entries(props)) {
- properties[k] = genProp(v);
- }
-
- return properties;
- }
-
- function genProp(param: Context): any {
- const required = param.name === 'Object' ? (param as any).props ? Object.entries((param as any).props).filter(([k, v]: any) => !v.isOptional).map(([k, v]) => k) : [] : [];
- return {
- description: (param.data || {}).desc,
- default: (param.data || {}).default,
- deprecated: (param.data || {}).deprecated,
- ...((param.data || {}).default ? { default: (param.data || {}).default } : {}),
- type: param.name === 'ID' ? 'string' : param.name.toLowerCase(),
- ...(param.name === 'ID' ? { example: 'xxxxxxxxxx', format: 'id' } : {}),
- nullable: param.isNullable,
- ...(param.name === 'String' ? {
- ...((param as any).enum ? { enum: (param as any).enum } : {}),
- ...((param as any).minLength ? { minLength: (param as any).minLength } : {}),
- ...((param as any).maxLength ? { maxLength: (param as any).maxLength } : {}),
- } : {}),
- ...(param.name === 'Number' ? {
- ...((param as any).minimum ? { minimum: (param as any).minimum } : {}),
- ...((param as any).maximum ? { maximum: (param as any).maximum } : {}),
- } : {}),
- ...(param.name === 'Object' ? {
- ...(required.length > 0 ? { required } : {}),
- properties: (param as any).props ? genProps((param as any).props) : {},
- } : {}),
- ...(param.name === 'Array' ? {
- items: (param as any).ctx ? genProp((param as any).ctx) : {},
- } : {}),
- };
- }
-
for (const endpoint of endpoints.filter(ep => !ep.meta.secure)) {
- const porops = {} as any;
const errors = {} as any;
if (endpoint.meta.errors) {
@@ -91,21 +50,9 @@ export function genOpenapiSpec(lang = 'ja-JP') {
}
}
- if (endpoint.meta.params) {
- for (const [k, v] of Object.entries(endpoint.meta.params)) {
- if (v.validator.data == null) v.validator.data = {};
- if (v.desc) v.validator.data.desc = v.desc[lang];
- if (v.deprecated) v.validator.data.deprecated = v.deprecated;
- if (v.default) v.validator.data.default = v.default;
- porops[k] = v.validator;
- }
- }
-
- const required = endpoint.meta.params ? Object.entries(endpoint.meta.params).filter(([k, v]) => !v.validator.isOptional).map(([k, v]) => k) : [];
-
const resSchema = endpoint.meta.res ? convertSchemaToOpenApiSchema(endpoint.meta.res) : {};
- let desc = (endpoint.meta.desc ? endpoint.meta.desc[lang] : 'No description provided.') + '\n\n';
+ let desc = (endpoint.meta.description ? endpoint.meta.description : 'No description provided.') + '\n\n';
desc += `**Credential required**: *${endpoint.meta.requireCredential ? 'Yes' : 'No'}*`;
if (endpoint.meta.kind) {
const kind = endpoint.meta.kind;
@@ -132,11 +79,7 @@ export function genOpenapiSpec(lang = 'ja-JP') {
required: true,
content: {
'application/json': {
- schema: {
- type: 'object',
- ...(required.length > 0 ? { required } : {}),
- properties: endpoint.meta.params ? genProps(porops) : {},
- },
+ schema: endpoint.params,
},
},
},
diff --git a/packages/backend/src/server/api/openapi/schemas.ts b/packages/backend/src/server/api/openapi/schemas.ts
index eb42667fd5..14bef9cab1 100644
--- a/packages/backend/src/server/api/openapi/schemas.ts
+++ b/packages/backend/src/server/api/openapi/schemas.ts
@@ -1,6 +1,6 @@
-import { refs, MinimumSchema } from '@/misc/schema';
+import { refs, Schema } from '@/misc/schema.js';
-export function convertSchemaToOpenApiSchema(schema: MinimumSchema) {
+export function convertSchemaToOpenApiSchema(schema: Schema) {
const res: any = schema;
if (schema.type === 'object' && schema.properties) {
diff --git a/packages/backend/src/server/api/private/signin.ts b/packages/backend/src/server/api/private/signin.ts
index 7b733b768d..b0f88948a0 100644
--- a/packages/backend/src/server/api/private/signin.ts
+++ b/packages/backend/src/server/api/private/signin.ts
@@ -1,13 +1,13 @@
-import * as Koa from 'koa';
-import * as bcrypt from 'bcryptjs';
+import Koa from 'koa';
+import bcrypt from 'bcryptjs';
import * as speakeasy from 'speakeasy';
-import signin from '../common/signin';
-import config from '@/config/index';
-import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '@/models/index';
-import { ILocalUser } from '@/models/entities/user';
-import { genId } from '@/misc/gen-id';
-import { verifyLogin, hash } from '../2fa';
-import { randomBytes } from 'crypto';
+import signin from '../common/signin.js';
+import config from '@/config/index.js';
+import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '@/models/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { genId } from '@/misc/gen-id.js';
+import { verifyLogin, hash } from '../2fa.js';
+import { randomBytes } from 'node:crypto';
export default async (ctx: Koa.Context) => {
ctx.set('Access-Control-Allow-Origin', config.url);
diff --git a/packages/backend/src/server/api/private/signup-pending.ts b/packages/backend/src/server/api/private/signup-pending.ts
index c0638a1cda..1a667ddb43 100644
--- a/packages/backend/src/server/api/private/signup-pending.ts
+++ b/packages/backend/src/server/api/private/signup-pending.ts
@@ -1,7 +1,7 @@
-import * as Koa from 'koa';
-import { Users, UserPendings, UserProfiles } from '@/models/index';
-import { signup } from '../common/signup';
-import signin from '../common/signin';
+import Koa from 'koa';
+import { Users, UserPendings, UserProfiles } from '@/models/index.js';
+import { signup } from '../common/signup.js';
+import signin from '../common/signin.js';
export default async (ctx: Koa.Context) => {
const body = ctx.request.body;
diff --git a/packages/backend/src/server/api/private/signup.ts b/packages/backend/src/server/api/private/signup.ts
index eaab8e7111..01f284a57f 100644
--- a/packages/backend/src/server/api/private/signup.ts
+++ b/packages/backend/src/server/api/private/signup.ts
@@ -1,14 +1,14 @@
-import * as Koa from 'koa';
+import Koa from 'koa';
import rndstr from 'rndstr';
-import * as bcrypt from 'bcryptjs';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { verifyHcaptcha, verifyRecaptcha } from '@/misc/captcha';
-import { Users, RegistrationTickets, UserPendings } from '@/models/index';
-import { signup } from '../common/signup';
-import config from '@/config';
-import { sendEmail } from '@/services/send-email';
-import { genId } from '@/misc/gen-id';
-import { validateEmailForAccount } from '@/services/validate-email-for-account';
+import bcrypt from 'bcryptjs';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { verifyHcaptcha, verifyRecaptcha } from '@/misc/captcha.js';
+import { Users, RegistrationTickets, UserPendings } from '@/models/index.js';
+import { signup } from '../common/signup.js';
+import config from '@/config/index.js';
+import { sendEmail } from '@/services/send-email.js';
+import { genId } from '@/misc/gen-id.js';
+import { validateEmailForAccount } from '@/services/validate-email-for-account.js';
export default async (ctx: Koa.Context) => {
const body = ctx.request.body;
@@ -38,7 +38,7 @@ export default async (ctx: Koa.Context) => {
const emailAddress = body['emailAddress'];
if (instance.emailRequiredForSignup) {
- if (emailAddress == null || typeof emailAddress != 'string') {
+ if (emailAddress == null || typeof emailAddress !== 'string') {
ctx.status = 400;
return;
}
@@ -51,7 +51,7 @@ export default async (ctx: Koa.Context) => {
}
if (instance.disableRegistration) {
- if (invitationCode == null || typeof invitationCode != 'string') {
+ if (invitationCode == null || typeof invitationCode !== 'string') {
ctx.status = 400;
return;
}
diff --git a/packages/backend/src/server/api/service/discord.ts b/packages/backend/src/server/api/service/discord.ts
index f574fe3878..089f7de0cd 100644
--- a/packages/backend/src/server/api/service/discord.ts
+++ b/packages/backend/src/server/api/service/discord.ts
@@ -1,28 +1,28 @@
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
-import { getJson } from '@/misc/fetch';
+import Koa from 'koa';
+import Router from '@koa/router';
+import { getJson } from '@/misc/fetch.js';
import { OAuth2 } from 'oauth';
-import config from '@/config/index';
-import { publishMainStream } from '@/services/stream';
-import { redisClient } from '../../../db/redis';
+import config from '@/config/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { redisClient } from '../../../db/redis.js';
import { v4 as uuid } from 'uuid';
-import signin from '../common/signin';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Users, UserProfiles } from '@/models/index';
-import { ILocalUser } from '@/models/entities/user';
+import signin from '../common/signin.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Users, UserProfiles } from '@/models/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
-function getUserToken(ctx: Koa.Context) {
+function getUserToken(ctx: Koa.BaseContext): string | null {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
}
-function compareOrigin(ctx: Koa.Context) {
- function normalizeUrl(url: string) {
+function compareOrigin(ctx: Koa.BaseContext): boolean {
+ function normalizeUrl(url?: string): string {
return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : '';
}
const referer = ctx.headers['referer'];
- return (normalizeUrl(referer) == normalizeUrl(config.url));
+ return (normalizeUrl(referer) === normalizeUrl(config.url));
}
// Init router
diff --git a/packages/backend/src/server/api/service/github.ts b/packages/backend/src/server/api/service/github.ts
index 5e0839df93..ce032db181 100644
--- a/packages/backend/src/server/api/service/github.ts
+++ b/packages/backend/src/server/api/service/github.ts
@@ -1,28 +1,28 @@
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
-import { getJson } from '@/misc/fetch';
+import Koa from 'koa';
+import Router from '@koa/router';
+import { getJson } from '@/misc/fetch.js';
import { OAuth2 } from 'oauth';
-import config from '@/config/index';
-import { publishMainStream } from '@/services/stream';
-import { redisClient } from '../../../db/redis';
+import config from '@/config/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { redisClient } from '../../../db/redis.js';
import { v4 as uuid } from 'uuid';
-import signin from '../common/signin';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Users, UserProfiles } from '@/models/index';
-import { ILocalUser } from '@/models/entities/user';
+import signin from '../common/signin.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Users, UserProfiles } from '@/models/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
-function getUserToken(ctx: Koa.Context) {
+function getUserToken(ctx: Koa.BaseContext): string | null {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
}
-function compareOrigin(ctx: Koa.Context) {
- function normalizeUrl(url: string) {
+function compareOrigin(ctx: Koa.BaseContext): boolean {
+ function normalizeUrl(url?: string): string {
return url ? url.endsWith('/') ? url.substr(0, url.length - 1) : url : '';
}
const referer = ctx.headers['referer'];
- return (normalizeUrl(referer) == normalizeUrl(config.url));
+ return (normalizeUrl(referer) === normalizeUrl(config.url));
}
// Init router
diff --git a/packages/backend/src/server/api/service/twitter.ts b/packages/backend/src/server/api/service/twitter.ts
index 8659b82cbe..e6e4398fa2 100644
--- a/packages/backend/src/server/api/service/twitter.ts
+++ b/packages/backend/src/server/api/service/twitter.ts
@@ -1,27 +1,27 @@
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
+import Koa from 'koa';
+import Router from '@koa/router';
import { v4 as uuid } from 'uuid';
import autwh from 'autwh';
-import { redisClient } from '../../../db/redis';
-import { publishMainStream } from '@/services/stream';
-import config from '@/config/index';
-import signin from '../common/signin';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Users, UserProfiles } from '@/models/index';
-import { ILocalUser } from '@/models/entities/user';
+import { redisClient } from '../../../db/redis.js';
+import { publishMainStream } from '@/services/stream.js';
+import config from '@/config/index.js';
+import signin from '../common/signin.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Users, UserProfiles } from '@/models/index.js';
+import { ILocalUser } from '@/models/entities/user.js';
-function getUserToken(ctx: Koa.Context) {
+function getUserToken(ctx: Koa.BaseContext): string | null {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
}
-function compareOrigin(ctx: Koa.Context) {
- function normalizeUrl(url: string) {
- return url.endsWith('/') ? url.substr(0, url.length - 1) : url;
+function compareOrigin(ctx: Koa.BaseContext): boolean {
+ function normalizeUrl(url?: string): string {
+ return url == null ? '' : url.endsWith('/') ? url.substr(0, url.length - 1) : url;
}
const referer = ctx.headers['referer'];
- return (normalizeUrl(referer) == normalizeUrl(config.url));
+ return (normalizeUrl(referer) === normalizeUrl(config.url));
}
// Init router
diff --git a/packages/backend/src/server/api/stream/channel.ts b/packages/backend/src/server/api/stream/channel.ts
index 98337bb318..d2cc5122d5 100644
--- a/packages/backend/src/server/api/stream/channel.ts
+++ b/packages/backend/src/server/api/stream/channel.ts
@@ -1,4 +1,3 @@
-import autobind from 'autobind-decorator';
import Connection from '.';
/**
@@ -44,7 +43,6 @@ export default abstract class Channel {
this.connection = connection;
}
- @autobind
public send(typeOrPayload: any, payload?: any) {
const type = payload === undefined ? typeOrPayload.type : typeOrPayload;
const body = payload === undefined ? typeOrPayload.body : payload;
diff --git a/packages/backend/src/server/api/stream/channels/admin.ts b/packages/backend/src/server/api/stream/channels/admin.ts
index 1ff932d1dd..945182ea10 100644
--- a/packages/backend/src/server/api/stream/channels/admin.ts
+++ b/packages/backend/src/server/api/stream/channels/admin.ts
@@ -1,12 +1,10 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
+import Channel from '../channel.js';
export default class extends Channel {
public readonly chName = 'admin';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
public async init(params: any) {
// Subscribe admin stream
this.subscriber.on(`adminStream:${this.user!.id}`, data => {
diff --git a/packages/backend/src/server/api/stream/channels/antenna.ts b/packages/backend/src/server/api/stream/channels/antenna.ts
index 3cbdfebb43..afd14946e1 100644
--- a/packages/backend/src/server/api/stream/channels/antenna.ts
+++ b/packages/backend/src/server/api/stream/channels/antenna.ts
@@ -1,9 +1,8 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
-import { Notes } from '@/models/index';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { StreamMessages } from '../types';
+import Channel from '../channel.js';
+import { Notes } from '@/models/index.js';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { StreamMessages } from '../types.js';
export default class extends Channel {
public readonly chName = 'antenna';
@@ -11,7 +10,11 @@ export default class extends Channel {
public static requireCredential = false;
private antennaId: string;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onEvent = this.onEvent.bind(this);
+ }
+
public async init(params: any) {
this.antennaId = params.antennaId as string;
@@ -19,7 +22,6 @@ export default class extends Channel {
this.subscriber.on(`antennaStream:${this.antennaId}`, this.onEvent);
}
- @autobind
private async onEvent(data: StreamMessages['antenna']['payload']) {
if (data.type === 'note') {
const note = await Notes.pack(data.body.id, this.user, { detail: true });
@@ -37,7 +39,6 @@ export default class extends Channel {
}
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off(`antennaStream:${this.antennaId}`, this.onEvent);
diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts
index 1e51a81c4b..16ad809395 100644
--- a/packages/backend/src/server/api/stream/channels/channel.ts
+++ b/packages/backend/src/server/api/stream/channels/channel.ts
@@ -1,11 +1,10 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
-import { Notes, Users } from '@/models/index';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { User } from '@/models/entities/user';
-import { StreamMessages } from '../types';
-import { Packed } from '@/misc/schema';
+import Channel from '../channel.js';
+import { Notes, Users } from '@/models/index.js';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { User } from '@/models/entities/user.js';
+import { StreamMessages } from '../types.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'channel';
@@ -15,7 +14,11 @@ export default class extends Channel {
private typers: Record<User['id'], Date> = {};
private emitTypersIntervalId: ReturnType<typeof setInterval>;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
this.channelId = params.channelId as string;
@@ -25,7 +28,6 @@ export default class extends Channel {
this.emitTypersIntervalId = setInterval(this.emitTypers, 5000);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
if (note.channelId !== this.channelId) return;
@@ -52,7 +54,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
private onEvent(data: StreamMessages['channel']['payload']) {
if (data.type === 'typing') {
const id = data.body;
@@ -64,7 +65,6 @@ export default class extends Channel {
}
}
- @autobind
private async emitTypers() {
const now = new Date();
@@ -81,7 +81,6 @@ export default class extends Channel {
});
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/drive.ts b/packages/backend/src/server/api/stream/channels/drive.ts
index 4112dd9b04..140255acd1 100644
--- a/packages/backend/src/server/api/stream/channels/drive.ts
+++ b/packages/backend/src/server/api/stream/channels/drive.ts
@@ -1,12 +1,10 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
+import Channel from '../channel.js';
export default class extends Channel {
public readonly chName = 'drive';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
public async init(params: any) {
// Subscribe drive stream
this.subscriber.on(`driveStream:${this.user!.id}`, data => {
diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts
index f14f597aac..1c7e038ab2 100644
--- a/packages/backend/src/server/api/stream/channels/global-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts
@@ -1,19 +1,22 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { isInstanceMuted } from '@/misc/is-instance-muted';
-import { Packed } from '@/misc/schema';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import Channel from '../channel.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { checkWordMute } from '@/misc/check-word-mute.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { isInstanceMuted } from '@/misc/is-instance-muted.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'globalTimeline';
public static shouldShare = true;
public static requireCredential = false;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
const meta = await fetchMeta();
if (meta.disableGlobalTimeline) {
@@ -24,7 +27,6 @@ export default class extends Channel {
this.subscriber.on('notesStream', this.onNote);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
if (note.visibility !== 'public') return;
if (note.channelId != null) return;
@@ -43,7 +45,7 @@ export default class extends Channel {
}
// 関係ない返信は除外
- if (note.reply) {
+ if (note.reply && !this.user!.showTimelineReplies) {
const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
@@ -69,7 +71,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/hashtag.ts b/packages/backend/src/server/api/stream/channels/hashtag.ts
index 820095dfcf..1b7a58022f 100644
--- a/packages/backend/src/server/api/stream/channels/hashtag.ts
+++ b/packages/backend/src/server/api/stream/channels/hashtag.ts
@@ -1,10 +1,9 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { Notes } from '@/models/index';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { Packed } from '@/misc/schema';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import Channel from '../channel.js';
+import { Notes } from '@/models/index.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'hashtag';
@@ -12,7 +11,11 @@ export default class extends Channel {
public static requireCredential = false;
private q: string[][];
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
this.q = params.q;
@@ -22,7 +25,6 @@ export default class extends Channel {
this.subscriber.on('notesStream', this.onNote);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
const noteTags = note.tags ? note.tags.map((t: string) => t.toLowerCase()) : [];
const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag))));
@@ -45,7 +47,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts
index 3bd491421d..3a8e55202a 100644
--- a/packages/backend/src/server/api/stream/channels/home-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts
@@ -1,24 +1,26 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { Notes } from '@/models/index';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { isInstanceMuted } from '@/misc/is-instance-muted';
-import { Packed } from '@/misc/schema';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import Channel from '../channel.js';
+import { Notes } from '@/models/index.js';
+import { checkWordMute } from '@/misc/check-word-mute.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { isInstanceMuted } from '@/misc/is-instance-muted.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'homeTimeline';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
// Subscribe events
this.subscriber.on('notesStream', this.onNote);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
if (note.channelId) {
if (!this.followingChannels.has(note.channelId)) return;
@@ -54,7 +56,7 @@ export default class extends Channel {
}
// 関係ない返信は除外
- if (note.reply) {
+ if (note.reply && !this.user!.showTimelineReplies) {
const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
@@ -77,7 +79,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
index 0ae19aa7ce..f3ceeffa1a 100644
--- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts
@@ -1,19 +1,22 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { isInstanceMuted } from '@/misc/is-instance-muted';
-import { Packed } from '@/misc/schema';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import Channel from '../channel.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { checkWordMute } from '@/misc/check-word-mute.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { isInstanceMuted } from '@/misc/is-instance-muted.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'hybridTimeline';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
const meta = await fetchMeta();
if (meta.disableLocalTimeline && !this.user!.isAdmin && !this.user!.isModerator) return;
@@ -22,7 +25,6 @@ export default class extends Channel {
this.subscriber.on('notesStream', this.onNote);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
// チャンネルの投稿ではなく、自分自身の投稿 または
// チャンネルの投稿ではなく、その投稿のユーザーをフォローしている または
@@ -62,7 +64,7 @@ export default class extends Channel {
if (isInstanceMuted(note, new Set<string>(this.userProfile?.mutedInstances ?? []))) return;
// 関係ない返信は除外
- if (note.reply) {
+ if (note.reply && !this.user!.showTimelineReplies) {
const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
@@ -85,7 +87,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/index.ts b/packages/backend/src/server/api/stream/channels/index.ts
index f3826c4cf7..d422edde87 100644
--- a/packages/backend/src/server/api/stream/channels/index.ts
+++ b/packages/backend/src/server/api/stream/channels/index.ts
@@ -1,18 +1,18 @@
-import main from './main';
-import homeTimeline from './home-timeline';
-import localTimeline from './local-timeline';
-import hybridTimeline from './hybrid-timeline';
-import globalTimeline from './global-timeline';
-import serverStats from './server-stats';
-import queueStats from './queue-stats';
-import userList from './user-list';
-import antenna from './antenna';
-import messaging from './messaging';
-import messagingIndex from './messaging-index';
-import drive from './drive';
-import hashtag from './hashtag';
-import channel from './channel';
-import admin from './admin';
+import main from './main.js';
+import homeTimeline from './home-timeline.js';
+import localTimeline from './local-timeline.js';
+import hybridTimeline from './hybrid-timeline.js';
+import globalTimeline from './global-timeline.js';
+import serverStats from './server-stats.js';
+import queueStats from './queue-stats.js';
+import userList from './user-list.js';
+import antenna from './antenna.js';
+import messaging from './messaging.js';
+import messagingIndex from './messaging-index.js';
+import drive from './drive.js';
+import hashtag from './hashtag.js';
+import channel from './channel.js';
+import admin from './admin.js';
export default {
main,
diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts
index 3178b1d511..4e198482a0 100644
--- a/packages/backend/src/server/api/stream/channels/local-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts
@@ -1,18 +1,21 @@
-import autobind from 'autobind-decorator';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import Channel from '../channel';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Notes } from '@/models/index';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { Packed } from '@/misc/schema';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import Channel from '../channel.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { checkWordMute } from '@/misc/check-word-mute.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'localTimeline';
public static shouldShare = true;
public static requireCredential = false;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
const meta = await fetchMeta();
if (meta.disableLocalTimeline) {
@@ -23,7 +26,6 @@ export default class extends Channel {
this.subscriber.on('notesStream', this.onNote);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
if (note.user.host !== null) return;
if (note.visibility !== 'public') return;
@@ -43,7 +45,7 @@ export default class extends Channel {
}
// 関係ない返信は除外
- if (note.reply) {
+ if (note.reply && !this.user!.showTimelineReplies) {
const reply = note.reply;
// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合
if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return;
@@ -66,7 +68,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off('notesStream', this.onNote);
diff --git a/packages/backend/src/server/api/stream/channels/main.ts b/packages/backend/src/server/api/stream/channels/main.ts
index b41eae7c71..9cfea0bfc4 100644
--- a/packages/backend/src/server/api/stream/channels/main.ts
+++ b/packages/backend/src/server/api/stream/channels/main.ts
@@ -1,14 +1,12 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
-import { Notes } from '@/models/index';
-import { isInstanceMuted, isUserFromMutedInstance } from '@/misc/is-instance-muted';
+import Channel from '../channel.js';
+import { Notes } from '@/models/index.js';
+import { isInstanceMuted, isUserFromMutedInstance } from '@/misc/is-instance-muted.js';
export default class extends Channel {
public readonly chName = 'main';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
public async init(params: any) {
// Subscribe main stream channel
this.subscriber.on(`mainStream:${this.user!.id}`, async data => {
diff --git a/packages/backend/src/server/api/stream/channels/messaging-index.ts b/packages/backend/src/server/api/stream/channels/messaging-index.ts
index 0c495398ab..b930785d20 100644
--- a/packages/backend/src/server/api/stream/channels/messaging-index.ts
+++ b/packages/backend/src/server/api/stream/channels/messaging-index.ts
@@ -1,12 +1,10 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
+import Channel from '../channel.js';
export default class extends Channel {
public readonly chName = 'messagingIndex';
public static shouldShare = true;
public static requireCredential = true;
- @autobind
public async init(params: any) {
// Subscribe messaging index stream
this.subscriber.on(`messagingIndexStream:${this.user!.id}`, data => {
diff --git a/packages/backend/src/server/api/stream/channels/messaging.ts b/packages/backend/src/server/api/stream/channels/messaging.ts
index d8fccf0763..94bbdeca52 100644
--- a/packages/backend/src/server/api/stream/channels/messaging.ts
+++ b/packages/backend/src/server/api/stream/channels/messaging.ts
@@ -1,10 +1,9 @@
-import autobind from 'autobind-decorator';
-import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message';
-import Channel from '../channel';
-import { UserGroupJoinings, Users, MessagingMessages } from '@/models/index';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { UserGroup } from '@/models/entities/user-group';
-import { StreamMessages } from '../types';
+import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message.js';
+import Channel from '../channel.js';
+import { UserGroupJoinings, Users, MessagingMessages } from '@/models/index.js';
+import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { StreamMessages } from '../types.js';
export default class extends Channel {
public readonly chName = 'messaging';
@@ -18,7 +17,13 @@ export default class extends Channel {
private typers: Record<User['id'], Date> = {};
private emitTypersIntervalId: ReturnType<typeof setInterval>;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onEvent = this.onEvent.bind(this);
+ this.onMessage = this.onMessage.bind(this);
+ this.emitTypers = this.emitTypers.bind(this);
+ }
+
public async init(params: any) {
this.otherpartyId = params.otherparty;
this.otherparty = this.otherpartyId ? await Users.findOneOrFail({ id: this.otherpartyId }) : null;
@@ -46,7 +51,6 @@ export default class extends Channel {
this.subscriber.on(this.subCh, this.onEvent);
}
- @autobind
private onEvent(data: StreamMessages['messaging']['payload'] | StreamMessages['groupMessaging']['payload']) {
if (data.type === 'typing') {
const id = data.body;
@@ -60,7 +64,6 @@ export default class extends Channel {
}
}
- @autobind
public onMessage(type: string, body: any) {
switch (type) {
case 'read':
@@ -80,7 +83,6 @@ export default class extends Channel {
}
}
- @autobind
private async emitTypers() {
const now = new Date();
@@ -97,7 +99,6 @@ export default class extends Channel {
});
}
- @autobind
public dispose() {
this.subscriber.off(this.subCh, this.onEvent);
diff --git a/packages/backend/src/server/api/stream/channels/queue-stats.ts b/packages/backend/src/server/api/stream/channels/queue-stats.ts
index be18438fa3..043d03ab8d 100644
--- a/packages/backend/src/server/api/stream/channels/queue-stats.ts
+++ b/packages/backend/src/server/api/stream/channels/queue-stats.ts
@@ -1,25 +1,27 @@
-import autobind from 'autobind-decorator';
-import Xev from 'xev';
-import Channel from '../channel';
+import { default as Xev } from 'xev';
+import Channel from '../channel.js';
-const ev = new Xev();
+const ev = new Xev.default();
export default class extends Channel {
public readonly chName = 'queueStats';
public static shouldShare = true;
public static requireCredential = false;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onStats = this.onStats.bind(this);
+ this.onMessage = this.onMessage.bind(this);
+ }
+
public async init(params: any) {
ev.addListener('queueStats', this.onStats);
}
- @autobind
private onStats(stats: any) {
this.send('stats', stats);
}
- @autobind
public onMessage(type: string, body: any) {
switch (type) {
case 'requestLog':
@@ -34,7 +36,6 @@ export default class extends Channel {
}
}
- @autobind
public dispose() {
ev.removeListener('queueStats', this.onStats);
}
diff --git a/packages/backend/src/server/api/stream/channels/server-stats.ts b/packages/backend/src/server/api/stream/channels/server-stats.ts
index df89b4c750..0da1895767 100644
--- a/packages/backend/src/server/api/stream/channels/server-stats.ts
+++ b/packages/backend/src/server/api/stream/channels/server-stats.ts
@@ -1,25 +1,27 @@
-import autobind from 'autobind-decorator';
-import Xev from 'xev';
-import Channel from '../channel';
+import { default as Xev } from 'xev';
+import Channel from '../channel.js';
-const ev = new Xev();
+const ev = new Xev.default();
export default class extends Channel {
public readonly chName = 'serverStats';
public static shouldShare = true;
public static requireCredential = false;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.onStats = this.onStats.bind(this);
+ this.onMessage = this.onMessage.bind(this);
+ }
+
public async init(params: any) {
ev.addListener('serverStats', this.onStats);
}
- @autobind
private onStats(stats: any) {
this.send('stats', stats);
}
- @autobind
public onMessage(type: string, body: any) {
switch (type) {
case 'requestLog':
@@ -34,7 +36,6 @@ export default class extends Channel {
}
}
- @autobind
public dispose() {
ev.removeListener('serverStats', this.onStats);
}
diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts
index b75920a180..57523c8488 100644
--- a/packages/backend/src/server/api/stream/channels/user-list.ts
+++ b/packages/backend/src/server/api/stream/channels/user-list.ts
@@ -1,10 +1,9 @@
-import autobind from 'autobind-decorator';
-import Channel from '../channel';
-import { Notes, UserListJoinings, UserLists } from '@/models/index';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import { User } from '@/models/entities/user';
-import { isBlockerUserRelated } from '@/misc/is-blocker-user-related';
-import { Packed } from '@/misc/schema';
+import Channel from '../channel.js';
+import { Notes, UserListJoinings, UserLists } from '@/models/index.js';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import { User } from '@/models/entities/user.js';
+import { isBlockerUserRelated } from '@/misc/is-blocker-user-related.js';
+import { Packed } from '@/misc/schema.js';
export default class extends Channel {
public readonly chName = 'userList';
@@ -14,7 +13,12 @@ export default class extends Channel {
public listUsers: User['id'][] = [];
private listUsersClock: NodeJS.Timer;
- @autobind
+ constructor(id: string, connection: Channel['connection']) {
+ super(id, connection);
+ this.updateListUsers = this.updateListUsers.bind(this);
+ this.onNote = this.onNote.bind(this);
+ }
+
public async init(params: any) {
this.listId = params.listId as string;
@@ -34,7 +38,6 @@ export default class extends Channel {
this.listUsersClock = setInterval(this.updateListUsers, 5000);
}
- @autobind
private async updateListUsers() {
const users = await UserListJoinings.find({
where: {
@@ -46,7 +49,6 @@ export default class extends Channel {
this.listUsers = users.map(x => x.userId);
}
- @autobind
private async onNote(note: Packed<'Note'>) {
if (!this.listUsers.includes(note.userId)) return;
@@ -81,7 +83,6 @@ export default class extends Channel {
this.send('note', note);
}
- @autobind
public dispose() {
// Unsubscribe events
this.subscriber.off(`userListStream:${this.listId}`, this.send);
diff --git a/packages/backend/src/server/api/stream/index.ts b/packages/backend/src/server/api/stream/index.ts
index 84689bca1a..0cb38e2a99 100644
--- a/packages/backend/src/server/api/stream/index.ts
+++ b/packages/backend/src/server/api/stream/index.ts
@@ -1,21 +1,20 @@
-import autobind from 'autobind-decorator';
import * as websocket from 'websocket';
-import { readNotification } from '../common/read-notification';
-import call from '../call';
-import readNote from '@/services/note/read';
-import Channel from './channel';
-import channels from './channels/index';
+import { readNotification } from '../common/read-notification.js';
+import call from '../call.js';
+import readNote from '@/services/note/read.js';
+import Channel from './channel.js';
+import channels from './channels/index.js';
import { EventEmitter } from 'events';
-import { User } from '@/models/entities/user';
-import { Channel as ChannelModel } from '@/models/entities/channel';
-import { Users, Followings, Mutings, UserProfiles, ChannelFollowings, Blockings } from '@/models/index';
-import { ApiError } from '../error';
-import { AccessToken } from '@/models/entities/access-token';
-import { UserProfile } from '@/models/entities/user-profile';
-import { publishChannelStream, publishGroupMessagingStream, publishMessagingStream } from '@/services/stream';
-import { UserGroup } from '@/models/entities/user-group';
-import { StreamEventEmitter, StreamMessages } from './types';
-import { Packed } from '@/misc/schema';
+import { User } from '@/models/entities/user.js';
+import { Channel as ChannelModel } from '@/models/entities/channel.js';
+import { Users, Followings, Mutings, UserProfiles, ChannelFollowings, Blockings } from '@/models/index.js';
+import { ApiError } from '../error.js';
+import { AccessToken } from '@/models/entities/access-token.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { publishChannelStream, publishGroupMessagingStream, publishMessagingStream } from '@/services/stream.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { StreamEventEmitter, StreamMessages } from './types.js';
+import { Packed } from '@/misc/schema.js';
/**
* Main stream connection
@@ -38,13 +37,18 @@ export default class Connection {
wsConnection: websocket.connection,
subscriber: EventEmitter,
user: User | null | undefined,
- token: AccessToken | null | undefined
+ token: AccessToken | null | undefined,
) {
this.wsConnection = wsConnection;
this.subscriber = subscriber;
if (user) this.user = user;
if (token) this.token = token;
+ this.onWsConnectionMessage = this.onWsConnectionMessage.bind(this);
+ this.onUserEvent = this.onUserEvent.bind(this);
+ this.onNoteStreamMessage = this.onNoteStreamMessage.bind(this);
+ this.onBroadcastMessage = this.onBroadcastMessage.bind(this);
+
this.wsConnection.on('message', this.onWsConnectionMessage);
this.subscriber.on('broadcast', data => {
@@ -62,7 +66,6 @@ export default class Connection {
}
}
- @autobind
private onUserEvent(data: StreamMessages['user']['payload']) { // { type, body }と展開するとそれぞれ型が分離してしまう
switch (data.type) {
case 'follow':
@@ -108,8 +111,8 @@ export default class Connection {
/**
* クライアントからメッセージ受信時
*/
- @autobind
- private async onWsConnectionMessage(data: websocket.IMessage) {
+ private async onWsConnectionMessage(data: websocket.Message) {
+ if (data.type !== 'utf8') return;
if (data.utf8Data == null) return;
let obj: Record<string, any>;
@@ -143,12 +146,10 @@ export default class Connection {
}
}
- @autobind
private onBroadcastMessage(data: StreamMessages['broadcast']['payload']) {
this.sendMessageToWs(data.type, data.body);
}
- @autobind
public cacheNote(note: Packed<'Note'>) {
const add = (note: Packed<'Note'>) => {
const existIndex = this.cachedNotes.findIndex(n => n.id === note.id);
@@ -168,7 +169,6 @@ export default class Connection {
if (note.renote) add(note.renote);
}
- @autobind
private readNote(body: any) {
const id = body.id;
@@ -186,7 +186,6 @@ export default class Connection {
/**
* APIリクエスト要求時
*/
- @autobind
private async onApiRequest(payload: any) {
// 新鮮なデータを利用するためにユーザーをフェッチ
const user = this.user ? await Users.findOne(this.user.id) : null;
@@ -209,7 +208,6 @@ export default class Connection {
});
}
- @autobind
private onReadNotification(payload: any) {
if (!payload.id) return;
readNotification(this.user!.id, [payload.id]);
@@ -218,7 +216,6 @@ export default class Connection {
/**
* 投稿購読要求時
*/
- @autobind
private onSubscribeNote(payload: any) {
if (!payload.id) return;
@@ -236,7 +233,6 @@ export default class Connection {
/**
* 投稿購読解除要求時
*/
- @autobind
private onUnsubscribeNote(payload: any) {
if (!payload.id) return;
@@ -247,7 +243,6 @@ export default class Connection {
}
}
- @autobind
private async onNoteStreamMessage(data: StreamMessages['note']['payload']) {
this.sendMessageToWs('noteUpdated', {
id: data.body.id,
@@ -259,7 +254,6 @@ export default class Connection {
/**
* チャンネル接続要求時
*/
- @autobind
private onChannelConnectRequested(payload: any) {
const { channel, id, params, pong } = payload;
this.connectChannel(id, params, channel, pong);
@@ -268,7 +262,6 @@ export default class Connection {
/**
* チャンネル切断要求時
*/
- @autobind
private onChannelDisconnectRequested(payload: any) {
const { id } = payload;
this.disconnectChannel(id);
@@ -277,7 +270,6 @@ export default class Connection {
/**
* クライアントにメッセージ送信
*/
- @autobind
public sendMessageToWs(type: string, payload: any) {
this.wsConnection.send(JSON.stringify({
type: type,
@@ -288,7 +280,6 @@ export default class Connection {
/**
* チャンネルに接続
*/
- @autobind
public connectChannel(id: string, params: any, channel: string, pong = false) {
if ((channels as any)[channel].requireCredential && this.user == null) {
return;
@@ -314,7 +305,6 @@ export default class Connection {
* チャンネルから切断
* @param id チャンネルコネクションID
*/
- @autobind
public disconnectChannel(id: string) {
const channel = this.channels.find(c => c.id === id);
@@ -328,7 +318,6 @@ export default class Connection {
* チャンネルへメッセージ送信要求時
* @param data メッセージ
*/
- @autobind
private onChannelMessageRequested(data: any) {
const channel = this.channels.find(c => c.id === data.id);
if (channel != null && channel.onMessage != null) {
@@ -336,14 +325,12 @@ export default class Connection {
}
}
- @autobind
private typingOnChannel(channel: ChannelModel['id']) {
if (this.user) {
publishChannelStream(channel, 'typing', this.user.id);
}
}
- @autobind
private typingOnMessaging(param: { partner?: User['id']; group?: UserGroup['id']; }) {
if (this.user) {
if (param.partner) {
@@ -354,7 +341,6 @@ export default class Connection {
}
}
- @autobind
private async updateFollowing() {
const followings = await Followings.find({
where: {
@@ -366,7 +352,6 @@ export default class Connection {
this.following = new Set<string>(followings.map(x => x.followeeId));
}
- @autobind
private async updateMuting() {
const mutings = await Mutings.find({
where: {
@@ -378,7 +363,6 @@ export default class Connection {
this.muting = new Set<string>(mutings.map(x => x.muteeId));
}
- @autobind
private async updateBlocking() { // ここでいうBlockingは被Blockingの意
const blockings = await Blockings.find({
where: {
@@ -390,7 +374,6 @@ export default class Connection {
this.blocking = new Set<string>(blockings.map(x => x.blockerId));
}
- @autobind
private async updateFollowingChannels() {
const followings = await ChannelFollowings.find({
where: {
@@ -402,7 +385,6 @@ export default class Connection {
this.followingChannels = new Set<string>(followings.map(x => x.followeeId));
}
- @autobind
private async updateUserProfile() {
this.userProfile = await UserProfiles.findOne({
userId: this.user!.id,
@@ -412,7 +394,6 @@ export default class Connection {
/**
* ストリームが切れたとき
*/
- @autobind
public dispose() {
for (const c of this.channels.filter(c => c.dispose)) {
if (c.dispose) c.dispose();
diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts
index e70c26f5e5..90cf59038d 100644
--- a/packages/backend/src/server/api/stream/types.ts
+++ b/packages/backend/src/server/api/stream/types.ts
@@ -1,20 +1,20 @@
import { EventEmitter } from 'events';
import Emitter from 'strict-event-emitter-types';
-import { Channel } from '@/models/entities/channel';
-import { User } from '@/models/entities/user';
-import { UserProfile } from '@/models/entities/user-profile';
-import { Note } from '@/models/entities/note';
-import { Antenna } from '@/models/entities/antenna';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFolder } from '@/models/entities/drive-folder';
-import { Emoji } from '@/models/entities/emoji';
-import { UserList } from '@/models/entities/user-list';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { UserGroup } from '@/models/entities/user-group';
-import { AbuseUserReport } from '@/models/entities/abuse-user-report';
-import { Signin } from '@/models/entities/signin';
-import { Page } from '@/models/entities/page';
-import { Packed } from '@/misc/schema';
+import { Channel } from '@/models/entities/channel.js';
+import { User } from '@/models/entities/user.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { Note } from '@/models/entities/note.js';
+import { Antenna } from '@/models/entities/antenna.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFolder } from '@/models/entities/drive-folder.js';
+import { Emoji } from '@/models/entities/emoji.js';
+import { UserList } from '@/models/entities/user-list.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { AbuseUserReport } from '@/models/entities/abuse-user-report.js';
+import { Signin } from '@/models/entities/signin.js';
+import { Page } from '@/models/entities/page.js';
+import { Packed } from '@/misc/schema.js';
//#region Stream type-body definitions
export interface InternalStreamTypes {
@@ -84,6 +84,7 @@ export interface MainStreamTypes {
};
driveFileCreated: Packed<'DriveFile'>;
readAntenna: Antenna;
+ receiveFollowRequest: Packed<'User'>;
}
export interface DriveStreamTypes {
@@ -105,7 +106,10 @@ export interface NoteStreamTypes {
};
reacted: {
reaction: string;
- emoji?: Emoji;
+ emoji?: {
+ name: string;
+ url: string;
+ } | null;
userId: User['id'];
};
unreacted: {
diff --git a/packages/backend/src/server/api/streaming.ts b/packages/backend/src/server/api/streaming.ts
index ad87311064..2a34edac67 100644
--- a/packages/backend/src/server/api/streaming.ts
+++ b/packages/backend/src/server/api/streaming.ts
@@ -1,14 +1,14 @@
import * as http from 'http';
import * as websocket from 'websocket';
-import MainStreamConnection from './stream/index';
+import MainStreamConnection from './stream/index.js';
import { ParsedUrlQuery } from 'querystring';
-import authenticate from './authenticate';
+import authenticate from './authenticate.js';
import { EventEmitter } from 'events';
-import { subsdcriber as redisClient } from '../../db/redis';
-import { Users } from '@/models/index';
+import { subsdcriber as redisClient } from '../../db/redis.js';
+import { Users } from '@/models/index.js';
-module.exports = (server: http.Server) => {
+export const initializeStreamingServer = (server: http.Server) => {
// Init websocket server
const ws = new websocket.server({
httpServer: server,
@@ -59,7 +59,7 @@ module.exports = (server: http.Server) => {
});
connection.on('message', async (data) => {
- if (data.utf8Data === 'ping') {
+ if (data.type === 'utf8' && data.utf8Data === 'ping') {
connection.send('pong');
}
});
diff --git a/packages/backend/src/server/file/index.ts b/packages/backend/src/server/file/index.ts
index a455acd1cf..07a493700a 100644
--- a/packages/backend/src/server/file/index.ts
+++ b/packages/backend/src/server/file/index.ts
@@ -2,23 +2,22 @@
* File Server
*/
-import * as fs from 'fs';
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-import * as Koa from 'koa';
-import * as cors from '@koa/cors';
-import * as Router from '@koa/router';
-import sendDriveFile from './send-drive-file';
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
+import Koa from 'koa';
+import cors from '@koa/cors';
+import Router from '@koa/router';
+import sendDriveFile from './send-drive-file.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
// Init app
const app = new Koa();
app.use(cors());
app.use(async (ctx, next) => {
- ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`);
+ ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`);
await next();
});
@@ -38,4 +37,4 @@ router.get('/:key/(.*)', sendDriveFile);
// Register router
app.use(router.routes());
-module.exports = app;
+export default app;
diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts
index f3c6c518fa..4e2bba0e20 100644
--- a/packages/backend/src/server/file/send-drive-file.ts
+++ b/packages/backend/src/server/file/send-drive-file.ts
@@ -1,23 +1,22 @@
-import * as fs from 'fs';
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-import * as Koa from 'koa';
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
+import Koa from 'koa';
import * as send from 'koa-send';
-import * as rename from 'rename';
+import rename from 'rename';
import * as tmp from 'tmp';
-import { serverLogger } from '../index';
-import { contentDisposition } from '@/misc/content-disposition';
-import { DriveFiles } from '@/models/index';
-import { InternalStorage } from '@/services/drive/internal-storage';
-import { downloadUrl } from '@/misc/download-url';
-import { detectType } from '@/misc/get-file-info';
-import { convertToJpeg, convertToPng, convertToPngOrJpeg } from '@/services/drive/image-processor';
-import { GenerateVideoThumbnail } from '@/services/drive/generate-video-thumbnail';
-import { StatusError } from '@/misc/fetch';
-import { FILE_TYPE_BROWSERSAFE } from '@/const';
+import { serverLogger } from '../index.js';
+import { contentDisposition } from '@/misc/content-disposition.js';
+import { DriveFiles } from '@/models/index.js';
+import { InternalStorage } from '@/services/drive/internal-storage.js';
+import { downloadUrl } from '@/misc/download-url.js';
+import { detectType } from '@/misc/get-file-info.js';
+import { convertToJpeg, convertToPng, convertToPngOrJpeg } from '@/services/drive/image-processor.js';
+import { GenerateVideoThumbnail } from '@/services/drive/generate-video-thumbnail.js';
+import { StatusError } from '@/misc/fetch.js';
+import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
const assets = `${_dirname}/../../server/file/assets/`;
diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts
index 764306c7d8..80130e8843 100644
--- a/packages/backend/src/server/index.ts
+++ b/packages/backend/src/server/index.ts
@@ -2,31 +2,32 @@
* Core Server
*/
-import * as fs from 'fs';
+import * as fs from 'node:fs';
import * as http from 'http';
import * as http2 from 'http2';
import * as https from 'https';
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
-import * as mount from 'koa-mount';
-import * as koaLogger from 'koa-logger';
-import * as requestStats from 'request-stats';
+import Koa from 'koa';
+import Router from '@koa/router';
+import mount from 'koa-mount';
+import koaLogger from 'koa-logger';
import * as slow from 'koa-slow';
-import activityPub from './activitypub';
-import nodeinfo from './nodeinfo';
-import wellKnown from './well-known';
-import config from '@/config/index';
-import apiServer from './api/index';
-import { sum } from '@/prelude/array';
-import Logger from '@/services/logger';
-import { envOption } from '../env';
-import { UserProfiles, Users } from '@/models/index';
-import { networkChart } from '@/services/chart/index';
-import { genIdenticon } from '@/misc/gen-identicon';
-import { createTemp } from '@/misc/create-temp';
-import { publishMainStream } from '@/services/stream';
-import * as Acct from 'misskey-js/built/acct';
+import activityPub from './activitypub.js';
+import nodeinfo from './nodeinfo.js';
+import wellKnown from './well-known.js';
+import config from '@/config/index.js';
+import apiServer from './api/index.js';
+import fileServer from './file/index.js';
+import proxyServer from './proxy/index.js';
+import webServer from './web/index.js';
+import Logger from '@/services/logger.js';
+import { envOption } from '../env.js';
+import { UserProfiles, Users } from '@/models/index.js';
+import { genIdenticon } from '@/misc/gen-identicon.js';
+import { createTemp } from '@/misc/create-temp.js';
+import { publishMainStream } from '@/services/stream.js';
+import * as Acct from '@/misc/acct.js';
+import { initializeStreamingServer } from './api/streaming.js';
export const serverLogger = new Logger('server', 'gray', false);
@@ -58,8 +59,8 @@ if (config.url.startsWith('https') && !config.disableHsts) {
}
app.use(mount('/api', apiServer));
-app.use(mount('/files', require('./file')));
-app.use(mount('/proxy', require('./proxy')));
+app.use(mount('/files', fileServer));
+app.use(mount('/proxy', proxyServer));
// Init router
const router = new Router();
@@ -75,6 +76,8 @@ router.get('/avatar/@:acct', async ctx => {
usernameLower: username.toLowerCase(),
host: host === config.host ? null : host,
isSuspended: false,
+ }, {
+ relations: ['avatar'],
});
if (user) {
@@ -117,7 +120,7 @@ router.get('/verify-email/:code', async ctx => {
// Register router
app.use(router.routes());
-app.use(mount(require('./web')));
+app.use(mount(webServer));
function createServer() {
if (config.https) {
@@ -136,10 +139,8 @@ function createServer() {
export const startServer = () => {
const server = createServer();
- // Init stream server
- require('./api/streaming')(server);
+ initializeStreamingServer(server);
- // Listen
server.listen(config.port);
return server;
@@ -148,32 +149,7 @@ export const startServer = () => {
export default () => new Promise(resolve => {
const server = createServer();
- // Init stream server
- require('./api/streaming')(server);
+ initializeStreamingServer(server);
- // Listen
server.listen(config.port, resolve);
-
- //#region Network stats
- let queue: any[] = [];
-
- requestStats(server, (stats: any) => {
- if (stats.ok) {
- queue.push(stats);
- }
- });
-
- // Bulk write
- setInterval(() => {
- if (queue.length === 0) return;
-
- const requests = queue.length;
- const time = sum(queue.map(x => x.time));
- const incomingBytes = sum(queue.map(x => x.req.byets));
- const outgoingBytes = sum(queue.map(x => x.res.byets));
- queue = [];
-
- networkChart.update(requests, time, incomingBytes, outgoingBytes);
- }, 5000);
- //#endregion
});
diff --git a/packages/backend/src/server/nodeinfo.ts b/packages/backend/src/server/nodeinfo.ts
index 44f32bf882..f4b56fc8a5 100644
--- a/packages/backend/src/server/nodeinfo.ts
+++ b/packages/backend/src/server/nodeinfo.ts
@@ -1,8 +1,9 @@
-import * as Router from '@koa/router';
-import config from '@/config/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Users, Notes } from '@/models/index';
-import { Not, IsNull, MoreThan } from 'typeorm';
+import Router from '@koa/router';
+import config from '@/config/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Users, Notes } from '@/models/index.js';
+import { MoreThan } from 'typeorm';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
const router = new Router();
@@ -25,14 +26,12 @@ const nodeinfo2 = async () => {
activeHalfyear,
activeMonth,
localPosts,
- localComments,
] = await Promise.all([
fetchMeta(true),
Users.count({ where: { host: null } }),
- Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 15552000000)) } }),
- Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 2592000000)) } }),
- Notes.count({ where: { userHost: null, replyId: null } }),
- Notes.count({ where: { userHost: null, replyId: Not(IsNull()) } }),
+ Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 15552000000)) } }),
+ Users.count({ where: { host: null, lastActiveDate: MoreThan(new Date(now - 2592000000)) } }),
+ Notes.count({ where: { userHost: null } }),
]);
const proxyAccount = meta.proxyAccountId ? await Users.pack(meta.proxyAccountId).catch(() => null) : null;
@@ -52,7 +51,7 @@ const nodeinfo2 = async () => {
usage: {
users: { total, activeHalfyear, activeMonth },
localPosts,
- localComments,
+ localComments: 0,
},
metadata: {
nodeName: meta.name,
@@ -71,7 +70,7 @@ const nodeinfo2 = async () => {
emailRequiredForSignup: meta.emailRequiredForSignup,
enableHcaptcha: meta.enableHcaptcha,
enableRecaptcha: meta.enableRecaptcha,
- maxNoteTextLength: meta.maxNoteTextLength,
+ maxNoteTextLength: MAX_NOTE_TEXT_LENGTH,
enableTwitterIntegration: meta.enableTwitterIntegration,
enableGithubIntegration: meta.enableGithubIntegration,
enableDiscordIntegration: meta.enableDiscordIntegration,
diff --git a/packages/backend/src/server/proxy/index.ts b/packages/backend/src/server/proxy/index.ts
index b8993f19f8..506ba10ef1 100644
--- a/packages/backend/src/server/proxy/index.ts
+++ b/packages/backend/src/server/proxy/index.ts
@@ -2,16 +2,16 @@
* Media Proxy
*/
-import * as Koa from 'koa';
-import * as cors from '@koa/cors';
-import * as Router from '@koa/router';
-import { proxyMedia } from './proxy-media';
+import Koa from 'koa';
+import cors from '@koa/cors';
+import Router from '@koa/router';
+import { proxyMedia } from './proxy-media.js';
// Init app
const app = new Koa();
app.use(cors());
app.use(async (ctx, next) => {
- ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`);
+ ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`);
await next();
});
@@ -23,4 +23,4 @@ router.get('/:url*', proxyMedia);
// Register router
app.use(router.routes());
-module.exports = app;
+export default app;
diff --git a/packages/backend/src/server/proxy/proxy-media.ts b/packages/backend/src/server/proxy/proxy-media.ts
index c234b70c55..3cc5b827a6 100644
--- a/packages/backend/src/server/proxy/proxy-media.ts
+++ b/packages/backend/src/server/proxy/proxy-media.ts
@@ -1,16 +1,21 @@
-import * as fs from 'fs';
-import * as Koa from 'koa';
-import { serverLogger } from '../index';
-import { IImage, convertToPng, convertToJpeg } from '@/services/drive/image-processor';
-import { createTemp } from '@/misc/create-temp';
-import { downloadUrl } from '@/misc/download-url';
-import { detectType } from '@/misc/get-file-info';
-import { StatusError } from '@/misc/fetch';
-import { FILE_TYPE_BROWSERSAFE } from '@/const';
+import * as fs from 'node:fs';
+import Koa from 'koa';
+import { serverLogger } from '../index.js';
+import { IImage, convertToPng, convertToJpeg } from '@/services/drive/image-processor.js';
+import { createTemp } from '@/misc/create-temp.js';
+import { downloadUrl } from '@/misc/download-url.js';
+import { detectType } from '@/misc/get-file-info.js';
+import { StatusError } from '@/misc/fetch.js';
+import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
export async function proxyMedia(ctx: Koa.Context) {
const url = 'url' in ctx.query ? ctx.query.url : 'https://' + ctx.params.url;
+ if (typeof url !== 'string') {
+ ctx.status = 400;
+ return;
+ }
+
// Create temp file
const [path, cleanup] = await createTemp();
diff --git a/packages/backend/src/server/web/feed.ts b/packages/backend/src/server/web/feed.ts
index db589e086b..b98e3f8bf6 100644
--- a/packages/backend/src/server/web/feed.ts
+++ b/packages/backend/src/server/web/feed.ts
@@ -1,7 +1,7 @@
import { Feed } from 'feed';
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { Notes, DriveFiles, UserProfiles } from '@/models/index';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { Notes, DriveFiles, UserProfiles } from '@/models/index.js';
import { In } from 'typeorm';
export default async function(user: User) {
diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts
index e95a115aec..cc4c2cc9ca 100644
--- a/packages/backend/src/server/web/index.ts
+++ b/packages/backend/src/server/web/index.ts
@@ -2,24 +2,26 @@
* Web Client Server
*/
-import { dirname } from 'path';
+import { dirname } from 'node:path';
+import { fileURLToPath } from 'node:url';
import ms from 'ms';
-import * as Koa from 'koa';
-import * as Router from '@koa/router';
-import * as send from 'koa-send';
-import * as favicon from 'koa-favicon';
-import * as views from 'koa-views';
+import Koa from 'koa';
+import Router from '@koa/router';
+import send from 'koa-send';
+import favicon from 'koa-favicon';
+import views from 'koa-views';
-import packFeed from './feed';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { genOpenapiSpec } from '../api/openapi/gen-spec';
-import config from '@/config/index';
-import { Users, Notes, UserProfiles, Pages, Channels, Clips, GalleryPosts } from '@/models/index';
-import * as Acct from 'misskey-js/built/acct';
-import { getNoteSummary } from '@/misc/get-note-summary';
+import packFeed from './feed.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { genOpenapiSpec } from '../api/openapi/gen-spec.js';
+import config from '@/config/index.js';
+import { Users, Notes, UserProfiles, Pages, Channels, Clips, GalleryPosts } from '@/models/index.js';
+import * as Acct from '@/misc/acct.js';
+import { getNoteSummary } from '@/misc/get-note-summary.js';
+import { urlPreviewHandler } from './url-preview.js';
+import { manifestHandler } from './manifest.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
const staticAssets = `${_dirname}/../../../assets/`;
@@ -105,7 +107,7 @@ router.get('/sw.js', async ctx => {
});
// Manifest
-router.get('/manifest.json', require('./manifest'));
+router.get('/manifest.json', manifestHandler);
router.get('/robots.txt', async ctx => {
await send(ctx as any, '/robots.txt', {
@@ -123,7 +125,7 @@ router.get('/api-doc', async ctx => {
});
// URL preview endpoint
-router.get('/url', require('./url-preview'));
+router.get('/url', urlPreviewHandler);
router.get('/api.json', async ctx => {
ctx.body = genOpenapiSpec();
@@ -200,6 +202,7 @@ router.get(['/@:user', '/@:user/:sub'], async (ctx, next) => {
sub: ctx.params.sub,
instanceName: meta.name || 'Misskey',
icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=30');
} else {
@@ -239,6 +242,7 @@ router.get('/notes/:note', async (ctx, next) => {
summary: getNoteSummary(_note),
instanceName: meta.name || 'Misskey',
icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
if (['public', 'home'].includes(note.visibility)) {
@@ -276,6 +280,8 @@ router.get('/@:user/pages/:page', async (ctx, next) => {
page: _page,
profile,
instanceName: meta.name || 'Misskey',
+ icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
if (['public'].includes(page.visibility)) {
@@ -305,6 +311,8 @@ router.get('/clips/:clip', async (ctx, next) => {
clip: _clip,
profile,
instanceName: meta.name || 'Misskey',
+ icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=180');
@@ -328,6 +336,7 @@ router.get('/gallery/:post', async (ctx, next) => {
profile,
instanceName: meta.name || 'Misskey',
icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=180');
@@ -350,6 +359,8 @@ router.get('/channels/:channel', async (ctx, next) => {
await ctx.render('channel', {
channel: _channel,
instanceName: meta.name || 'Misskey',
+ icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=180');
@@ -409,6 +420,7 @@ router.get('(.*)', async ctx => {
instanceName: meta.name || 'Misskey',
desc: meta.description,
icon: meta.iconUrl,
+ themeColor: meta.themeColor,
});
ctx.set('Cache-Control', 'public, max-age=300');
});
@@ -416,4 +428,4 @@ router.get('(.*)', async ctx => {
// Register router
app.use(router.routes());
-module.exports = app;
+export default app;
diff --git a/packages/backend/src/server/web/manifest.ts b/packages/backend/src/server/web/manifest.ts
index 918fe27c03..bcbf9b76a7 100644
--- a/packages/backend/src/server/web/manifest.ts
+++ b/packages/backend/src/server/web/manifest.ts
@@ -1,14 +1,15 @@
-import * as Koa from 'koa';
-import * as manifest from './manifest.json';
-import { fetchMeta } from '@/misc/fetch-meta';
+import Koa from 'koa';
+import manifest from './manifest.json' assert { type: 'json' };
+import { fetchMeta } from '@/misc/fetch-meta.js';
-module.exports = async (ctx: Koa.Context) => {
+export const manifestHandler = async (ctx: Koa.Context) => {
const json = JSON.parse(JSON.stringify(manifest));
const instance = await fetchMeta(true);
json.short_name = instance.name || 'Misskey';
json.name = instance.name || 'Misskey';
+ if (instance.themeColor) json.theme_color = instance.themeColor;
ctx.set('Cache-Control', 'max-age=300');
ctx.body = json;
diff --git a/packages/backend/src/server/web/url-preview.ts b/packages/backend/src/server/web/url-preview.ts
index 71465c8083..6bd8ead5b5 100644
--- a/packages/backend/src/server/web/url-preview.ts
+++ b/packages/backend/src/server/web/url-preview.ts
@@ -1,30 +1,42 @@
-import * as Koa from 'koa';
+import Koa from 'koa';
import summaly from 'summaly';
-import { fetchMeta } from '@/misc/fetch-meta';
-import Logger from '@/services/logger';
-import config from '@/config/index';
-import { query } from '@/prelude/url';
-import { getJson } from '@/misc/fetch';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import Logger from '@/services/logger.js';
+import config from '@/config/index.js';
+import { query } from '@/prelude/url.js';
+import { getJson } from '@/misc/fetch.js';
const logger = new Logger('url-preview');
-module.exports = async (ctx: Koa.Context) => {
+export const urlPreviewHandler = async (ctx: Koa.Context) => {
+ const url = ctx.query.url;
+ if (typeof url !== 'string') {
+ ctx.status = 400;
+ return;
+ }
+
+ const lang = ctx.query.lang;
+ if (Array.isArray(lang)) {
+ ctx.status = 400;
+ return;
+ }
+
const meta = await fetchMeta();
logger.info(meta.summalyProxy
- ? `(Proxy) Getting preview of ${ctx.query.url}@${ctx.query.lang} ...`
- : `Getting preview of ${ctx.query.url}@${ctx.query.lang} ...`);
+ ? `(Proxy) Getting preview of ${url}@${lang} ...`
+ : `Getting preview of ${url}@${lang} ...`);
try {
const summary = meta.summalyProxy ? await getJson(`${meta.summalyProxy}?${query({
- url: ctx.query.url,
- lang: ctx.query.lang || 'ja-JP',
- })}`) : await summaly(ctx.query.url, {
+ url: url,
+ lang: lang ?? 'ja-JP',
+ })}`) : await summaly.default(url, {
followRedirects: false,
- lang: ctx.query.lang || 'ja-JP',
+ lang: lang ?? 'ja-JP',
});
- logger.succ(`Got preview of ${ctx.query.url}: ${summary.title}`);
+ logger.succ(`Got preview of ${url}: ${summary.title}`);
summary.icon = wrap(summary.icon);
summary.thumbnail = wrap(summary.thumbnail);
@@ -33,8 +45,8 @@ module.exports = async (ctx: Koa.Context) => {
ctx.set('Cache-Control', 'max-age=604800, immutable');
ctx.body = summary;
- } catch (e) {
- logger.warn(`Failed to get preview of ${ctx.query.url}: ${e}`);
+ } catch (err) {
+ logger.warn(`Failed to get preview of ${url}: ${err}`);
ctx.status = 200;
ctx.set('Cache-Control', 'max-age=86400, immutable');
ctx.body = '{}';
diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug
index 42c068c403..e1cb2cfa93 100644
--- a/packages/backend/src/server/web/views/base.pug
+++ b/packages/backend/src/server/web/views/base.pug
@@ -19,8 +19,9 @@ html
meta(charset='utf-8')
meta(name='application-name' content='Misskey')
meta(name='referrer' content='origin')
- meta(name='theme-color' content='#86b300')
- meta(name='theme-color-orig' content='#86b300')
+ meta(name='theme-color' content= themeColor || '#86b300')
+ meta(name='theme-color-orig' content= themeColor || '#86b300')
+ meta(property='twitter:card' content='summary')
meta(property='og:site_name' content= instanceName || 'Misskey')
meta(name='viewport' content='width=device-width, initial-scale=1')
link(rel='icon' href= icon || '/favicon.ico')
@@ -29,8 +30,8 @@ html
link(rel='prefetch' href='https://xn--931a.moe/assets/info.jpg')
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
- link(rel='preload' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css' as='style')
- link(rel='stylesheet' href='https://use.fontawesome.com/releases/v5.15.3/css/all.css')
+ link(rel='preload' href='/assets/fontawesome/css/all.css' as='style')
+ link(rel='stylesheet' href='/assets/fontawesome/css/all.css')
title
block title
@@ -42,7 +43,9 @@ html
block meta
block og
- meta(property='og:image' content=img)
+ meta(property='og:title' content= title || 'Misskey')
+ meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨')
+ meta(property='og:image' content= img)
style
include ../style.css
diff --git a/packages/backend/src/server/web/views/channel.pug b/packages/backend/src/server/web/views/channel.pug
index 273632f0e0..486f0ecc47 100644
--- a/packages/backend/src/server/web/views/channel.pug
+++ b/packages/backend/src/server/web/views/channel.pug
@@ -16,6 +16,3 @@ block og
meta(property='og:description' content= channel.description)
meta(property='og:url' content= url)
meta(property='og:image' content= channel.bannerUrl)
-
-block meta
- meta(name='twitter:card' content='summary')
diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug
index 8de53f19d6..7a84d50f6c 100644
--- a/packages/backend/src/server/web/views/clip.pug
+++ b/packages/backend/src/server/web/views/clip.pug
@@ -26,8 +26,6 @@ block meta
meta(name='misskey:user-id' content=user.id)
meta(name='misskey:clip-id' content=clip.id)
- meta(name='twitter:card' content='summary')
-
// todo
if user.twitter
meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/gallery-post.pug b/packages/backend/src/server/web/views/gallery-post.pug
index 95bbb2437c..ca0663a481 100644
--- a/packages/backend/src/server/web/views/gallery-post.pug
+++ b/packages/backend/src/server/web/views/gallery-post.pug
@@ -25,8 +25,6 @@ block meta
meta(name='misskey:user-username' content=user.username)
meta(name='misskey:user-id' content=user.id)
- meta(name='twitter:card' content='summary')
-
// todo
if user.twitter
meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug
index fce91bdabe..34b03f9833 100644
--- a/packages/backend/src/server/web/views/note.pug
+++ b/packages/backend/src/server/web/views/note.pug
@@ -26,9 +26,7 @@ block meta
meta(name='misskey:user-username' content=user.username)
meta(name='misskey:user-id' content=user.id)
meta(name='misskey:note-id' content=note.id)
-
- meta(name='twitter:card' content='summary')
-
+
// todo
if user.twitter
meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/page.pug b/packages/backend/src/server/web/views/page.pug
index cb9e1039e1..b6c9548025 100644
--- a/packages/backend/src/server/web/views/page.pug
+++ b/packages/backend/src/server/web/views/page.pug
@@ -26,8 +26,6 @@ block meta
meta(name='misskey:user-id' content=user.id)
meta(name='misskey:page-id' content=page.id)
- meta(name='twitter:card' content='summary')
-
// todo
if user.twitter
meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
diff --git a/packages/backend/src/server/web/views/user.pug b/packages/backend/src/server/web/views/user.pug
index 1a8a6b4413..2adec0f889 100644
--- a/packages/backend/src/server/web/views/user.pug
+++ b/packages/backend/src/server/web/views/user.pug
@@ -25,8 +25,6 @@ block meta
meta(name='misskey:user-username' content=user.username)
meta(name='misskey:user-id' content=user.id)
- meta(name='twitter:card' content='summary')
-
if profile.twitter
meta(name='twitter:creator' content=`@${profile.twitter.screenName}`)
diff --git a/packages/backend/src/server/well-known.ts b/packages/backend/src/server/well-known.ts
index d1f13b70bb..7a5d085413 100644
--- a/packages/backend/src/server/well-known.ts
+++ b/packages/backend/src/server/well-known.ts
@@ -1,11 +1,11 @@
-import * as Router from '@koa/router';
+import Router from '@koa/router';
-import config from '@/config/index';
-import * as Acct from 'misskey-js/built/acct';
-import { links } from './nodeinfo';
-import { escapeAttribute, escapeValue } from '@/prelude/xml';
-import { Users } from '@/models/index';
-import { User } from '@/models/entities/user';
+import config from '@/config/index.js';
+import * as Acct from '@/misc/acct.js';
+import { links } from './nodeinfo.js';
+import { escapeAttribute, escapeValue } from '@/prelude/xml.js';
+import { Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
// Init router
const router = new Router();
diff --git a/packages/backend/src/services/add-note-to-antenna.ts b/packages/backend/src/services/add-note-to-antenna.ts
index 168e3a614d..e88c387234 100644
--- a/packages/backend/src/services/add-note-to-antenna.ts
+++ b/packages/backend/src/services/add-note-to-antenna.ts
@@ -1,10 +1,10 @@
-import { Antenna } from '@/models/entities/antenna';
-import { Note } from '@/models/entities/note';
-import { AntennaNotes, Mutings, Notes } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { isMutedUserRelated } from '@/misc/is-muted-user-related';
-import { publishAntennaStream, publishMainStream } from '@/services/stream';
-import { User } from '@/models/entities/user';
+import { Antenna } from '@/models/entities/antenna.js';
+import { Note } from '@/models/entities/note.js';
+import { AntennaNotes, Mutings, Notes } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { isMutedUserRelated } from '@/misc/is-muted-user-related.js';
+import { publishAntennaStream, publishMainStream } from '@/services/stream.js';
+import { User } from '@/models/entities/user.js';
export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: { id: User['id']; }) {
// 通知しない設定になっているか、自分自身の投稿なら既読にする
diff --git a/packages/backend/src/services/blocking/create.ts b/packages/backend/src/services/blocking/create.ts
index 907e4c3116..198d28705e 100644
--- a/packages/backend/src/services/blocking/create.ts
+++ b/packages/backend/src/services/blocking/create.ts
@@ -1,15 +1,15 @@
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import renderBlock from '@/remote/activitypub/renderer/block';
-import { deliver } from '@/queue/index';
-import renderReject from '@/remote/activitypub/renderer/reject';
-import { User } from '@/models/entities/user';
-import { Blockings, Users, FollowRequests, Followings, UserListJoinings, UserLists } from '@/models/index';
-import { perUserFollowingChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { IdentifiableError } from '@/misc/identifiable-error';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import renderBlock from '@/remote/activitypub/renderer/block.js';
+import { deliver } from '@/queue/index.js';
+import renderReject from '@/remote/activitypub/renderer/reject.js';
+import { User } from '@/models/entities/user.js';
+import { Blockings, Users, FollowRequests, Followings, UserListJoinings, UserLists } from '@/models/index.js';
+import { perUserFollowingChart } from '@/services/chart/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export default async function(blocker: User, blockee: User) {
await Promise.all([
diff --git a/packages/backend/src/services/blocking/delete.ts b/packages/backend/src/services/blocking/delete.ts
index 271bf4854a..c4f3784b05 100644
--- a/packages/backend/src/services/blocking/delete.ts
+++ b/packages/backend/src/services/blocking/delete.ts
@@ -1,10 +1,10 @@
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderBlock from '@/remote/activitypub/renderer/block';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { deliver } from '@/queue/index';
-import Logger from '../logger';
-import { User } from '@/models/entities/user';
-import { Blockings, Users } from '@/models/index';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderBlock from '@/remote/activitypub/renderer/block.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { deliver } from '@/queue/index.js';
+import Logger from '../logger.js';
+import { User } from '@/models/entities/user.js';
+import { Blockings, Users } from '@/models/index.js';
const logger = new Logger('blocking/delete');
diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts
index 9490101e36..d952ea53bd 100644
--- a/packages/backend/src/services/chart/charts/active-users.ts
+++ b/packages/backend/src/services/chart/charts/active-users.ts
@@ -1,51 +1,44 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { User } from '@/models/entities/user';
-import { SchemaType } from '@/misc/schema';
-import { Users } from '@/models/index';
-import { name, schema } from './entities/active-users';
+import Chart, { KVs } from '../core.js';
+import { User } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
+import { name, schema } from './entities/active-users.js';
-type ActiveUsersLog = SchemaType<typeof schema>;
+const week = 1000 * 60 * 60 * 24 * 7;
+const month = 1000 * 60 * 60 * 24 * 30;
+const year = 1000 * 60 * 60 * 24 * 365;
/**
* アクティブユーザーに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class ActiveUsersChart extends Chart<ActiveUsersLog> {
+export default class ActiveUsersChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: ActiveUsersLog): DeepPartial<ActiveUsersLog> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
- protected aggregate(logs: ActiveUsersLog[]): ActiveUsersLog {
- return {
- local: {
- users: logs.reduce((a, b) => a.concat(b.local.users), [] as ActiveUsersLog['local']['users']),
- },
- remote: {
- users: logs.reduce((a, b) => a.concat(b.remote.users), [] as ActiveUsersLog['remote']['users']),
- },
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<ActiveUsersLog>> {
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
- public async update(user: { id: User['id'], host: User['host'] }): Promise<void> {
- const update: Obj = {
- users: [user.id],
- };
+ public async read(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise<void> {
+ await this.commit({
+ 'read': [user.id],
+ 'registeredWithinWeek': (Date.now() - user.createdAt.getTime() < week) ? [user.id] : [],
+ 'registeredWithinMonth': (Date.now() - user.createdAt.getTime() < month) ? [user.id] : [],
+ 'registeredWithinYear': (Date.now() - user.createdAt.getTime() < year) ? [user.id] : [],
+ 'registeredOutsideWeek': (Date.now() - user.createdAt.getTime() > week) ? [user.id] : [],
+ 'registeredOutsideMonth': (Date.now() - user.createdAt.getTime() > month) ? [user.id] : [],
+ 'registeredOutsideYear': (Date.now() - user.createdAt.getTime() > year) ? [user.id] : [],
+ });
+ }
- await this.inc({
- [Users.isLocalUser(user) ? 'local' : 'remote']: update,
+ public async write(user: { id: User['id'], host: null, createdAt: User['createdAt'] }): Promise<void> {
+ await this.commit({
+ 'write': [user.id],
});
}
}
diff --git a/packages/backend/src/services/chart/charts/ap-request.ts b/packages/backend/src/services/chart/charts/ap-request.ts
new file mode 100644
index 0000000000..e9e42ade7f
--- /dev/null
+++ b/packages/backend/src/services/chart/charts/ap-request.ts
@@ -0,0 +1,38 @@
+import Chart, { KVs } from '../core.js';
+import { name, schema } from './entities/ap-request.js';
+
+/**
+ * Chart about ActivityPub requests
+ */
+// eslint-disable-next-line import/no-default-export
+export default class ApRequestChart extends Chart<typeof schema> {
+ constructor() {
+ super(name, schema);
+ }
+
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ public async deliverSucc(): Promise<void> {
+ await this.commit({
+ 'deliverSucceeded': 1,
+ });
+ }
+
+ public async deliverFail(): Promise<void> {
+ await this.commit({
+ 'deliverFailed': 1,
+ });
+ }
+
+ public async inbox(): Promise<void> {
+ await this.commit({
+ 'inboxReceived': 1,
+ });
+ }
+}
diff --git a/packages/backend/src/services/chart/charts/drive.ts b/packages/backend/src/services/chart/charts/drive.ts
index 06cf7ebeeb..0eeba90dd3 100644
--- a/packages/backend/src/services/chart/charts/drive.ts
+++ b/packages/backend/src/services/chart/charts/drive.ts
@@ -1,95 +1,38 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { DriveFiles } from '@/models/index';
+import Chart, { KVs } from '../core.js';
+import { DriveFiles } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
-import { DriveFile } from '@/models/entities/drive-file';
-import { name, schema } from './entities/drive';
-
-type DriveLog = SchemaType<typeof schema>;
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { name, schema } from './entities/drive.js';
/**
* ドライブに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class DriveChart extends Chart<DriveLog> {
+export default class DriveChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: DriveLog): DeepPartial<DriveLog> {
- return {
- local: {
- totalCount: latest.local.totalCount,
- totalSize: latest.local.totalSize,
- },
- remote: {
- totalCount: latest.remote.totalCount,
- totalSize: latest.remote.totalSize,
- },
- };
- }
-
- @autobind
- protected aggregate(logs: DriveLog[]): DriveLog {
- return {
- local: {
- totalCount: logs[0].local.totalCount,
- totalSize: logs[0].local.totalSize,
- incCount: logs.reduce((a, b) => a + b.local.incCount, 0),
- incSize: logs.reduce((a, b) => a + b.local.incSize, 0),
- decCount: logs.reduce((a, b) => a + b.local.decCount, 0),
- decSize: logs.reduce((a, b) => a + b.local.decSize, 0),
- },
- remote: {
- totalCount: logs[0].remote.totalCount,
- totalSize: logs[0].remote.totalSize,
- incCount: logs.reduce((a, b) => a + b.remote.incCount, 0),
- incSize: logs.reduce((a, b) => a + b.remote.incSize, 0),
- decCount: logs.reduce((a, b) => a + b.remote.decCount, 0),
- decSize: logs.reduce((a, b) => a + b.remote.decSize, 0),
- },
- };
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
}
- @autobind
- protected async fetchActual(): Promise<DeepPartial<DriveLog>> {
- const [localCount, remoteCount, localSize, remoteSize] = await Promise.all([
- DriveFiles.count({ userHost: null }),
- DriveFiles.count({ userHost: Not(IsNull()) }),
- DriveFiles.calcDriveUsageOfLocal(),
- DriveFiles.calcDriveUsageOfRemote(),
- ]);
-
- return {
- local: {
- totalCount: localCount,
- totalSize: localSize,
- },
- remote: {
- totalCount: remoteCount,
- totalSize: remoteSize,
- },
- };
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
}
- @autobind
public async update(file: DriveFile, isAdditional: boolean): Promise<void> {
- const update: Obj = {};
-
- update.totalCount = isAdditional ? 1 : -1;
- update.totalSize = isAdditional ? file.size : -file.size;
- if (isAdditional) {
- update.incCount = 1;
- update.incSize = file.size;
- } else {
- update.decCount = 1;
- update.decSize = file.size;
- }
-
- await this.inc({
- [file.userHost === null ? 'local' : 'remote']: update,
+ const fileSizeKb = file.size / 1000;
+ await this.commit(file.userHost === null ? {
+ 'local.incCount': isAdditional ? 1 : 0,
+ 'local.incSize': isAdditional ? fileSizeKb : 0,
+ 'local.decCount': isAdditional ? 0 : 1,
+ 'local.decSize': isAdditional ? 0 : fileSizeKb,
+ } : {
+ 'remote.incCount': isAdditional ? 1 : 0,
+ 'remote.incSize': isAdditional ? fileSizeKb : 0,
+ 'remote.decCount': isAdditional ? 0 : 1,
+ 'remote.decSize': isAdditional ? 0 : fileSizeKb,
});
}
}
diff --git a/packages/backend/src/services/chart/charts/entities/active-users.ts b/packages/backend/src/services/chart/charts/entities/active-users.ts
index d6b49c86c3..5767b76f8e 100644
--- a/packages/backend/src/services/chart/charts/entities/active-users.ts
+++ b/packages/backend/src/services/chart/charts/entities/active-users.ts
@@ -1,36 +1,17 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'activeUsers';
-const logSchema = {
- /**
- * アクティブユーザー
- */
- users: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'readWrite': { intersection: ['read', 'write'], range: 'small' },
+ 'read': { uniqueIncrement: true, range: 'small' },
+ 'write': { uniqueIncrement: true, range: 'small' },
+ 'registeredWithinWeek': { uniqueIncrement: true, range: 'small' },
+ 'registeredWithinMonth': { uniqueIncrement: true, range: 'small' },
+ 'registeredWithinYear': { uniqueIncrement: true, range: 'small' },
+ 'registeredOutsideWeek': { uniqueIncrement: true, range: 'small' },
+ 'registeredOutsideMonth': { uniqueIncrement: true, range: 'small' },
+ 'registeredOutsideYear': { uniqueIncrement: true, range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/ap-request.ts b/packages/backend/src/services/chart/charts/entities/ap-request.ts
new file mode 100644
index 0000000000..3a9f3dacfd
--- /dev/null
+++ b/packages/backend/src/services/chart/charts/entities/ap-request.ts
@@ -0,0 +1,11 @@
+import Chart from '../../core.js';
+
+export const name = 'apRequest';
+
+export const schema = {
+ 'deliverFailed': { },
+ 'deliverSucceeded': { },
+ 'inboxReceived': { },
+} as const;
+
+export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/drive.ts b/packages/backend/src/services/chart/charts/entities/drive.ts
index 3362cbd4cb..4bf5bb729e 100644
--- a/packages/backend/src/services/chart/charts/entities/drive.ts
+++ b/packages/backend/src/services/chart/charts/entities/drive.ts
@@ -1,72 +1,16 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'drive';
-const logSchema = {
- /**
- * 集計期間時点での、全ドライブファイル数
- */
- totalCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 集計期間時点での、全ドライブファイルの合計サイズ
- */
- totalSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 増加したドライブファイル数
- */
- incCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 増加したドライブ使用量
- */
- incSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 減少したドライブファイル数
- */
- decCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 減少したドライブ使用量
- */
- decSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.incCount': {},
+ 'local.incSize': {}, // in kilobyte
+ 'local.decCount': {},
+ 'local.decSize': {}, // in kilobyte
+ 'remote.incCount': {},
+ 'remote.incSize': {}, // in kilobyte
+ 'remote.decCount': {},
+ 'remote.decSize': {}, // in kilobyte
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts
index 836116bd06..9d2b860b10 100644
--- a/packages/backend/src/services/chart/charts/entities/federation.ts
+++ b/packages/backend/src/services/chart/charts/entities/federation.ts
@@ -1,30 +1,14 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'federation';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- instance: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
-};
+ 'deliveredInstances': { uniqueIncrement: true, range: 'small' },
+ 'inboxInstances': { uniqueIncrement: true, range: 'small' },
+ 'stalled': { uniqueIncrement: true, range: 'small' },
+ 'sub': { accumulate: true, range: 'small' },
+ 'pub': { accumulate: true, range: 'small' },
+ 'pubsub': { accumulate: true, range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/hashtag.ts b/packages/backend/src/services/chart/charts/entities/hashtag.ts
index 43e15456a5..4d04039047 100644
--- a/packages/backend/src/services/chart/charts/entities/hashtag.ts
+++ b/packages/backend/src/services/chart/charts/entities/hashtag.ts
@@ -1,36 +1,10 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'hashtag';
-const logSchema = {
- /**
- * 投稿したユーザー
- */
- users: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.users': { uniqueIncrement: true },
+ 'remote.users': { uniqueIncrement: true },
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/instance.ts b/packages/backend/src/services/chart/charts/entities/instance.ts
index 9d1f651dbb..06962120e2 100644
--- a/packages/backend/src/services/chart/charts/entities/instance.ts
+++ b/packages/backend/src/services/chart/charts/entities/instance.ts
@@ -1,158 +1,32 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'instance';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- requests: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- failed: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- succeeded: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- received: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-
- notes: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- diffs: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- normal: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- reply: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- renote: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
- },
-
- users: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-
- following: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-
- followers: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-
- drive: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- totalFiles: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- totalUsage: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- incFiles: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- incUsage: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- decFiles: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- decUsage: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
-};
+ 'requests.failed': { range: 'small' },
+ 'requests.succeeded': { range: 'small' },
+ 'requests.received': { range: 'small' },
+ 'notes.total': { accumulate: true },
+ 'notes.inc': {},
+ 'notes.dec': {},
+ 'notes.diffs.normal': {},
+ 'notes.diffs.reply': {},
+ 'notes.diffs.renote': {},
+ 'notes.diffs.withFile': {},
+ 'users.total': { accumulate: true },
+ 'users.inc': { range: 'small' },
+ 'users.dec': { range: 'small' },
+ 'following.total': { accumulate: true },
+ 'following.inc': { range: 'small' },
+ 'following.dec': { range: 'small' },
+ 'followers.total': { accumulate: true },
+ 'followers.inc': { range: 'small' },
+ 'followers.dec': { range: 'small' },
+ 'drive.totalFiles': { accumulate: true },
+ 'drive.incFiles': {},
+ 'drive.decFiles': {},
+ 'drive.incUsage': {}, // in kilobyte
+ 'drive.decUsage': {}, // in kilobyte
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/network.ts b/packages/backend/src/services/chart/charts/entities/network.ts
deleted file mode 100644
index 3d4fffb855..0000000000
--- a/packages/backend/src/services/chart/charts/entities/network.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import Chart from '../../core';
-
-export const name = 'network';
-
-export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- incomingRequests: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- outgoingRequests: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- totalTime: { // TIP: (totalTime / incomingRequests) でひとつのリクエストに平均でどれくらいの時間がかかったか知れる
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- incomingBytes: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- outgoingBytes: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
-
-export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/notes.ts b/packages/backend/src/services/chart/charts/entities/notes.ts
index 554d3abe12..9387dbfb2c 100644
--- a/packages/backend/src/services/chart/charts/entities/notes.ts
+++ b/packages/backend/src/services/chart/charts/entities/notes.ts
@@ -1,60 +1,22 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'notes';
-const logSchema = {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- diffs: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- normal: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- reply: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- renote: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.total': { accumulate: true },
+ 'local.inc': {},
+ 'local.dec': {},
+ 'local.diffs.normal': {},
+ 'local.diffs.reply': {},
+ 'local.diffs.renote': {},
+ 'local.diffs.withFile': {},
+ 'remote.total': { accumulate: true },
+ 'remote.inc': {},
+ 'remote.dec': {},
+ 'remote.diffs.normal': {},
+ 'remote.diffs.reply': {},
+ 'remote.diffs.renote': {},
+ 'remote.diffs.withFile': {},
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts
index ebf64e733e..6111640ea0 100644
--- a/packages/backend/src/services/chart/charts/entities/per-user-drive.ts
+++ b/packages/backend/src/services/chart/charts/entities/per-user-drive.ts
@@ -1,59 +1,14 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'perUserDrive';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- /**
- * 集計期間時点での、全ドライブファイル数
- */
- totalCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 集計期間時点での、全ドライブファイルの合計サイズ
- */
- totalSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 増加したドライブファイル数
- */
- incCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 増加したドライブ使用量
- */
- incSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 減少したドライブファイル数
- */
- decCount: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 減少したドライブ使用量
- */
- decSize: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
-};
+ 'totalCount': { accumulate: true },
+ 'totalSize': { accumulate: true }, // in kilobyte
+ 'incCount': { range: 'small' },
+ 'incSize': {}, // in kilobyte
+ 'decCount': { range: 'small' },
+ 'decSize': {}, // in kilobyte
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/per-user-following.ts b/packages/backend/src/services/chart/charts/entities/per-user-following.ts
index 8016c5fe97..4118daa474 100644
--- a/packages/backend/src/services/chart/charts/entities/per-user-following.ts
+++ b/packages/backend/src/services/chart/charts/entities/per-user-following.ts
@@ -1,90 +1,20 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'perUserFollowing';
-const logSchema = {
- /**
- * フォローしている
- */
- followings: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- /**
- * フォローしている合計
- */
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * フォローした数
- */
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * フォロー解除した数
- */
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-
- /**
- * フォローされている
- */
- followers: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- /**
- * フォローされている合計
- */
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * フォローされた数
- */
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * フォロー解除された数
- */
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.followings.total': { accumulate: true },
+ 'local.followings.inc': { range: 'small' },
+ 'local.followings.dec': { range: 'small' },
+ 'local.followers.total': { accumulate: true },
+ 'local.followers.inc': { range: 'small' },
+ 'local.followers.dec': { range: 'small' },
+ 'remote.followings.total': { accumulate: true },
+ 'remote.followings.inc': { range: 'small' },
+ 'remote.followings.dec': { range: 'small' },
+ 'remote.followers.total': { accumulate: true },
+ 'remote.followers.inc': { range: 'small' },
+ 'remote.followers.dec': { range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts
index d8f645b36e..c1fa174452 100644
--- a/packages/backend/src/services/chart/charts/entities/per-user-notes.ts
+++ b/packages/backend/src/services/chart/charts/entities/per-user-notes.ts
@@ -1,47 +1,15 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'perUserNotes';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- diffs: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- normal: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- reply: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- renote: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
-};
+ 'total': { accumulate: true },
+ 'inc': { range: 'small' },
+ 'dec': { range: 'small' },
+ 'diffs.normal': { range: 'small' },
+ 'diffs.reply': { range: 'small' },
+ 'diffs.renote': { range: 'small' },
+ 'diffs.withFile': { range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts
index bcb7012661..5e1a6c7b30 100644
--- a/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts
+++ b/packages/backend/src/services/chart/charts/entities/per-user-reactions.ts
@@ -1,32 +1,10 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'perUserReaction';
-const logSchema = {
- /**
- * 被リアクション数
- */
- count: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.count': { range: 'small' },
+ 'remote.count': { range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/test-grouped.ts b/packages/backend/src/services/chart/charts/entities/test-grouped.ts
index ca1c8c5700..66b6e8e864 100644
--- a/packages/backend/src/services/chart/charts/entities/test-grouped.ts
+++ b/packages/backend/src/services/chart/charts/entities/test-grouped.ts
@@ -1,32 +1,11 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'testGrouped';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- foo: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
-};
+ 'foo.total': { accumulate: true },
+ 'foo.inc': {},
+ 'foo.dec': {},
+} as const;
export const entity = Chart.schemaToEntity(name, schema, true);
diff --git a/packages/backend/src/services/chart/charts/entities/test-intersection.ts b/packages/backend/src/services/chart/charts/entities/test-intersection.ts
new file mode 100644
index 0000000000..a3bdcb367f
--- /dev/null
+++ b/packages/backend/src/services/chart/charts/entities/test-intersection.ts
@@ -0,0 +1,11 @@
+import Chart from '../../core.js';
+
+export const name = 'testIntersection';
+
+export const schema = {
+ 'a': { uniqueIncrement: true },
+ 'b': { uniqueIncrement: true },
+ 'aAndB': { intersection: ['a', 'b'] },
+} as const;
+
+export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/test-unique.ts b/packages/backend/src/services/chart/charts/entities/test-unique.ts
index 2e917ee9ed..b2cfb71b05 100644
--- a/packages/backend/src/services/chart/charts/entities/test-unique.ts
+++ b/packages/backend/src/services/chart/charts/entities/test-unique.ts
@@ -1,20 +1,9 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'testUnique';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- foo: {
- type: 'array' as const,
- optional: false as const, nullable: false as const,
- items: {
- type: 'string' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
-};
+ 'foo': { uniqueIncrement: true },
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/test.ts b/packages/backend/src/services/chart/charts/entities/test.ts
index fa536ff2cf..7cba21e16a 100644
--- a/packages/backend/src/services/chart/charts/entities/test.ts
+++ b/packages/backend/src/services/chart/charts/entities/test.ts
@@ -1,32 +1,11 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'test';
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- foo: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
- },
- },
- },
-};
+ 'foo.total': { accumulate: true },
+ 'foo.inc': {},
+ 'foo.dec': {},
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/entities/users.ts b/packages/backend/src/services/chart/charts/entities/users.ts
index 08d51c9414..c0b83094ae 100644
--- a/packages/backend/src/services/chart/charts/entities/users.ts
+++ b/packages/backend/src/services/chart/charts/entities/users.ts
@@ -1,48 +1,14 @@
-import Chart from '../../core';
+import Chart from '../../core.js';
export const name = 'users';
-const logSchema = {
- /**
- * 集計期間時点での、全ユーザー数
- */
- total: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 増加したユーザー数
- */
- inc: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-
- /**
- * 減少したユーザー数
- */
- dec: {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- },
-};
-
export const schema = {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: {
- local: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- remote: {
- type: 'object' as const,
- optional: false as const, nullable: false as const,
- properties: logSchema,
- },
- },
-};
+ 'local.total': { accumulate: true },
+ 'local.inc': { range: 'small' },
+ 'local.dec': { range: 'small' },
+ 'remote.total': { accumulate: true },
+ 'remote.inc': { range: 'small' },
+ 'remote.dec': { range: 'small' },
+} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/federation.ts b/packages/backend/src/services/chart/charts/federation.ts
index 8abb18b51f..4fbd297dbf 100644
--- a/packages/backend/src/services/chart/charts/federation.ts
+++ b/packages/backend/src/services/chart/charts/federation.ts
@@ -1,66 +1,64 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { Instances } from '@/models/index';
-import { name, schema } from './entities/federation';
-
-type FederationLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { Followings } from '@/models/index.js';
+import { name, schema } from './entities/federation.js';
/**
* フェデレーションに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class FederationChart extends Chart<FederationLog> {
+export default class FederationChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: FederationLog): DeepPartial<FederationLog> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {
- instance: {
- total: latest.instance.total,
- },
};
}
- @autobind
- protected aggregate(logs: FederationLog[]): FederationLog {
- return {
- instance: {
- total: logs[0].instance.total,
- inc: logs.reduce((a, b) => a + b.instance.inc, 0),
- dec: logs.reduce((a, b) => a + b.instance.dec, 0),
- },
- };
- }
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ const pubsubSubQuery = Followings.createQueryBuilder('f')
+ .select('f.followerHost')
+ .where('f.followerHost IS NOT NULL');
- @autobind
- protected async fetchActual(): Promise<DeepPartial<FederationLog>> {
- const [total] = await Promise.all([
- Instances.count({}),
+ const [sub, pub, pubsub] = await Promise.all([
+ Followings.createQueryBuilder('following')
+ .select('COUNT(DISTINCT following.followeeHost)')
+ .where('following.followeeHost IS NOT NULL')
+ .getRawOne()
+ .then(x => parseInt(x.count, 10)),
+ Followings.createQueryBuilder('following')
+ .select('COUNT(DISTINCT following.followerHost)')
+ .where('following.followerHost IS NOT NULL')
+ .getRawOne()
+ .then(x => parseInt(x.count, 10)),
+ Followings.createQueryBuilder('following')
+ .select('COUNT(DISTINCT following.followeeHost)')
+ .where('following.followeeHost IS NOT NULL')
+ .andWhere(`following.followeeHost IN (${ pubsubSubQuery.getQuery() })`)
+ .setParameters(pubsubSubQuery.getParameters())
+ .getRawOne()
+ .then(x => parseInt(x.count, 10)),
]);
return {
- instance: {
- total: total,
- },
+ 'sub': sub,
+ 'pub': pub,
+ 'pubsub': pubsub,
};
}
- @autobind
- public async update(isAdditional: boolean): Promise<void> {
- const update: Obj = {};
-
- update.total = isAdditional ? 1 : -1;
- if (isAdditional) {
- update.inc = 1;
- } else {
- update.dec = 1;
- }
+ public async deliverd(host: string, succeeded: boolean): Promise<void> {
+ await this.commit(succeeded ? {
+ 'deliveredInstances': [host],
+ } : {
+ 'stalled': [host],
+ });
+ }
- await this.inc({
- instance: update,
+ public async inbox(host: string): Promise<void> {
+ await this.commit({
+ 'inboxInstances': [host],
});
}
}
diff --git a/packages/backend/src/services/chart/charts/hashtag.ts b/packages/backend/src/services/chart/charts/hashtag.ts
index 34e0614643..31f7fa95dc 100644
--- a/packages/backend/src/services/chart/charts/hashtag.ts
+++ b/packages/backend/src/services/chart/charts/hashtag.ts
@@ -1,51 +1,29 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { User } from '@/models/entities/user';
-import { SchemaType } from '@/misc/schema';
-import { Users } from '@/models/index';
-import { name, schema } from './entities/hashtag';
-
-type HashtagLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { User } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
+import { name, schema } from './entities/hashtag.js';
/**
* ハッシュタグに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class HashtagChart extends Chart<HashtagLog> {
+export default class HashtagChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: HashtagLog): DeepPartial<HashtagLog> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
- protected aggregate(logs: HashtagLog[]): HashtagLog {
- return {
- local: {
- users: logs.reduce((a, b) => a.concat(b.local.users), [] as HashtagLog['local']['users']),
- },
- remote: {
- users: logs.reduce((a, b) => a.concat(b.remote.users), [] as HashtagLog['remote']['users']),
- },
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<HashtagLog>> {
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
public async update(hashtag: string, user: { id: User['id'], host: User['host'] }): Promise<void> {
- const update: Obj = {
- users: [user.id],
- };
-
- await this.inc({
- [Users.isLocalUser(user) ? 'local' : 'remote']: update,
+ await this.commit({
+ 'local.users': Users.isLocalUser(user) ? [user.id] : [],
+ 'remote.users': Users.isLocalUser(user) ? [] : [user.id],
}, hashtag);
}
}
diff --git a/packages/backend/src/services/chart/charts/instance.ts b/packages/backend/src/services/chart/charts/instance.ts
index 7f3419b69c..593430f281 100644
--- a/packages/backend/src/services/chart/charts/instance.ts
+++ b/packages/backend/src/services/chart/charts/instance.ts
@@ -1,221 +1,105 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { DriveFiles, Followings, Users, Notes } from '@/models/index';
-import { DriveFile } from '@/models/entities/drive-file';
-import { Note } from '@/models/entities/note';
-import { toPuny } from '@/misc/convert-host';
-import { name, schema } from './entities/instance';
-
-type InstanceLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { DriveFiles, Followings, Users, Notes } from '@/models/index.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { Note } from '@/models/entities/note.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { name, schema } from './entities/instance.js';
/**
* インスタンスごとのチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class InstanceChart extends Chart<InstanceLog> {
+export default class InstanceChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: InstanceLog): DeepPartial<InstanceLog> {
- return {
- notes: {
- total: latest.notes.total,
- },
- users: {
- total: latest.users.total,
- },
- following: {
- total: latest.following.total,
- },
- followers: {
- total: latest.followers.total,
- },
- drive: {
- totalFiles: latest.drive.totalFiles,
- totalUsage: latest.drive.totalUsage,
- },
- };
- }
-
- @autobind
- protected aggregate(logs: InstanceLog[]): InstanceLog {
- return {
- requests: {
- failed: logs.reduce((a, b) => a + b.requests.failed, 0),
- succeeded: logs.reduce((a, b) => a + b.requests.succeeded, 0),
- received: logs.reduce((a, b) => a + b.requests.received, 0),
- },
- notes: {
- total: logs[0].notes.total,
- inc: logs.reduce((a, b) => a + b.notes.inc, 0),
- dec: logs.reduce((a, b) => a + b.notes.dec, 0),
- diffs: {
- reply: logs.reduce((a, b) => a + b.notes.diffs.reply, 0),
- renote: logs.reduce((a, b) => a + b.notes.diffs.renote, 0),
- normal: logs.reduce((a, b) => a + b.notes.diffs.normal, 0),
- },
- },
- users: {
- total: logs[0].users.total,
- inc: logs.reduce((a, b) => a + b.users.inc, 0),
- dec: logs.reduce((a, b) => a + b.users.dec, 0),
- },
- following: {
- total: logs[0].following.total,
- inc: logs.reduce((a, b) => a + b.following.inc, 0),
- dec: logs.reduce((a, b) => a + b.following.dec, 0),
- },
- followers: {
- total: logs[0].followers.total,
- inc: logs.reduce((a, b) => a + b.followers.inc, 0),
- dec: logs.reduce((a, b) => a + b.followers.dec, 0),
- },
- drive: {
- totalFiles: logs[0].drive.totalFiles,
- totalUsage: logs[0].drive.totalUsage,
- incFiles: logs.reduce((a, b) => a + b.drive.incFiles, 0),
- incUsage: logs.reduce((a, b) => a + b.drive.incUsage, 0),
- decFiles: logs.reduce((a, b) => a + b.drive.decFiles, 0),
- decUsage: logs.reduce((a, b) => a + b.drive.decUsage, 0),
- },
- };
- }
-
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<InstanceLog>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [
notesCount,
usersCount,
followingCount,
followersCount,
driveFiles,
- driveUsage,
+ //driveUsage,
] = await Promise.all([
Notes.count({ userHost: group }),
Users.count({ host: group }),
Followings.count({ followerHost: group }),
Followings.count({ followeeHost: group }),
DriveFiles.count({ userHost: group }),
- DriveFiles.calcDriveUsageOfHost(group),
+ //DriveFiles.calcDriveUsageOfHost(group),
]);
return {
- notes: {
- total: notesCount,
- },
- users: {
- total: usersCount,
- },
- following: {
- total: followingCount,
- },
- followers: {
- total: followersCount,
- },
- drive: {
- totalFiles: driveFiles,
- totalUsage: driveUsage,
- },
+ 'notes.total': notesCount,
+ 'users.total': usersCount,
+ 'following.total': followingCount,
+ 'followers.total': followersCount,
+ 'drive.totalFiles': driveFiles,
};
}
- @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
public async requestReceived(host: string): Promise<void> {
- await this.inc({
- requests: {
- received: 1,
- },
+ await this.commit({
+ 'requests.received': 1,
}, toPuny(host));
}
- @autobind
public async requestSent(host: string, isSucceeded: boolean): Promise<void> {
- const update: Obj = {};
-
- if (isSucceeded) {
- update.succeeded = 1;
- } else {
- update.failed = 1;
- }
-
- await this.inc({
- requests: update,
+ await this.commit({
+ 'requests.succeeded': isSucceeded ? 1 : 0,
+ 'requests.failed': isSucceeded ? 0 : 1,
}, toPuny(host));
}
- @autobind
public async newUser(host: string): Promise<void> {
- await this.inc({
- users: {
- total: 1,
- inc: 1,
- },
+ await this.commit({
+ 'users.total': 1,
+ 'users.inc': 1,
}, toPuny(host));
}
- @autobind
public async updateNote(host: string, note: Note, isAdditional: boolean): Promise<void> {
- const diffs = {} as Record<string, unknown>;
-
- if (note.replyId != null) {
- diffs.reply = isAdditional ? 1 : -1;
- } else if (note.renoteId != null) {
- diffs.renote = isAdditional ? 1 : -1;
- } else {
- diffs.normal = isAdditional ? 1 : -1;
- }
-
- await this.inc({
- notes: {
- total: isAdditional ? 1 : -1,
- inc: isAdditional ? 1 : 0,
- dec: isAdditional ? 0 : 1,
- diffs: diffs,
- },
+ await this.commit({
+ 'notes.total': isAdditional ? 1 : -1,
+ 'notes.inc': isAdditional ? 1 : 0,
+ 'notes.dec': isAdditional ? 0 : 1,
+ 'notes.diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0,
+ 'notes.diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0,
+ 'notes.diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0,
+ 'notes.diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0,
}, toPuny(host));
}
- @autobind
public async updateFollowing(host: string, isAdditional: boolean): Promise<void> {
- await this.inc({
- following: {
- total: isAdditional ? 1 : -1,
- inc: isAdditional ? 1 : 0,
- dec: isAdditional ? 0 : 1,
- },
+ await this.commit({
+ 'following.total': isAdditional ? 1 : -1,
+ 'following.inc': isAdditional ? 1 : 0,
+ 'following.dec': isAdditional ? 0 : 1,
}, toPuny(host));
}
- @autobind
public async updateFollowers(host: string, isAdditional: boolean): Promise<void> {
- await this.inc({
- followers: {
- total: isAdditional ? 1 : -1,
- inc: isAdditional ? 1 : 0,
- dec: isAdditional ? 0 : 1,
- },
+ await this.commit({
+ 'followers.total': isAdditional ? 1 : -1,
+ 'followers.inc': isAdditional ? 1 : 0,
+ 'followers.dec': isAdditional ? 0 : 1,
}, toPuny(host));
}
- @autobind
public async updateDrive(file: DriveFile, isAdditional: boolean): Promise<void> {
- const update: Obj = {};
-
- update.totalFiles = isAdditional ? 1 : -1;
- update.totalUsage = isAdditional ? file.size : -file.size;
- if (isAdditional) {
- update.incFiles = 1;
- update.incUsage = file.size;
- } else {
- update.decFiles = 1;
- update.decUsage = file.size;
- }
-
- await this.inc({
- drive: update,
+ const fileSizeKb = file.size / 1000;
+ await this.commit({
+ 'drive.totalFiles': isAdditional ? 1 : -1,
+ 'drive.incFiles': isAdditional ? 1 : 0,
+ 'drive.incUsage': isAdditional ? fileSizeKb : 0,
+ 'drive.decFiles': isAdditional ? 1 : 0,
+ 'drive.decUsage': isAdditional ? fileSizeKb : 0,
}, file.userHost);
}
}
diff --git a/packages/backend/src/services/chart/charts/network.ts b/packages/backend/src/services/chart/charts/network.ts
deleted file mode 100644
index 73ea2f7e19..0000000000
--- a/packages/backend/src/services/chart/charts/network.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import autobind from 'autobind-decorator';
-import Chart, { DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { name, schema } from './entities/network';
-
-type NetworkLog = SchemaType<typeof schema>;
-
-/**
- * ネットワークに関するチャート
- */
-// eslint-disable-next-line import/no-default-export
-export default class NetworkChart extends Chart<NetworkLog> {
- constructor() {
- super(name, schema);
- }
-
- @autobind
- protected genNewLog(latest: NetworkLog): DeepPartial<NetworkLog> {
- return {};
- }
-
- @autobind
- protected aggregate(logs: NetworkLog[]): NetworkLog {
- return {
- incomingRequests: logs.reduce((a, b) => a + b.incomingRequests, 0),
- outgoingRequests: logs.reduce((a, b) => a + b.outgoingRequests, 0),
- totalTime: logs.reduce((a, b) => a + b.totalTime, 0),
- incomingBytes: logs.reduce((a, b) => a + b.incomingBytes, 0),
- outgoingBytes: logs.reduce((a, b) => a + b.outgoingBytes, 0),
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<NetworkLog>> {
- return {};
- }
-
- @autobind
- public async update(incomingRequests: number, time: number, incomingBytes: number, outgoingBytes: number): Promise<void> {
- const inc: DeepPartial<NetworkLog> = {
- incomingRequests: incomingRequests,
- totalTime: time,
- incomingBytes: incomingBytes,
- outgoingBytes: outgoingBytes,
- };
-
- await this.inc(inc);
- }
-}
diff --git a/packages/backend/src/services/chart/charts/notes.ts b/packages/backend/src/services/chart/charts/notes.ts
index 86cda17225..ab6a37e3c1 100644
--- a/packages/backend/src/services/chart/charts/notes.ts
+++ b/packages/backend/src/services/chart/charts/notes.ts
@@ -1,101 +1,45 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { Notes } from '@/models/index';
+import Chart, { KVs } from '../core.js';
+import { Notes } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
-import { Note } from '@/models/entities/note';
-import { name, schema } from './entities/notes';
-
-type NotesLog = SchemaType<typeof schema>;
+import { Note } from '@/models/entities/note.js';
+import { name, schema } from './entities/notes.js';
/**
* ノートに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class NotesChart extends Chart<NotesLog> {
+export default class NotesChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: NotesLog): DeepPartial<NotesLog> {
- return {
- local: {
- total: latest.local.total,
- },
- remote: {
- total: latest.remote.total,
- },
- };
- }
-
- @autobind
- protected aggregate(logs: NotesLog[]): NotesLog {
- return {
- local: {
- total: logs[0].local.total,
- inc: logs.reduce((a, b) => a + b.local.inc, 0),
- dec: logs.reduce((a, b) => a + b.local.dec, 0),
- diffs: {
- reply: logs.reduce((a, b) => a + b.local.diffs.reply, 0),
- renote: logs.reduce((a, b) => a + b.local.diffs.renote, 0),
- normal: logs.reduce((a, b) => a + b.local.diffs.normal, 0),
- },
- },
- remote: {
- total: logs[0].remote.total,
- inc: logs.reduce((a, b) => a + b.remote.inc, 0),
- dec: logs.reduce((a, b) => a + b.remote.dec, 0),
- diffs: {
- reply: logs.reduce((a, b) => a + b.remote.diffs.reply, 0),
- renote: logs.reduce((a, b) => a + b.remote.diffs.renote, 0),
- normal: logs.reduce((a, b) => a + b.remote.diffs.normal, 0),
- },
- },
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<NotesLog>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
const [localCount, remoteCount] = await Promise.all([
Notes.count({ userHost: null }),
Notes.count({ userHost: Not(IsNull()) }),
]);
return {
- local: {
- total: localCount,
- },
- remote: {
- total: remoteCount,
- },
+ 'local.total': localCount,
+ 'remote.total': remoteCount,
};
}
- @autobind
- public async update(note: Note, isAdditional: boolean): Promise<void> {
- const update: Obj = {
- diffs: {},
- };
-
- update.total = isAdditional ? 1 : -1;
-
- if (isAdditional) {
- update.inc = 1;
- } else {
- update.dec = 1;
- }
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
- if (note.replyId != null) {
- update.diffs.reply = isAdditional ? 1 : -1;
- } else if (note.renoteId != null) {
- update.diffs.renote = isAdditional ? 1 : -1;
- } else {
- update.diffs.normal = isAdditional ? 1 : -1;
- }
+ public async update(note: Note, isAdditional: boolean): Promise<void> {
+ const prefix = note.userHost === null ? 'local' : 'remote';
- await this.inc({
- [note.userHost === null ? 'local' : 'remote']: update,
+ await this.commit({
+ [`${prefix}.total`]: isAdditional ? 1 : -1,
+ [`${prefix}.inc`]: isAdditional ? 1 : 0,
+ [`${prefix}.dec`]: isAdditional ? 0 : 1,
+ [`${prefix}.diffs.normal`]: note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0,
+ [`${prefix}.diffs.renote`]: note.renoteId != null ? (isAdditional ? 1 : -1) : 0,
+ [`${prefix}.diffs.reply`]: note.replyId != null ? (isAdditional ? 1 : -1) : 0,
+ [`${prefix}.diffs.withFile`]: note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0,
});
}
}
diff --git a/packages/backend/src/services/chart/charts/per-user-drive.ts b/packages/backend/src/services/chart/charts/per-user-drive.ts
index fff790367f..131befa396 100644
--- a/packages/backend/src/services/chart/charts/per-user-drive.ts
+++ b/packages/backend/src/services/chart/charts/per-user-drive.ts
@@ -1,68 +1,42 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { DriveFiles } from '@/models/index';
-import { DriveFile } from '@/models/entities/drive-file';
-import { name, schema } from './entities/per-user-drive';
-
-type PerUserDriveLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { DriveFiles } from '@/models/index.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { name, schema } from './entities/per-user-drive.js';
/**
* ユーザーごとのドライブに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class PerUserDriveChart extends Chart<PerUserDriveLog> {
+export default class PerUserDriveChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: PerUserDriveLog): DeepPartial<PerUserDriveLog> {
- return {
- totalCount: latest.totalCount,
- totalSize: latest.totalSize,
- };
- }
-
- @autobind
- protected aggregate(logs: PerUserDriveLog[]): PerUserDriveLog {
- return {
- totalCount: logs[0].totalCount,
- totalSize: logs[0].totalSize,
- incCount: logs.reduce((a, b) => a + b.incCount, 0),
- incSize: logs.reduce((a, b) => a + b.incSize, 0),
- decCount: logs.reduce((a, b) => a + b.decCount, 0),
- decSize: logs.reduce((a, b) => a + b.decSize, 0),
- };
- }
-
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<PerUserDriveLog>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [count, size] = await Promise.all([
DriveFiles.count({ userId: group }),
DriveFiles.calcDriveUsageOf(group),
]);
return {
- totalCount: count,
- totalSize: size,
+ 'totalCount': count,
+ 'totalSize': size,
};
}
- @autobind
- public async update(file: DriveFile, isAdditional: boolean): Promise<void> {
- const update: Obj = {};
-
- update.totalCount = isAdditional ? 1 : -1;
- update.totalSize = isAdditional ? file.size : -file.size;
- if (isAdditional) {
- update.incCount = 1;
- update.incSize = file.size;
- } else {
- update.decCount = 1;
- update.decSize = file.size;
- }
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
- await this.inc(update, file.userId);
+ public async update(file: DriveFile, isAdditional: boolean): Promise<void> {
+ const fileSizeKb = file.size / 1000;
+ await this.commit({
+ 'totalCount': isAdditional ? 1 : -1,
+ 'totalSize': isAdditional ? fileSizeKb : -fileSizeKb,
+ 'incCount': isAdditional ? 1 : 0,
+ 'incSize': isAdditional ? fileSizeKb : 0,
+ 'decCount': isAdditional ? 0 : 1,
+ 'decSize': isAdditional ? 0 : fileSizeKb,
+ }, file.userId);
}
}
diff --git a/packages/backend/src/services/chart/charts/per-user-following.ts b/packages/backend/src/services/chart/charts/per-user-following.ts
index d0a80abdaf..5d5dd1fa1e 100644
--- a/packages/backend/src/services/chart/charts/per-user-following.ts
+++ b/packages/backend/src/services/chart/charts/per-user-following.ts
@@ -1,76 +1,19 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { Followings, Users } from '@/models/index';
+import Chart, { KVs } from '../core.js';
+import { Followings, Users } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
-import { User } from '@/models/entities/user';
-import { name, schema } from './entities/per-user-following';
-
-type PerUserFollowingLog = SchemaType<typeof schema>;
+import { User } from '@/models/entities/user.js';
+import { name, schema } from './entities/per-user-following.js';
/**
* ユーザーごとのフォローに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
+export default class PerUserFollowingChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: PerUserFollowingLog): DeepPartial<PerUserFollowingLog> {
- return {
- local: {
- followings: {
- total: latest.local.followings.total,
- },
- followers: {
- total: latest.local.followers.total,
- },
- },
- remote: {
- followings: {
- total: latest.remote.followings.total,
- },
- followers: {
- total: latest.remote.followers.total,
- },
- },
- };
- }
-
- @autobind
- protected aggregate(logs: PerUserFollowingLog[]): PerUserFollowingLog {
- return {
- local: {
- followings: {
- total: logs[0].local.followings.total,
- inc: logs.reduce((a, b) => a + b.local.followings.inc, 0),
- dec: logs.reduce((a, b) => a + b.local.followings.dec, 0),
- },
- followers: {
- total: logs[0].local.followers.total,
- inc: logs.reduce((a, b) => a + b.local.followers.inc, 0),
- dec: logs.reduce((a, b) => a + b.local.followers.dec, 0),
- },
- },
- remote: {
- followings: {
- total: logs[0].remote.followings.total,
- inc: logs.reduce((a, b) => a + b.remote.followings.inc, 0),
- dec: logs.reduce((a, b) => a + b.remote.followings.dec, 0),
- },
- followers: {
- total: logs[0].remote.followers.total,
- inc: logs.reduce((a, b) => a + b.remote.followers.inc, 0),
- dec: logs.reduce((a, b) => a + b.remote.followers.dec, 0),
- },
- },
- };
- }
-
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<PerUserFollowingLog>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [
localFollowingsCount,
localFollowersCount,
@@ -84,42 +27,30 @@ export default class PerUserFollowingChart extends Chart<PerUserFollowingLog> {
]);
return {
- local: {
- followings: {
- total: localFollowingsCount,
- },
- followers: {
- total: localFollowersCount,
- },
- },
- remote: {
- followings: {
- total: remoteFollowingsCount,
- },
- followers: {
- total: remoteFollowersCount,
- },
- },
+ 'local.followings.total': localFollowingsCount,
+ 'local.followers.total': localFollowersCount,
+ 'remote.followings.total': remoteFollowingsCount,
+ 'remote.followers.total': remoteFollowersCount,
};
}
- @autobind
- public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise<void> {
- const update: Obj = {};
-
- update.total = isFollow ? 1 : -1;
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
- if (isFollow) {
- update.inc = 1;
- } else {
- update.dec = 1;
- }
+ public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise<void> {
+ const prefixFollower = Users.isLocalUser(follower) ? 'local' : 'remote';
+ const prefixFollowee = Users.isLocalUser(followee) ? 'local' : 'remote';
- this.inc({
- [Users.isLocalUser(follower) ? 'local' : 'remote']: { followings: update },
+ this.commit({
+ [`${prefixFollower}.followings.total`]: isFollow ? 1 : -1,
+ [`${prefixFollower}.followings.inc`]: isFollow ? 1 : 0,
+ [`${prefixFollower}.followings.dec`]: isFollow ? 0 : 1,
}, follower.id);
- this.inc({
- [Users.isLocalUser(followee) ? 'local' : 'remote']: { followers: update },
+ this.commit({
+ [`${prefixFollowee}.followers.total`]: isFollow ? 1 : -1,
+ [`${prefixFollowee}.followers.inc`]: isFollow ? 1 : 0,
+ [`${prefixFollowee}.followers.dec`]: isFollow ? 0 : 1,
}, followee.id);
}
}
diff --git a/packages/backend/src/services/chart/charts/per-user-notes.ts b/packages/backend/src/services/chart/charts/per-user-notes.ts
index d048c88885..9c5dea1aa9 100644
--- a/packages/backend/src/services/chart/charts/per-user-notes.ts
+++ b/packages/backend/src/services/chart/charts/per-user-notes.ts
@@ -1,45 +1,19 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { User } from '@/models/entities/user';
-import { SchemaType } from '@/misc/schema';
-import { Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { name, schema } from './entities/per-user-notes';
-
-type PerUserNotesLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { User } from '@/models/entities/user.js';
+import { Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { name, schema } from './entities/per-user-notes.js';
/**
* ユーザーごとのノートに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class PerUserNotesChart extends Chart<PerUserNotesLog> {
+export default class PerUserNotesChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: PerUserNotesLog): DeepPartial<PerUserNotesLog> {
- return {
- total: latest.total,
- };
- }
-
- @autobind
- protected aggregate(logs: PerUserNotesLog[]): PerUserNotesLog {
- return {
- total: logs[0].total,
- inc: logs.reduce((a, b) => a + b.inc, 0),
- dec: logs.reduce((a, b) => a + b.dec, 0),
- diffs: {
- reply: logs.reduce((a, b) => a + b.diffs.reply, 0),
- renote: logs.reduce((a, b) => a + b.diffs.renote, 0),
- normal: logs.reduce((a, b) => a + b.diffs.normal, 0),
- },
- };
- }
-
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<PerUserNotesLog>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [count] = await Promise.all([
Notes.count({ userId: group }),
]);
@@ -49,28 +23,19 @@ export default class PerUserNotesChart extends Chart<PerUserNotesLog> {
};
}
- @autobind
- public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise<void> {
- const update: Obj = {
- diffs: {},
- };
-
- update.total = isAdditional ? 1 : -1;
-
- if (isAdditional) {
- update.inc = 1;
- } else {
- update.dec = 1;
- }
-
- if (note.replyId != null) {
- update.diffs.reply = isAdditional ? 1 : -1;
- } else if (note.renoteId != null) {
- update.diffs.renote = isAdditional ? 1 : -1;
- } else {
- update.diffs.normal = isAdditional ? 1 : -1;
- }
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
- await this.inc(update, user.id);
+ public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise<void> {
+ await this.commit({
+ 'total': isAdditional ? 1 : -1,
+ 'inc': isAdditional ? 1 : 0,
+ 'dec': isAdditional ? 0 : 1,
+ 'diffs.normal': note.replyId == null && note.renoteId == null ? (isAdditional ? 1 : -1) : 0,
+ 'diffs.renote': note.renoteId != null ? (isAdditional ? 1 : -1) : 0,
+ 'diffs.reply': note.replyId != null ? (isAdditional ? 1 : -1) : 0,
+ 'diffs.withFile': note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0,
+ }, user.id);
}
}
diff --git a/packages/backend/src/services/chart/charts/per-user-reactions.ts b/packages/backend/src/services/chart/charts/per-user-reactions.ts
index 2f5353340d..3a830e118c 100644
--- a/packages/backend/src/services/chart/charts/per-user-reactions.ts
+++ b/packages/backend/src/services/chart/charts/per-user-reactions.ts
@@ -1,48 +1,30 @@
-import autobind from 'autobind-decorator';
-import Chart, { DeepPartial } from '../core';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { SchemaType } from '@/misc/schema';
-import { Users } from '@/models/index';
-import { name, schema } from './entities/per-user-reactions';
-
-type PerUserReactionsLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { Users } from '@/models/index.js';
+import { name, schema } from './entities/per-user-reactions.js';
/**
* ユーザーごとのリアクションに関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class PerUserReactionsChart extends Chart<PerUserReactionsLog> {
+export default class PerUserReactionsChart extends Chart<typeof schema> {
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: PerUserReactionsLog): DeepPartial<PerUserReactionsLog> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
- protected aggregate(logs: PerUserReactionsLog[]): PerUserReactionsLog {
- return {
- local: {
- count: logs.reduce((a, b) => a + b.local.count, 0),
- },
- remote: {
- count: logs.reduce((a, b) => a + b.remote.count, 0),
- },
- };
- }
-
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<PerUserReactionsLog>> {
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
public async update(user: { id: User['id'], host: User['host'] }, note: Note): Promise<void> {
- this.inc({
- [Users.isLocalUser(user) ? 'local' : 'remote']: { count: 1 },
+ const prefix = Users.isLocalUser(user) ? 'local' : 'remote';
+ this.commit({
+ [`${prefix}.count`]: 1,
}, note.userId);
}
}
diff --git a/packages/backend/src/services/chart/charts/test-grouped.ts b/packages/backend/src/services/chart/charts/test-grouped.ts
index c851d2df01..d01c9fcbd6 100644
--- a/packages/backend/src/services/chart/charts/test-grouped.ts
+++ b/packages/backend/src/services/chart/charts/test-grouped.ts
@@ -1,62 +1,35 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { name, schema } from './entities/test-grouped';
-
-type TestGroupedLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { name, schema } from './entities/test-grouped.js';
/**
* For testing
*/
// eslint-disable-next-line import/no-default-export
-export default class TestGroupedChart extends Chart<TestGroupedLog> {
+export default class TestGroupedChart extends Chart<typeof schema> {
private total = {} as Record<string, number>;
constructor() {
super(name, schema, true);
}
- @autobind
- protected genNewLog(latest: TestGroupedLog): DeepPartial<TestGroupedLog> {
- return {
- foo: {
- total: latest.foo.total,
- },
- };
- }
-
- @autobind
- protected aggregate(logs: TestGroupedLog[]): TestGroupedLog {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
return {
- foo: {
- total: logs[0].foo.total,
- inc: logs.reduce((a, b) => a + b.foo.inc, 0),
- dec: logs.reduce((a, b) => a + b.foo.dec, 0),
- },
+ 'foo.total': this.total[group],
};
}
- @autobind
- protected async fetchActual(group: string): Promise<DeepPartial<TestGroupedLog>> {
- return {
- foo: {
- total: this.total[group],
- },
- };
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
}
- @autobind
public async increment(group: string): Promise<void> {
if (this.total[group] == null) this.total[group] = 0;
- const update: Obj = {};
-
- update.total = 1;
- update.inc = 1;
this.total[group]++;
- await this.inc({
- foo: update,
+ await this.commit({
+ 'foo.total': 1,
+ 'foo.inc': 1,
}, group);
}
}
diff --git a/packages/backend/src/services/chart/charts/test-intersection.ts b/packages/backend/src/services/chart/charts/test-intersection.ts
new file mode 100644
index 0000000000..88b5a715c1
--- /dev/null
+++ b/packages/backend/src/services/chart/charts/test-intersection.ts
@@ -0,0 +1,32 @@
+import Chart, { KVs } from '../core.js';
+import { name, schema } from './entities/test-intersection.js';
+
+/**
+ * For testing
+ */
+// eslint-disable-next-line import/no-default-export
+export default class TestIntersectionChart extends Chart<typeof schema> {
+ constructor() {
+ super(name, schema);
+ }
+
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ public async addA(key: string): Promise<void> {
+ await this.commit({
+ a: [key],
+ });
+ }
+
+ public async addB(key: string): Promise<void> {
+ await this.commit({
+ b: [key],
+ });
+ }
+}
diff --git a/packages/backend/src/services/chart/charts/test-unique.ts b/packages/backend/src/services/chart/charts/test-unique.ts
index 3564f675ad..d714f1d40c 100644
--- a/packages/backend/src/services/chart/charts/test-unique.ts
+++ b/packages/backend/src/services/chart/charts/test-unique.ts
@@ -1,39 +1,25 @@
-import autobind from 'autobind-decorator';
-import Chart, { DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { name, schema } from './entities/test-unique';
-
-type TestUniqueLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { name, schema } from './entities/test-unique.js';
/**
* For testing
*/
// eslint-disable-next-line import/no-default-export
-export default class TestUniqueChart extends Chart<TestUniqueLog> {
+export default class TestUniqueChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: TestUniqueLog): DeepPartial<TestUniqueLog> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
- protected aggregate(logs: TestUniqueLog[]): TestUniqueLog {
- return {
- foo: logs.reduce((a, b) => a.concat(b.foo), [] as TestUniqueLog['foo']),
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<TestUniqueLog>> {
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
- @autobind
public async uniqueIncrement(key: string): Promise<void> {
- await this.inc({
+ await this.commit({
foo: [key],
});
}
diff --git a/packages/backend/src/services/chart/charts/test.ts b/packages/backend/src/services/chart/charts/test.ts
index 06add7ede9..adb2b18c87 100644
--- a/packages/backend/src/services/chart/charts/test.ts
+++ b/packages/backend/src/services/chart/charts/test.ts
@@ -1,73 +1,42 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { name, schema } from './entities/test';
-
-type TestLog = SchemaType<typeof schema>;
+import Chart, { KVs } from '../core.js';
+import { name, schema } from './entities/test.js';
/**
* For testing
*/
// eslint-disable-next-line import/no-default-export
-export default class TestChart extends Chart<TestLog> {
+export default class TestChart extends Chart<typeof schema> {
public total = 0; // publicにするのはテストのため
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: TestLog): DeepPartial<TestLog> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {
- foo: {
- total: latest.foo.total,
- },
+ 'foo.total': this.total,
};
}
- @autobind
- protected aggregate(logs: TestLog[]): TestLog {
- return {
- foo: {
- total: logs[0].foo.total,
- inc: logs.reduce((a, b) => a + b.foo.inc, 0),
- dec: logs.reduce((a, b) => a + b.foo.dec, 0),
- },
- };
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
}
- @autobind
- protected async fetchActual(): Promise<DeepPartial<TestLog>> {
- return {
- foo: {
- total: this.total,
- },
- };
- }
-
- @autobind
public async increment(): Promise<void> {
- const update: Obj = {};
-
- update.total = 1;
- update.inc = 1;
this.total++;
- await this.inc({
- foo: update,
+ await this.commit({
+ 'foo.total': 1,
+ 'foo.inc': 1,
});
}
- @autobind
public async decrement(): Promise<void> {
- const update: Obj = {};
-
- update.total = -1;
- update.dec = 1;
this.total--;
- await this.inc({
- foo: update,
+ await this.commit({
+ 'foo.total': -1,
+ 'foo.dec': 1,
});
}
}
diff --git a/packages/backend/src/services/chart/charts/users.ts b/packages/backend/src/services/chart/charts/users.ts
index c36c6cd979..fb9d5e15fb 100644
--- a/packages/backend/src/services/chart/charts/users.ts
+++ b/packages/backend/src/services/chart/charts/users.ts
@@ -1,80 +1,41 @@
-import autobind from 'autobind-decorator';
-import Chart, { Obj, DeepPartial } from '../core';
-import { SchemaType } from '@/misc/schema';
-import { Users } from '@/models/index';
+import Chart, { KVs } from '../core.js';
+import { Users } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
-import { User } from '@/models/entities/user';
-import { name, schema } from './entities/users';
-
-type UsersLog = SchemaType<typeof schema>;
+import { User } from '@/models/entities/user.js';
+import { name, schema } from './entities/users.js';
/**
* ユーザー数に関するチャート
*/
// eslint-disable-next-line import/no-default-export
-export default class UsersChart extends Chart<UsersLog> {
+export default class UsersChart extends Chart<typeof schema> {
constructor() {
super(name, schema);
}
- @autobind
- protected genNewLog(latest: UsersLog): DeepPartial<UsersLog> {
- return {
- local: {
- total: latest.local.total,
- },
- remote: {
- total: latest.remote.total,
- },
- };
- }
-
- @autobind
- protected aggregate(logs: UsersLog[]): UsersLog {
- return {
- local: {
- total: logs[0].local.total,
- inc: logs.reduce((a, b) => a + b.local.inc, 0),
- dec: logs.reduce((a, b) => a + b.local.dec, 0),
- },
- remote: {
- total: logs[0].remote.total,
- inc: logs.reduce((a, b) => a + b.remote.inc, 0),
- dec: logs.reduce((a, b) => a + b.remote.dec, 0),
- },
- };
- }
-
- @autobind
- protected async fetchActual(): Promise<DeepPartial<UsersLog>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
const [localCount, remoteCount] = await Promise.all([
Users.count({ host: null }),
Users.count({ host: Not(IsNull()) }),
]);
return {
- local: {
- total: localCount,
- },
- remote: {
- total: remoteCount,
- },
+ 'local.total': localCount,
+ 'remote.total': remoteCount,
};
}
- @autobind
- public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean): Promise<void> {
- const update: Obj = {};
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
- update.total = isAdditional ? 1 : -1;
- if (isAdditional) {
- update.inc = 1;
- } else {
- update.dec = 1;
- }
+ public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean): Promise<void> {
+ const prefix = Users.isLocalUser(user) ? 'local' : 'remote';
- await this.inc({
- [Users.isLocalUser(user) ? 'local' : 'remote']: update,
+ await this.commit({
+ [`${prefix}.total`]: isAdditional ? 1 : -1,
+ [`${prefix}.inc`]: isAdditional ? 1 : 0,
+ [`${prefix}.dec`]: isAdditional ? 0 : 1,
});
}
}
diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts
index e406449f4f..39fad71dd7 100644
--- a/packages/backend/src/services/chart/core.ts
+++ b/packages/backend/src/services/chart/core.ts
@@ -5,26 +5,39 @@
*/
import * as nestedProperty from 'nested-property';
-import autobind from 'autobind-decorator';
-import Logger from '../logger';
-import { Schema } from '@/misc/schema';
+import Logger from '../logger.js';
import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm';
-import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/prelude/time';
-import { getChartInsertLock } from '@/misc/app-lock';
+import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '@/prelude/time.js';
+import { getChartInsertLock } from '@/misc/app-lock.js';
const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test');
-export type Obj = { [key: string]: any };
+const columnPrefix = '___' as const;
+const uniqueTempColumnPrefix = 'unique_temp___' as const;
+const columnDot = '_' as const;
-export type DeepPartial<T> = {
- [P in keyof T]?: DeepPartial<T[P]>;
+type Schema = Record<string, {
+ uniqueIncrement?: boolean;
+
+ intersection?: string[] | ReadonlyArray<string>;
+
+ range?: 'big' | 'small' | 'medium';
+
+ // previousな値を引き継ぐかどうか
+ accumulate?: boolean;
+}>;
+
+type KeyToColumnName<T extends string> = T extends `${infer R1}.${infer R2}` ? `${R1}${typeof columnDot}${KeyToColumnName<R2>}` : T;
+
+type Columns<S extends Schema> = {
+ [K in keyof S as `${typeof columnPrefix}${KeyToColumnName<string & K>}`]: number;
};
-type ArrayValue<T> = {
- [P in keyof T]: T[P] extends number ? T[P][] : ArrayValue<T[P]>;
+type TempColumnsForUnique<S extends Schema> = {
+ [K in keyof S as `${typeof uniqueTempColumnPrefix}${KeyToColumnName<string & K>}`]: S[K]['uniqueIncrement'] extends true ? string[] : never;
};
-type Log = {
+type RawRecord<S extends Schema> = {
id: number;
/**
@@ -36,7 +49,7 @@ type Log = {
* 集計日時のUnixタイムスタンプ(秒)
*/
date: number;
-};
+} & TempColumnsForUnique<S> & Columns<S>;
const camelToSnake = (str: string): string => {
return str.replace(/([A-Z])/g, s => '_' + s.charAt(0).toLowerCase());
@@ -44,127 +57,119 @@ const camelToSnake = (str: string): string => {
const removeDuplicates = (array: any[]) => Array.from(new Set(array));
+type Commit<S extends Schema> = {
+ [K in keyof S]?: S[K]['uniqueIncrement'] extends true ? string[] : number;
+};
+
+export type KVs<S extends Schema> = {
+ [K in keyof S]: number;
+};
+
+type ChartResult<T extends Schema> = {
+ [P in keyof T]: number[];
+};
+
+type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
+
+type UnflattenSingleton<K extends string, V> = K extends `${infer A}.${infer B}`
+ ? { [_ in A]: UnflattenSingleton<B, V>; }
+ : { [_ in K]: V; };
+
+type Unflatten<T extends Record<string, any>> = UnionToIntersection<
+ {
+ [K in Extract<keyof T, string>]: UnflattenSingleton<K, T[K]>;
+ }[Extract<keyof T, string>]
+>;
+
+type ToJsonSchema<S> = {
+ type: 'object';
+ properties: {
+ [K in keyof S]: S[K] extends number[] ? { type: 'array'; items: { type: 'number'; }; } : ToJsonSchema<S[K]>;
+ },
+ required: (keyof S)[];
+};
+
+export function getJsonSchema<S extends Schema>(schema: S): ToJsonSchema<Unflatten<ChartResult<S>>> {
+ const object = {};
+ for (const [k, v] of Object.entries(schema)) {
+ nestedProperty.set(object, k, null);
+ }
+
+ function f(obj: Record<string, null | Record<string, unknown>>) {
+ const jsonSchema = {
+ type: 'object',
+ properties: {} as Record<string, unknown>,
+ required: [],
+ };
+ for (const [k, v] of Object.entries(obj)) {
+ jsonSchema.properties[k] = v === null ? {
+ type: 'array',
+ items: { type: 'number' },
+ } : f(v as Record<string, null | Record<string, unknown>>);
+ }
+ return jsonSchema;
+ }
+
+ return f(object) as ToJsonSchema<Unflatten<ChartResult<S>>>;
+}
+
/**
* 様々なチャートの管理を司るクラス
*/
// eslint-disable-next-line import/no-default-export
-export default abstract class Chart<T extends Record<string, any>> {
- private static readonly columnPrefix = '___';
- private static readonly columnDot = '_';
+export default abstract class Chart<T extends Schema> {
+ public schema: T;
private name: string;
private buffer: {
- diff: DeepPartial<T>;
+ diff: Commit<T>;
group: string | null;
}[] = [];
- public schema: Schema;
- protected repositoryForHour: Repository<Log>;
- protected repositoryForDay: Repository<Log>;
-
- protected abstract genNewLog(latest: T): DeepPartial<T>;
+ // ↓にしたいけどfindOneとかで型エラーになる
+ //private repositoryForHour: Repository<RawRecord<T>>;
+ //private repositoryForDay: Repository<RawRecord<T>>;
+ private repositoryForHour: Repository<{ id: number; group?: string | null; date: number; }>;
+ private repositoryForDay: Repository<{ id: number; group?: string | null; date: number; }>;
/**
- * @param logs 日時が新しい方が先頭
+ * 1日に一回程度実行されれば良いような計算処理を入れる(主にCASCADE削除などアプリケーション側で感知できない変動によるズレの修正用)
*/
- protected abstract aggregate(logs: T[]): T;
+ protected abstract tickMajor(group: string | null): Promise<Partial<KVs<T>>>;
- protected abstract fetchActual(group: string | null): Promise<DeepPartial<T>>;
+ /**
+ * 少なくとも最小スパン内に1回は実行されて欲しい計算処理を入れる
+ */
+ protected abstract tickMinor(group: string | null): Promise<Partial<KVs<T>>>;
- @autobind
- private static convertSchemaToFlatColumnDefinitions(schema: Schema) {
- const columns = {} as Record<string, unknown>;
- const flatColumns = (x: Obj, path?: string) => {
- for (const [k, v] of Object.entries(x)) {
- const p = path ? `${path}${this.columnDot}${k}` : k;
- if (v.type === 'object') {
- flatColumns(v.properties, p);
- } else if (v.type === 'number') {
- columns[this.columnPrefix + p] = {
- type: 'bigint',
- };
- } else if (v.type === 'array' && v.items.type === 'string') {
- columns[this.columnPrefix + p] = {
- type: 'varchar',
- array: true,
- };
- }
+ private static convertSchemaToColumnDefinitions(schema: Schema): Record<string, { type: string; array?: boolean; default?: any; }> {
+ const columns = {} as Record<string, { type: string; array?: boolean; default?: any; }>;
+ for (const [k, v] of Object.entries(schema)) {
+ const name = k.replaceAll('.', columnDot);
+ const type = v.range === 'big' ? 'bigint' : v.range === 'small' ? 'smallint' : 'integer';
+ if (v.uniqueIncrement) {
+ columns[uniqueTempColumnPrefix + name] = {
+ type: 'varchar',
+ array: true,
+ default: '{}',
+ };
+ columns[columnPrefix + name] = {
+ type,
+ default: 0,
+ };
+ } else {
+ columns[columnPrefix + name] = {
+ type,
+ default: 0,
+ };
}
- };
- flatColumns(schema.properties!);
- return columns;
- }
-
- @autobind
- private static convertFlattenColumnsToObject(x: Record<string, unknown>): Record<string, unknown> {
- const obj = {} as Record<string, unknown>;
- for (const k of Object.keys(x).filter(k => k.startsWith(Chart.columnPrefix))) {
- // now k is ___x_y_z
- const path = k.substr(Chart.columnPrefix.length).split(Chart.columnDot).join('.');
- nestedProperty.set(obj, path, x[k]);
}
- return obj;
- }
-
- @autobind
- private static convertObjectToFlattenColumns(x: Record<string, unknown>) {
- const columns = {} as Record<string, number | unknown[]>;
- const flatten = (x: Obj, path?: string) => {
- for (const [k, v] of Object.entries(x)) {
- const p = path ? `${path}${this.columnDot}${k}` : k;
- if (typeof v === 'object' && !Array.isArray(v)) {
- flatten(v, p);
- } else {
- columns[this.columnPrefix + p] = v;
- }
- }
- };
- flatten(x);
return columns;
}
- @autobind
- private static countUniqueFields(x: Record<string, unknown>) {
- const exec = (x: Obj) => {
- const res = {} as Record<string, unknown>;
- for (const [k, v] of Object.entries(x)) {
- if (typeof v === 'object' && !Array.isArray(v)) {
- res[k] = exec(v);
- } else if (Array.isArray(v)) {
- res[k] = Array.from(new Set(v)).length;
- } else {
- res[k] = v;
- }
- }
- return res;
- };
- return exec(x);
- }
-
- @autobind
- private static convertQuery(diff: Record<string, number | unknown[]>) {
- const query: Record<string, () => string> = {};
-
- for (const [k, v] of Object.entries(diff)) {
- if (typeof v === 'number') {
- if (v > 0) query[k] = () => `"${k}" + ${v}`;
- if (v < 0) query[k] = () => `"${k}" - ${Math.abs(v)}`;
- } else if (Array.isArray(v)) {
- // TODO: item が文字列以外の場合も対応
- // TODO: item をSQLエスケープ
- const items = v.map(item => `"${item}"`).join(',');
- query[k] = () => `array_cat("${k}", '{${items}}'::varchar[])`;
- }
- }
-
- return query;
- }
-
- @autobind
- private static dateToTimestamp(x: Date): Log['date'] {
+ private static dateToTimestamp(x: Date): number {
return Math.floor(x.getTime() / 1000);
}
- @autobind
private static parseDate(date: Date): [number, number, number, number, number, number, number] {
const y = date.getUTCFullYear();
const m = date.getUTCMonth();
@@ -177,12 +182,10 @@ export default abstract class Chart<T extends Record<string, any>> {
return [y, m, d, h, _m, _s, _ms];
}
- @autobind
private static getCurrentDate() {
return Chart.parseDate(new Date());
}
- @autobind
public static schemaToEntity(name: string, schema: Schema, grouped = false): {
hour: EntitySchema,
day: EntitySchema,
@@ -207,7 +210,7 @@ export default abstract class Chart<T extends Record<string, any>> {
length: 128,
},
} : {}),
- ...Chart.convertSchemaToFlatColumnDefinitions(schema),
+ ...Chart.convertSchemaToColumnDefinitions(schema),
},
indices: [{
columns: grouped ? ['date', 'group'] : ['date'],
@@ -233,37 +236,36 @@ export default abstract class Chart<T extends Record<string, any>> {
};
}
- constructor(name: string, schema: Schema, grouped = false) {
+ constructor(name: string, schema: T, grouped = false) {
this.name = name;
this.schema = schema;
const { hour, day } = Chart.schemaToEntity(name, schema, grouped);
- this.repositoryForHour = getRepository<Log>(hour);
- this.repositoryForDay = getRepository<Log>(day);
+ this.repositoryForHour = getRepository<{ id: number; group?: string | null; date: number; }>(hour);
+ this.repositoryForDay = getRepository<{ id: number; group?: string | null; date: number; }>(day);
}
- @autobind
- private getNewLog(latest: T | null): T {
- const log = latest ? this.genNewLog(latest) : {};
- const flatColumns = (x: Obj, path?: string) => {
- for (const [k, v] of Object.entries(x)) {
- const p = path ? `${path}.${k}` : k;
- if (v.type === 'object') {
- flatColumns(v.properties, p);
- } else {
- if (nestedProperty.get(log, p) == null) {
- const emptyValue = v.type === 'number' ? 0 : [];
- nestedProperty.set(log, p, emptyValue);
- }
- }
+ private convertRawRecord(x: RawRecord<T>): KVs<T> {
+ const kvs = {} as Record<string, number>;
+ for (const k of Object.keys(x).filter((k) => k.startsWith(columnPrefix)) as (keyof Columns<T>)[]) {
+ kvs[(k as string).substr(columnPrefix.length).split(columnDot).join('.')] = x[k];
+ }
+ return kvs as KVs<T>;
+ }
+
+ private getNewLog(latest: KVs<T> | null): KVs<T> {
+ const log = {} as Record<keyof T, number>;
+ for (const [k, v] of Object.entries(this.schema) as ([keyof typeof this['schema'], this['schema'][string]])[]) {
+ if (v.accumulate && latest) {
+ log[k] = latest[k];
+ } else {
+ log[k] = 0;
}
- };
- flatColumns(this.schema.properties!);
- return log as T;
+ }
+ return log as KVs<T>;
}
- @autobind
- private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise<Log | null> {
+ private getLatestLog(group: string | null, span: 'hour' | 'day'): Promise<RawRecord<T> | null> {
const repository =
span === 'hour' ? this.repositoryForHour :
span === 'day' ? this.repositoryForDay :
@@ -275,14 +277,13 @@ export default abstract class Chart<T extends Record<string, any>> {
order: {
date: -1,
},
- }).then(x => x || null);
+ }).then(x => x ?? null) as Promise<RawRecord<T> | null>;
}
/**
* 現在(=今のHour or Day)のログをデータベースから探して、あればそれを返し、なければ作成して返します。
*/
- @autobind
- private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise<Log> {
+ private async claimCurrentLog(group: string | null, span: 'hour' | 'day'): Promise<RawRecord<T>> {
const [y, m, d, h] = Chart.getCurrentDate();
const current = dateUTC(
@@ -299,15 +300,15 @@ export default abstract class Chart<T extends Record<string, any>> {
const currentLog = await repository.findOne({
date: Chart.dateToTimestamp(current),
...(group ? { group: group } : {}),
- });
+ }) as RawRecord<T> | undefined;
// ログがあればそれを返して終了
if (currentLog != null) {
return currentLog;
}
- let log: Log;
- let data: T;
+ let log: RawRecord<T>;
+ let data: KVs<T>;
// 集計期間が変わってから、初めてのチャート更新なら
// 最も最近のログを持ってくる
@@ -318,10 +319,8 @@ export default abstract class Chart<T extends Record<string, any>> {
const latest = await this.getLatestLog(group, span);
if (latest != null) {
- const obj = Chart.convertFlattenColumnsToObject(latest) as T;
-
// 空ログデータを作成
- data = this.getNewLog(obj);
+ data = this.getNewLog(this.convertRawRecord(latest));
} else {
// ログが存在しなかったら
// (Misskeyインスタンスを建てて初めてのチャート更新時など)
@@ -341,17 +340,23 @@ export default abstract class Chart<T extends Record<string, any>> {
const currentLog = await repository.findOne({
date: date,
...(group ? { group: group } : {}),
- });
+ }) as RawRecord<T> | undefined;
// ログがあればそれを返して終了
if (currentLog != null) return currentLog;
+ const columns = {} as Record<string, number | unknown[]>;
+ for (const [k, v] of Object.entries(data)) {
+ const name = k.replaceAll('.', columnDot);
+ columns[columnPrefix + name] = v;
+ }
+
// 新規ログ挿入
log = await repository.insert({
date: date,
...(group ? { group: group } : {}),
- ...Chart.convertObjectToFlattenColumns(data),
- }).then(x => repository.findOneOrFail(x.identifiers[0]));
+ ...columns,
+ }).then(x => repository.findOneOrFail(x.identifiers[0])) as RawRecord<T>;
logger.info(`${this.name + (group ? `:${group}` : '')}(${span}): New commit created`);
@@ -361,14 +366,15 @@ export default abstract class Chart<T extends Record<string, any>> {
}
}
- @autobind
- protected commit(diff: DeepPartial<T>, group: string | null = null): void {
+ protected commit(diff: Commit<T>, group: string | null = null): void {
+ for (const [k, v] of Object.entries(diff)) {
+ if (v == null || v === 0 || (Array.isArray(v) && v.length === 0)) delete diff[k];
+ }
this.buffer.push({
diff, group,
});
}
- @autobind
public async save(): Promise<void> {
if (this.buffer.length === 0) {
logger.info(`${this.name}: Write skipped`);
@@ -381,37 +387,91 @@ export default abstract class Chart<T extends Record<string, any>> {
// そのログは本来は 01:00~ のログとしてDBに保存されて欲しいのに、02:00~ のログ扱いになってしまう。
// これを回避するための実装は複雑になりそうなため、一旦保留。
- const update = async (logHour: Log, logDay: Log): Promise<void> => {
- const finalDiffs = {} as Record<string, number | unknown[]>;
+ const update = async (logHour: RawRecord<T>, logDay: RawRecord<T>): Promise<void> => {
+ const finalDiffs = {} as Record<string, number | string[]>;
for (const diff of this.buffer.filter(q => q.group == null || (q.group === logHour.group)).map(q => q.diff)) {
- const columns = Chart.convertObjectToFlattenColumns(diff);
-
- for (const [k, v] of Object.entries(columns)) {
+ for (const [k, v] of Object.entries(diff)) {
if (finalDiffs[k] == null) {
finalDiffs[k] = v;
} else {
if (typeof finalDiffs[k] === 'number') {
(finalDiffs[k] as number) += v as number;
} else {
- (finalDiffs[k] as unknown[]) = (finalDiffs[k] as unknown[]).concat(v);
+ (finalDiffs[k] as string[]) = (finalDiffs[k] as string[]).concat(v);
}
}
}
}
- const query = Chart.convertQuery(finalDiffs);
+ const queryForHour: Record<keyof RawRecord<T>, number | (() => string)> = {} as any;
+ const queryForDay: Record<keyof RawRecord<T>, number | (() => string)> = {} as any;
+ for (const [k, v] of Object.entries(finalDiffs)) {
+ if (typeof v === 'number') {
+ const name = columnPrefix + k.replaceAll('.', columnDot) as keyof Columns<T>;
+ if (v > 0) queryForHour[name] = () => `"${name}" + ${v}`;
+ if (v < 0) queryForHour[name] = () => `"${name}" - ${Math.abs(v)}`;
+ if (v > 0) queryForDay[name] = () => `"${name}" + ${v}`;
+ if (v < 0) queryForDay[name] = () => `"${name}" - ${Math.abs(v)}`;
+ } else if (Array.isArray(v) && v.length > 0) { // ユニークインクリメント
+ const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot) as keyof TempColumnsForUnique<T>;
+ // TODO: item をSQLエスケープ
+ const itemsForHour = v.filter(item => !logHour[tempColumnName].includes(item)).map(item => `"${item}"`);
+ const itemsForDay = v.filter(item => !logDay[tempColumnName].includes(item)).map(item => `"${item}"`);
+ if (itemsForHour.length > 0) queryForHour[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForHour.join(',')}}'::varchar[])`;
+ if (itemsForDay.length > 0) queryForDay[tempColumnName] = () => `array_cat("${tempColumnName}", '{${itemsForDay.join(',')}}'::varchar[])`;
+ }
+ }
+
+ // bake unique count
+ for (const [k, v] of Object.entries(finalDiffs)) {
+ if (this.schema[k].uniqueIncrement) {
+ const name = columnPrefix + k.replaceAll('.', columnDot) as keyof Columns<T>;
+ const tempColumnName = uniqueTempColumnPrefix + k.replaceAll('.', columnDot) as keyof TempColumnsForUnique<T>;
+ queryForHour[name] = new Set([...(v as string[]), ...logHour[tempColumnName]]).size;
+ queryForDay[name] = new Set([...(v as string[]), ...logDay[tempColumnName]]).size;
+ }
+ }
+
+ // compute intersection
+ // TODO: intersectionに指定されたカラムがintersectionだった場合の対応
+ for (const [k, v] of Object.entries(this.schema)) {
+ const intersection = v.intersection;
+ if (intersection) {
+ const name = columnPrefix + k.replaceAll('.', columnDot) as keyof Columns<T>;
+ const firstKey = intersection[0];
+ const firstTempColumnName = uniqueTempColumnPrefix + firstKey.replaceAll('.', columnDot) as keyof TempColumnsForUnique<T>;
+ const firstValues = finalDiffs[firstKey] as string[] | undefined;
+ const currentValuesForHour = new Set([...(firstValues ?? []), ...logHour[firstTempColumnName]]);
+ const currentValuesForDay = new Set([...(firstValues ?? []), ...logDay[firstTempColumnName]]);
+ for (let i = 1; i < intersection.length; i++) {
+ const targetKey = intersection[i];
+ const targetTempColumnName = uniqueTempColumnPrefix + targetKey.replaceAll('.', columnDot) as keyof TempColumnsForUnique<T>;
+ const targetValues = finalDiffs[targetKey] as string[] | undefined;
+ const targetValuesForHour = new Set([...(targetValues ?? []), ...logHour[targetTempColumnName]]);
+ const targetValuesForDay = new Set([...(targetValues ?? []), ...logDay[targetTempColumnName]]);
+ currentValuesForHour.forEach(v => {
+ if (!targetValuesForHour.has(v)) currentValuesForHour.delete(v);
+ });
+ currentValuesForDay.forEach(v => {
+ if (!targetValuesForDay.has(v)) currentValuesForDay.delete(v);
+ });
+ }
+ queryForHour[name] = currentValuesForHour.size;
+ queryForDay[name] = currentValuesForDay.size;
+ }
+ }
// ログ更新
await Promise.all([
this.repositoryForHour.createQueryBuilder()
.update()
- .set(query)
+ .set(queryForHour as any)
.where('id = :id', { id: logHour.id })
.execute(),
this.repositoryForDay.createQueryBuilder()
.update()
- .set(query)
+ .set(queryForDay as any)
.where('id = :id', { id: logDay.id })
.execute(),
]);
@@ -433,20 +493,29 @@ export default abstract class Chart<T extends Record<string, any>> {
update(logHour, logDay))));
}
- @autobind
- public async resync(group: string | null = null): Promise<void> {
- const data = await this.fetchActual(group);
+ public async tick(major: boolean, group: string | null = null): Promise<void> {
+ const data = major ? await this.tickMajor(group) : await this.tickMinor(group);
- const update = async (logHour: Log, logDay: Log): Promise<void> => {
+ const columns = {} as Record<keyof Columns<T>, number>;
+ for (const [k, v] of Object.entries(data) as ([keyof typeof data, number])[]) {
+ const name = columnPrefix + (k as string).replaceAll('.', columnDot) as keyof Columns<T>;
+ columns[name] = v;
+ }
+
+ if (Object.keys(columns).length === 0) {
+ return;
+ }
+
+ const update = async (logHour: RawRecord<T>, logDay: RawRecord<T>): Promise<void> => {
await Promise.all([
this.repositoryForHour.createQueryBuilder()
.update()
- .set(Chart.convertObjectToFlattenColumns(data))
+ .set(columns)
.where('id = :id', { id: logHour.id })
.execute(),
this.repositoryForDay.createQueryBuilder()
.update()
- .set(Chart.convertObjectToFlattenColumns(data))
+ .set(columns)
.where('id = :id', { id: logDay.id })
.execute(),
]);
@@ -459,13 +528,46 @@ export default abstract class Chart<T extends Record<string, any>> {
update(logHour, logDay));
}
- @autobind
- protected async inc(inc: DeepPartial<T>, group: string | null = null): Promise<void> {
- await this.commit(inc, group);
+ public resync(group: string | null = null): Promise<void> {
+ return this.tick(true, group);
}
- @autobind
- public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise<ArrayValue<T>> {
+ public async clean(): Promise<void> {
+ const current = dateUTC(Chart.getCurrentDate());
+
+ // 一日以上前かつ三日以内
+ const gt = Chart.dateToTimestamp(current) - (60 * 60 * 24 * 3);
+ const lt = Chart.dateToTimestamp(current) - (60 * 60 * 24);
+
+ const columns = {} as Record<keyof TempColumnsForUnique<T>, []>;
+ for (const [k, v] of Object.entries(this.schema)) {
+ if (v.uniqueIncrement) {
+ const name = uniqueTempColumnPrefix + k.replaceAll('.', columnDot) as keyof TempColumnsForUnique<T>;
+ columns[name] = [];
+ }
+ }
+
+ if (Object.keys(columns).length === 0) {
+ return;
+ }
+
+ await Promise.all([
+ this.repositoryForHour.createQueryBuilder()
+ .update()
+ .set(columns)
+ .where('date > :gt', { gt })
+ .andWhere('date < :lt', { lt })
+ .execute(),
+ this.repositoryForDay.createQueryBuilder()
+ .update()
+ .set(columns)
+ .where('date > :gt', { gt })
+ .andWhere('date < :lt', { lt })
+ .execute(),
+ ]);
+ }
+
+ public async getChartRaw(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise<ChartResult<T>> {
const [y, m, d, h, _m, _s, _ms] = cursor ? Chart.parseDate(subtractTime(addTime(cursor, 1, span), 1)) : Chart.getCurrentDate();
const [y2, m2, d2, h2] = cursor ? Chart.parseDate(addTime(cursor, 1, span)) : [] as never;
@@ -490,7 +592,7 @@ export default abstract class Chart<T extends Record<string, any>> {
order: {
date: -1,
},
- });
+ }) as RawRecord<T>[];
// 要求された範囲にログがひとつもなかったら
if (logs.length === 0) {
@@ -502,7 +604,7 @@ export default abstract class Chart<T extends Record<string, any>> {
order: {
date: -1,
},
- });
+ }) as RawRecord<T> | undefined;
if (recentLog) {
logs = [recentLog];
@@ -519,14 +621,14 @@ export default abstract class Chart<T extends Record<string, any>> {
order: {
date: -1,
},
- });
+ }) as RawRecord<T> | undefined;
if (outdatedLog) {
logs.push(outdatedLog);
}
}
- const chart: T[] = [];
+ const chart: KVs<T>[] = [];
for (let i = (amount - 1); i >= 0; i--) {
const current =
@@ -537,17 +639,16 @@ export default abstract class Chart<T extends Record<string, any>> {
const log = logs.find(l => isTimeSame(new Date(l.date * 1000), current));
if (log) {
- const data = Chart.convertFlattenColumnsToObject(log);
- chart.unshift(Chart.countUniqueFields(data) as T);
+ chart.unshift(this.convertRawRecord(log));
} else {
// 隙間埋め
const latest = logs.find(l => isTimeBefore(new Date(l.date * 1000), current));
- const data = latest ? Chart.convertFlattenColumnsToObject(latest) as T : null;
- chart.unshift(Chart.countUniqueFields(this.getNewLog(data)) as T);
+ const data = latest ? this.convertRawRecord(latest) : null;
+ chart.unshift(this.getNewLog(data));
}
}
- const res = {} as Record<string, unknown>;
+ const res = {} as ChartResult<T>;
/**
* [{ foo: 1, bar: 5 }, { foo: 2, bar: 6 }, { foo: 3, bar: 7 }]
@@ -555,36 +656,25 @@ export default abstract class Chart<T extends Record<string, any>> {
* { foo: [1, 2, 3], bar: [5, 6, 7] }
* にする
*/
- const compact = (x: Obj, path?: string): void => {
- for (const [k, v] of Object.entries(x)) {
- const p = path ? `${path}.${k}` : k;
- if (typeof v === 'object' && !Array.isArray(v)) {
- compact(v, p);
+ for (const record of chart) {
+ for (const [k, v] of Object.entries(record) as ([keyof typeof record, number])[]) {
+ if (res[k]) {
+ res[k].push(v);
} else {
- const values = chart.map(s => nestedProperty.get(s, p));
- nestedProperty.set(res, p, values);
+ res[k] = [v];
}
}
- };
-
- compact(chart[0]);
+ }
- return res as ArrayValue<T>;
+ return res;
}
-}
-export function convertLog(logSchema: Schema): Schema {
- const v: Schema = JSON.parse(JSON.stringify(logSchema)); // copy
- if (v.type === 'number') {
- v.type = 'array';
- v.items = {
- type: 'number' as const,
- optional: false as const, nullable: false as const,
- };
- } else if (v.type === 'object') {
- for (const k of Object.keys(v.properties!)) {
- v.properties![k] = convertLog(v.properties![k]);
+ public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise<Unflatten<ChartResult<T>>> {
+ const result = await this.getChartRaw(span, amount, cursor, group);
+ const object = {};
+ for (const [k, v] of Object.entries(result)) {
+ nestedProperty.set(object, k, v);
}
+ return object as Unflatten<ChartResult<T>>;
}
- return v;
}
diff --git a/packages/backend/src/services/chart/entities.ts b/packages/backend/src/services/chart/entities.ts
index dedbd47080..13e994cb65 100644
--- a/packages/backend/src/services/chart/entities.ts
+++ b/packages/backend/src/services/chart/entities.ts
@@ -1,21 +1,20 @@
-import { entity as FederationChart } from './charts/entities/federation';
-import { entity as NotesChart } from './charts/entities/notes';
-import { entity as UsersChart } from './charts/entities/users';
-import { entity as NetworkChart } from './charts/entities/network';
-import { entity as ActiveUsersChart } from './charts/entities/active-users';
-import { entity as InstanceChart } from './charts/entities/instance';
-import { entity as PerUserNotesChart } from './charts/entities/per-user-notes';
-import { entity as DriveChart } from './charts/entities/drive';
-import { entity as PerUserReactionsChart } from './charts/entities/per-user-reactions';
-import { entity as HashtagChart } from './charts/entities/hashtag';
-import { entity as PerUserFollowingChart } from './charts/entities/per-user-following';
-import { entity as PerUserDriveChart } from './charts/entities/per-user-drive';
+import { entity as FederationChart } from './charts/entities/federation.js';
+import { entity as NotesChart } from './charts/entities/notes.js';
+import { entity as UsersChart } from './charts/entities/users.js';
+import { entity as ActiveUsersChart } from './charts/entities/active-users.js';
+import { entity as InstanceChart } from './charts/entities/instance.js';
+import { entity as PerUserNotesChart } from './charts/entities/per-user-notes.js';
+import { entity as DriveChart } from './charts/entities/drive.js';
+import { entity as PerUserReactionsChart } from './charts/entities/per-user-reactions.js';
+import { entity as HashtagChart } from './charts/entities/hashtag.js';
+import { entity as PerUserFollowingChart } from './charts/entities/per-user-following.js';
+import { entity as PerUserDriveChart } from './charts/entities/per-user-drive.js';
+import { entity as ApRequestChart } from './charts/entities/ap-request.js';
export const entities = [
FederationChart.hour, FederationChart.day,
NotesChart.hour, NotesChart.day,
UsersChart.hour, UsersChart.day,
- NetworkChart.hour, NetworkChart.day,
ActiveUsersChart.hour, ActiveUsersChart.day,
InstanceChart.hour, InstanceChart.day,
PerUserNotesChart.hour, PerUserNotesChart.day,
@@ -24,4 +23,5 @@ export const entities = [
HashtagChart.hour, HashtagChart.day,
PerUserFollowingChart.hour, PerUserFollowingChart.day,
PerUserDriveChart.hour, PerUserDriveChart.day,
+ ApRequestChart.hour, ApRequestChart.day,
];
diff --git a/packages/backend/src/services/chart/index.ts b/packages/backend/src/services/chart/index.ts
index 0b9887b36f..8bf2d8f65f 100644
--- a/packages/backend/src/services/chart/index.ts
+++ b/packages/backend/src/services/chart/index.ts
@@ -1,22 +1,21 @@
-import { beforeShutdown } from '@/misc/before-shutdown';
+import { beforeShutdown } from '@/misc/before-shutdown.js';
-import FederationChart from './charts/federation';
-import NotesChart from './charts/notes';
-import UsersChart from './charts/users';
-import NetworkChart from './charts/network';
-import ActiveUsersChart from './charts/active-users';
-import InstanceChart from './charts/instance';
-import PerUserNotesChart from './charts/per-user-notes';
-import DriveChart from './charts/drive';
-import PerUserReactionsChart from './charts/per-user-reactions';
-import HashtagChart from './charts/hashtag';
-import PerUserFollowingChart from './charts/per-user-following';
-import PerUserDriveChart from './charts/per-user-drive';
+import FederationChart from './charts/federation.js';
+import NotesChart from './charts/notes.js';
+import UsersChart from './charts/users.js';
+import ActiveUsersChart from './charts/active-users.js';
+import InstanceChart from './charts/instance.js';
+import PerUserNotesChart from './charts/per-user-notes.js';
+import DriveChart from './charts/drive.js';
+import PerUserReactionsChart from './charts/per-user-reactions.js';
+import HashtagChart from './charts/hashtag.js';
+import PerUserFollowingChart from './charts/per-user-following.js';
+import PerUserDriveChart from './charts/per-user-drive.js';
+import ApRequestChart from './charts/ap-request.js';
export const federationChart = new FederationChart();
export const notesChart = new NotesChart();
export const usersChart = new UsersChart();
-export const networkChart = new NetworkChart();
export const activeUsersChart = new ActiveUsersChart();
export const instanceChart = new InstanceChart();
export const perUserNotesChart = new PerUserNotesChart();
@@ -25,12 +24,12 @@ export const perUserReactionsChart = new PerUserReactionsChart();
export const hashtagChart = new HashtagChart();
export const perUserFollowingChart = new PerUserFollowingChart();
export const perUserDriveChart = new PerUserDriveChart();
+export const apRequestChart = new ApRequestChart();
const charts = [
federationChart,
notesChart,
usersChart,
- networkChart,
activeUsersChart,
instanceChart,
perUserNotesChart,
@@ -39,6 +38,7 @@ const charts = [
hashtagChart,
perUserFollowingChart,
perUserDriveChart,
+ apRequestChart,
];
// 20分おきにメモリ情報をDBに書き込み
diff --git a/packages/backend/src/services/create-notification.ts b/packages/backend/src/services/create-notification.ts
index 1c1c1fcdff..d78e707ecf 100644
--- a/packages/backend/src/services/create-notification.ts
+++ b/packages/backend/src/services/create-notification.ts
@@ -1,10 +1,10 @@
-import { publishMainStream } from '@/services/stream';
-import pushSw from './push-notification';
-import { Notifications, Mutings, UserProfiles, Users } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { User } from '@/models/entities/user';
-import { Notification } from '@/models/entities/notification';
-import { sendEmailNotification } from './send-email-notification';
+import { publishMainStream } from '@/services/stream.js';
+import pushSw from './push-notification.js';
+import { Notifications, Mutings, UserProfiles, Users } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { User } from '@/models/entities/user.js';
+import { Notification } from '@/models/entities/notification.js';
+import { sendEmailNotification } from './send-email-notification.js';
export async function createNotification(
notifieeId: User['id'],
diff --git a/packages/backend/src/services/create-system-user.ts b/packages/backend/src/services/create-system-user.ts
index 82130dd593..781e0560d1 100644
--- a/packages/backend/src/services/create-system-user.ts
+++ b/packages/backend/src/services/create-system-user.ts
@@ -1,13 +1,13 @@
-import * as bcrypt from 'bcryptjs';
+import bcrypt from 'bcryptjs';
import { v4 as uuid } from 'uuid';
-import generateNativeUserToken from '../server/api/common/generate-native-user-token';
-import { genRsaKeyPair } from '@/misc/gen-key-pair';
-import { User } from '@/models/entities/user';
-import { UserProfile } from '@/models/entities/user-profile';
-import { getConnection } from 'typeorm';
-import { genId } from '@/misc/gen-id';
-import { UserKeypair } from '@/models/entities/user-keypair';
-import { UsedUsername } from '@/models/entities/used-username';
+import generateNativeUserToken from '../server/api/common/generate-native-user-token.js';
+import { genRsaKeyPair } from '@/misc/gen-key-pair.js';
+import { User } from '@/models/entities/user.js';
+import { UserProfile } from '@/models/entities/user-profile.js';
+import { getConnection, ObjectLiteral } from 'typeorm';
+import { genId } from '@/misc/gen-id.js';
+import { UserKeypair } from '@/models/entities/user-keypair.js';
+import { UsedUsername } from '@/models/entities/used-username.js';
export async function createSystemUser(username: string) {
const password = uuid();
@@ -21,7 +21,7 @@ export async function createSystemUser(username: string) {
const keyPair = await genRsaKeyPair(4096);
- let account!: User;
+ let account!: User | ObjectLiteral;
// Start transaction
await getConnection().transaction(async transactionalEntityManager => {
diff --git a/packages/backend/src/services/drive/add-file.ts b/packages/backend/src/services/drive/add-file.ts
index a89e068f45..9f1980bff1 100644
--- a/packages/backend/src/services/drive/add-file.ts
+++ b/packages/backend/src/services/drive/add-file.ts
@@ -1,26 +1,26 @@
-import * as fs from 'fs';
+import * as fs from 'node:fs';
import { v4 as uuid } from 'uuid';
-import { publishMainStream, publishDriveStream } from '@/services/stream';
-import { deleteFile } from './delete-file';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { GenerateVideoThumbnail } from './generate-video-thumbnail';
-import { driveLogger } from './logger';
-import { IImage, convertSharpToJpeg, convertSharpToWebp, convertSharpToPng, convertSharpToPngOrJpeg } from './image-processor';
-import { contentDisposition } from '@/misc/content-disposition';
-import { getFileInfo } from '@/misc/get-file-info';
-import { DriveFiles, DriveFolders, Users, Instances, UserProfiles } from '@/models/index';
-import { InternalStorage } from './internal-storage';
-import { DriveFile } from '@/models/entities/drive-file';
-import { IRemoteUser, User } from '@/models/entities/user';
-import { driveChart, perUserDriveChart, instanceChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-import * as S3 from 'aws-sdk/clients/s3';
-import { getS3 } from './s3';
-import * as sharp from 'sharp';
-import { FILE_TYPE_BROWSERSAFE } from '@/const';
+import { publishMainStream, publishDriveStream } from '@/services/stream.js';
+import { deleteFile } from './delete-file.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { GenerateVideoThumbnail } from './generate-video-thumbnail.js';
+import { driveLogger } from './logger.js';
+import { IImage, convertSharpToJpeg, convertSharpToWebp, convertSharpToPng, convertSharpToPngOrJpeg } from './image-processor.js';
+import { contentDisposition } from '@/misc/content-disposition.js';
+import { getFileInfo } from '@/misc/get-file-info.js';
+import { DriveFiles, DriveFolders, Users, Instances, UserProfiles } from '@/models/index.js';
+import { InternalStorage } from './internal-storage.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { IRemoteUser, User } from '@/models/entities/user.js';
+import { driveChart, perUserDriveChart, instanceChart } from '@/services/chart/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
+import S3 from 'aws-sdk/clients/s3.js';
+import { getS3 } from './s3.js';
+import sharp from 'sharp';
+import { FILE_TYPE_BROWSERSAFE } from '@/const.js';
const logger = driveLogger.createSubLogger('register', 'yellow');
@@ -160,8 +160,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool
webpublic: null,
thumbnail,
};
- } catch (e) {
- logger.warn(`GenerateVideoThumbnail failed: ${e}`);
+ } catch (err) {
+ logger.warn(`GenerateVideoThumbnail failed: ${err}`);
return {
webpublic: null,
thumbnail: null,
@@ -191,8 +191,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool
thumbnail: null,
};
}
- } catch (e) {
- logger.warn(`sharp failed: ${e}`);
+ } catch (err) {
+ logger.warn(`sharp failed: ${err}`);
return {
webpublic: null,
thumbnail: null,
@@ -215,8 +215,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool
} else {
logger.debug(`web image not created (not an required image)`);
}
- } catch (e) {
- logger.warn(`web image not created (an error occured)`, e);
+ } catch (err) {
+ logger.warn(`web image not created (an error occured)`, err as Error);
}
} else {
logger.info(`web image not created (from remote)`);
@@ -234,8 +234,8 @@ export async function generateAlts(path: string, type: string, generateWeb: bool
} else {
logger.debug(`thumbnail not created (not an required file)`);
}
- } catch (e) {
- logger.warn(`thumbnail not created (an error occured)`, e);
+ } catch (err) {
+ logger.warn(`thumbnail not created (an error occured)`, err as Error);
}
// #endregion thumbnail
@@ -451,9 +451,9 @@ export async function addFile({
file.storedInternal = false;
file = await DriveFiles.insert(file).then(x => DriveFiles.findOneOrFail(x.identifiers[0]));
- } catch (e) {
+ } catch (err) {
// duplicate key error (when already registered)
- if (isDuplicateKeyValueError(e)) {
+ if (isDuplicateKeyValueError(err)) {
logger.info(`already registered ${file.uri}`);
file = await DriveFiles.findOne({
@@ -461,8 +461,8 @@ export async function addFile({
userId: user ? user.id : null,
}) as DriveFile;
} else {
- logger.error(e);
- throw e;
+ logger.error(err as Error);
+ throw err;
}
}
} else {
diff --git a/packages/backend/src/services/drive/delete-file.ts b/packages/backend/src/services/drive/delete-file.ts
index 5cda32c7d5..18f1dc970b 100644
--- a/packages/backend/src/services/drive/delete-file.ts
+++ b/packages/backend/src/services/drive/delete-file.ts
@@ -1,10 +1,10 @@
-import { DriveFile } from '@/models/entities/drive-file';
-import { InternalStorage } from './internal-storage';
-import { DriveFiles, Instances } from '@/models/index';
-import { driveChart, perUserDriveChart, instanceChart } from '@/services/chart/index';
-import { createDeleteObjectStorageFileJob } from '@/queue/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { getS3 } from './s3';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { InternalStorage } from './internal-storage.js';
+import { DriveFiles, Instances } from '@/models/index.js';
+import { driveChart, perUserDriveChart, instanceChart } from '@/services/chart/index.js';
+import { createDeleteObjectStorageFileJob } from '@/queue/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { getS3 } from './s3.js';
import { v4 as uuid } from 'uuid';
export async function deleteFile(file: DriveFile, isExpired = false) {
diff --git a/packages/backend/src/services/drive/generate-video-thumbnail.ts b/packages/backend/src/services/drive/generate-video-thumbnail.ts
index e8cc952b9a..04a7a83346 100644
--- a/packages/backend/src/services/drive/generate-video-thumbnail.ts
+++ b/packages/backend/src/services/drive/generate-video-thumbnail.ts
@@ -1,6 +1,6 @@
-import * as fs from 'fs';
+import * as fs from 'node:fs';
import * as tmp from 'tmp';
-import { IImage, convertToJpeg } from './image-processor';
+import { IImage, convertToJpeg } from './image-processor.js';
import * as FFmpeg from 'fluent-ffmpeg';
export async function GenerateVideoThumbnail(path: string): Promise<IImage> {
diff --git a/packages/backend/src/services/drive/image-processor.ts b/packages/backend/src/services/drive/image-processor.ts
index f3c4a2abd9..146dcfb6ca 100644
--- a/packages/backend/src/services/drive/image-processor.ts
+++ b/packages/backend/src/services/drive/image-processor.ts
@@ -1,4 +1,4 @@
-import * as sharp from 'sharp';
+import sharp from 'sharp';
export type IImage = {
data: Buffer;
diff --git a/packages/backend/src/services/drive/internal-storage.ts b/packages/backend/src/services/drive/internal-storage.ts
index fe190a028c..8f76c81ca3 100644
--- a/packages/backend/src/services/drive/internal-storage.ts
+++ b/packages/backend/src/services/drive/internal-storage.ts
@@ -1,11 +1,10 @@
-import * as fs from 'fs';
-import * as Path from 'path';
-import { fileURLToPath } from 'url';
-import { dirname } from 'path';
-import config from '@/config/index';
+import * as fs from 'node:fs';
+import * as Path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
+import config from '@/config/index.js';
-//const _filename = fileURLToPath(import.meta.url);
-const _filename = __filename;
+const _filename = fileURLToPath(import.meta.url);
const _dirname = dirname(_filename);
export class InternalStorage {
diff --git a/packages/backend/src/services/drive/logger.ts b/packages/backend/src/services/drive/logger.ts
index 655d074d6e..917a8317e2 100644
--- a/packages/backend/src/services/drive/logger.ts
+++ b/packages/backend/src/services/drive/logger.ts
@@ -1,3 +1,3 @@
-import Logger from '../logger';
+import Logger from '../logger.js';
export const driveLogger = new Logger('drive', 'blue');
diff --git a/packages/backend/src/services/drive/s3.ts b/packages/backend/src/services/drive/s3.ts
index 42bf6e187c..80e34be956 100644
--- a/packages/backend/src/services/drive/s3.ts
+++ b/packages/backend/src/services/drive/s3.ts
@@ -1,7 +1,7 @@
-import { URL } from 'url';
-import * as S3 from 'aws-sdk/clients/s3';
-import { Meta } from '@/models/entities/meta';
-import { getAgentByUrl } from '@/misc/fetch';
+import { URL } from 'node:url';
+import S3 from 'aws-sdk/clients/s3.js';
+import { Meta } from '@/models/entities/meta.js';
+import { getAgentByUrl } from '@/misc/fetch.js';
export function getS3(meta: Meta) {
const u = meta.objectStorageEndpoint != null
diff --git a/packages/backend/src/services/drive/upload-from-url.ts b/packages/backend/src/services/drive/upload-from-url.ts
index 7c5fa5ce3f..5007fff6ee 100644
--- a/packages/backend/src/services/drive/upload-from-url.ts
+++ b/packages/backend/src/services/drive/upload-from-url.ts
@@ -1,12 +1,12 @@
-import { URL } from 'url';
-import { addFile } from './add-file';
-import { User } from '@/models/entities/user';
-import { driveLogger } from './logger';
-import { createTemp } from '@/misc/create-temp';
-import { downloadUrl } from '@/misc/download-url';
-import { DriveFolder } from '@/models/entities/drive-folder';
-import { DriveFile } from '@/models/entities/drive-file';
-import { DriveFiles } from '@/models/index';
+import { URL } from 'node:url';
+import { addFile } from './add-file.js';
+import { User } from '@/models/entities/user.js';
+import { driveLogger } from './logger.js';
+import { createTemp } from '@/misc/create-temp.js';
+import { downloadUrl } from '@/misc/download-url.js';
+import { DriveFolder } from '@/models/entities/drive-folder.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { DriveFiles } from '@/models/index.js';
const logger = driveLogger.createSubLogger('downloader');
diff --git a/packages/backend/src/services/fetch-instance-metadata.ts b/packages/backend/src/services/fetch-instance-metadata.ts
index 2c401508a9..f3a0424abd 100644
--- a/packages/backend/src/services/fetch-instance-metadata.ts
+++ b/packages/backend/src/services/fetch-instance-metadata.ts
@@ -1,11 +1,11 @@
import { DOMWindow, JSDOM } from 'jsdom';
import fetch from 'node-fetch';
-import { getJson, getHtml, getAgentByUrl } from '@/misc/fetch';
-import { Instance } from '@/models/entities/instance';
-import { Instances } from '@/models/index';
-import { getFetchInstanceMetadataLock } from '@/misc/app-lock';
-import Logger from './logger';
-import { URL } from 'url';
+import { getJson, getHtml, getAgentByUrl } from '@/misc/fetch.js';
+import { Instance } from '@/models/entities/instance.js';
+import { Instances } from '@/models/index.js';
+import { getFetchInstanceMetadataLock } from '@/misc/app-lock.js';
+import Logger from './logger.js';
+import { URL } from 'node:url';
const logger = new Logger('metadata', 'cyan');
@@ -156,7 +156,8 @@ async function fetchFaviconUrl(instance: Instance, doc: DOMWindow['document'] |
const url = 'https://' + instance.host;
if (doc) {
- const href = doc.querySelector('link[rel="icon"]')?.getAttribute('href');
+ // https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
+ const href = Array.from(doc.getElementsByTagName('link')).reverse().find(link => link.relList.contains('icon'))?.href;
if (href) {
return (new URL(href, url)).href;
@@ -186,11 +187,16 @@ async function fetchIconUrl(instance: Instance, doc: DOMWindow['document'] | nul
if (doc) {
const url = 'https://' + instance.host;
- const hrefAppleTouchIconPrecomposed = doc.querySelector('link[rel="apple-touch-icon-precomposed"]')?.getAttribute('href');
- const hrefAppleTouchIcon = doc.querySelector('link[rel="apple-touch-icon"]')?.getAttribute('href');
- const hrefIcon = doc.querySelector('link[rel="icon"]')?.getAttribute('href');
-
- const href = hrefAppleTouchIconPrecomposed || hrefAppleTouchIcon || hrefIcon;
+ // https://github.com/misskey-dev/misskey/pull/8220#issuecomment-1025104043
+ const links = Array.from(doc.getElementsByTagName('link')).reverse();
+ // https://github.com/misskey-dev/misskey/pull/8220/files/0ec4eba22a914e31b86874f12448f88b3e58dd5a#r796487559
+ const href =
+ [
+ links.find(link => link.relList.contains('apple-touch-icon-precomposed'))?.href,
+ links.find(link => link.relList.contains('apple-touch-icon'))?.href,
+ links.find(link => link.relList.contains('icon'))?.href,
+ ]
+ .find(href => href);
if (href) {
return (new URL(href, url)).href;
diff --git a/packages/backend/src/services/following/create.ts b/packages/backend/src/services/following/create.ts
index bc5ac275b5..a416412131 100644
--- a/packages/backend/src/services/following/create.ts
+++ b/packages/backend/src/services/following/create.ts
@@ -1,20 +1,20 @@
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderAccept from '@/remote/activitypub/renderer/accept';
-import renderReject from '@/remote/activitypub/renderer/reject';
-import { deliver } from '@/queue/index';
-import createFollowRequest from './requests/create';
-import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import Logger from '../logger';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User } from '@/models/entities/user';
-import { Followings, Users, FollowRequests, Blockings, Instances, UserProfiles } from '@/models/index';
-import { instanceChart, perUserFollowingChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { createNotification } from '../create-notification';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-import { Packed } from '@/misc/schema';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderAccept from '@/remote/activitypub/renderer/accept.js';
+import renderReject from '@/remote/activitypub/renderer/reject.js';
+import { deliver } from '@/queue/index.js';
+import createFollowRequest from './requests/create.js';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc.js';
+import Logger from '../logger.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { User } from '@/models/entities/user.js';
+import { Followings, Users, FollowRequests, Blockings, Instances, UserProfiles } from '@/models/index.js';
+import { instanceChart, perUserFollowingChart } from '@/services/chart/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { createNotification } from '../create-notification.js';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
+import { Packed } from '@/misc/schema.js';
const logger = new Logger('following/create');
diff --git a/packages/backend/src/services/following/delete.ts b/packages/backend/src/services/following/delete.ts
index 9b7d72e86d..d82c0be52d 100644
--- a/packages/backend/src/services/following/delete.ts
+++ b/packages/backend/src/services/following/delete.ts
@@ -1,14 +1,14 @@
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import renderReject from '@/remote/activitypub/renderer/reject';
-import { deliver } from '@/queue/index';
-import Logger from '../logger';
-import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import { User } from '@/models/entities/user';
-import { Followings, Users, Instances } from '@/models/index';
-import { instanceChart, perUserFollowingChart } from '@/services/chart/index';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import renderReject from '@/remote/activitypub/renderer/reject.js';
+import { deliver } from '@/queue/index.js';
+import Logger from '../logger.js';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc.js';
+import { User } from '@/models/entities/user.js';
+import { Followings, Users, Instances } from '@/models/index.js';
+import { instanceChart, perUserFollowingChart } from '@/services/chart/index.js';
const logger = new Logger('following/delete');
diff --git a/packages/backend/src/services/following/reject.ts b/packages/backend/src/services/following/reject.ts
index 1deabea4f8..3b0cb2ba88 100644
--- a/packages/backend/src/services/following/reject.ts
+++ b/packages/backend/src/services/following/reject.ts
@@ -1,11 +1,11 @@
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderReject from '@/remote/activitypub/renderer/reject';
-import { deliver } from '@/queue/index';
-import { publishMainStream, publishUserEvent } from '@/services/stream';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { Users, FollowRequests, Followings } from '@/models/index';
-import { decrementFollowing } from './delete';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderReject from '@/remote/activitypub/renderer/reject.js';
+import { deliver } from '@/queue/index.js';
+import { publishMainStream, publishUserEvent } from '@/services/stream.js';
+import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { Users, FollowRequests, Followings } from '@/models/index.js';
+import { decrementFollowing } from './delete.js';
type Local = ILocalUser | { id: User['id']; host: User['host']; uri: User['host'] };
type Remote = IRemoteUser;
diff --git a/packages/backend/src/services/following/requests/accept-all.ts b/packages/backend/src/services/following/requests/accept-all.ts
index 06ff835c02..a240bec8f4 100644
--- a/packages/backend/src/services/following/requests/accept-all.ts
+++ b/packages/backend/src/services/following/requests/accept-all.ts
@@ -1,6 +1,6 @@
-import accept from './accept';
-import { User } from '@/models/entities/user';
-import { FollowRequests, Users } from '@/models/index';
+import accept from './accept.js';
+import { User } from '@/models/entities/user.js';
+import { FollowRequests, Users } from '@/models/index.js';
/**
* 指定したユーザー宛てのフォローリクエストをすべて承認
diff --git a/packages/backend/src/services/following/requests/accept.ts b/packages/backend/src/services/following/requests/accept.ts
index fcda49758e..b8113cd1b1 100644
--- a/packages/backend/src/services/following/requests/accept.ts
+++ b/packages/backend/src/services/following/requests/accept.ts
@@ -1,12 +1,12 @@
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderAccept from '@/remote/activitypub/renderer/accept';
-import { deliver } from '@/queue/index';
-import { publishMainStream } from '@/services/stream';
-import { insertFollowingDoc } from '../create';
-import { User, ILocalUser } from '@/models/entities/user';
-import { FollowRequests, Users } from '@/models/index';
-import { IdentifiableError } from '@/misc/identifiable-error';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderAccept from '@/remote/activitypub/renderer/accept.js';
+import { deliver } from '@/queue/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { insertFollowingDoc } from '../create.js';
+import { User, ILocalUser } from '@/models/entities/user.js';
+import { FollowRequests, Users } from '@/models/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, follower: User) {
const request = await FollowRequests.findOne({
diff --git a/packages/backend/src/services/following/requests/cancel.ts b/packages/backend/src/services/following/requests/cancel.ts
index 53e54f2a1b..ca9777d38b 100644
--- a/packages/backend/src/services/following/requests/cancel.ts
+++ b/packages/backend/src/services/following/requests/cancel.ts
@@ -1,11 +1,11 @@
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { deliver } from '@/queue/index';
-import { publishMainStream } from '@/services/stream';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User, ILocalUser } from '@/models/entities/user';
-import { Users, FollowRequests } from '@/models/index';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { deliver } from '@/queue/index.js';
+import { publishMainStream } from '@/services/stream.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { User, ILocalUser } from '@/models/entities/user.js';
+import { Users, FollowRequests } from '@/models/index.js';
export default async function(followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox'] }, follower: { id: User['id']; host: User['host']; uri: User['host'] }) {
if (Users.isRemoteUser(followee)) {
diff --git a/packages/backend/src/services/following/requests/create.ts b/packages/backend/src/services/following/requests/create.ts
index e45023015d..bca607d7e4 100644
--- a/packages/backend/src/services/following/requests/create.ts
+++ b/packages/backend/src/services/following/requests/create.ts
@@ -1,11 +1,11 @@
-import { publishMainStream } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderFollow from '@/remote/activitypub/renderer/follow';
-import { deliver } from '@/queue/index';
-import { User } from '@/models/entities/user';
-import { Blockings, FollowRequests, Users } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { createNotification } from '../../create-notification';
+import { publishMainStream } from '@/services/stream.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderFollow from '@/remote/activitypub/renderer/follow.js';
+import { deliver } from '@/queue/index.js';
+import { User } from '@/models/entities/user.js';
+import { Blockings, FollowRequests, Users } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { createNotification } from '../../create-notification.js';
export default async function(follower: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, followee: { id: User['id']; host: User['host']; uri: User['host']; inbox: User['inbox']; sharedInbox: User['sharedInbox']; }, requestId?: string) {
if (follower.id === followee.id) return;
diff --git a/packages/backend/src/services/i/pin.ts b/packages/backend/src/services/i/pin.ts
index 167dfc10c1..06d7e79e89 100644
--- a/packages/backend/src/services/i/pin.ts
+++ b/packages/backend/src/services/i/pin.ts
@@ -1,15 +1,15 @@
-import config from '@/config/index';
-import renderAdd from '@/remote/activitypub/renderer/add';
-import renderRemove from '@/remote/activitypub/renderer/remove';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { Notes, UserNotePinings, Users } from '@/models/index';
-import { UserNotePining } from '@/models/entities/user-note-pining';
-import { genId } from '@/misc/gen-id';
-import { deliverToFollowers } from '@/remote/activitypub/deliver-manager';
-import { deliverToRelays } from '../relay';
+import config from '@/config/index.js';
+import renderAdd from '@/remote/activitypub/renderer/add.js';
+import renderRemove from '@/remote/activitypub/renderer/remove.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { Notes, UserNotePinings, Users } from '@/models/index.js';
+import { UserNotePining } from '@/models/entities/user-note-pining.js';
+import { genId } from '@/misc/gen-id.js';
+import { deliverToFollowers } from '@/remote/activitypub/deliver-manager.js';
+import { deliverToRelays } from '../relay.js';
/**
* 指定した投稿をピン留めします
diff --git a/packages/backend/src/services/i/update.ts b/packages/backend/src/services/i/update.ts
index f700d9b48b..1fbaf40df1 100644
--- a/packages/backend/src/services/i/update.ts
+++ b/packages/backend/src/services/i/update.ts
@@ -1,10 +1,10 @@
-import renderUpdate from '@/remote/activitypub/renderer/update';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { Users } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { renderPerson } from '@/remote/activitypub/renderer/person';
-import { deliverToFollowers } from '@/remote/activitypub/deliver-manager';
-import { deliverToRelays } from '../relay';
+import renderUpdate from '@/remote/activitypub/renderer/update.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { renderPerson } from '@/remote/activitypub/renderer/person.js';
+import { deliverToFollowers } from '@/remote/activitypub/deliver-manager.js';
+import { deliverToRelays } from '../relay.js';
export async function publishToFollowers(userId: User['id']) {
const user = await Users.findOne(userId);
diff --git a/packages/backend/src/services/insert-moderation-log.ts b/packages/backend/src/services/insert-moderation-log.ts
index affed4095f..0a7c472d8d 100644
--- a/packages/backend/src/services/insert-moderation-log.ts
+++ b/packages/backend/src/services/insert-moderation-log.ts
@@ -1,6 +1,6 @@
-import { ModerationLogs } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { User } from '@/models/entities/user';
+import { ModerationLogs } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { User } from '@/models/entities/user.js';
export async function insertModerationLog(moderator: { id: User['id'] }, type: string, info?: Record<string, any>) {
await ModerationLogs.insert({
diff --git a/packages/backend/src/services/instance-actor.ts b/packages/backend/src/services/instance-actor.ts
index 6f2e32667a..e271710488 100644
--- a/packages/backend/src/services/instance-actor.ts
+++ b/packages/backend/src/services/instance-actor.ts
@@ -1,7 +1,7 @@
-import { createSystemUser } from './create-system-user';
-import { ILocalUser } from '@/models/entities/user';
-import { Users } from '@/models/index';
-import { Cache } from '@/misc/cache';
+import { createSystemUser } from './create-system-user.js';
+import { ILocalUser } from '@/models/entities/user.js';
+import { Users } from '@/models/index.js';
+import { Cache } from '@/misc/cache.js';
const ACTOR_USERNAME = 'instance.actor' as const;
diff --git a/packages/backend/src/services/logger.ts b/packages/backend/src/services/logger.ts
index 626cc6b44c..89d6d57209 100644
--- a/packages/backend/src/services/logger.ts
+++ b/packages/backend/src/services/logger.ts
@@ -1,8 +1,9 @@
-import * as cluster from 'cluster';
-import * as chalk from 'chalk';
-import * as dateformat from 'dateformat';
-import { envOption } from '../env';
-import config from '@/config/index';
+import cluster from 'node:cluster';
+import chalk from 'chalk';
+import { default as convertColor } from 'color-convert';
+import { format as dateFormat } from 'date-fns';
+import { envOption } from '../env.js';
+import config from '@/config/index.js';
import * as SyslogPro from 'syslog-pro';
@@ -57,7 +58,7 @@ export default class Logger {
return;
}
- const time = dateformat(new Date(), 'HH:MM:ss');
+ const time = dateFormat(new Date(), 'HH:mm:ss');
const worker = cluster.isPrimary ? '*' : cluster.worker.id;
const l =
level === 'error' ? important ? chalk.bgRed.white('ERR ') : chalk.red('ERR ') :
@@ -66,7 +67,7 @@ export default class Logger {
level === 'debug' ? chalk.gray('VERB') :
level === 'info' ? chalk.blue('INFO') :
null;
- const domains = [this.domain].concat(subDomains).map(d => d.color ? chalk.keyword(d.color)(d.name) : chalk.white(d.name));
+ const domains = [this.domain].concat(subDomains).map(d => d.color ? chalk.rgb(...convertColor.keyword.rgb(d.color))(d.name) : chalk.white(d.name));
const m =
level === 'error' ? chalk.red(message) :
level === 'warning' ? chalk.yellow(message) :
@@ -116,7 +117,7 @@ export default class Logger {
}
public debug(message: string, data?: Record<string, any> | null, important = false): void { // デバッグ用に使う(開発者に必要だが利用者に不要な情報)
- if (process.env.NODE_ENV != 'production' || envOption.verbose) {
+ if (process.env.NODE_ENV !== 'production' || envOption.verbose) {
this.log('debug', message, data, important);
}
}
diff --git a/packages/backend/src/services/messages/create.ts b/packages/backend/src/services/messages/create.ts
index e1bef09a79..c3908b2552 100644
--- a/packages/backend/src/services/messages/create.ts
+++ b/packages/backend/src/services/messages/create.ts
@@ -1,19 +1,19 @@
-import { User } from '@/models/entities/user';
-import { UserGroup } from '@/models/entities/user-group';
-import { DriveFile } from '@/models/entities/drive-file';
-import { MessagingMessages, UserGroupJoinings, Mutings, Users } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { publishMessagingStream, publishMessagingIndexStream, publishMainStream, publishGroupMessagingStream } from '@/services/stream';
-import pushNotification from '../push-notification';
+import { User } from '@/models/entities/user.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { MessagingMessages, UserGroupJoinings, Mutings, Users } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { publishMessagingStream, publishMessagingIndexStream, publishMainStream, publishGroupMessagingStream } from '@/services/stream.js';
+import pushNotification from '../push-notification.js';
import { Not } from 'typeorm';
-import { Note } from '@/models/entities/note';
-import renderNote from '@/remote/activitypub/renderer/note';
-import renderCreate from '@/remote/activitypub/renderer/create';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { deliver } from '@/queue/index';
+import { Note } from '@/models/entities/note.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import renderCreate from '@/remote/activitypub/renderer/create.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { deliver } from '@/queue/index.js';
-export async function createMessage(user: { id: User['id']; host: User['host']; }, recipientUser: User | undefined, recipientGroup: UserGroup | undefined, text: string | undefined, file: DriveFile | null, uri?: string) {
+export async function createMessage(user: { id: User['id']; host: User['host']; }, recipientUser: User | undefined, recipientGroup: UserGroup | undefined, text: string | null | undefined, file: DriveFile | null, uri?: string) {
const message = {
id: genId(),
createdAt: new Date(),
diff --git a/packages/backend/src/services/messages/delete.ts b/packages/backend/src/services/messages/delete.ts
index 5c299c9a50..82eb6cb21c 100644
--- a/packages/backend/src/services/messages/delete.ts
+++ b/packages/backend/src/services/messages/delete.ts
@@ -1,11 +1,11 @@
-import config from '@/config/index';
-import { MessagingMessages, Users } from '@/models/index';
-import { MessagingMessage } from '@/models/entities/messaging-message';
-import { publishGroupMessagingStream, publishMessagingStream } from '@/services/stream';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderDelete from '@/remote/activitypub/renderer/delete';
-import renderTombstone from '@/remote/activitypub/renderer/tombstone';
-import { deliver } from '@/queue/index';
+import config from '@/config/index.js';
+import { MessagingMessages, Users } from '@/models/index.js';
+import { MessagingMessage } from '@/models/entities/messaging-message.js';
+import { publishGroupMessagingStream, publishMessagingStream } from '@/services/stream.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderDelete from '@/remote/activitypub/renderer/delete.js';
+import renderTombstone from '@/remote/activitypub/renderer/tombstone.js';
+import { deliver } from '@/queue/index.js';
export async function deleteMessage(message: MessagingMessage) {
await MessagingMessages.delete(message.id);
diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts
index fb22bd6593..ed242a0b59 100644
--- a/packages/backend/src/services/note/create.ts
+++ b/packages/backend/src/services/note/create.ts
@@ -1,39 +1,39 @@
import * as mfm from 'mfm-js';
-import es from '../../db/elasticsearch';
-import { publishMainStream, publishNotesStream } from '@/services/stream';
-import DeliverManager from '@/remote/activitypub/deliver-manager';
-import renderNote from '@/remote/activitypub/renderer/note';
-import renderCreate from '@/remote/activitypub/renderer/create';
-import renderAnnounce from '@/remote/activitypub/renderer/announce';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { resolveUser } from '@/remote/resolve-user';
-import config from '@/config/index';
-import { updateHashtags } from '../update-hashtag';
-import { concat } from '@/prelude/array';
-import { insertNoteUnread } from '@/services/note/unread';
-import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import { extractMentions } from '@/misc/extract-mentions';
-import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm';
-import { extractHashtags } from '@/misc/extract-hashtags';
-import { Note, IMentionedRemoteUsers } from '@/models/entities/note';
-import { Mutings, Users, NoteWatchings, Notes, Instances, UserProfiles, Antennas, Followings, MutedNotes, Channels, ChannelFollowings, Blockings, NoteThreadMutings } from '@/models/index';
-import { DriveFile } from '@/models/entities/drive-file';
-import { App } from '@/models/entities/app';
+import es from '../../db/elasticsearch.js';
+import { publishMainStream, publishNotesStream } from '@/services/stream.js';
+import DeliverManager from '@/remote/activitypub/deliver-manager.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import renderCreate from '@/remote/activitypub/renderer/create.js';
+import renderAnnounce from '@/remote/activitypub/renderer/announce.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { resolveUser } from '@/remote/resolve-user.js';
+import config from '@/config/index.js';
+import { updateHashtags } from '../update-hashtag.js';
+import { concat } from '@/prelude/array.js';
+import { insertNoteUnread } from '@/services/note/unread.js';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc.js';
+import { extractMentions } from '@/misc/extract-mentions.js';
+import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
+import { extractHashtags } from '@/misc/extract-hashtags.js';
+import { Note, IMentionedRemoteUsers } from '@/models/entities/note.js';
+import { Mutings, Users, NoteWatchings, Notes, Instances, UserProfiles, Antennas, Followings, MutedNotes, Channels, ChannelFollowings, Blockings, NoteThreadMutings } from '@/models/index.js';
+import { DriveFile } from '@/models/entities/drive-file.js';
+import { App } from '@/models/entities/app.js';
import { Not, getConnection, In } from 'typeorm';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { genId } from '@/misc/gen-id';
-import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '@/services/chart/index';
-import { Poll, IPoll } from '@/models/entities/poll';
-import { createNotification } from '../create-notification';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-import { checkHitAntenna } from '@/misc/check-hit-antenna';
-import { checkWordMute } from '@/misc/check-word-mute';
-import { addNoteToAntenna } from '../add-note-to-antenna';
-import { countSameRenotes } from '@/misc/count-same-renotes';
-import { deliverToRelays } from '../relay';
-import { Channel } from '@/models/entities/channel';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
-import { getAntennas } from '@/misc/antenna-cache';
+import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { genId } from '@/misc/gen-id.js';
+import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '@/services/chart/index.js';
+import { Poll, IPoll } from '@/models/entities/poll.js';
+import { createNotification } from '../create-notification.js';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
+import { checkHitAntenna } from '@/misc/check-hit-antenna.js';
+import { checkWordMute } from '@/misc/check-word-mute.js';
+import { addNoteToAntenna } from '../add-note-to-antenna.js';
+import { countSameRenotes } from '@/misc/count-same-renotes.js';
+import { deliverToRelays } from '../relay.js';
+import { Channel } from '@/models/entities/channel.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
+import { getAntennas } from '@/misc/antenna-cache.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@@ -59,7 +59,7 @@ class NotificationManager {
if (exist) {
// 「メンションされているかつ返信されている」場合は、メンションとしての通知ではなく返信としての通知にする
- if (reason != 'mention') {
+ if (reason !== 'mention') {
exist.reason = reason;
}
} else {
@@ -111,7 +111,7 @@ type Option = {
app?: App | null;
};
-export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; }, data: Option, silent = false) => new Promise<Note>(async (res, rej) => {
+export default async (user: { id: User['id']; username: User['username']; host: User['host']; isSilenced: User['isSilenced']; createdAt: User['createdAt']; }, data: Option, silent = false) => new Promise<Note>(async (res, rej) => {
// チャンネル外にリプライしたら対象のスコープに合わせる
// (クライアントサイドでやっても良い処理だと思うけどとりあえずサーバーサイドで)
if (data.reply && data.channel && data.reply.channelId !== data.channel.id) {
@@ -201,7 +201,7 @@ export default async (user: { id: User['id']; username: User['username']; host:
mentionedUsers.push(await Users.findOneOrFail(data.reply.userId));
}
- if (data.visibility == 'specified') {
+ if (data.visibility === 'specified') {
if (data.visibleUsers == null) throw new Error('invalid param');
for (const u of data.visibleUsers) {
@@ -297,11 +297,10 @@ export default async (user: { id: User['id']; username: User['username']; host:
}
if (!silent) {
- // ローカルユーザーのチャートはタイムライン取得時に更新しているのでリモートユーザーの場合だけでよい
- if (Users.isRemoteUser(user)) activeUsersChart.update(user);
+ if (Users.isLocalUser(user)) activeUsersChart.write(user);
// 未読通知を作成
- if (data.visibility == 'specified') {
+ if (data.visibility === 'specified') {
if (data.visibleUsers == null) throw new Error('invalid param');
for (const u of data.visibleUsers) {
@@ -439,7 +438,7 @@ export default async (user: { id: User['id']; username: User['username']; host:
async function renderNoteOrRenoteActivity(data: Option, note: Note) {
if (data.localOnly) return null;
- const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length == 0)
+ const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0)
? renderAnnounce(data.renote.uri ? data.renote.uri : `${config.url}/notes/${data.renote.id}`, note)
: renderCreate(await renderNote(note, false), note);
@@ -478,7 +477,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O
userId: user.id,
localOnly: data.localOnly!,
visibility: data.visibility as any,
- visibleUserIds: data.visibility == 'specified'
+ visibleUserIds: data.visibility === 'specified'
? data.visibleUsers
? data.visibleUsers.map(u => u.id)
: []
@@ -502,7 +501,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O
insert.mentions = mentionedUsers.map(u => u.id);
const profiles = await UserProfiles.find({ userId: In(insert.mentions) });
insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => {
- const profile = profiles.find(p => p.userId == u.id);
+ const profile = profiles.find(p => p.userId === u.id);
const url = profile != null ? profile.url : null;
return {
uri: u.uri,
diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts
index 64383ee928..cf23656f8f 100644
--- a/packages/backend/src/services/note/delete.ts
+++ b/packages/backend/src/services/note/delete.ts
@@ -1,18 +1,18 @@
-import { publishNoteStream } from '@/services/stream';
-import renderDelete from '@/remote/activitypub/renderer/delete';
-import renderAnnounce from '@/remote/activitypub/renderer/announce';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderTombstone from '@/remote/activitypub/renderer/tombstone';
-import config from '@/config/index';
-import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user';
-import { Note, IMentionedRemoteUsers } from '@/models/entities/note';
-import { Notes, Users, Instances } from '@/models/index';
-import { notesChart, perUserNotesChart, instanceChart } from '@/services/chart/index';
-import { deliverToFollowers, deliverToUser } from '@/remote/activitypub/deliver-manager';
-import { countSameRenotes } from '@/misc/count-same-renotes';
-import { deliverToRelays } from '../relay';
+import { publishNoteStream } from '@/services/stream.js';
+import renderDelete from '@/remote/activitypub/renderer/delete.js';
+import renderAnnounce from '@/remote/activitypub/renderer/announce.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderTombstone from '@/remote/activitypub/renderer/tombstone.js';
+import config from '@/config/index.js';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc.js';
+import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
+import { Note, IMentionedRemoteUsers } from '@/models/entities/note.js';
+import { Notes, Users, Instances } from '@/models/index.js';
+import { notesChart, perUserNotesChart, instanceChart } from '@/services/chart/index.js';
+import { deliverToFollowers, deliverToUser } from '@/remote/activitypub/deliver-manager.js';
+import { countSameRenotes } from '@/misc/count-same-renotes.js';
+import { deliverToRelays } from '../relay.js';
import { Brackets, In } from 'typeorm';
/**
@@ -39,7 +39,7 @@ export default async function(user: User, note: Note, quiet = false) {
let renote: Note | undefined;
// if deletd note is renote
- if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length == 0)) {
+ if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) {
renote = await Notes.findOne({
id: note.renoteId,
});
diff --git a/packages/backend/src/services/note/polls/update.ts b/packages/backend/src/services/note/polls/update.ts
index a22ce8e373..88baf16b64 100644
--- a/packages/backend/src/services/note/polls/update.ts
+++ b/packages/backend/src/services/note/polls/update.ts
@@ -1,10 +1,10 @@
-import renderUpdate from '@/remote/activitypub/renderer/update';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import renderNote from '@/remote/activitypub/renderer/note';
-import { Users, Notes } from '@/models/index';
-import { Note } from '@/models/entities/note';
-import { deliverToFollowers } from '@/remote/activitypub/deliver-manager';
-import { deliverToRelays } from '../../relay';
+import renderUpdate from '@/remote/activitypub/renderer/update.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import renderNote from '@/remote/activitypub/renderer/note.js';
+import { Users, Notes } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
+import { deliverToFollowers } from '@/remote/activitypub/deliver-manager.js';
+import { deliverToRelays } from '../../relay.js';
export async function deliverQuestionUpdate(noteId: Note['id']) {
const note = await Notes.findOne(noteId);
diff --git a/packages/backend/src/services/note/polls/vote.ts b/packages/backend/src/services/note/polls/vote.ts
index 25c62f3e3d..9b83b1953f 100644
--- a/packages/backend/src/services/note/polls/vote.ts
+++ b/packages/backend/src/services/note/polls/vote.ts
@@ -1,10 +1,10 @@
-import { publishNoteStream } from '@/services/stream';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { PollVotes, NoteWatchings, Polls, Blockings } from '@/models/index';
+import { publishNoteStream } from '@/services/stream.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { PollVotes, NoteWatchings, Polls, Blockings } from '@/models/index.js';
import { Not } from 'typeorm';
-import { genId } from '@/misc/gen-id';
-import { createNotification } from '../../create-notification';
+import { genId } from '@/misc/gen-id.js';
+import { createNotification } from '../../create-notification.js';
export default async function(user: User, note: Note, choice: number) {
const poll = await Polls.findOne(note.id);
diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts
index 47f46419dd..236aa79938 100644
--- a/packages/backend/src/services/note/reaction/create.ts
+++ b/packages/backend/src/services/note/reaction/create.ts
@@ -1,19 +1,19 @@
-import { publishNoteStream } from '@/services/stream';
-import { renderLike } from '@/remote/activitypub/renderer/like';
-import DeliverManager from '@/remote/activitypub/deliver-manager';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { toDbReaction, decodeReaction } from '@/misc/reaction-lib';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { NoteReactions, Users, NoteWatchings, Notes, Emojis, Blockings } from '@/models/index';
+import { publishNoteStream } from '@/services/stream.js';
+import { renderLike } from '@/remote/activitypub/renderer/like.js';
+import DeliverManager from '@/remote/activitypub/deliver-manager.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { toDbReaction, decodeReaction } from '@/misc/reaction-lib.js';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { NoteReactions, Users, NoteWatchings, Notes, Emojis, Blockings } from '@/models/index.js';
import { Not } from 'typeorm';
-import { perUserReactionsChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { createNotification } from '../../create-notification';
-import deleteReaction from './delete';
-import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error';
-import { NoteReaction } from '@/models/entities/note-reaction';
-import { IdentifiableError } from '@/misc/identifiable-error';
+import { perUserReactionsChart } from '@/services/chart/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { createNotification } from '../../create-notification.js';
+import deleteReaction from './delete.js';
+import { isDuplicateKeyValueError } from '@/misc/is-duplicate-key-value-error.js';
+import { NoteReaction } from '@/models/entities/note-reaction.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
export default async (user: { id: User['id']; host: User['host']; }, note: Note, reaction?: string) => {
// Check blocking
@@ -76,7 +76,7 @@ export default async (user: { id: User['id']; host: User['host']; }, note: Note,
// カスタム絵文字リアクションだったら絵文字情報も送る
const decodedReaction = decodeReaction(reaction);
- let emoji = await Emojis.findOne({
+ const emoji = await Emojis.findOne({
where: {
name: decodedReaction.name,
host: decodedReaction.host,
diff --git a/packages/backend/src/services/note/reaction/delete.ts b/packages/backend/src/services/note/reaction/delete.ts
index 21af819532..62b00f56fd 100644
--- a/packages/backend/src/services/note/reaction/delete.ts
+++ b/packages/backend/src/services/note/reaction/delete.ts
@@ -1,13 +1,13 @@
-import { publishNoteStream } from '@/services/stream';
-import { renderLike } from '@/remote/activitypub/renderer/like';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import DeliverManager from '@/remote/activitypub/deliver-manager';
-import { IdentifiableError } from '@/misc/identifiable-error';
-import { User, IRemoteUser } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { NoteReactions, Users, Notes } from '@/models/index';
-import { decodeReaction } from '@/misc/reaction-lib';
+import { publishNoteStream } from '@/services/stream.js';
+import { renderLike } from '@/remote/activitypub/renderer/like.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import DeliverManager from '@/remote/activitypub/deliver-manager.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { User, IRemoteUser } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { NoteReactions, Users, Notes } from '@/models/index.js';
+import { decodeReaction } from '@/misc/reaction-lib.js';
export default async (user: { id: User['id']; host: User['host']; }, note: Note) => {
// if already unreacted
diff --git a/packages/backend/src/services/note/read.ts b/packages/backend/src/services/note/read.ts
index aaf1c5ed71..28827c5965 100644
--- a/packages/backend/src/services/note/read.ts
+++ b/packages/backend/src/services/note/read.ts
@@ -1,13 +1,13 @@
-import { publishMainStream } from '@/services/stream';
-import { Note } from '@/models/entities/note';
-import { User } from '@/models/entities/user';
-import { NoteUnreads, AntennaNotes, Users, Followings, ChannelFollowings } from '@/models/index';
+import { publishMainStream } from '@/services/stream.js';
+import { Note } from '@/models/entities/note.js';
+import { User } from '@/models/entities/user.js';
+import { NoteUnreads, AntennaNotes, Users, Followings, ChannelFollowings } from '@/models/index.js';
import { Not, IsNull, In } from 'typeorm';
-import { Channel } from '@/models/entities/channel';
-import { checkHitAntenna } from '@/misc/check-hit-antenna';
-import { getAntennas } from '@/misc/antenna-cache';
-import { readNotificationByQuery } from '@/server/api/common/read-notification';
-import { Packed } from '@/misc/schema';
+import { Channel } from '@/models/entities/channel.js';
+import { checkHitAntenna } from '@/misc/check-hit-antenna.js';
+import { getAntennas } from '@/misc/antenna-cache.js';
+import { readNotificationByQuery } from '@/server/api/common/read-notification.js';
+import { Packed } from '@/misc/schema.js';
/**
* Mark notes as read
@@ -52,7 +52,7 @@ export default async function(
if (note.user != null) { // たぶんnullになることは無いはずだけど一応
for (const antenna of myAntennas) {
- if (await checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) {
+ if (await checkHitAntenna(antenna, note, note.user, undefined, Array.from(following))) {
readAntennaNotes.push(note);
}
}
diff --git a/packages/backend/src/services/note/unread.ts b/packages/backend/src/services/note/unread.ts
index 0b2b5b8d75..ef95dc7e8c 100644
--- a/packages/backend/src/services/note/unread.ts
+++ b/packages/backend/src/services/note/unread.ts
@@ -1,8 +1,8 @@
-import { Note } from '@/models/entities/note';
-import { publishMainStream } from '@/services/stream';
-import { User } from '@/models/entities/user';
-import { Mutings, NoteThreadMutings, NoteUnreads } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { Note } from '@/models/entities/note.js';
+import { publishMainStream } from '@/services/stream.js';
+import { User } from '@/models/entities/user.js';
+import { Mutings, NoteThreadMutings, NoteUnreads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
export async function insertNoteUnread(userId: User['id'], note: Note, params: {
// NOTE: isSpecifiedがtrueならisMentionedは必ずfalse
diff --git a/packages/backend/src/services/note/unwatch.ts b/packages/backend/src/services/note/unwatch.ts
index befdb2aa77..3964b2ba5f 100644
--- a/packages/backend/src/services/note/unwatch.ts
+++ b/packages/backend/src/services/note/unwatch.ts
@@ -1,6 +1,6 @@
-import { User } from '@/models/entities/user';
-import { NoteWatchings } from '@/models/index';
-import { Note } from '@/models/entities/note';
+import { User } from '@/models/entities/user.js';
+import { NoteWatchings } from '@/models/index.js';
+import { Note } from '@/models/entities/note.js';
export default async (me: User['id'], note: Note) => {
await NoteWatchings.delete({
diff --git a/packages/backend/src/services/note/watch.ts b/packages/backend/src/services/note/watch.ts
index ebaaf35936..2210c44a75 100644
--- a/packages/backend/src/services/note/watch.ts
+++ b/packages/backend/src/services/note/watch.ts
@@ -1,8 +1,8 @@
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { NoteWatchings } from '@/models/index';
-import { genId } from '@/misc/gen-id';
-import { NoteWatching } from '@/models/entities/note-watching';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { NoteWatchings } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { NoteWatching } from '@/models/entities/note-watching.js';
export default async (me: User['id'], note: Note) => {
// 自分の投稿はwatchできない
diff --git a/packages/backend/src/services/push-notification.ts b/packages/backend/src/services/push-notification.ts
index 2133768a96..8d5c09e6ae 100644
--- a/packages/backend/src/services/push-notification.ts
+++ b/packages/backend/src/services/push-notification.ts
@@ -1,9 +1,9 @@
-import * as push from 'web-push';
-import config from '@/config/index';
-import { SwSubscriptions } from '@/models/index';
-import { fetchMeta } from '@/misc/fetch-meta';
-import { Packed } from '@/misc/schema';
-import { getNoteSummary } from '@/misc/get-note-summary';
+import push from 'web-push';
+import config from '@/config/index.js';
+import { SwSubscriptions } from '@/models/index.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Packed } from '@/misc/schema.js';
+import { getNoteSummary } from '@/misc/get-note-summary.js';
type notificationType = 'notification' | 'unreadMessagingMessage';
type notificationBody = Packed<'Notification'> | Packed<'MessagingMessage'>;
diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts
index 18b42ed15b..152930dbd9 100644
--- a/packages/backend/src/services/register-or-fetch-instance-doc.ts
+++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts
@@ -1,9 +1,8 @@
-import { Instance } from '@/models/entities/instance';
-import { Instances } from '@/models/index';
-import { federationChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { toPuny } from '@/misc/convert-host';
-import { Cache } from '@/misc/cache';
+import { Instance } from '@/models/entities/instance.js';
+import { Instances } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { toPuny } from '@/misc/convert-host.js';
+import { Cache } from '@/misc/cache.js';
const cache = new Cache<Instance>(1000 * 60 * 60);
@@ -23,8 +22,6 @@ export async function registerOrFetchInstanceDoc(host: string): Promise<Instance
lastCommunicatedAt: new Date(),
}).then(x => Instances.findOneOrFail(x.identifiers[0]));
- federationChart.update(true);
-
cache.set(host, i);
return i;
} else {
diff --git a/packages/backend/src/services/relay.ts b/packages/backend/src/services/relay.ts
index 33a5ef7f9b..6f0da503fc 100644
--- a/packages/backend/src/services/relay.ts
+++ b/packages/backend/src/services/relay.ts
@@ -1,11 +1,11 @@
-import { createSystemUser } from './create-system-user';
-import { renderFollowRelay } from '@/remote/activitypub/renderer/follow-relay';
-import { renderActivity, attachLdSignature } from '@/remote/activitypub/renderer/index';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { deliver } from '@/queue/index';
-import { ILocalUser, User } from '@/models/entities/user';
-import { Users, Relays } from '@/models/index';
-import { genId } from '@/misc/gen-id';
+import { createSystemUser } from './create-system-user.js';
+import { renderFollowRelay } from '@/remote/activitypub/renderer/follow-relay.js';
+import { renderActivity, attachLdSignature } from '@/remote/activitypub/renderer/index.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { deliver } from '@/queue/index.js';
+import { ILocalUser, User } from '@/models/entities/user.js';
+import { Users, Relays } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
const ACTOR_USERNAME = 'relay.actor' as const;
diff --git a/packages/backend/src/services/send-email-notification.ts b/packages/backend/src/services/send-email-notification.ts
index 157bacb46d..debaf3476d 100644
--- a/packages/backend/src/services/send-email-notification.ts
+++ b/packages/backend/src/services/send-email-notification.ts
@@ -1,28 +1,33 @@
-import { UserProfiles } from '@/models/index';
-import { User } from '@/models/entities/user';
-import { sendEmail } from './send-email';
-import { I18n } from '@/misc/i18n';
-import * as Acct from 'misskey-js/built/acct';
-const locales = require('../../../../locales/index.js');
+import { UserProfiles } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { sendEmail } from './send-email.js';
+import { I18n } from '@/misc/i18n.js';
+import * as Acct from '@/misc/acct.js';
+// TODO
+//const locales = await import('../../../../locales/index.js');
// TODO: locale ファイルをクライアント用とサーバー用で分けたい
async function follow(userId: User['id'], follower: User) {
+ /*
const userProfile = await UserProfiles.findOneOrFail({ userId: userId });
if (!userProfile.email || !userProfile.emailNotificationTypes.includes('follow')) return;
const locale = locales[userProfile.lang || 'ja-JP'];
const i18n = new I18n(locale);
// TODO: render user information html
sendEmail(userProfile.email, i18n.t('_email._follow.title'), `${follower.name} (@${Acct.toString(follower)})`, `${follower.name} (@${Acct.toString(follower)})`);
+ */
}
async function receiveFollowRequest(userId: User['id'], follower: User) {
+ /*
const userProfile = await UserProfiles.findOneOrFail({ userId: userId });
if (!userProfile.email || !userProfile.emailNotificationTypes.includes('receiveFollowRequest')) return;
const locale = locales[userProfile.lang || 'ja-JP'];
const i18n = new I18n(locale);
// TODO: render user information html
sendEmail(userProfile.email, i18n.t('_email._receiveFollowRequest.title'), `${follower.name} (@${Acct.toString(follower)})`, `${follower.name} (@${Acct.toString(follower)})`);
+ */
}
export const sendEmailNotification = {
diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts
index f5f36148f6..b35d22548c 100644
--- a/packages/backend/src/services/send-email.ts
+++ b/packages/backend/src/services/send-email.ts
@@ -1,7 +1,7 @@
import * as nodemailer from 'nodemailer';
-import { fetchMeta } from '@/misc/fetch-meta';
-import Logger from './logger';
-import config from '@/config/index';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import Logger from './logger.js';
+import config from '@/config/index.js';
export const logger = new Logger('email');
@@ -114,9 +114,9 @@ export async function sendEmail(to: string, subject: string, html: string, text:
</html>`,
});
- logger.info('Message sent: %s', info.messageId);
- } catch (e) {
- logger.error(e);
- throw e;
+ logger.info(`Message sent: ${info.messageId}`);
+ } catch (err) {
+ logger.error(err as Error);
+ throw err;
}
}
diff --git a/packages/backend/src/services/stream.ts b/packages/backend/src/services/stream.ts
index c0cefe9af4..9fa2b97135 100644
--- a/packages/backend/src/services/stream.ts
+++ b/packages/backend/src/services/stream.ts
@@ -1,11 +1,11 @@
-import { redisClient } from '../db/redis';
-import { User } from '@/models/entities/user';
-import { Note } from '@/models/entities/note';
-import { UserList } from '@/models/entities/user-list';
-import { UserGroup } from '@/models/entities/user-group';
-import config from '@/config/index';
-import { Antenna } from '@/models/entities/antenna';
-import { Channel } from '@/models/entities/channel';
+import { redisClient } from '../db/redis.js';
+import { User } from '@/models/entities/user.js';
+import { Note } from '@/models/entities/note.js';
+import { UserList } from '@/models/entities/user-list.js';
+import { UserGroup } from '@/models/entities/user-group.js';
+import config from '@/config/index.js';
+import { Antenna } from '@/models/entities/antenna.js';
+import { Channel } from '@/models/entities/channel.js';
import {
StreamChannels,
AdminStreamTypes,
@@ -21,8 +21,8 @@ import {
NoteStreamTypes,
UserListStreamTypes,
UserStreamTypes,
-} from '@/server/api/stream/types';
-import { Packed } from '@/misc/schema';
+} from '@/server/api/stream/types.js';
+import { Packed } from '@/misc/schema.js';
class Publisher {
private publish = (channel: StreamChannels, type: string | null, value?: any): void => {
diff --git a/packages/backend/src/services/suspend-user.ts b/packages/backend/src/services/suspend-user.ts
index 262c8df5b2..033311a3cc 100644
--- a/packages/backend/src/services/suspend-user.ts
+++ b/packages/backend/src/services/suspend-user.ts
@@ -1,9 +1,9 @@
-import renderDelete from '@/remote/activitypub/renderer/delete';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { deliver } from '@/queue/index';
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { Users, Followings } from '@/models/index';
+import renderDelete from '@/remote/activitypub/renderer/delete.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { deliver } from '@/queue/index.js';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { Users, Followings } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
export async function doPostSuspend(user: { id: User['id']; host: User['host'] }) {
diff --git a/packages/backend/src/services/unsuspend-user.ts b/packages/backend/src/services/unsuspend-user.ts
index 04ad65a361..3be081d0ed 100644
--- a/packages/backend/src/services/unsuspend-user.ts
+++ b/packages/backend/src/services/unsuspend-user.ts
@@ -1,10 +1,10 @@
-import renderDelete from '@/remote/activitypub/renderer/delete';
-import renderUndo from '@/remote/activitypub/renderer/undo';
-import { renderActivity } from '@/remote/activitypub/renderer/index';
-import { deliver } from '@/queue/index';
-import config from '@/config/index';
-import { User } from '@/models/entities/user';
-import { Users, Followings } from '@/models/index';
+import renderDelete from '@/remote/activitypub/renderer/delete.js';
+import renderUndo from '@/remote/activitypub/renderer/undo.js';
+import { renderActivity } from '@/remote/activitypub/renderer/index.js';
+import { deliver } from '@/queue/index.js';
+import config from '@/config/index.js';
+import { User } from '@/models/entities/user.js';
+import { Users, Followings } from '@/models/index.js';
import { Not, IsNull } from 'typeorm';
export async function doPostUnsuspend(user: User) {
diff --git a/packages/backend/src/services/update-hashtag.ts b/packages/backend/src/services/update-hashtag.ts
index e8504f6ff0..b6fb38bc5a 100644
--- a/packages/backend/src/services/update-hashtag.ts
+++ b/packages/backend/src/services/update-hashtag.ts
@@ -1,9 +1,9 @@
-import { User } from '@/models/entities/user';
-import { Hashtags, Users } from '@/models/index';
-import { hashtagChart } from '@/services/chart/index';
-import { genId } from '@/misc/gen-id';
-import { Hashtag } from '@/models/entities/hashtag';
-import { normalizeForSearch } from '@/misc/normalize-for-search';
+import { User } from '@/models/entities/user.js';
+import { Hashtags, Users } from '@/models/index.js';
+import { hashtagChart } from '@/services/chart/index.js';
+import { genId } from '@/misc/gen-id.js';
+import { Hashtag } from '@/models/entities/hashtag.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
export async function updateHashtags(user: { id: User['id']; host: User['host']; }, tags: string[]) {
for (const tag of tags) {
diff --git a/packages/backend/src/services/user-list/push.ts b/packages/backend/src/services/user-list/push.ts
index 2b862ca9cc..d073afcd3a 100644
--- a/packages/backend/src/services/user-list/push.ts
+++ b/packages/backend/src/services/user-list/push.ts
@@ -1,11 +1,11 @@
-import { publishUserListStream } from '@/services/stream';
-import { User } from '@/models/entities/user';
-import { UserList } from '@/models/entities/user-list';
-import { UserListJoinings, Users } from '@/models/index';
-import { UserListJoining } from '@/models/entities/user-list-joining';
-import { genId } from '@/misc/gen-id';
-import { fetchProxyAccount } from '@/misc/fetch-proxy-account';
-import createFollowing from '../following/create';
+import { publishUserListStream } from '@/services/stream.js';
+import { User } from '@/models/entities/user.js';
+import { UserList } from '@/models/entities/user-list.js';
+import { UserListJoinings, Users } from '@/models/index.js';
+import { UserListJoining } from '@/models/entities/user-list-joining.js';
+import { genId } from '@/misc/gen-id.js';
+import { fetchProxyAccount } from '@/misc/fetch-proxy-account.js';
+import createFollowing from '../following/create.js';
export async function pushUserToUserList(target: User, list: UserList) {
await UserListJoinings.insert({
diff --git a/packages/backend/src/services/validate-email-for-account.ts b/packages/backend/src/services/validate-email-for-account.ts
index 1d039fb263..3c49d37eef 100644
--- a/packages/backend/src/services/validate-email-for-account.ts
+++ b/packages/backend/src/services/validate-email-for-account.ts
@@ -1,5 +1,5 @@
import validateEmail from 'deep-email-validator';
-import { UserProfiles } from '@/models';
+import { UserProfiles } from '@/models/index.js';
export async function validateEmailForAccount(emailAddress: string): Promise<{
available: boolean;
diff --git a/packages/backend/src/tools/accept-migration.ts b/packages/backend/src/tools/accept-migration.ts
index 2e54fc129f..adbfcdadf7 100644
--- a/packages/backend/src/tools/accept-migration.ts
+++ b/packages/backend/src/tools/accept-migration.ts
@@ -1,7 +1,7 @@
// ex) node built/tools/accept-migration Yo 1000000000001
import { createConnection } from 'typeorm';
-import config from '@/config/index';
+import config from '@/config/index.js';
createConnection({
type: 'postgres',
diff --git a/packages/backend/src/tools/demote-admin.ts b/packages/backend/src/tools/demote-admin.ts
index 45e32b513c..7f67222473 100644
--- a/packages/backend/src/tools/demote-admin.ts
+++ b/packages/backend/src/tools/demote-admin.ts
@@ -1,4 +1,4 @@
-import { initDb } from '../db/postgre';
+import { initDb } from '../db/postgre.js';
async function main(username: string) {
if (!username) throw `username required`;
diff --git a/packages/backend/src/tools/mark-admin.ts b/packages/backend/src/tools/mark-admin.ts
index 88d59518ab..630179e7ab 100644
--- a/packages/backend/src/tools/mark-admin.ts
+++ b/packages/backend/src/tools/mark-admin.ts
@@ -1,4 +1,4 @@
-import { initDb } from '../db/postgre';
+import { initDb } from '../db/postgre.js';
async function main(username: string) {
if (!username) throw `username required`;
diff --git a/packages/backend/src/tools/refresh-question.ts b/packages/backend/src/tools/refresh-question.ts
index 3bbb781ae7..0111a2257a 100644
--- a/packages/backend/src/tools/refresh-question.ts
+++ b/packages/backend/src/tools/refresh-question.ts
@@ -1,4 +1,4 @@
-import { initDb } from '@/db/postgre';
+import { initDb } from '@/db/postgre.js';
async function main(uri: string): Promise<any> {
await initDb();
diff --git a/packages/backend/src/tools/resync-remote-user.ts b/packages/backend/src/tools/resync-remote-user.ts
index 22d2f7c895..8c02ef7efc 100644
--- a/packages/backend/src/tools/resync-remote-user.ts
+++ b/packages/backend/src/tools/resync-remote-user.ts
@@ -1,5 +1,5 @@
-import { initDb } from '@/db/postgre';
-import * as Acct from 'misskey-js/built/acct';
+import { initDb } from '@/db/postgre.js';
+import * as Acct from '@/misc/acct.js';
async function main(acct: string): Promise<any> {
await initDb();
diff --git a/packages/backend/src/tools/show-signin-history.ts b/packages/backend/src/tools/show-signin-history.ts
index 7db84ece02..c3388fd1b6 100644
--- a/packages/backend/src/tools/show-signin-history.ts
+++ b/packages/backend/src/tools/show-signin-history.ts
@@ -1,4 +1,4 @@
-import { initDb } from '@/db/postgre';
+import { initDb } from '@/db/postgre.js';
// node built/tools/show-signin-history username
// => {Success} {Date} {IPAddrsss}
diff --git a/packages/backend/test/activitypub.ts b/packages/backend/test/activitypub.ts
index 777e7f355b..70f35cafd8 100644
--- a/packages/backend/test/activitypub.ts
+++ b/packages/backend/test/activitypub.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import rndstr from 'rndstr';
import * as assert from 'assert';
-import { initTestDb } from './utils';
+import { initTestDb } from './utils.js';
describe('ActivityPub', () => {
before(async () => {
@@ -33,8 +33,8 @@ describe('ActivityPub', () => {
};
it('Minimum Actor', async () => {
- const { MockResolver } = await import('./misc/mock-resolver');
- const { createPerson } = await import('../src/remote/activitypub/models/person');
+ const { MockResolver } = await import('./misc/mock-resolver.js');
+ const { createPerson } = await import('../src/remote/activitypub/models/person.js');
const resolver = new MockResolver();
resolver._register(actor.id, actor);
@@ -47,8 +47,8 @@ describe('ActivityPub', () => {
});
it('Minimum Note', async () => {
- const { MockResolver } = await import('./misc/mock-resolver');
- const { createNote } = await import('../src/remote/activitypub/models/note');
+ const { MockResolver } = await import('./misc/mock-resolver.js');
+ const { createNote } = await import('../src/remote/activitypub/models/note.js');
const resolver = new MockResolver();
resolver._register(actor.id, actor);
@@ -80,8 +80,8 @@ describe('ActivityPub', () => {
};
it('Actor', async () => {
- const { MockResolver } = await import('./misc/mock-resolver');
- const { createPerson } = await import('../src/remote/activitypub/models/person');
+ const { MockResolver } = await import('./misc/mock-resolver.js');
+ const { createPerson } = await import('../src/remote/activitypub/models/person.js');
const resolver = new MockResolver();
resolver._register(actor.id, actor);
diff --git a/packages/backend/test/ap-request.ts b/packages/backend/test/ap-request.ts
index 4a9799eb99..48f4fceb51 100644
--- a/packages/backend/test/ap-request.ts
+++ b/packages/backend/test/ap-request.ts
@@ -1,7 +1,7 @@
import * as assert from 'assert';
-import { genRsaKeyPair } from '../src/misc/gen-key-pair';
-import { createSignedPost, createSignedGet } from '../src/remote/activitypub/ap-request';
-const httpSignature = require('http-signature');
+import { genRsaKeyPair } from '../src/misc/gen-key-pair.js';
+import { createSignedPost, createSignedGet } from '../src/remote/activitypub/ap-request.js';
+import httpSignature from 'http-signature';
export const buildParsedSignature = (signingString: string, signature: string, algorithm: string) => {
return {
diff --git a/packages/backend/test/api-visibility.ts b/packages/backend/test/api-visibility.ts
index ade7b730b3..d946191be8 100644
--- a/packages/backend/test/api-visibility.ts
+++ b/packages/backend/test/api-visibility.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, startServer, shutdownServer } from './utils';
+import { async, signup, request, post, startServer, shutdownServer } from './utils.js';
describe('API visibility', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/api.ts b/packages/backend/test/api.ts
index 99fb196dcd..b1b2ecafc7 100644
--- a/packages/backend/test/api.ts
+++ b/packages/backend/test/api.ts
@@ -1,970 +1,83 @@
-/*
process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, react, uploadFile } from './utils';
+import { async, signup, request, post, react, uploadFile, startServer, shutdownServer } from './utils.js';
describe('API', () => {
let p: childProcess.ChildProcess;
+ let alice: any;
+ let bob: any;
+ let carol: any;
- beforeEach(done => {
- p = childProcess.spawn('node', [__dirname + '/../index.js'], {
- stdio: ['inherit', 'inherit', 'ipc'],
- env: { NODE_ENV: 'test' }
- });
- p.on('message', message => {
- if (message === 'ok') {
- done();
- }
- });
+ before(async () => {
+ p = await startServer();
+ alice = await signup({ username: 'alice' });
+ bob = await signup({ username: 'bob' });
+ carol = await signup({ username: 'carol' });
});
- afterEach(() => {
- p.kill();
+ after(async () => {
+ await shutdownServer(p);
});
- describe('signup', () => {
- it('不正なユーザー名でアカウントが作成できない', async(async () => {
- const res = await request('/signup', {
- username: 'test.',
- password: 'test'
+ describe('General validation', () => {
+ it('wrong type', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ string: 42,
});
assert.strictEqual(res.status, 400);
}));
- it('空のパスワードでアカウントが作成できない', async(async () => {
- const res = await request('/signup', {
- username: 'test',
- password: ''
+ it('missing require param', async(async () => {
+ const res = await request('/test', {
+ string: 'a',
});
assert.strictEqual(res.status, 400);
}));
- it('正しくアカウントが作成できる', async(async () => {
- const me = {
- username: 'test',
- password: 'test'
- };
-
- const res = await request('/signup', me);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.username, me.username);
- }));
-
- it('同じユーザー名のアカウントは作成できない', async(async () => {
- await signup({
- username: 'test'
- });
-
- const res = await request('/signup', {
- username: 'test',
- password: 'test'
- });
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('signin', () => {
- it('間違ったパスワードでサインインできない', async(async () => {
- await signup({
- username: 'test',
- password: 'foo'
- });
-
- const res = await request('/signin', {
- username: 'test',
- password: 'bar'
+ it('invalid misskey:id (empty string)', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ id: '',
});
-
- assert.strictEqual(res.status, 403);
- }));
-
- it('クエリをインジェクションできない', async(async () => {
- await signup({
- username: 'test'
- });
-
- const res = await request('/signin', {
- username: 'test',
- password: {
- $gt: ''
- }
- });
-
assert.strictEqual(res.status, 400);
}));
- it('正しい情報でサインインできる', async(async () => {
- await signup({
- username: 'test',
- password: 'foo'
+ it('valid misskey:id', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ id: '8wvhjghbxu',
});
-
- const res = await request('/signin', {
- username: 'test',
- password: 'foo'
- });
-
- assert.strictEqual(res.status, 200);
- }));
- });
-
- describe('i/update', () => {
- it('アカウント設定を更新できる', async(async () => {
- const me = await signup();
-
- const myName = '大室櫻子';
- const myLocation = '七森中';
- const myBirthday = '2000-09-07';
-
- const res = await request('/i/update', {
- name: myName,
- location: myLocation,
- birthday: myBirthday
- }, me);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, myName);
- assert.strictEqual(res.body.location, myLocation);
- assert.strictEqual(res.body.birthday, myBirthday);
- }));
-
- it('名前を空白にできない', async(async () => {
- const me = await signup();
- const res = await request('/i/update', {
- name: ' '
- }, me);
- assert.strictEqual(res.status, 400);
- }));
-
- it('誕生日の設定を削除できる', async(async () => {
- const me = await signup();
- await request('/i/update', {
- birthday: '2000-09-07'
- }, me);
-
- const res = await request('/i/update', {
- birthday: null
- }, me);
-
assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.birthday, null);
}));
- it('不正な誕生日の形式で怒られる', async(async () => {
- const me = await signup();
- const res = await request('/i/update', {
- birthday: '2000/09/07'
- }, me);
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('users/show', () => {
- it('ユーザーが取得できる', async(async () => {
- const me = await signup();
-
- const res = await request('/users/show', {
- userId: me.id
- }, me);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.id, me.id);
- }));
-
- it('ユーザーが存在しなかったら怒る', async(async () => {
- const res = await request('/users/show', {
- userId: '000000000000000000000000'
- });
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const res = await request('/users/show', {
- userId: 'kyoppie'
- });
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('notes/show', () => {
- it('投稿が取得できる', async(async () => {
- const me = await signup();
- const myPost = await post(me, {
- text: 'test'
+ it('default value', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ string: 'a',
});
-
- const res = await request('/notes/show', {
- noteId: myPost.id
- }, me);
-
assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.id, myPost.id);
- assert.strictEqual(res.body.text, myPost.text);
+ assert.strictEqual(res.body.default, 'hello');
}));
- it('投稿が存在しなかったら怒る', async(async () => {
- const res = await request('/notes/show', {
- noteId: '000000000000000000000000'
+ it('can set null even if it has default value', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ nullableDefault: null,
});
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const res = await request('/notes/show', {
- noteId: 'kyoppie'
- });
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('notes/reactions/create', () => {
- it('リアクションできる', async(async () => {
- const bob = await signup({ username: 'bob' });
- const bobPost = await post(bob);
-
- const alice = await signup({ username: 'alice' });
- const res = await request('/notes/reactions/create', {
- noteId: bobPost.id,
- reaction: 'like'
- }, alice);
-
- assert.strictEqual(res.status, 204);
- }));
-
- it('自分の投稿にはリアクションできない', async(async () => {
- const me = await signup();
- const myPost = await post(me);
-
- const res = await request('/notes/reactions/create', {
- noteId: myPost.id,
- reaction: 'like'
- }, me);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('二重にリアクションできない', async(async () => {
- const bob = await signup({ username: 'bob' });
- const bobPost = await post(bob);
-
- const alice = await signup({ username: 'alice' });
- await react(alice, bobPost, 'like');
-
- const res = await request('/notes/reactions/create', {
- noteId: bobPost.id,
- reaction: 'like'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しない投稿にはリアクションできない', async(async () => {
- const me = await signup();
-
- const res = await request('/notes/reactions/create', {
- noteId: '000000000000000000000000',
- reaction: 'like'
- }, me);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('空のパラメータで怒られる', async(async () => {
- const me = await signup();
-
- const res = await request('/notes/reactions/create', {}, me);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const me = await signup();
-
- const res = await request('/notes/reactions/create', {
- noteId: 'kyoppie',
- reaction: 'like'
- }, me);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('following/create', () => {
- it('フォローできる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- const res = await request('/following/create', {
- userId: alice.id
- }, bob);
-
- assert.strictEqual(res.status, 200);
- }));
-
- it('既にフォローしている場合は怒る', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
- await request('/following/create', {
- userId: alice.id
- }, bob);
-
- const res = await request('/following/create', {
- userId: alice.id
- }, bob);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しないユーザーはフォローできない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/create', {
- userId: '000000000000000000000000'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('自分自身はフォローできない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/create', {
- userId: alice.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('空のパラメータで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/create', {}, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/create', {
- userId: 'foo'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('following/delete', () => {
- it('フォロー解除できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
- await request('/following/create', {
- userId: alice.id
- }, bob);
-
- const res = await request('/following/delete', {
- userId: alice.id
- }, bob);
-
assert.strictEqual(res.status, 200);
+ assert.strictEqual(res.body.nullableDefault, null);
}));
- it('フォローしていない場合は怒る', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- const res = await request('/following/delete', {
- userId: alice.id
- }, bob);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しないユーザーはフォロー解除できない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/delete', {
- userId: '000000000000000000000000'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('自分自身はフォロー解除できない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/delete', {
- userId: alice.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('空のパラメータで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/delete', {}, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/following/delete', {
- userId: 'kyoppie'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('drive', () => {
- it('ドライブ情報を取得できる', async(async () => {
- const bob = await signup({ username: 'bob' });
- await uploadFile({
- userId: me.id,
- size: 256
+ it('cannot set undefined if it has default value', async(async () => {
+ const res = await request('/test', {
+ required: true,
+ nullableDefault: undefined,
});
- await uploadFile({
- userId: me.id,
- size: 512
- });
- await uploadFile({
- userId: me.id,
- size: 1024
- });
- const res = await request('/drive', {}, me);
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- expect(res.body).have.property('usage').eql(1792);
- }));
- });
-
- describe('drive/files/create', () => {
- it('ファイルを作成できる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await uploadFile(alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, 'Lenna.png');
- }));
-
- it('ファイルに名前を付けられる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await assert.request(server)
- .post('/drive/files/create')
- .field('i', alice.token)
- .field('name', 'Belmond.png')
- .attach('file', fs.readFileSync(__dirname + '/resources/Lenna.png'), 'Lenna.png');
-
- expect(res).have.status(200);
- expect(res.body).be.a('object');
- expect(res.body).have.property('name').eql('Belmond.png');
- }));
-
- it('ファイル無しで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/files/create', {}, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('SVGファイルを作成できる', async(async () => {
- const izumi = await signup({ username: 'izumi' });
-
- const res = await uploadFile(izumi, __dirname + '/resources/image.svg');
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, 'image.svg');
- assert.strictEqual(res.body.type, 'image/svg+xml');
- }));
- });
-
- describe('drive/files/update', () => {
- it('名前を更新できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
- const newName = 'いちごパスタ.png';
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- name: newName
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, newName);
- }));
-
- it('他人のファイルは更新できない', async(async () => {
- const bob = await signup({ username: 'bob' });
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(bob);
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- name: 'いちごパスタ.png'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('親フォルダを更新できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- folderId: folder.id
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.folderId, folder.id);
- }));
-
- it('親フォルダを無しにできる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
-
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
-
- await request('/drive/files/update', {
- fileId: file.id,
- folderId: folder.id
- }, alice);
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- folderId: null
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.folderId, null);
- }));
-
- it('他人のフォルダには入れられない', async(async () => {
- const bob = await signup({ username: 'bob' });
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, bob)).body;
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- folderId: folder.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しないフォルダで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- folderId: '000000000000000000000000'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('不正なフォルダIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const file = await uploadFile(alice);
-
- const res = await request('/drive/files/update', {
- fileId: file.id,
- folderId: 'foo'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('ファイルが存在しなかったら怒る', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/files/update', {
- fileId: '000000000000000000000000',
- name: 'いちごパスタ.png'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('間違ったIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/files/update', {
- fileId: 'kyoppie',
- name: 'いちごパスタ.png'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('drive/folders/create', () => {
- it('フォルダを作成できる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/folders/create', {
- name: 'test'
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, 'test');
- }));
- });
-
- describe('drive/folders/update', () => {
- it('名前を更新できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- name: 'new name'
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.name, 'new name');
- }));
-
- it('他人のフォルダを更新できない', async(async () => {
- const bob = await signup({ username: 'bob' });
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, bob)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- name: 'new name'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('親フォルダを更新できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const parentFolder = (await request('/drive/folders/create', {
- name: 'parent'
- }, alice)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: parentFolder.id
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.parentId, parentFolder.id);
- }));
-
- it('親フォルダを無しに更新できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const parentFolder = (await request('/drive/folders/create', {
- name: 'parent'
- }, alice)).body;
- await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: parentFolder.id
- }, alice);
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: null
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.parentId, null);
- }));
-
- it('他人のフォルダを親フォルダに設定できない', async(async () => {
- const bob = await signup({ username: 'bob' });
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const parentFolder = (await request('/drive/folders/create', {
- name: 'parent'
- }, bob)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: parentFolder.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('フォルダが循環するような構造にできない', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const parentFolder = (await request('/drive/folders/create', {
- name: 'parent'
- }, alice)).body;
- await request('/drive/folders/update', {
- folderId: parentFolder.id,
- parentId: folder.id
- }, alice);
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: parentFolder.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('フォルダが循環するような構造にできない(再帰的)', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folderA = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const folderB = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- const folderC = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
- await request('/drive/folders/update', {
- folderId: folderB.id,
- parentId: folderA.id
- }, alice);
- await request('/drive/folders/update', {
- folderId: folderC.id,
- parentId: folderB.id
- }, alice);
-
- const res = await request('/drive/folders/update', {
- folderId: folderA.id,
- parentId: folderC.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('フォルダが循環するような構造にできない(自身)', async(async () => {
- const arisugawa = await signup({ username: 'arisugawa' });
- const folderA = (await request('/drive/folders/create', {
- name: 'test'
- }, arisugawa)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folderA.id,
- parentId: folderA.id
- }, arisugawa);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しない親フォルダを設定できない', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: '000000000000000000000000'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('不正な親フォルダIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const folder = (await request('/drive/folders/create', {
- name: 'test'
- }, alice)).body;
-
- const res = await request('/drive/folders/update', {
- folderId: folder.id,
- parentId: 'foo'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しないフォルダを更新できない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/folders/update', {
- folderId: '000000000000000000000000'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('不正なフォルダIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/drive/folders/update', {
- folderId: 'foo'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('messaging/messages/create', () => {
- it('メッセージを送信できる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- const res = await request('/messaging/messages/create', {
- userId: bob.id,
- text: 'test'
- }, alice);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
- assert.strictEqual(res.body.text, 'test');
- }));
-
- it('自分自身にはメッセージを送信できない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/messaging/messages/create', {
- userId: alice.id,
- text: 'Yo'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('存在しないユーザーにはメッセージを送信できない', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/messaging/messages/create', {
- userId: '000000000000000000000000',
- text: 'test'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('不正なユーザーIDで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
-
- const res = await request('/messaging/messages/create', {
- userId: 'foo',
- text: 'test'
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('テキストが無くて怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- const res = await request('/messaging/messages/create', {
- userId: bob.id
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
-
- it('文字数オーバーで怒られる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- const res = await request('/messaging/messages/create', {
- userId: bob.id,
- text: '!'.repeat(1001)
- }, alice);
-
- assert.strictEqual(res.status, 400);
- }));
- });
-
- describe('notes/replies', () => {
- it('自分に閲覧権限のない投稿は含まれない', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
- const carol = await signup({ username: 'carol' });
-
- const alicePost = await post(alice, {
- text: 'foo'
- });
-
- await post(bob, {
- replyId: alicePost.id,
- text: 'bar',
- visibility: 'specified',
- visibleUserIds: [alice.id]
- });
-
- const res = await request('/notes/replies', {
- noteId: alicePost.id
- }, carol);
-
- assert.strictEqual(res.status, 200);
- assert.strictEqual(Array.isArray(res.body), true);
- assert.strictEqual(res.body.length, 0);
- }));
- });
-
- describe('notes/timeline', () => {
- it('フォロワー限定投稿が含まれる', async(async () => {
- const alice = await signup({ username: 'alice' });
- const bob = await signup({ username: 'bob' });
-
- await request('/following/create', {
- userId: alice.id
- }, bob);
-
- const alicePost = await post(alice, {
- text: 'foo',
- visibility: 'followers'
- });
-
- const res = await request('/notes/timeline', {}, bob);
-
assert.strictEqual(res.status, 200);
- assert.strictEqual(Array.isArray(res.body), true);
- assert.strictEqual(res.body.length, 1);
- assert.strictEqual(res.body[0].id, alicePost.id);
+ assert.strictEqual(res.body.nullableDefault, 'hello');
}));
});
});
-*/
diff --git a/packages/backend/test/block.ts b/packages/backend/test/block.ts
index 6d9efb77b7..103eec991d 100644
--- a/packages/backend/test/block.ts
+++ b/packages/backend/test/block.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, startServer, shutdownServer } from './utils';
+import { async, signup, request, post, startServer, shutdownServer } from './utils.js';
describe('Block', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/chart.ts b/packages/backend/test/chart.ts
index 66000bc928..c8cea874f0 100644
--- a/packages/backend/test/chart.ts
+++ b/packages/backend/test/chart.ts
@@ -2,18 +2,21 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as lolex from '@sinonjs/fake-timers';
-import { async, initTestDb } from './utils';
-import TestChart from '../src/services/chart/charts/test';
-import TestGroupedChart from '../src/services/chart/charts/test-grouped';
-import TestUniqueChart from '../src/services/chart/charts/test-unique';
-import * as _TestChart from '../src/services/chart/charts/entities/test';
-import * as _TestGroupedChart from '../src/services/chart/charts/entities/test-grouped';
-import * as _TestUniqueChart from '../src/services/chart/charts/entities/test-unique';
+import { async, initTestDb } from './utils.js';
+import TestChart from '../src/services/chart/charts/test.js';
+import TestGroupedChart from '../src/services/chart/charts/test-grouped.js';
+import TestUniqueChart from '../src/services/chart/charts/test-unique.js';
+import TestIntersectionChart from '../src/services/chart/charts/test-intersection.js';
+import * as _TestChart from '../src/services/chart/charts/entities/test.js';
+import * as _TestGroupedChart from '../src/services/chart/charts/entities/test-grouped.js';
+import * as _TestUniqueChart from '../src/services/chart/charts/entities/test-unique.js';
+import * as _TestIntersectionChart from '../src/services/chart/charts/entities/test-intersection.js';
describe('Chart', () => {
let testChart: TestChart;
let testGroupedChart: TestGroupedChart;
let testUniqueChart: TestUniqueChart;
+ let testIntersectionChart: TestIntersectionChart;
let clock: lolex.Clock;
beforeEach(async(async () => {
@@ -21,11 +24,13 @@ describe('Chart', () => {
_TestChart.entity.hour, _TestChart.entity.day,
_TestGroupedChart.entity.hour, _TestGroupedChart.entity.day,
_TestUniqueChart.entity.hour, _TestUniqueChart.entity.day,
+ _TestIntersectionChart.entity.hour, _TestIntersectionChart.entity.day,
]);
testChart = new TestChart();
testGroupedChart = new TestGroupedChart();
testUniqueChart = new TestUniqueChart();
+ testIntersectionChart = new TestIntersectionChart();
clock = lolex.install({
now: new Date(Date.UTC(2000, 0, 1, 0, 0, 0))
@@ -426,6 +431,53 @@ describe('Chart', () => {
foo: [2, 0, 0],
});
}));
+
+ describe('Intersection', () => {
+ it('条件が満たされていない場合はカウントされない', async(async () => {
+ await testIntersectionChart.addA('alice');
+ await testIntersectionChart.addA('bob');
+ await testIntersectionChart.addB('carol');
+ await testIntersectionChart.save();
+
+ const chartHours = await testIntersectionChart.getChart('hour', 3, null);
+ const chartDays = await testIntersectionChart.getChart('day', 3, null);
+
+ assert.deepStrictEqual(chartHours, {
+ a: [2, 0, 0],
+ b: [1, 0, 0],
+ aAndB: [0, 0, 0],
+ });
+
+ assert.deepStrictEqual(chartDays, {
+ a: [2, 0, 0],
+ b: [1, 0, 0],
+ aAndB: [0, 0, 0],
+ });
+ }));
+
+ it('条件が満たされている場合にカウントされる', async(async () => {
+ await testIntersectionChart.addA('alice');
+ await testIntersectionChart.addA('bob');
+ await testIntersectionChart.addB('carol');
+ await testIntersectionChart.addB('alice');
+ await testIntersectionChart.save();
+
+ const chartHours = await testIntersectionChart.getChart('hour', 3, null);
+ const chartDays = await testIntersectionChart.getChart('day', 3, null);
+
+ assert.deepStrictEqual(chartHours, {
+ a: [2, 0, 0],
+ b: [2, 0, 0],
+ aAndB: [1, 0, 0],
+ });
+
+ assert.deepStrictEqual(chartDays, {
+ a: [2, 0, 0],
+ b: [2, 0, 0],
+ aAndB: [1, 0, 0],
+ });
+ }));
+ });
});
describe('Resync', () => {
diff --git a/packages/backend/test/endpoints.ts b/packages/backend/test/endpoints.ts
new file mode 100644
index 0000000000..2aedc25f2c
--- /dev/null
+++ b/packages/backend/test/endpoints.ts
@@ -0,0 +1,865 @@
+/*
+process.env.NODE_ENV = 'test';
+
+import * as assert from 'assert';
+import * as childProcess from 'child_process';
+import { async, signup, request, post, react, uploadFile, startServer, shutdownServer } from './utils.js';
+
+describe('API: Endpoints', () => {
+ let p: childProcess.ChildProcess;
+ let alice: any;
+ let bob: any;
+ let carol: any;
+
+ before(async () => {
+ p = await startServer();
+ alice = await signup({ username: 'alice' });
+ bob = await signup({ username: 'bob' });
+ carol = await signup({ username: 'carol' });
+ });
+
+ after(async () => {
+ await shutdownServer(p);
+ });
+
+ describe('signup', () => {
+ it('不正なユーザー名でアカウントが作成できない', async(async () => {
+ const res = await request('/signup', {
+ username: 'test.',
+ password: 'test'
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('空のパスワードでアカウントが作成できない', async(async () => {
+ const res = await request('/signup', {
+ username: 'test',
+ password: ''
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('正しくアカウントが作成できる', async(async () => {
+ const me = {
+ username: 'test1',
+ password: 'test1'
+ };
+
+ const res = await request('/signup', me);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.username, me.username);
+ }));
+
+ it('同じユーザー名のアカウントは作成できない', async(async () => {
+ await signup({
+ username: 'test2'
+ });
+
+ const res = await request('/signup', {
+ username: 'test2',
+ password: 'test2'
+ });
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('signin', () => {
+ it('間違ったパスワードでサインインできない', async(async () => {
+ await signup({
+ username: 'test3',
+ password: 'foo'
+ });
+
+ const res = await request('/signin', {
+ username: 'test3',
+ password: 'bar'
+ });
+
+ assert.strictEqual(res.status, 403);
+ }));
+
+ it('クエリをインジェクションできない', async(async () => {
+ await signup({
+ username: 'test4'
+ });
+
+ const res = await request('/signin', {
+ username: 'test4',
+ password: {
+ $gt: ''
+ }
+ });
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('正しい情報でサインインできる', async(async () => {
+ await signup({
+ username: 'test5',
+ password: 'foo'
+ });
+
+ const res = await request('/signin', {
+ username: 'test5',
+ password: 'foo'
+ });
+
+ assert.strictEqual(res.status, 200);
+ }));
+ });
+
+ describe('i/update', () => {
+ it('アカウント設定を更新できる', async(async () => {
+ const myName = '大室櫻子';
+ const myLocation = '七森中';
+ const myBirthday = '2000-09-07';
+
+ const res = await request('/i/update', {
+ name: myName,
+ location: myLocation,
+ birthday: myBirthday
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, myName);
+ assert.strictEqual(res.body.location, myLocation);
+ assert.strictEqual(res.body.birthday, myBirthday);
+ }));
+
+ it('名前を空白にできない', async(async () => {
+ const res = await request('/i/update', {
+ name: ' '
+ }, alice);
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('誕生日の設定を削除できる', async(async () => {
+ await request('/i/update', {
+ birthday: '2000-09-07'
+ }, alice);
+
+ const res = await request('/i/update', {
+ birthday: null
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.birthday, null);
+ }));
+
+ it('不正な誕生日の形式で怒られる', async(async () => {
+ const res = await request('/i/update', {
+ birthday: '2000/09/07'
+ }, alice);
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('users/show', () => {
+ it('ユーザーが取得できる', async(async () => {
+ const res = await request('/users/show', {
+ userId: alice.id
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.id, alice.id);
+ }));
+
+ it('ユーザーが存在しなかったら怒る', async(async () => {
+ const res = await request('/users/show', {
+ userId: '000000000000000000000000'
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/users/show', {
+ userId: 'kyoppie'
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('notes/show', () => {
+ it('投稿が取得できる', async(async () => {
+ const myPost = await post(alice, {
+ text: 'test'
+ });
+
+ const res = await request('/notes/show', {
+ noteId: myPost.id
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.id, myPost.id);
+ assert.strictEqual(res.body.text, myPost.text);
+ }));
+
+ it('投稿が存在しなかったら怒る', async(async () => {
+ const res = await request('/notes/show', {
+ noteId: '000000000000000000000000'
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/notes/show', {
+ noteId: 'kyoppie'
+ });
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('notes/reactions/create', () => {
+ it('リアクションできる', async(async () => {
+ const bobPost = await post(bob);
+
+ const alice = await signup({ username: 'alice' });
+ const res = await request('/notes/reactions/create', {
+ noteId: bobPost.id,
+ reaction: '🚀',
+ }, alice);
+
+ assert.strictEqual(res.status, 204);
+
+ const resNote = await request('/notes/show', {
+ noteId: bobPost.id,
+ }, alice);
+
+ assert.strictEqual(resNote.status, 200);
+ assert.strictEqual(resNote.body.reactions['🚀'], [alice.id]);
+ }));
+
+ it('自分の投稿にもリアクションできる', async(async () => {
+ const myPost = await post(alice);
+
+ const res = await request('/notes/reactions/create', {
+ noteId: myPost.id,
+ reaction: '🚀',
+ }, alice);
+
+ assert.strictEqual(res.status, 204);
+ }));
+
+ it('二重にリアクションできない', async(async () => {
+ const bobPost = await post(bob);
+
+ await react(alice, bobPost, 'like');
+
+ const res = await request('/notes/reactions/create', {
+ noteId: bobPost.id,
+ reaction: '🚀',
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しない投稿にはリアクションできない', async(async () => {
+ const res = await request('/notes/reactions/create', {
+ noteId: '000000000000000000000000',
+ reaction: '🚀',
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('空のパラメータで怒られる', async(async () => {
+ const res = await request('/notes/reactions/create', {}, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/notes/reactions/create', {
+ noteId: 'kyoppie',
+ reaction: '🚀',
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('following/create', () => {
+ it('フォローできる', async(async () => {
+ const res = await request('/following/create', {
+ userId: alice.id
+ }, bob);
+
+ assert.strictEqual(res.status, 200);
+ }));
+
+ it('既にフォローしている場合は怒る', async(async () => {
+ const res = await request('/following/create', {
+ userId: alice.id
+ }, bob);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しないユーザーはフォローできない', async(async () => {
+ const res = await request('/following/create', {
+ userId: '000000000000000000000000'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('自分自身はフォローできない', async(async () => {
+ const res = await request('/following/create', {
+ userId: alice.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('空のパラメータで怒られる', async(async () => {
+ const res = await request('/following/create', {}, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/following/create', {
+ userId: 'foo'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('following/delete', () => {
+ it('フォロー解除できる', async(async () => {
+ await request('/following/create', {
+ userId: alice.id
+ }, bob);
+
+ const res = await request('/following/delete', {
+ userId: alice.id
+ }, bob);
+
+ assert.strictEqual(res.status, 200);
+ }));
+
+ it('フォローしていない場合は怒る', async(async () => {
+ const res = await request('/following/delete', {
+ userId: alice.id
+ }, bob);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しないユーザーはフォロー解除できない', async(async () => {
+ const res = await request('/following/delete', {
+ userId: '000000000000000000000000'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('自分自身はフォロー解除できない', async(async () => {
+ const res = await request('/following/delete', {
+ userId: alice.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('空のパラメータで怒られる', async(async () => {
+ const res = await request('/following/delete', {}, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/following/delete', {
+ userId: 'kyoppie'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('drive', () => {
+ it('ドライブ情報を取得できる', async(async () => {
+ await uploadFile({
+ userId: alice.id,
+ size: 256
+ });
+ await uploadFile({
+ userId: alice.id,
+ size: 512
+ });
+ await uploadFile({
+ userId: alice.id,
+ size: 1024
+ });
+ const res = await request('/drive', {}, alice);
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ expect(res.body).have.property('usage').eql(1792);
+ }));
+ });
+
+ describe('drive/files/create', () => {
+ it('ファイルを作成できる', async(async () => {
+ const res = await uploadFile(alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, 'Lenna.png');
+ }));
+
+ it('ファイルに名前を付けられる', async(async () => {
+ const res = await assert.request(server)
+ .post('/drive/files/create')
+ .field('i', alice.token)
+ .field('name', 'Belmond.png')
+ .attach('file', fs.readFileSync(__dirname + '/resources/Lenna.png'), 'Lenna.png');
+
+ expect(res).have.status(200);
+ expect(res.body).be.a('object');
+ expect(res.body).have.property('name').eql('Belmond.png');
+ }));
+
+ it('ファイル無しで怒られる', async(async () => {
+ const res = await request('/drive/files/create', {}, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('SVGファイルを作成できる', async(async () => {
+ const res = await uploadFile(alice, __dirname + '/resources/image.svg');
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, 'image.svg');
+ assert.strictEqual(res.body.type, 'image/svg+xml');
+ }));
+ });
+
+ describe('drive/files/update', () => {
+ it('名前を更新できる', async(async () => {
+ const file = await uploadFile(alice);
+ const newName = 'いちごパスタ.png';
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ name: newName
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, newName);
+ }));
+
+ it('他人のファイルは更新できない', async(async () => {
+ const file = await uploadFile(bob);
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ name: 'いちごパスタ.png'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('親フォルダを更新できる', async(async () => {
+ const file = await uploadFile(alice);
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: folder.id
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.folderId, folder.id);
+ }));
+
+ it('親フォルダを無しにできる', async(async () => {
+ const file = await uploadFile(alice);
+
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: folder.id
+ }, alice);
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: null
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.folderId, null);
+ }));
+
+ it('他人のフォルダには入れられない', async(async () => {
+ const file = await uploadFile(alice);
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, bob)).body;
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: folder.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しないフォルダで怒られる', async(async () => {
+ const file = await uploadFile(alice);
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: '000000000000000000000000'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('不正なフォルダIDで怒られる', async(async () => {
+ const file = await uploadFile(alice);
+
+ const res = await request('/drive/files/update', {
+ fileId: file.id,
+ folderId: 'foo'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('ファイルが存在しなかったら怒る', async(async () => {
+ const res = await request('/drive/files/update', {
+ fileId: '000000000000000000000000',
+ name: 'いちごパスタ.png'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('間違ったIDで怒られる', async(async () => {
+ const res = await request('/drive/files/update', {
+ fileId: 'kyoppie',
+ name: 'いちごパスタ.png'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('drive/folders/create', () => {
+ it('フォルダを作成できる', async(async () => {
+ const res = await request('/drive/folders/create', {
+ name: 'test'
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, 'test');
+ }));
+ });
+
+ describe('drive/folders/update', () => {
+ it('名前を更新できる', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ name: 'new name'
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.name, 'new name');
+ }));
+
+ it('他人のフォルダを更新できない', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, bob)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ name: 'new name'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('親フォルダを更新できる', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const parentFolder = (await request('/drive/folders/create', {
+ name: 'parent'
+ }, alice)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: parentFolder.id
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.parentId, parentFolder.id);
+ }));
+
+ it('親フォルダを無しに更新できる', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const parentFolder = (await request('/drive/folders/create', {
+ name: 'parent'
+ }, alice)).body;
+ await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: parentFolder.id
+ }, alice);
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: null
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.parentId, null);
+ }));
+
+ it('他人のフォルダを親フォルダに設定できない', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const parentFolder = (await request('/drive/folders/create', {
+ name: 'parent'
+ }, bob)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: parentFolder.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('フォルダが循環するような構造にできない', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const parentFolder = (await request('/drive/folders/create', {
+ name: 'parent'
+ }, alice)).body;
+ await request('/drive/folders/update', {
+ folderId: parentFolder.id,
+ parentId: folder.id
+ }, alice);
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: parentFolder.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('フォルダが循環するような構造にできない(再帰的)', async(async () => {
+ const folderA = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const folderB = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ const folderC = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+ await request('/drive/folders/update', {
+ folderId: folderB.id,
+ parentId: folderA.id
+ }, alice);
+ await request('/drive/folders/update', {
+ folderId: folderC.id,
+ parentId: folderB.id
+ }, alice);
+
+ const res = await request('/drive/folders/update', {
+ folderId: folderA.id,
+ parentId: folderC.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('フォルダが循環するような構造にできない(自身)', async(async () => {
+ const folderA = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folderA.id,
+ parentId: folderA.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しない親フォルダを設定できない', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: '000000000000000000000000'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('不正な親フォルダIDで怒られる', async(async () => {
+ const folder = (await request('/drive/folders/create', {
+ name: 'test'
+ }, alice)).body;
+
+ const res = await request('/drive/folders/update', {
+ folderId: folder.id,
+ parentId: 'foo'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しないフォルダを更新できない', async(async () => {
+ const res = await request('/drive/folders/update', {
+ folderId: '000000000000000000000000'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('不正なフォルダIDで怒られる', async(async () => {
+ const res = await request('/drive/folders/update', {
+ folderId: 'foo'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('messaging/messages/create', () => {
+ it('メッセージを送信できる', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: bob.id,
+ text: 'test'
+ }, alice);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(typeof res.body === 'object' && !Array.isArray(res.body), true);
+ assert.strictEqual(res.body.text, 'test');
+ }));
+
+ it('自分自身にはメッセージを送信できない', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: alice.id,
+ text: 'Yo'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('存在しないユーザーにはメッセージを送信できない', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: '000000000000000000000000',
+ text: 'test'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('不正なユーザーIDで怒られる', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: 'foo',
+ text: 'test'
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('テキストが無くて怒られる', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: bob.id
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+
+ it('文字数オーバーで怒られる', async(async () => {
+ const res = await request('/messaging/messages/create', {
+ userId: bob.id,
+ text: '!'.repeat(1001)
+ }, alice);
+
+ assert.strictEqual(res.status, 400);
+ }));
+ });
+
+ describe('notes/replies', () => {
+ it('自分に閲覧権限のない投稿は含まれない', async(async () => {
+ const alicePost = await post(alice, {
+ text: 'foo'
+ });
+
+ await post(bob, {
+ replyId: alicePost.id,
+ text: 'bar',
+ visibility: 'specified',
+ visibleUserIds: [alice.id]
+ });
+
+ const res = await request('/notes/replies', {
+ noteId: alicePost.id
+ }, carol);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(Array.isArray(res.body), true);
+ assert.strictEqual(res.body.length, 0);
+ }));
+ });
+
+ describe('notes/timeline', () => {
+ it('フォロワー限定投稿が含まれる', async(async () => {
+ await request('/following/create', {
+ userId: alice.id
+ }, bob);
+
+ const alicePost = await post(alice, {
+ text: 'foo',
+ visibility: 'followers'
+ });
+
+ const res = await request('/notes/timeline', {}, bob);
+
+ assert.strictEqual(res.status, 200);
+ assert.strictEqual(Array.isArray(res.body), true);
+ assert.strictEqual(res.body.length, 1);
+ assert.strictEqual(res.body[0].id, alicePost.id);
+ }));
+ });
+});
+*/
diff --git a/packages/backend/test/extract-mentions.ts b/packages/backend/test/extract-mentions.ts
index 9e6d041906..9bfbc4192a 100644
--- a/packages/backend/test/extract-mentions.ts
+++ b/packages/backend/test/extract-mentions.ts
@@ -1,6 +1,6 @@
import * as assert from 'assert';
-import { extractMentions } from '../src/misc/extract-mentions';
+import { extractMentions } from '../src/misc/extract-mentions.js';
import { parse } from 'mfm-js';
describe('Extract mentions', () => {
diff --git a/packages/backend/test/fetch-resource.ts b/packages/backend/test/fetch-resource.ts
index c403f4d395..4cb4b42562 100644
--- a/packages/backend/test/fetch-resource.ts
+++ b/packages/backend/test/fetch-resource.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, startServer, signup, post, request, simpleGet, port, shutdownServer } from './utils';
+import { async, startServer, signup, post, request, simpleGet, port, shutdownServer } from './utils.js';
import * as openapi from '@redocly/openapi-core';
// Request Accept
diff --git a/packages/backend/test/ff-visibility.ts b/packages/backend/test/ff-visibility.ts
index 295ab19335..4f6847be6d 100644
--- a/packages/backend/test/ff-visibility.ts
+++ b/packages/backend/test/ff-visibility.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, react, connectStream, startServer, shutdownServer, simpleGet } from './utils';
+import { async, signup, request, post, react, connectStream, startServer, shutdownServer, simpleGet } from './utils.js';
describe('FF visibility', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/get-file-info.ts b/packages/backend/test/get-file-info.ts
index a0146bd815..20061b8708 100644
--- a/packages/backend/test/get-file-info.ts
+++ b/packages/backend/test/get-file-info.ts
@@ -1,6 +1,6 @@
import * as assert from 'assert';
-import { async } from './utils';
-import { getFileInfo } from '../src/misc/get-file-info';
+import { async } from './utils.js';
+import { getFileInfo } from '../src/misc/get-file-info.js';
describe('Get file info', () => {
it('Empty file', async (async () => {
diff --git a/packages/backend/test/loader.js b/packages/backend/test/loader.js
new file mode 100644
index 0000000000..016f32f1a8
--- /dev/null
+++ b/packages/backend/test/loader.js
@@ -0,0 +1,37 @@
+import path from 'path'
+import typescript from 'typescript'
+import { createMatchPath } from 'tsconfig-paths'
+import { resolve as BaseResolve, getFormat, transformSource } from 'ts-node/esm'
+
+const { readConfigFile, parseJsonConfigFileContent, sys } = typescript
+
+const __dirname = path.dirname(new URL(import.meta.url).pathname)
+
+const configFile = readConfigFile('./test/tsconfig.json', sys.readFile)
+if (typeof configFile.error !== 'undefined') {
+ throw new Error(`Failed to load tsconfig: ${configFile.error}`)
+}
+
+const { options } = parseJsonConfigFileContent(
+ configFile.config,
+ {
+ fileExists: sys.fileExists,
+ readFile: sys.readFile,
+ readDirectory: sys.readDirectory,
+ useCaseSensitiveFileNames: true,
+ },
+ __dirname
+)
+
+export { getFormat, transformSource } // こいつらはそのまま使ってほしいので re-export する
+
+const matchPath = createMatchPath(options.baseUrl, options.paths)
+
+export async function resolve(specifier, context, defaultResolve) {
+ const matchedSpecifier = matchPath(specifier.replace('.js', '.ts'))
+ return BaseResolve( // ts-node/esm の resolve に tsconfig-paths で解決したパスを渡す
+ matchedSpecifier ? `${matchedSpecifier}.ts` : specifier,
+ context,
+ defaultResolve
+ )
+}
diff --git a/packages/backend/test/mfm.ts b/packages/backend/test/mfm.ts
index ecf886ad6c..5218942a5a 100644
--- a/packages/backend/test/mfm.ts
+++ b/packages/backend/test/mfm.ts
@@ -1,8 +1,8 @@
import * as assert from 'assert';
import * as mfm from 'mfm-js';
-import { toHtml } from '../src/mfm/to-html';
-import { fromHtml } from '../src/mfm/from-html';
+import { toHtml } from '../src/mfm/to-html.js';
+import { fromHtml } from '../src/mfm/from-html.js';
describe('toHtml', () => {
it('br', () => {
diff --git a/packages/backend/test/misc/mock-resolver.ts b/packages/backend/test/misc/mock-resolver.ts
index c245c83bac..5a46daf49f 100644
--- a/packages/backend/test/misc/mock-resolver.ts
+++ b/packages/backend/test/misc/mock-resolver.ts
@@ -1,5 +1,5 @@
-import Resolver from '../../src/remote/activitypub/resolver';
-import { IObject } from '../../src/remote/activitypub/type';
+import Resolver from '../../src/remote/activitypub/resolver.js';
+import { IObject } from '../../src/remote/activitypub/type.js';
type MockResponse = {
type: string;
diff --git a/packages/backend/test/mute.ts b/packages/backend/test/mute.ts
index ecac310758..288e8a8055 100644
--- a/packages/backend/test/mute.ts
+++ b/packages/backend/test/mute.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, react, connectStream, startServer, shutdownServer } from './utils';
+import { async, signup, request, post, react, connectStream, startServer, shutdownServer } from './utils.js';
describe('Mute', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/note.ts b/packages/backend/test/note.ts
index ab8b6b1903..62cea5208b 100644
--- a/packages/backend/test/note.ts
+++ b/packages/backend/test/note.ts
@@ -2,8 +2,8 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, uploadFile, startServer, shutdownServer, initTestDb } from './utils';
-import { Note } from '../src/models/entities/note';
+import { async, signup, request, post, uploadFile, startServer, shutdownServer, initTestDb } from './utils.js';
+import { Note } from '../src/models/entities/note.js';
describe('Note', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/prelude/maybe.ts b/packages/backend/test/prelude/maybe.ts
index 2687a739a0..0f4b00065f 100644
--- a/packages/backend/test/prelude/maybe.ts
+++ b/packages/backend/test/prelude/maybe.ts
@@ -1,5 +1,5 @@
import * as assert from 'assert';
-import { just, nothing } from '../../src/prelude/maybe';
+import { just, nothing } from '../../src/prelude/maybe.js';
describe('just', () => {
it('has a value', () => {
diff --git a/packages/backend/test/prelude/url.ts b/packages/backend/test/prelude/url.ts
index 1f814968a6..84e43d26c2 100644
--- a/packages/backend/test/prelude/url.ts
+++ b/packages/backend/test/prelude/url.ts
@@ -1,5 +1,5 @@
import * as assert from 'assert';
-import { query } from '../../src/prelude/url';
+import { query } from '../../src/prelude/url.js';
describe('url', () => {
it('query', () => {
diff --git a/packages/backend/test/reaction-lib.ts b/packages/backend/test/reaction-lib.ts
index 59c07de001..7c61dc76c2 100644
--- a/packages/backend/test/reaction-lib.ts
+++ b/packages/backend/test/reaction-lib.ts
@@ -1,7 +1,7 @@
/*
import * as assert from 'assert';
-import { toDbReaction } from '../src/misc/reaction-lib';
+import { toDbReaction } from '../src/misc/reaction-lib.js';
describe('toDbReaction', async () => {
it('既存の文字列リアクションはそのまま', async () => {
diff --git a/packages/backend/test/streaming.ts b/packages/backend/test/streaming.ts
index e4b651aa9f..8d22b6d3d3 100644
--- a/packages/backend/test/streaming.ts
+++ b/packages/backend/test/streaming.ts
@@ -2,8 +2,8 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { connectStream, signup, request, post, startServer, shutdownServer, initTestDb } from './utils';
-import { Following } from '../src/models/entities/following';
+import { connectStream, signup, request, post, startServer, shutdownServer, initTestDb } from './utils.js';
+import { Following } from '../src/models/entities/following.js';
describe('Streaming', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/thread-mute.ts b/packages/backend/test/thread-mute.ts
index 95601cd903..cd3e519394 100644
--- a/packages/backend/test/thread-mute.ts
+++ b/packages/backend/test/thread-mute.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, react, connectStream, startServer, shutdownServer } from './utils';
+import { async, signup, request, post, react, connectStream, startServer, shutdownServer } from './utils.js';
describe('Note thread mute', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/tsconfig.json b/packages/backend/test/tsconfig.json
index 9f9e724ea2..3f9020d467 100644
--- a/packages/backend/test/tsconfig.json
+++ b/packages/backend/test/tsconfig.json
@@ -10,7 +10,7 @@
"declaration": false,
"sourceMap": true,
"target": "es2017",
- "module": "commonjs",
+ "module": "es2020",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"removeComments": false,
diff --git a/packages/backend/test/user-notes.ts b/packages/backend/test/user-notes.ts
index c90c07d75f..25ffe04756 100644
--- a/packages/backend/test/user-notes.ts
+++ b/packages/backend/test/user-notes.ts
@@ -2,7 +2,7 @@ process.env.NODE_ENV = 'test';
import * as assert from 'assert';
import * as childProcess from 'child_process';
-import { async, signup, request, post, uploadFile, startServer, shutdownServer } from './utils';
+import { async, signup, request, post, uploadFile, startServer, shutdownServer } from './utils.js';
describe('users/notes', () => {
let p: childProcess.ChildProcess;
diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts
index b7f6cfbdac..994c098b7b 100644
--- a/packages/backend/test/utils.ts
+++ b/packages/backend/test/utils.ts
@@ -1,14 +1,14 @@
-import * as fs from 'fs';
+import * as fs from 'node:fs';
import * as WebSocket from 'ws';
import * as misskey from 'misskey-js';
import fetch from 'node-fetch';
-const FormData = require('form-data');
+import FormData from 'form-data';
import * as childProcess from 'child_process';
import * as http from 'http';
-import loadConfig from '../src/config/load';
+import loadConfig from '../src/config/load.js';
import { SIGKILL } from 'constants';
import { createConnection, getConnection } from 'typeorm';
-import { entities } from '../src/db/postgre';
+import { entities } from '../src/db/postgre.js';
const config = loadConfig();
export const port = config.port;
diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json
index 3311e117de..3120851aae 100644
--- a/packages/backend/tsconfig.json
+++ b/packages/backend/tsconfig.json
@@ -10,7 +10,7 @@
"declaration": false,
"sourceMap": false,
"target": "es2017",
- "module": "commonjs",
+ "module": "es2020",
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"removeComments": false,
@@ -30,7 +30,7 @@
"outDir": "./built",
"typeRoots": [
"./node_modules/@types",
- "./@types"
+ "./src/@types"
],
"lib": [
"esnext"
diff --git a/packages/backend/yarn.lock b/packages/backend/yarn.lock
index 99e2e2306e..fea3b2e010 100644
--- a/packages/backend/yarn.lock
+++ b/packages/backend/yarn.lock
@@ -82,14 +82,14 @@
pump "^3.0.0"
secure-json-parse "^2.1.0"
-"@eslint/eslintrc@^1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318"
- integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==
+"@eslint/eslintrc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.1.0.tgz#583d12dbec5d4f22f333f9669f7d0b7c7815b4d3"
+ integrity sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.2.0"
+ espree "^9.3.1"
globals "^13.9.0"
ignore "^4.0.6"
import-fresh "^3.2.1"
@@ -128,10 +128,10 @@
resolved "https://registry.yarnpkg.com/@koa/multer/-/multer-3.0.0.tgz#439777949f28097d7b329c0b4ce3048074c862f8"
integrity sha512-y+OQBmex5D1jIl723gAEUYcAWPEicIXppaAKw/zCMfpllQ08ZNweDPwoCLxEoatqd5pCu2XG6V8dl67JRq3RJw==
-"@koa/router@9.0.1":
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/@koa/router/-/router-9.0.1.tgz#4090a14223ea7e78aa13b632761209cba69acd95"
- integrity sha512-OI+OU49CJV4px0WkIMmayBeqVXB/JS1ZMq7UoGlTZt6Y7ijK7kdeQ18+SEHHJPytmtI1y6Hf8XLrpxva3mhv5Q==
+"@koa/router@10.1.1":
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/@koa/router/-/router-10.1.1.tgz#8e5a85c9b243e0bc776802c0de564561e57a5f78"
+ integrity sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw==
dependencies:
debug "^4.1.1"
http-errors "^1.7.3"
@@ -216,10 +216,10 @@
require-from-string "^2.0.2"
uri-js "^4.2.2"
-"@redocly/openapi-core@1.0.0-beta.79":
- version "1.0.0-beta.79"
- resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.79.tgz#7512b3507ab99dc78226f9069669c5302abb0969"
- integrity sha512-do79vGt3iiHsaVG9LKY8dH+d1E7TLHr+3T+CQ1lqagtWVjYOxqGaoxAT8tRD7R1W0z8BmS4e2poNON6c1sxP5g==
+"@redocly/openapi-core@1.0.0-beta.83":
+ version "1.0.0-beta.83"
+ resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.83.tgz#df1324cc6f1874ecf3046e503192cf872f134a2f"
+ integrity sha512-XwlxMAmNEQeyBfODXVg2iBpSUqzCwT2zI+7o5iKxjUwJ+5ZugNOYjZGGM3Q9rJGqzFVwLKdElM5a1MlhPvlu4Q==
dependencies:
"@redocly/ajv" "^8.6.4"
"@types/node" "^14.11.8"
@@ -238,9 +238,9 @@
integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ==
"@sindresorhus/is@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4"
- integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185"
+ integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==
"@sinonjs/commons@^1.7.0":
version "1.7.2"
@@ -249,10 +249,10 @@
dependencies:
type-detect "4.0.8"
-"@sinonjs/fake-timers@7.1.2":
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5"
- integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==
+"@sinonjs/fake-timers@9.1.0":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.0.tgz#8c92c56f195e0bed4c893ba59c8e3d55831ca0df"
+ integrity sha512-M8vapsv9qQupMdzrVzkn5rb9jG7aUTEPAZdMtME2PuBaefksFZVE2C1g4LBRTkF/k3nRDNbDc5tp5NFC1PEYxA==
dependencies:
"@sinonjs/commons" "^1.7.0"
@@ -289,6 +289,11 @@
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
"@tsconfig/node10@^1.0.7":
version "1.0.7"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606"
@@ -316,11 +321,6 @@
dependencies:
"@types/node" "*"
-"@types/anymatch@*":
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
- integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
-
"@types/bcryptjs@2.4.2":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae"
@@ -334,10 +334,10 @@
"@types/connect" "*"
"@types/node" "*"
-"@types/bull@3.15.7":
- version "3.15.7"
- resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.7.tgz#a9d7fb332cc02dc021d0eb234b9604b356e9e6de"
- integrity sha512-7NC7XN5NoS0A+leJ/dR69ZfKaegOlCZaii/xGgKnCyh1UYisRncibImb7VMwrc3OdJcbDJt6+4om70TeNl3J7g==
+"@types/bull@3.15.8":
+ version "3.15.8"
+ resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.8.tgz#ae2139f94490d740b37c8da5d828ce75dd82ce7c"
+ integrity sha512-8DbSPMSsZH5PWPnGEkAZLYgJEH4ghHJNKF7LB6Wr5R0/v6g+Vs+JoaA7kcvLtHE936xg2WpFPkaoaJgExOmKDw==
dependencies:
"@types/ioredis" "*"
"@types/redis" "^2.8.0"
@@ -386,11 +386,6 @@
"@types/keygrip" "*"
"@types/node" "*"
-"@types/dateformat@3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc"
- integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g==
-
"@types/disposable-email-domains@^1.0.1":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/disposable-email-domains/-/disposable-email-domains-1.0.2.tgz#0280f6b38fa7f14e54b056a434135ecd254483b1"
@@ -401,27 +396,6 @@
resolved "https://registry.yarnpkg.com/@types/escape-regexp/-/escape-regexp-0.0.1.tgz#f1a977ccdf2ef059e9862bd3af5e92cbbe723e0e"
integrity sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw==
-"@types/eslint-scope@^3.7.0":
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
- integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==
- dependencies:
- "@types/eslint" "*"
- "@types/estree" "*"
-
-"@types/eslint@*":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.0.tgz#eb5c5b575237334df24c53195e37b53d66478d7b"
- integrity sha512-LpUXkr7fnmPXWGxB0ZuLEzNeTURuHPavkC5zuU4sg62/TgL5ZEjamr5Y8b6AftwHtx2bPJasI+CL0TT2JwQ7aA==
- dependencies:
- "@types/estree" "*"
- "@types/json-schema" "*"
-
-"@types/estree@*", "@types/estree@^0.0.46":
- version "0.0.46"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe"
- integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==
-
"@types/express-serve-static-core@*":
version "4.17.5"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.5.tgz#a00ac7dadd746ae82477443e4d480a6a93ea083c"
@@ -447,14 +421,6 @@
dependencies:
"@types/node" "*"
-"@types/glob@7.2.0":
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
- integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
- dependencies:
- "@types/minimatch" "*"
- "@types/node" "*"
-
"@types/http-assert@*":
version "1.5.1"
resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b"
@@ -496,11 +462,6 @@
"@types/parse5" "*"
"@types/tough-cookie" "*"
-"@types/json-schema@*":
- version "7.0.5"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
- integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
-
"@types/json-schema@^7.0.6":
version "7.0.6"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0"
@@ -643,15 +604,10 @@
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
-"@types/minimatch@*":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
- integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-
-"@types/mocha@8.2.3":
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323"
- integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==
+"@types/mocha@9.1.0":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5"
+ integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==
"@types/node-fetch@3.0.3":
version "3.0.3"
@@ -665,10 +621,10 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50"
integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==
-"@types/node@17.0.10":
- version "17.0.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab"
- integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog==
+"@types/node@17.0.19":
+ version "17.0.19"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.19.tgz#726171367f404bfbe8512ba608a09ebad810c7e6"
+ integrity sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==
"@types/node@^14.11.8":
version "14.17.9"
@@ -770,13 +726,6 @@
resolved "https://registry.yarnpkg.com/@types/rename/-/rename-1.0.4.tgz#30c6f0306042591a560361ea02639e89647dd173"
integrity sha512-eV81+6bVv2mdCBahkMefjEUwAjKDAP3AuyhqWCWRxcRaeVdUeHUBaoq2zSz+5HNHF2jzTajMcfLvJsy4K3cbwA==
-"@types/request-stats@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/request-stats/-/request-stats-3.0.0.tgz#d3909a9f778b8ae0b42fb8c1ed20cb936ed95f99"
- integrity sha512-POsDF7nETH8up49iBNvbZuO0pEk9F+TG0rXCkvjxCClcOS99xfF+mKmJteYlwKYpuRKkixzysKlL8rwN1hU2lw==
- dependencies:
- "@types/node" "*"
-
"@types/responselike@*", "@types/responselike@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
@@ -791,10 +740,10 @@
dependencies:
htmlparser2 "^6.0.0"
-"@types/seedrandom@2.4.28":
- version "2.4.28"
- resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f"
- integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA==
+"@types/seedrandom@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4"
+ integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==
"@types/serve-static@*":
version "1.13.3"
@@ -811,15 +760,10 @@
dependencies:
"@types/node" "*"
-"@types/sinonjs__fake-timers@6.0.4":
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d"
- integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A==
-
-"@types/source-list-map@*":
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
- integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+"@types/sinonjs__fake-timers@8.1.1":
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3"
+ integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==
"@types/speakeasy@2.0.7":
version "2.0.7"
@@ -828,11 +772,6 @@
dependencies:
"@types/node" "*"
-"@types/tapable@^1":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.7.tgz#545158342f949e8fd3bfd813224971ecddc3fac4"
- integrity sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ==
-
"@types/throttle-debounce@2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz#1c3df624bfc4b62f992d3012b84c56d41eab3776"
@@ -853,13 +792,6 @@
resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d"
integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==
-"@types/uglify-js@*":
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87"
- integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw==
- dependencies:
- source-map "^0.6.1"
-
"@types/uuid@8.3.4":
version "8.3.4"
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
@@ -872,55 +804,17 @@
dependencies:
"@types/node" "*"
-"@types/webpack-sources@*":
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141"
- integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==
- dependencies:
- "@types/node" "*"
- "@types/source-list-map" "*"
- source-map "^0.6.1"
-
-"@types/webpack-stream@3.2.12":
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/@types/webpack-stream/-/webpack-stream-3.2.12.tgz#cf13e64067a662a7acd8cd0524b3f64c86b0ecb6"
- integrity sha512-znMUl4kKT0V0SwkUgRgwUNSAO7J5I/jdTCBNy3utkCsgMJ3IHp4FBTDwsQC+tfQ73TWeKIH05QNmbUYmeGThGw==
- dependencies:
- "@types/node" "*"
- "@types/webpack" "^4"
-
-"@types/webpack@5.28.0":
- version "5.28.0"
- resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.0.tgz#78dde06212f038d77e54116cfe69e88ae9ed2c03"
- integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==
- dependencies:
- "@types/node" "*"
- tapable "^2.2.0"
- webpack "^5"
-
-"@types/webpack@^4":
- version "4.41.27"
- resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.27.tgz#f47da488c8037e7f1b2dbf2714fbbacb61ec0ffc"
- integrity sha512-wK/oi5gcHi72VMTbOaQ70VcDxSQ1uX8S2tukBK9ARuGXrYM/+u4ou73roc7trXDNmCxCoerE8zruQqX/wuHszA==
- dependencies:
- "@types/anymatch" "*"
- "@types/node" "*"
- "@types/tapable" "^1"
- "@types/uglify-js" "*"
- "@types/webpack-sources" "*"
- source-map "^0.6.0"
-
-"@types/websocket@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8"
- integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==
+"@types/websocket@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c"
+ integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==
dependencies:
"@types/node" "*"
-"@types/ws@8.2.2":
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21"
- integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==
+"@types/ws@8.2.3":
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.3.tgz#0bca6b03ba2f41e0fab782d4a573fe284aa907ae"
+ integrity sha512-ahRJZquUYCdOZf/rCsWg88S0/+cb9wazUBHv6HZEe3XdYaBe2zr/slM8J28X07Hn88Pnm4ezo7N8/ofnOgrPVQ==
dependencies:
"@types/node" "*"
@@ -929,14 +823,14 @@
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71"
integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg==
-"@typescript-eslint/eslint-plugin@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a"
- integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==
+"@typescript-eslint/eslint-plugin@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz#b2cd3e288f250ce8332d5035a2ff65aba3374ac4"
+ integrity sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==
dependencies:
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/type-utils" "5.10.0"
- "@typescript-eslint/utils" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/type-utils" "5.12.1"
+ "@typescript-eslint/utils" "5.12.1"
debug "^4.3.2"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
@@ -944,69 +838,69 @@
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/parser@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c"
- integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==
+"@typescript-eslint/parser@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.12.1.tgz#b090289b553b8aa0899740d799d0f96e6f49771b"
+ integrity sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==
dependencies:
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/typescript-estree" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/typescript-estree" "5.12.1"
debug "^4.3.2"
-"@typescript-eslint/scope-manager@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb"
- integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==
+"@typescript-eslint/scope-manager@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz#58734fd45d2d1dec49641aacc075fba5f0968817"
+ integrity sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==
dependencies:
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/visitor-keys" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/visitor-keys" "5.12.1"
-"@typescript-eslint/type-utils@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5"
- integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==
+"@typescript-eslint/type-utils@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz#8d58c6a0bb176b5e9a91581cda1a7f91a114d3f0"
+ integrity sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==
dependencies:
- "@typescript-eslint/utils" "5.10.0"
+ "@typescript-eslint/utils" "5.12.1"
debug "^4.3.2"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c"
- integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==
+"@typescript-eslint/types@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.12.1.tgz#46a36a28ff4d946821b58fe5a73c81dc2e12aa89"
+ integrity sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==
-"@typescript-eslint/typescript-estree@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224"
- integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==
+"@typescript-eslint/typescript-estree@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz#6a9425b9c305bcbc38e2d1d9a24c08e15e02b722"
+ integrity sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==
dependencies:
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/visitor-keys" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/visitor-keys" "5.12.1"
debug "^4.3.2"
globby "^11.0.4"
is-glob "^4.0.3"
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65"
- integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==
+"@typescript-eslint/utils@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.12.1.tgz#447c24a05d9c33f9c6c64cb48f251f2371eef920"
+ integrity sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==
dependencies:
"@types/json-schema" "^7.0.9"
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/typescript-estree" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/typescript-estree" "5.12.1"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
-"@typescript-eslint/visitor-keys@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281"
- integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==
+"@typescript-eslint/visitor-keys@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz#f722da106c8f9695ae5640574225e45af3e52ec3"
+ integrity sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==
dependencies:
- "@typescript-eslint/types" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
eslint-visitor-keys "^3.0.0"
"@ungap/promise-all-settled@1.1.2":
@@ -1014,137 +908,6 @@
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
-"@webassemblyjs/ast@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f"
- integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
-
-"@webassemblyjs/floating-point-hex-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c"
- integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==
-
-"@webassemblyjs/helper-api-error@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4"
- integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==
-
-"@webassemblyjs/helper-buffer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642"
- integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==
-
-"@webassemblyjs/helper-numbers@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9"
- integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-wasm-bytecode@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1"
- integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==
-
-"@webassemblyjs/helper-wasm-section@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b"
- integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
-
-"@webassemblyjs/ieee754@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf"
- integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b"
- integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf"
- integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==
-
-"@webassemblyjs/wasm-edit@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78"
- integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/helper-wasm-section" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-opt" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- "@webassemblyjs/wast-printer" "1.11.0"
-
-"@webassemblyjs/wasm-gen@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe"
- integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wasm-opt@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978"
- integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
-
-"@webassemblyjs/wasm-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754"
- integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wast-printer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e"
- integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@xtuc/long" "4.2.2"
-
-"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
abab@^2.0.3, abab@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
@@ -1198,22 +961,12 @@ acorn@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.0.4:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe"
- integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==
-
-acorn@^8.2.4:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0"
- integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==
-
acorn@^8.4.1:
version "8.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
-acorn@^8.7.0:
+acorn@^8.5.0, acorn@^8.7.0:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
@@ -1247,6 +1000,16 @@ ajv-keywords@^3.5.2:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+ajv@8.10.0:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d"
+ integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.5"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da"
@@ -1476,10 +1239,10 @@ autwh@0.1.0:
dependencies:
oauth "0.9.15"
-aws-sdk@2.1061.0:
- version "2.1061.0"
- resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1061.0.tgz#79c75e6856e5a59e0857d0d066a8ff5ff5e0d752"
- integrity sha512-T29yV+EPo4Fis9hAArxAXS/u6utKnlBq3DEu85LTSIA8i6e6Xg7e9u7Rveo8DmrlVrf7EGCNThaeF9WERHnwLg==
+aws-sdk@2.1079.0:
+ version "2.1079.0"
+ resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1079.0.tgz#41ede54aa4ba5ce77d4ffe202f9a1ee7869da2a8"
+ integrity sha512-WHYWiye9f2XYQ33Rj/uVw4VF/Qq/xrB9NDnGlRhgK8Ga7T20+8/iZD5/Z8wICVNZTsfUZ3g6LfkeZ1l+LZhHKw==
dependencies:
buffer "4.9.2"
events "1.1.1"
@@ -1584,10 +1347,10 @@ bluebird@~3.4.1:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3"
integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=
-blurhash@1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.4.tgz#a7010ceb3019cd2c9809b17c910ebf6175d29244"
- integrity sha512-MXIPz6zwYUKayju+Uidf83KhH0vodZfeRl6Ich8Gu+KGl0JgKiFq9LsfqV7cVU5fKD/AotmduZqvOfrGKOfTaA==
+blurhash@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.5.tgz#3034104cd5dce5a3e5caa871ae2f0f1f2d0ab566"
+ integrity sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==
bn.js@^4.0.0:
version "4.11.8"
@@ -1614,10 +1377,10 @@ braces@^3.0.1, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-broadcast-channel@4.9.0:
- version "4.9.0"
- resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-4.9.0.tgz#8af337d4ea19aeb6b819ec2eb3dda942b28c724c"
- integrity sha512-xWzFb3wrOZGJF2kOSs2D3KvHXdLDMVb+WypEIoNvwblcHgUBydVy65pDJ9RS4WN9Kyvs0UVQuCCzfKme0G6Qjw==
+broadcast-channel@4.10.0:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-4.10.0.tgz#d19fb902df227df40b1b580351713d30c302d198"
+ integrity sha512-hOUh312XyHk6JTVyX9cyXaH1UYs+2gHVtnW16oQAu9FL7ALcXGXc/YoJWqlkV8vUn14URQPMmRi4A9q4UrwVEQ==
dependencies:
"@babel/runtime" "^7.16.0"
detect-node "^2.1.0"
@@ -1638,17 +1401,6 @@ browser-stdout@1.3.1:
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
-browserslist@^4.14.5:
- version "4.16.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
- integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
- dependencies:
- caniuse-lite "^1.0.30001181"
- colorette "^1.2.1"
- electron-to-chromium "^1.3.649"
- escalade "^3.1.1"
- node-releases "^1.1.70"
-
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -1711,16 +1463,17 @@ bufferutil@^4.0.1:
dependencies:
node-gyp-build "~3.7.0"
-bull@4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/bull/-/bull-4.2.1.tgz#c5a7e1496c7903274ce90192e4e5cb18f6c866c0"
- integrity sha512-YkCQZMOub++siHw3SbYYXZ5xGEn6Tt3BPoCVq/irPNCxUqUYzta8yDlXyyAsfMKMVj0M7PcnynUabfMf9PFpOA==
+bull@4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/bull/-/bull-4.6.2.tgz#fdde3b13245cff79571d85c4702884dfbf419b27"
+ integrity sha512-RA6wnL+rZ2GRHMhz+UxFEn7hlLBpxPEiW4A0UY3YwWnheRA55AT4MC0PknxqO1K55pGFKSh/GpHQaj8flJMm+w==
dependencies:
- cron-parser "^2.13.0"
+ cron-parser "^4.2.1"
debuglog "^1.0.0"
get-port "^5.1.1"
- ioredis "^4.27.0"
+ ioredis "^4.28.5"
lodash "^4.17.21"
+ msgpackr "^1.5.2"
p-timeout "^3.2.0"
semver "^7.3.2"
uuid "^8.3.0"
@@ -1821,11 +1574,6 @@ camelcase@^6.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
-caniuse-lite@^1.0.30001181:
- version "1.0.30001191"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001191.tgz#bacb432b6701f690c8c5f7c680166b9a9f0843d9"
- integrity sha512-xJJqzyd+7GCJXkcoBiQ1GuxEiOBCLQ0aVW9HMekifZsAVGdj5eJ4mFB9fEhSHipq9IOk/QXFJUiIr9lZT+EsGw==
-
canonicalize@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/canonicalize/-/canonicalize-1.0.1.tgz#657b4f3fa38a6ecb97a9e5b7b26d7a19cc6e0da9"
@@ -1853,6 +1601,13 @@ chainsaw@~0.1.0:
dependencies:
traverse ">=0.3.0 <0.4"
+chalk-template@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.3.1.tgz#9511cd31ec3c4911448410d49645526c1c7a3a22"
+ integrity sha512-sbWkBbb9Tfo81aTtQrfP9eBSVCTL8biVvZ0tA1rH9xqVrKoV2T9Y6Bp94wB+DRXtSGl/UXsgV83Np5hLhNRXww==
+ dependencies:
+ chalk "^4.1.2"
+
chalk@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
@@ -1861,13 +1616,10 @@ chalk@4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
+chalk@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.0.tgz#bd96c6bb8e02b96e08c0c3ee2a9d90e050c7b832"
+ integrity sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==
chalk@^2.4.2:
version "2.4.2"
@@ -1886,6 +1638,14 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
char-regex@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
@@ -1920,7 +1680,7 @@ cheerio@0.22.0:
lodash.reject "^4.4.0"
lodash.some "^4.4.0"
-chokidar@3.5.1, chokidar@^3.3.1, chokidar@^3.5.2:
+chokidar@3.5.3, chokidar@^3.3.1, chokidar@^3.5.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
@@ -1945,13 +1705,6 @@ chownr@^2.0.0:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-chrome-trace-event@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
- integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
- dependencies:
- tslib "^1.9.0"
-
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -2029,6 +1782,13 @@ code-point-at@^1.0.0:
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+color-convert@2.0.1, color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -2036,13 +1796,6 @@ color-convert@^1.9.0:
dependencies:
color-name "1.1.3"
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
@@ -2053,10 +1806,10 @@ color-name@^1.0.0, color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-color-string@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
- integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
+color-string@^1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa"
+ integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
@@ -2066,15 +1819,15 @@ color-support@^1.1.2:
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-color@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67"
- integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==
+color@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/color/-/color-4.2.0.tgz#0c782459a3e98838ea01e4bc0fb43310ca35af78"
+ integrity sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ==
dependencies:
color-convert "^2.0.1"
- color-string "^1.6.0"
+ color-string "^1.9.0"
-colorette@^1.2.0, colorette@^1.2.1:
+colorette@^1.2.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
@@ -2086,7 +1839,7 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
-commander@^2.19.0, commander@^2.20.0:
+commander@^2.19.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -2195,7 +1948,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-crc-32@1.2.0, crc-32@^1.2.0:
+crc-32@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
@@ -2216,13 +1969,12 @@ create-require@^1.1.0:
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-cron-parser@^2.13.0:
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.13.0.tgz#6f930bb6f2931790d2a9eec83b3ec276e27a6725"
- integrity sha512-UWeIpnRb0eyoWPVk+pD3TDpNx3KCFQeezO224oJIkktBrcW6RoAPOx5zIKprZGfk6vcYSmA8yQXItejSaDBhbQ==
+cron-parser@^4.2.1:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.2.1.tgz#b43205d05ccd5c93b097dae64f3bd811f5993af3"
+ integrity sha512-5sJBwDYyCp+0vU5b7POl8zLWfgV5fOHxlc45FWoWdHecGC7MQHCjx0CHivCMRnGFovghKhhyYM+Zm9DcY5qcHg==
dependencies:
- is-nan "^1.2.1"
- moment-timezone "^0.5.25"
+ luxon "^1.28.0"
cross-env@7.0.3:
version "7.0.3"
@@ -2255,10 +2007,10 @@ css-what@2.1:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
-cssom@^0.4.4:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
- integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+cssom@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
+ integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
cssom@~0.3.6:
version "0.3.8"
@@ -2297,19 +2049,19 @@ data-uri-to-buffer@^4.0.0:
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b"
integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==
-data-urls@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
- integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+data-urls@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.1.tgz#597fc2ae30f8bc4dbcf731fcd1b1954353afc6f8"
+ integrity sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==
dependencies:
abab "^2.0.3"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^8.0.0"
+ whatwg-mimetype "^3.0.0"
+ whatwg-url "^10.0.0"
-dateformat@4.5.1:
- version "4.5.1"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c"
- integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==
+date-fns@2.28.0:
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
+ integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==
debug@2, debug@^2.2.0, debug@^2.5.2, debug@^2.6.9:
version "2.6.9"
@@ -2318,7 +2070,7 @@ debug@2, debug@^2.2.0, debug@^2.5.2, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@4.3.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
@@ -2368,10 +2120,10 @@ decamelize@^4.0.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
-decimal.js@^10.2.1:
- version "10.2.1"
- resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3"
- integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==
+decimal.js@^10.3.1:
+ version "10.3.1"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+ integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
decompress-response@^6.0.0:
version "6.0.0"
@@ -2462,10 +2214,10 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-detect-libc@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
- integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+detect-libc@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.0.tgz#c528bc09bc6d1aa30149228240917c225448f204"
+ integrity sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw==
detect-node@2.1.0, detect-node@^2.1.0:
version "2.1.0"
@@ -2566,12 +2318,12 @@ domelementtype@^2.2.0:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
-domexception@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
- integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+domexception@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
+ integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
dependencies:
- webidl-conversions "^5.0.0"
+ webidl-conversions "^7.0.0"
domhandler@^2.3.0:
version "2.4.2"
@@ -2661,11 +2413,6 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
-electron-to-chromium@^1.3.649:
- version "1.3.672"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a"
- integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw==
-
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -2708,14 +2455,6 @@ enhanced-resolve@^5.0.0:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-enhanced-resolve@^5.7.0:
- version "5.7.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c"
- integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
entities@^1.1.1, entities@~1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
@@ -2762,11 +2501,6 @@ es-abstract@^1.19.0, es-abstract@^1.19.1:
string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1"
-es-module-lexer@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.0.tgz#21f4181cc8b7eee06855f1c59e6087c7bc4f77b0"
- integrity sha512-iuEGihqqhKWFgh72Q/Jtch7V2t/ft8w8IPP2aEN8ArYKO+IWyo6hsi96hCdgyeEDQIV3InhYQ9BlwUFPGXrbEQ==
-
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -2882,10 +2616,10 @@ eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-scope@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153"
- integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
@@ -2907,17 +2641,17 @@ eslint-visitor-keys@^3.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186"
integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==
-eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
- integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-eslint@8.7.0:
- version "8.7.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.7.0.tgz#22e036842ee5b7cf87b03fe237731675b4d3633c"
- integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==
+eslint@8.9.0:
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb"
+ integrity sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==
dependencies:
- "@eslint/eslintrc" "^1.0.5"
+ "@eslint/eslintrc" "^1.1.0"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -2925,10 +2659,10 @@ eslint@8.7.0:
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
- eslint-scope "^7.1.0"
+ eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
- eslint-visitor-keys "^3.2.0"
- espree "^9.3.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.1"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -2958,14 +2692,14 @@ esm@^3.2.22:
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
-espree@^9.2.0, espree@^9.3.0:
- version "9.3.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8"
- integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==
+espree@^9.3.1:
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
+ integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
dependencies:
acorn "^8.7.0"
acorn-jsx "^5.3.1"
- eslint-visitor-keys "^3.1.0"
+ eslint-visitor-keys "^3.3.0"
esprima@^4.0.1:
version "4.0.1"
@@ -3021,24 +2755,19 @@ events@1.1.1:
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
-events@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
- integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
-
-execa@6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-6.0.0.tgz#598b46f09ae44f5d8097a30cfb1681d0f0371503"
- integrity sha512-m4wU9j4Z9nXXoqT8RSfl28JSwmMNLFF69OON8H/lL3NeU0tNpGz313bcOfYoBBHokB0dC2tMl3VUcKgHELhL2Q==
+execa@6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20"
+ integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==
dependencies:
cross-spawn "^7.0.3"
get-stream "^6.0.1"
human-signals "^3.0.1"
is-stream "^3.0.0"
merge-stream "^2.0.0"
- npm-run-path "^5.0.1"
+ npm-run-path "^5.1.0"
onetime "^6.0.0"
- signal-exit "^3.0.5"
+ signal-exit "^3.0.7"
strip-final-newline "^3.0.0"
exit-on-epipe@~1.0.1:
@@ -3241,10 +2970,10 @@ follow-redirects@^1.14.4:
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685"
integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==
-form-data@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
- integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
@@ -3406,9 +3135,9 @@ github-from-package@0.0.0:
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
glob-parent@^5.1.0, glob-parent@~5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
- integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
@@ -3419,15 +3148,10 @@ glob-parent@^6.0.1:
dependencies:
is-glob "^4.0.3"
-glob-to-regexp@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
- integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-
-glob@7.1.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+glob@7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3436,10 +3160,10 @@ glob@7.1.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3619,12 +3343,12 @@ hpagent@^0.1.1:
resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.1.tgz#66f67f16e5c7a8b59a068e40c2658c2c749ad5e2"
integrity sha512-IxJWQiY0vmEjetHdoE9HZjD4Cx+mYTr25tR7JCxXaiI3QxW0YqYyM11KyZbHufoa/piWhMb2+D3FGpMgmA2cFQ==
-html-encoding-sniffer@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
- integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+html-encoding-sniffer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
+ integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
dependencies:
- whatwg-encoding "^1.0.5"
+ whatwg-encoding "^2.0.0"
html-entities@2.3.2:
version "2.3.2"
@@ -3687,13 +3411,6 @@ http-errors@~1.6.2:
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
-http-headers@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/http-headers/-/http-headers-3.0.2.tgz#5147771292f0b39d6778d930a3a59a76fc7ef44d"
- integrity sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==
- dependencies:
- next-line "^1.1.0"
-
http-proxy-agent@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
@@ -3703,6 +3420,15 @@ http-proxy-agent@^4.0.1:
agent-base "6"
debug "4"
+http-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
+ integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+ dependencies:
+ "@tootallnate/once" "2"
+ agent-base "6"
+ debug "4"
+
http-signature@1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9"
@@ -3712,7 +3438,7 @@ http-signature@1.3.6:
jsprim "^2.0.2"
sshpk "^1.14.1"
-http2-wrapper@^1.0.0-beta.5.0:
+http2-wrapper@^1.0.0-beta.5.0, http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
@@ -3720,14 +3446,6 @@ http2-wrapper@^1.0.0-beta.5.0:
quick-lru "^5.1.1"
resolve-alpn "^1.0.0"
-http2-wrapper@^1.0.0-beta.5.2:
- version "1.0.0-beta.5.2"
- resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3"
- integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==
- dependencies:
- quick-lru "^5.1.1"
- resolve-alpn "^1.0.0"
-
http_ece@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75"
@@ -3767,6 +3485,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4:
dependencies:
safer-buffer ">= 2.1.2 < 3"
+iconv-lite@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
iconv-lite@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01"
@@ -3869,16 +3594,17 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
-ioredis@^4.27.0:
- version "4.27.6"
- resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.27.6.tgz#a53d427d3fe75fbd10ed7ad150ce00559df8dcf8"
- integrity sha512-6W3ZHMbpCa8ByMyC1LJGOi7P2WiOKP9B3resoZOVLDhi+6dDBOW+KNsRq3yI36Hmnb2sifCxHX+YSarTeXh48A==
+ioredis@^4.28.5:
+ version "4.28.5"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.5.tgz#5c149e6a8d76a7f8fa8a504ffc85b7d5b6797f9f"
+ integrity sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==
dependencies:
cluster-key-slot "^1.1.0"
debug "^4.3.1"
denque "^1.1.0"
lodash.defaults "^4.2.0"
lodash.flatten "^4.4.0"
+ lodash.isarguments "^3.1.0"
p-map "^2.1.0"
redis-commands "1.7.0"
redis-errors "^1.2.0"
@@ -4017,14 +3743,7 @@ is-generator-function@^1.0.7:
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-glob@^4.0.3:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -4043,13 +3762,6 @@ is-lambda@^1.0.1:
resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=
-is-nan@^1.2.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.0.tgz#85d1f5482f7051c2019f5673ccebdb06f3b0db03"
- integrity sha512-z7bbREymOqt2CCaZVly8aC4ML3Xhfi0ekuOnjO2L8vKdl+CttdVoGZQhd4adMFAsxQ5VeRVwORs4tU8RH+HFtQ==
- dependencies:
- define-properties "^1.1.3"
-
is-negative-zero@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
@@ -4152,6 +3864,11 @@ is-typedarray@^1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
is-weakref@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2"
@@ -4184,15 +3901,6 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-jest-worker@^26.6.2:
- version "26.6.2"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
- integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
- dependencies:
- "@types/node" "*"
- merge-stream "^2.0.0"
- supports-color "^7.0.0"
-
jmespath@0.16.0:
version "0.16.0"
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076"
@@ -4224,13 +3932,6 @@ js-stringify@^1.0.2:
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
-js-yaml@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
- integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
- dependencies:
- argparse "^2.0.1"
-
js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
@@ -4253,23 +3954,23 @@ jschardet@3.0.0:
resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882"
integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ==
-jsdom@16.7.0:
- version "16.7.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
- integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+jsdom@19.0.0:
+ version "19.0.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a"
+ integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==
dependencies:
abab "^2.0.5"
- acorn "^8.2.4"
+ acorn "^8.5.0"
acorn-globals "^6.0.0"
- cssom "^0.4.4"
+ cssom "^0.5.0"
cssstyle "^2.3.0"
- data-urls "^2.0.0"
- decimal.js "^10.2.1"
- domexception "^2.0.1"
+ data-urls "^3.0.1"
+ decimal.js "^10.3.1"
+ domexception "^4.0.0"
escodegen "^2.0.0"
- form-data "^3.0.0"
- html-encoding-sniffer "^2.0.1"
- http-proxy-agent "^4.0.1"
+ form-data "^4.0.0"
+ html-encoding-sniffer "^3.0.0"
+ http-proxy-agent "^5.0.0"
https-proxy-agent "^5.0.0"
is-potential-custom-element-name "^1.0.1"
nwsapi "^2.2.0"
@@ -4278,24 +3979,19 @@ jsdom@16.7.0:
symbol-tree "^3.2.4"
tough-cookie "^4.0.0"
w3c-hr-time "^1.0.2"
- w3c-xmlserializer "^2.0.0"
- webidl-conversions "^6.1.0"
- whatwg-encoding "^1.0.5"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^8.5.0"
- ws "^7.4.6"
- xml-name-validator "^3.0.0"
+ w3c-xmlserializer "^3.0.0"
+ webidl-conversions "^7.0.0"
+ whatwg-encoding "^2.0.0"
+ whatwg-mimetype "^3.0.0"
+ whatwg-url "^10.0.0"
+ ws "^8.2.3"
+ xml-name-validator "^4.0.0"
json-buffer@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -4577,11 +4273,6 @@ ky@^0.25.1:
resolved "https://registry.yarnpkg.com/ky/-/ky-0.25.1.tgz#0df0bd872a9cc57e31acd5dbc1443547c881bfbc"
integrity sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA==
-langmap@0.0.16:
- version "0.0.16"
- resolved "https://registry.yarnpkg.com/langmap/-/langmap-0.0.16.tgz#2fe3e98a531fec0fec546624ebe168c2855bab56"
- integrity sha512-AtYvBK7BsDvWwnSfmO7CfgeUy7GUT1wK3QX8eKH/Ey/eXodqoHuAtvdQ82hmWD9QVFVKnuiNjym9fGY4qSJeLA==
-
lazystream@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
@@ -4610,11 +4301,6 @@ listenercount@~1.0.1:
resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937"
integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=
-loader-runner@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
- integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
-
loader-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
@@ -4681,6 +4367,11 @@ lodash.foreach@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
+lodash.isarguments@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+ integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
+
lodash.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
@@ -4731,27 +4422,23 @@ lodash.some@^4.4.0:
resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
-lodash.sortby@^4.7.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
- integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
-
lodash.union@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
-lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
+lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-log-symbols@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
- integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
+log-symbols@4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
dependencies:
- chalk "^4.0.0"
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
lowercase-keys@^2.0.0:
version "2.0.0"
@@ -4773,6 +4460,11 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
+luxon@^1.28.0:
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf"
+ integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==
+
mailcheck@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/mailcheck/-/mailcheck-1.1.1.tgz#d87cf6ba0b64ba512199dbf93f1489f479591e34"
@@ -4867,7 +4559,7 @@ mime-types@2.1.34:
dependencies:
mime-db "1.51.0"
-mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@~2.1.24:
+mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.24:
version "2.1.27"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
@@ -4945,17 +4637,10 @@ minipass-sized@^1.0.3:
dependencies:
minipass "^3.0.0"
-minipass@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
- integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
- dependencies:
- yallist "^4.0.0"
-
-minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
- integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
+ integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
dependencies:
yallist "^4.0.0"
@@ -4967,10 +4652,10 @@ minizlib@^2.0.0, minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
-misskey-js@0.0.13:
- version "0.0.13"
- resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.13.tgz#03a4e469186e28752d599dc4093519eb64647970"
- integrity sha512-kBdJdfe281gtykzzsrN3IAxWUQIimzPiJGyKWf863ggWJlWYVPmP9hTFlX2z8oPOaypgVBPEPHyw/jNUdc2DbQ==
+misskey-js@0.0.14:
+ version "0.0.14"
+ resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.14.tgz#1a616bdfbe81c6ee6900219eaf425bb5c714dd4d"
+ integrity sha512-bvLx6U3OwQwqHfp/WKwIVwdvNYAAPk0+YblXyxmSG3dwlzCgBRRLcB8o6bNruUDyJgh3t73pLDcOz3myxcUmww==
dependencies:
autobind-decorator "^2.4.0"
eventemitter3 "^4.0.7"
@@ -4998,45 +4683,37 @@ mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.3:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-mocha@8.4.0:
- version "8.4.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
- integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+mocha@9.2.1:
+ version "9.2.1"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e"
+ integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==
dependencies:
"@ungap/promise-all-settled" "1.1.2"
ansi-colors "4.1.1"
browser-stdout "1.3.1"
- chokidar "3.5.1"
- debug "4.3.1"
+ chokidar "3.5.3"
+ debug "4.3.3"
diff "5.0.0"
escape-string-regexp "4.0.0"
find-up "5.0.0"
- glob "7.1.6"
+ glob "7.2.0"
growl "1.10.5"
he "1.2.0"
- js-yaml "4.0.0"
- log-symbols "4.0.0"
+ js-yaml "4.1.0"
+ log-symbols "4.1.0"
minimatch "3.0.4"
ms "2.1.3"
- nanoid "3.1.20"
- serialize-javascript "5.0.1"
+ nanoid "3.2.0"
+ serialize-javascript "6.0.0"
strip-json-comments "3.1.1"
supports-color "8.1.1"
which "2.0.2"
- wide-align "1.1.3"
- workerpool "6.1.0"
+ workerpool "6.2.0"
yargs "16.2.0"
yargs-parser "20.2.4"
yargs-unparser "2.0.0"
-moment-timezone@^0.5.25:
- version "0.5.28"
- resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.28.tgz#f093d789d091ed7b055d82aa81a82467f72e4338"
- integrity sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==
- dependencies:
- moment ">= 2.9.0"
-
-"moment@>= 2.9.0", moment@^2.22.2:
+moment@^2.22.2:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
@@ -5061,6 +4738,21 @@ ms@3.0.0-canary.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-3.0.0-canary.1.tgz#c7b34fbce381492fd0b345d1cf56e14d67b77b80"
integrity sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==
+msgpackr-extract@^1.0.14:
+ version "1.0.16"
+ resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.16.tgz#701c4f6e6f25c100ae84557092274e8fffeefe45"
+ integrity sha512-fxdRfQUxPrL/TizyfYfMn09dK58e+d65bRD/fcaVH4052vj30QOzzqxcQIS7B0NsqlypEQ/6Du3QmP2DhWFfCA==
+ dependencies:
+ nan "^2.14.2"
+ node-gyp-build "^4.2.3"
+
+msgpackr@^1.5.2:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.5.4.tgz#2b6ea6cb7d79c0ad98fc76c68163c48eda50cf0d"
+ integrity sha512-Z7w5Jg+2Q9z9gJxeM68d7tSuWZZGnFIRhZnyqcZCa/1dKkhOCNvR1TUV3zzJ3+vj78vlwKRzUgVDlW4jiSOeDA==
+ optionalDependencies:
+ msgpackr-extract "^1.0.14"
+
multer@1.4.4:
version "1.4.4"
resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c"
@@ -5089,7 +4781,7 @@ mz@^2.4.0, mz@^2.7.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
-nan@^2.15.0:
+nan@^2.14.2, nan@^2.15.0:
version "2.15.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
@@ -5101,10 +4793,10 @@ nano-time@1.0.0:
dependencies:
big-integer "^1.6.16"
-nanoid@3.1.20:
- version "3.1.20"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
- integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
+nanoid@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
+ integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
nanoid@^3.1.30:
version "3.1.30"
@@ -5135,11 +4827,6 @@ negotiator@0.6.2, negotiator@^0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
-neo-async@^2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
- integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-
nested-property@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-4.0.0.tgz#a67b5a31991e701e03cdbaa6453bc5b1011bb88d"
@@ -5150,11 +4837,6 @@ netmask@^2.0.2:
resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
-next-line@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/next-line/-/next-line-1.1.0.tgz#fcae57853052b6a9bae8208e40dd7d3c2d304603"
- integrity sha1-/K5XhTBStqm66CCOQN19PC0wRgM=
-
next-tick@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
@@ -5167,10 +4849,10 @@ node-abi@^3.3.0:
dependencies:
semver "^7.3.5"
-node-addon-api@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87"
- integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==
+node-addon-api@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
+ integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
node-domexception@^1.0.0:
version "1.0.0"
@@ -5186,10 +4868,12 @@ node-fetch@*:
fetch-blob "^3.1.4"
formdata-polyfill "^4.0.10"
-node-fetch@2.6.1, node-fetch@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+node-fetch@2.6.7, node-fetch@^2.6.1:
+ version "2.6.7"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+ integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+ dependencies:
+ whatwg-url "^5.0.0"
node-fetch@3.0.0-beta.9:
version "3.0.0-beta.9"
@@ -5199,6 +4883,11 @@ node-fetch@3.0.0-beta.9:
data-uri-to-buffer "^3.0.1"
fetch-blob "^2.1.1"
+node-gyp-build@^4.2.3:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3"
+ integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==
+
node-gyp-build@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d"
@@ -5220,11 +4909,6 @@ node-gyp@^8.4.1:
tar "^6.1.2"
which "^2.0.2"
-node-releases@^1.1.70:
- version "1.1.71"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
- integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
-
nodemailer@6.7.2:
version "6.7.2"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.7.2.tgz#44b2ad5f7ed71b7067f7a21c4fedabaec62b85e0"
@@ -5263,14 +4947,14 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-url@^4.1.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
- integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
+ integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
-npm-run-path@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.0.1.tgz#748dd68ed7de377bb1f7132c7dafe657be5ab400"
- integrity sha512-ybBJQUSyFwEEhqO2lXmyKOl9ucHtyZBWVM0h0FiMfT/+WKxCUZFa95qAR2X3w/w6oigN3B0b2UNHZbD+kdfD5w==
+npm-run-path@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
+ integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
dependencies:
path-key "^4.0.0"
@@ -5464,13 +5148,6 @@ p-limit@^3.0.2:
dependencies:
p-try "^2.0.0"
-p-limit@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
- integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
- dependencies:
- yocto-queue "^0.1.0"
-
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -5604,9 +5281,9 @@ path-key@^4.0.0:
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@^6.1.0:
version "6.1.0"
@@ -5633,10 +5310,10 @@ pg-int8@1.0.1:
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
-pg-pool@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.4.1.tgz#0e71ce2c67b442a5e862a9c182172c37eda71e9c"
- integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==
+pg-pool@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.1.tgz#f499ce76f9bf5097488b3b83b19861f28e4ed905"
+ integrity sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==
pg-protocol@^1.5.0:
version "1.5.0"
@@ -5654,15 +5331,15 @@ pg-types@^2.1.0:
postgres-date "~1.0.4"
postgres-interval "^1.1.0"
-pg@8.7.1:
- version "8.7.1"
- resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.1.tgz#9ea9d1ec225980c36f94e181d009ab9f4ce4c471"
- integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==
+pg@8.7.3:
+ version "8.7.3"
+ resolved "https://registry.yarnpkg.com/pg/-/pg-8.7.3.tgz#8a5bdd664ca4fda4db7997ec634c6e5455b27c44"
+ integrity sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==
dependencies:
buffer-writer "2.0.0"
packet-reader "1.0.0"
pg-connection-string "^2.5.0"
- pg-pool "^3.4.1"
+ pg-pool "^3.5.1"
pg-protocol "^1.5.0"
pg-types "^2.1.0"
pgpass "1.x"
@@ -5743,12 +5420,12 @@ postgres-interval@^1.1.0:
dependencies:
xtend "^4.0.0"
-prebuild-install@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574"
- integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==
+prebuild-install@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.1.tgz#c10075727c318efe72412f333e0ef625beaf3870"
+ integrity sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==
dependencies:
- detect-libc "^1.0.3"
+ detect-libc "^2.0.0"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
@@ -5796,10 +5473,10 @@ private-ip@2.3.3:
is-ip "^3.1.0"
netmask "^2.0.2"
-probe-image-size@7.2.2:
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.2.tgz#e5851b9be7864f21e3bac5e6e4fac9da9055b412"
- integrity sha512-QUm+w1S9WTsT5GZB830u0BHExrUmF0J4fyRm5kbLUMEP3fl9UVYXc3xOBVqZNnH9tnvVEJO8vDk3PMtsLqjxug==
+probe-image-size@7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-7.2.3.tgz#d49c64be540ec8edea538f6f585f65a9b3ab4309"
+ integrity sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==
dependencies:
lodash.merge "^4.6.2"
needle "^2.5.2"
@@ -6061,10 +5738,10 @@ rdf-canonize@^3.0.0:
dependencies:
setimmediate "^1.0.5"
-re2@1.17.3:
- version "1.17.3"
- resolved "https://registry.yarnpkg.com/re2/-/re2-1.17.3.tgz#8cceb48f52c45b860b1f67cee8a44726f7d05e9a"
- integrity sha512-Dp5iWVR8W3C7Nm9DziMY4BleMPRb/pe6kvfbzLv80dVYaXRc9jRnwwNqU0oE/taRm0qYR1+Qrtzk9rPjS9ecaQ==
+re2@1.17.4:
+ version "1.17.4"
+ resolved "https://registry.yarnpkg.com/re2/-/re2-1.17.4.tgz#7bf29290bdde963014e77bd2c2e799a6d788386e"
+ integrity sha512-xyZ4h5PqE8I9tAxTh3G0UttcK5ufrcUxReFjGzfX61vtanNbS1XZHjnwRSyPcLgChI4KLxVgOT/ioZXnUAdoTA==
dependencies:
install-artifact-from-github "^1.3.0"
nan "^2.15.0"
@@ -6194,14 +5871,6 @@ rename@1.0.4:
dependencies:
debug "^2.5.2"
-request-stats@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/request-stats/-/request-stats-3.0.0.tgz#769155dc8974d78d4a1cb87bbf14eaab985afe25"
- integrity sha1-dpFV3Il0141KHLh7vxTqq5ha/iU=
- dependencies:
- http-headers "^3.0.1"
- once "^1.4.0"
-
require-all@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/require-all/-/require-all-3.0.0.tgz#473d49704be310115ce124f77383b1ebd8671312"
@@ -6325,10 +5994,10 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sanitize-html@2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.6.1.tgz#5d37c08e189c61c0631560a889b10d9d155d000e"
- integrity sha512-DzjSz3H5qDntD7s1TcWCSoRPmNR8UmA+y+xZQOvWgjATe2Br9ZW73+vD3Pj6Snrg0RuEuJdXgrKvnYuiuixRkA==
+sanitize-html@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.7.0.tgz#e106205b468aca932e2f9baf241f24660d34e279"
+ integrity sha512-jfQelabOn5voO7FAfnQF7v+jsA6z9zC/O4ec0z3E35XPEtHYJT/OdUziVWlKW4irCr2kXaQAyXTXDHWAibg1tA==
dependencies:
deepmerge "^4.2.2"
escape-string-regexp "^4.0.0"
@@ -6397,10 +6066,10 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
-serialize-javascript@5.0.1, serialize-javascript@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
- integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+serialize-javascript@6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
@@ -6432,17 +6101,17 @@ sha.js@^2.4.11:
inherits "^2.0.1"
safe-buffer "^5.0.1"
-sharp@0.29.3:
- version "0.29.3"
- resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.3.tgz#0da183d626094c974516a48fab9b3e4ba92eb5c2"
- integrity sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA==
+sharp@0.30.1:
+ version "0.30.1"
+ resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.30.1.tgz#203efaf9acfc5c15c8a343800254621e56011c12"
+ integrity sha512-ycpz81q8AeVjz1pGvvirQBeJcYE2sXAjcLXR/69LWOe/oxavBLOrenZcTzvTXn83jqAGqY+OuwF+2kFXzbKtDA==
dependencies:
- color "^4.0.1"
- detect-libc "^1.0.3"
- node-addon-api "^4.2.0"
- prebuild-install "^7.0.0"
+ color "^4.2.0"
+ detect-libc "^2.0.0"
+ node-addon-api "^4.3.0"
+ prebuild-install "^7.0.1"
semver "^7.3.5"
- simple-get "^4.0.0"
+ simple-get "^4.0.1"
tar-fs "^2.1.1"
tunnel-agent "^0.6.0"
@@ -6477,20 +6146,20 @@ signal-exit@^3.0.0:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-signal-exit@^3.0.5:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
- integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
simple-concat@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
- integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-simple-get@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675"
- integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==
+simple-get@^4.0.0, simple-get@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
dependencies:
decompress-response "^6.0.0"
once "^1.3.1"
@@ -6530,34 +6199,16 @@ socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
-source-list-map@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
source-map-js@^0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
-source-map-support@~0.5.19:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
speakeasy@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/speakeasy/-/speakeasy-2.0.0.tgz#85c91a071b09a5cb8642590d983566165f57613a"
@@ -6794,7 +6445,7 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.0.0, supports-color@^7.1.0:
+supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -6813,12 +6464,12 @@ syslog-pro@1.0.0:
dependencies:
moment "^2.22.2"
-systeminformation@5.9.9:
- version "5.9.9"
- resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.9.9.tgz#aa8234a138363bd988f438fed3273370f79d7e30"
- integrity sha512-xciy6NKCLfs4dqMD1Tdlo7v1/g0NfdA1EKsIptUQjlcVvpwHyjifAbNOF7ppFezGSMXxYE8me+l2+RlFF4lyTg==
+systeminformation@5.11.4:
+ version "5.11.4"
+ resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.11.4.tgz#3ed99533c67d0b4bd357871687e014f1c2a37194"
+ integrity sha512-rh7bjpjP5whUaTknim5CiGdAiKZcgWhmbmxjzBRXDWqUc/k67bz2OP+03DdcX6/SN/CDSAi/NeUwM5o2gjHJoA==
-tapable@^2.1.1, tapable@^2.2.0:
+tapable@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
@@ -6865,19 +6516,7 @@ tar-stream@^2.1.4, tar-stream@^2.2.0:
inherits "^2.0.3"
readable-stream "^3.1.1"
-tar@^6.0.2:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
- integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
- dependencies:
- chownr "^2.0.0"
- fs-minipass "^2.0.0"
- minipass "^3.0.0"
- minizlib "^2.1.1"
- mkdirp "^1.0.3"
- yallist "^4.0.0"
-
-tar@^6.1.2:
+tar@^6.0.2, tar@^6.1.2:
version "6.1.11"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
@@ -6889,27 +6528,6 @@ tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
-terser-webpack-plugin@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673"
- integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==
- dependencies:
- jest-worker "^26.6.2"
- p-limit "^3.1.0"
- schema-utils "^3.0.0"
- serialize-javascript "^5.0.1"
- source-map "^0.6.1"
- terser "^5.5.1"
-
-terser@^5.5.1:
- version "5.5.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289"
- integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==
- dependencies:
- commander "^2.20.0"
- source-map "~0.7.2"
- source-map-support "~0.5.19"
-
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -6990,13 +6608,18 @@ tough-cookie@^4.0.0:
punycode "^2.1.1"
universalify "^0.1.2"
-tr46@^2.0.0, tr46@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
- integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
+tr46@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+ integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
dependencies:
punycode "^2.1.1"
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+
trace-redirect@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/trace-redirect/-/trace-redirect-1.0.6.tgz#ac629b5bf8247d30dde5a35fe9811b811075b504"
@@ -7017,10 +6640,10 @@ ts-loader@9.2.6:
micromatch "^4.0.0"
semver "^7.3.4"
-ts-node@10.4.0:
- version "10.4.0"
- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
- integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==
+ts-node@10.5.0:
+ version "10.5.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.5.0.tgz#618bef5854c1fbbedf5e31465cbb224a1d524ef9"
+ integrity sha512-6kEJKwVxAJ35W4akuiysfKwKmjkbYxwQMTBaAxo9KKAx/Yd26mPUyhGz3ji+EsJoAgrLqVsYHNuuYwQe22lbtw==
dependencies:
"@cspotcode/source-map-support" "0.7.0"
"@tsconfig/node10" "^1.0.7"
@@ -7033,6 +6656,7 @@ ts-node@10.4.0:
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.0"
yn "3.1.1"
tsc-alias@1.4.1:
@@ -7057,7 +6681,7 @@ tsconfig-paths@3.12.0, tsconfig-paths@^3.12.0:
minimist "^1.2.0"
strip-bom "^3.0.0"
-tslib@^1.8.1, tslib@^1.9.0:
+tslib@^1.8.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
@@ -7150,10 +6774,10 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-typeorm@0.2.41:
- version "0.2.41"
- resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.41.tgz#88758101ac158dc0a0a903d70eaacea2974281cc"
- integrity sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw==
+typeorm@0.2.44:
+ version "0.2.44"
+ resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.44.tgz#4cc07eb1eb7a0e7f3ec9e65ded9eb3c3aedbb3e1"
+ integrity sha512-yFyb9Ts73vGaS/O06TvLpzvT5U/ngO31GeciNc0eoH7P1QcG8kVZdOy9FHJqkTeDmIljMRgWjbYUoMw53ZY7Xw==
dependencies:
"@sqltools/formatter" "^1.2.2"
app-root-path "^3.0.0"
@@ -7168,6 +6792,7 @@ typeorm@0.2.41:
reflect-metadata "^0.1.13"
sha.js "^2.4.11"
tslib "^2.1.0"
+ uuid "^8.3.2"
xml2js "^0.4.23"
yargs "^17.0.1"
zen-observable-ts "^1.0.0"
@@ -7282,11 +6907,16 @@ uuid@7.0.3:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
-uuid@8.3.2, uuid@^8.3.0:
+uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+v8-compile-cache-lib@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
+ integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
+
v8-compile-cache@^2.0.3:
version "2.2.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
@@ -7318,20 +6948,12 @@ w3c-hr-time@^1.0.2:
dependencies:
browser-process-hrtime "^1.0.0"
-w3c-xmlserializer@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
- integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
- dependencies:
- xml-name-validator "^3.0.0"
-
-watchpack@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0.tgz#b12248f32f0fd4799b7be0802ad1f6573a45955c"
- integrity sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg==
+w3c-xmlserializer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923"
+ integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==
dependencies:
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.1.2"
+ xml-name-validator "^4.0.0"
web-push@3.4.5:
version "3.4.5"
@@ -7350,52 +6972,15 @@ web-streams-polyfill@^3.0.3:
resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965"
integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==
-webidl-conversions@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
- integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
-
-webidl-conversions@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
- integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
-
-webpack-sources@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac"
- integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==
- dependencies:
- source-list-map "^2.0.1"
- source-map "^0.6.1"
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
-webpack@^5:
- version "5.33.2"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.33.2.tgz#c049717c9b038febf5a72fd2f53319ad59a8c1fc"
- integrity sha512-X4b7F1sYBmJx8mlh2B7mV5szEkE0jYNJ2y3akgAP0ERi0vLCG1VvdsIxt8lFd4st6SUy0lf7W0CCQS566MBpJg==
- dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.46"
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/wasm-edit" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- acorn "^8.0.4"
- browserslist "^4.14.5"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.7.0"
- es-module-lexer "^0.4.0"
- eslint-scope "^5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^3.0.0"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.1.1"
- watchpack "^2.0.0"
- webpack-sources "^2.1.1"
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
websocket@1.0.34:
version "1.0.34"
@@ -7409,35 +6994,33 @@ websocket@1.0.34:
utf-8-validate "^5.0.2"
yaeti "^0.0.6"
-whatwg-encoding@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
- integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+whatwg-encoding@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
+ integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
dependencies:
- iconv-lite "0.4.24"
+ iconv-lite "0.6.3"
-whatwg-mimetype@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
- integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+whatwg-mimetype@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
+ integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
-whatwg-url@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871"
- integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==
+whatwg-url@^10.0.0:
+ version "10.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da"
+ integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==
dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^2.0.0"
- webidl-conversions "^5.0.0"
+ tr46 "^3.0.0"
+ webidl-conversions "^7.0.0"
-whatwg-url@^8.5.0:
- version "8.5.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3"
- integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
dependencies:
- lodash "^4.7.0"
- tr46 "^2.0.2"
- webidl-conversions "^6.1.0"
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
which-boxed-primitive@^1.0.2:
version "1.0.2"
@@ -7469,7 +7052,7 @@ which@^1.1.1, which@^1.2.14:
dependencies:
isexe "^2.0.0"
-wide-align@1.1.3, wide-align@^1.1.0:
+wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
@@ -7498,10 +7081,10 @@ word-wrap@^1.2.3, word-wrap@~1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-workerpool@6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
- integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+workerpool@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
+ integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
wrap-ansi@^6.2.0:
version "6.2.0"
@@ -7526,16 +7109,16 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-ws@8.4.2:
+ws@8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
+ integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
+
+ws@^8.2.3:
version "8.4.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b"
integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==
-ws@^7.4.6:
- version "7.5.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
- integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
-
xev@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/xev/-/xev-2.0.1.tgz#24484173a22115bc8a990ef5d4d5129695b827a7"
@@ -7548,10 +7131,10 @@ xml-js@^1.6.11:
dependencies:
sax "^1.2.4"
-xml-name-validator@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
- integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+xml-name-validator@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
+ integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
xml2js@0.4.19:
version "0.4.19"
@@ -7695,11 +7278,6 @@ yn@3.1.1:
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-yocto-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-
zen-observable-ts@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz#30d1202b81d8ba4c489e3781e8ca09abf0075e70"
diff --git a/packages/client/.eslintrc.js b/packages/client/.eslintrc.js
index d414f86ed3..a6e23e5171 100644
--- a/packages/client/.eslintrc.js
+++ b/packages/client/.eslintrc.js
@@ -18,6 +18,8 @@ module.exports = {
// data の禁止理由: 抽象的すぎるため
// e の禁止理由: error や event など、複数のキーワードの頭文字であり分かりにくいため
"id-denylist": ["error", "window", "data", "e"],
+ 'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
+ "no-shadow": ["warn"],
"vue/attributes-order": ["error", {
"alphabetical": false
}],
diff --git a/packages/client/package.json b/packages/client/package.json
index c5b91148a7..a781f43c5a 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -11,53 +11,50 @@
},
"dependencies": {
"@discordapp/twemoji": "13.1.0",
+ "@fortawesome/fontawesome-free": "6.0.0",
"@syuilo/aiscript": "0.11.1",
- "@types/dateformat": "3.0.1",
"@types/escape-regexp": "0.0.1",
"@types/glob": "7.2.0",
"@types/gulp": "4.0.9",
"@types/gulp-rename": "2.0.1",
"@types/is-url": "1.2.30",
"@types/katex": "0.11.1",
- "@types/matter-js": "0.17.6",
- "@types/mocha": "8.2.3",
+ "@types/matter-js": "0.17.7",
+ "@types/mocha": "9.1.0",
"@types/oauth": "0.9.1",
"@types/parse5": "6.0.3",
"@types/punycode": "2.1.0",
"@types/qrcode": "1.4.2",
"@types/random-seed": "0.3.3",
- "@types/request-stats": "3.0.0",
"@types/seedrandom": "2.4.28",
"@types/throttle-debounce": "2.1.0",
"@types/tinycolor2": "1.4.3",
- "@types/tmp": "0.2.3",
"@types/uuid": "8.3.4",
- "@types/web-push": "3.3.2",
"@types/webpack": "5.28.0",
"@types/webpack-stream": "3.2.12",
- "@types/websocket": "1.0.4",
- "@types/ws": "8.2.2",
- "@typescript-eslint/parser": "5.10.0",
- "@vue/compiler-sfc": "3.2.29",
+ "@types/websocket": "1.0.5",
+ "@types/ws": "8.2.3",
+ "@typescript-eslint/parser": "5.12.1",
+ "@vue/compiler-sfc": "3.2.31",
"abort-controller": "3.0.0",
"autobind-decorator": "2.4.0",
"autosize": "5.0.1",
"autwh": "0.1.0",
- "blurhash": "1.1.4",
- "broadcast-channel": "4.9.0",
- "chart.js": "3.7.0",
+ "blurhash": "1.1.5",
+ "broadcast-channel": "4.10.0",
+ "chart.js": "3.7.1",
"chartjs-adapter-date-fns": "2.0.0",
+ "chartjs-plugin-gradient": "0.2.1",
"chartjs-plugin-zoom": "1.2.0",
"compare-versions": "4.1.3",
"content-disposition": "0.5.4",
- "crc-32": "1.2.0",
- "css-loader": "6.5.1",
- "cssnano": "5.0.15",
+ "css-loader": "6.6.0",
+ "cssnano": "5.0.17",
"date-fns": "2.28.0",
"deepcopy": "2.1.0",
"escape-regexp": "0.0.1",
- "eslint": "8.7.0",
- "eslint-plugin-vue": "8.3.0",
+ "eslint": "8.9.0",
+ "eslint-plugin-vue": "8.5.0",
"eventemitter3": "4.0.7",
"feed": "4.2.2",
"glob": "7.2.0",
@@ -67,19 +64,18 @@
"json5": "2.2.0",
"json5-loader": "4.0.1",
"katex": "0.15.2",
- "langmap": "0.0.16",
"matter-js": "0.18.0",
"mfm-js": "0.21.0",
- "misskey-js": "0.0.13",
- "mocha": "8.4.0",
+ "misskey-js": "0.0.14",
+ "mocha": "9.2.1",
"ms": "2.1.3",
"nested-property": "4.0.0",
"parse5": "6.0.1",
"photoswipe": "git+https://github.com/dimsemenov/photoswipe#v5-beta",
"portscanner": "2.2.0",
- "postcss": "8.4.5",
+ "postcss": "8.4.6",
"postcss-loader": "6.2.1",
- "prismjs": "1.26.0",
+ "prismjs": "1.27.0",
"private-ip": "2.3.3",
"promise-limit": "2.7.0",
"pug": "3.0.2",
@@ -88,11 +84,10 @@
"querystring": "0.2.1",
"random-seed": "0.3.0",
"reflect-metadata": "0.1.13",
- "request-stats": "3.0.0",
"rndstr": "1.0.0",
"s-age": "1.1.2",
- "sass": "1.49.0",
- "sass-loader": "12.4.0",
+ "sass": "1.49.8",
+ "sass-loader": "12.6.0",
"seedrandom": "3.0.5",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
@@ -102,9 +97,7 @@
"three": "0.136.0",
"throttle-debounce": "3.0.1",
"tinycolor2": "1.4.2",
- "tmp": "0.2.1",
"ts-loader": "9.2.6",
- "ts-node": "10.4.0",
"tsc-alias": "1.5.0",
"tsconfig-paths": "3.12.0",
"twemoji-parser": "13.1.0",
@@ -112,25 +105,22 @@
"uuid": "8.3.2",
"v-debounce": "0.1.2",
"vanilla-tilt": "1.7.2",
- "vue": "3.2.29",
+ "vue": "3.2.31",
"vue-loader": "17.0.0",
"vue-prism-editor": "2.0.0-alpha.2",
- "vue-router": "4.0.5",
+ "vue-router": "4.0.12",
"vue-style-loader": "4.1.3",
"vue-svg-loader": "0.17.0-beta.2",
"vuedraggable": "4.0.1",
- "web-push": "3.4.5",
- "webpack": "5.66.0",
- "webpack-cli": "4.9.1",
+ "webpack": "5.69.1",
+ "webpack-cli": "4.9.2",
"websocket": "1.0.34",
- "ws": "8.4.2"
+ "ws": "8.5.0"
},
"devDependencies": {
- "@redocly/openapi-core": "1.0.0-beta.79",
- "@types/fluent-ffmpeg": "2.1.20",
- "@typescript-eslint/eslint-plugin": "5.10.0",
+ "@typescript-eslint/eslint-plugin": "5.12.1",
"cross-env": "7.0.3",
- "cypress": "9.3.1",
+ "cypress": "9.5.0",
"eslint-plugin-import": "2.25.4",
"start-server-and-test": "1.14.0"
}
diff --git a/packages/client/src/components/autocomplete.vue b/packages/client/src/components/autocomplete.vue
index 91a50ffa59..adeac4e050 100644
--- a/packages/client/src/components/autocomplete.vue
+++ b/packages/client/src/components/autocomplete.vue
@@ -57,7 +57,7 @@ const lib = emojilist.filter(x => x.category !== 'flags');
const char2file = (char: string) => {
let codes = Array.from(char).map(x => x.codePointAt(0)?.toString(16));
- if (!codes.includes('200d')) codes = codes.filter(x => x != 'fe0f');
+ if (!codes.includes('200d')) codes = codes.filter(x => x !== 'fe0f');
return codes.filter(x => x && x.length).join('-');
};
@@ -192,8 +192,7 @@ function exec() {
const cache = sessionStorage.getItem(cacheKey);
if (cache) {
- const users = JSON.parse(cache);
- users.value = users;
+ users.value = JSON.parse(cache);
fetching.value = false;
} else {
os.api('users/search-by-username-and-host', {
@@ -208,7 +207,7 @@ function exec() {
});
}
} else if (props.type === 'hashtag') {
- if (!props.q || props.q == '') {
+ if (!props.q || props.q === '') {
hashtags.value = JSON.parse(localStorage.getItem('hashtags') || '[]');
fetching.value = false;
} else {
@@ -231,9 +230,9 @@ function exec() {
}
}
} else if (props.type === 'emoji') {
- if (!props.q || props.q == '') {
+ if (!props.q || props.q === '') {
// 最近使った絵文字をサジェスト
- emojis.value = defaultStore.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x) as EmojiDef[];
+ emojis.value = defaultStore.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji === emoji)).filter(x => x) as EmojiDef[];
return;
}
@@ -241,37 +240,37 @@ function exec() {
const max = 30;
emojiDb.some(x => {
- if (x.name.startsWith(props.q || '') && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
- return matched.length == max;
+ if (x.name.startsWith(props.q ?? '') && !x.aliasOf && !matched.some(y => y.emoji === x.emoji)) matched.push(x);
+ return matched.length === max;
});
if (matched.length < max) {
emojiDb.some(x => {
- if (x.name.startsWith(props.q || '') && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
- return matched.length == max;
+ if (x.name.startsWith(props.q ?? '') && !matched.some(y => y.emoji === x.emoji)) matched.push(x);
+ return matched.length === max;
});
}
if (matched.length < max) {
emojiDb.some(x => {
- if (x.name.includes(props.q || '') && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
- return matched.length == max;
+ if (x.name.includes(props.q ?? '') && !matched.some(y => y.emoji === x.emoji)) matched.push(x);
+ return matched.length === max;
});
}
emojis.value = matched;
} else if (props.type === 'mfmTag') {
- if (!props.q || props.q == '') {
+ if (!props.q || props.q === '') {
mfmTags.value = MFM_TAGS;
return;
}
- mfmTags.value = MFM_TAGS.filter(tag => tag.startsWith(props.q || ''));
+ mfmTags.value = MFM_TAGS.filter(tag => tag.startsWith(props.q ?? ''));
}
}
function onMousedown(e: Event) {
- if (!contains(rootEl.value, e.target) && (rootEl.value != e.target)) props.close();
+ if (!contains(rootEl.value, e.target) && (rootEl.value !== e.target)) props.close();
}
function onKeydown(e: KeyboardEvent) {
@@ -348,7 +347,7 @@ function chooseUser() {
onUpdated(() => {
setPosition();
- items.value = suggests.value?.children || [];
+ items.value = suggests.value?.children ?? [];
});
onMounted(() => {
diff --git a/packages/client/src/components/captcha.vue b/packages/client/src/components/captcha.vue
index 963ae25f8e..ccd8880df8 100644
--- a/packages/client/src/components/captcha.vue
+++ b/packages/client/src/components/captcha.vue
@@ -93,7 +93,7 @@ function requestRender() {
}
function callback(response?: string) {
- emit('update:modelValue', typeof response == 'string' ? response : null);
+ emit('update:modelValue', typeof response === 'string' ? response : null);
}
onMounted(() => {
diff --git a/packages/client/src/components/chart-tooltip.vue b/packages/client/src/components/chart-tooltip.vue
new file mode 100644
index 0000000000..20e094a5a7
--- /dev/null
+++ b/packages/client/src/components/chart-tooltip.vue
@@ -0,0 +1,51 @@
+<template>
+<MkTooltip ref="tooltip" :showing="showing" :x="x" :y="y" :max-width="340" :direction="'left'" :inner-margin="16" @closed="emit('closed')">
+ <div v-if="title" class="qpcyisrl">
+ <div class="title">{{ title }}</div>
+ <div v-for="x in series" class="series">
+ <span class="color" :style="{ background: x.backgroundColor, borderColor: x.borderColor }"></span>
+ <span>{{ x.text }}</span>
+ </div>
+ </div>
+</MkTooltip>
+</template>
+
+<script lang="ts" setup>
+import { } from 'vue';
+import MkTooltip from './ui/tooltip.vue';
+
+const props = defineProps<{
+ showing: boolean;
+ x: number;
+ y: number;
+ title: string;
+ series: {
+ backgroundColor: string;
+ borderColor: string;
+ text: string;
+ }[];
+}>();
+
+const emit = defineEmits<{
+ (ev: 'closed'): void;
+}>();
+</script>
+
+<style lang="scss" scoped>
+.qpcyisrl {
+ > .title {
+ margin-bottom: 4px;
+ }
+
+ > .series {
+ > .color {
+ display: inline-block;
+ width: 8px;
+ height: 8px;
+ border-width: 1px;
+ border-style: solid;
+ margin-right: 8px;
+ }
+ }
+}
+</style>
diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue
index d17c0c9f3e..3787c5f066 100644
--- a/packages/client/src/components/chart.vue
+++ b/packages/client/src/components/chart.vue
@@ -8,7 +8,7 @@
</template>
<script lang="ts">
-import { defineComponent, onMounted, ref, watch, PropType } from 'vue';
+import { defineComponent, onMounted, ref, watch, PropType, onUnmounted, shallowRef } from 'vue';
import {
Chart,
ArcElement,
@@ -29,8 +29,10 @@ import {
import 'chartjs-adapter-date-fns';
import { enUS } from 'date-fns/locale';
import zoomPlugin from 'chartjs-plugin-zoom';
+import gradient from 'chartjs-plugin-gradient';
import * as os from '@/os';
import { defaultStore } from '@/store';
+import MkChartTooltip from '@/components/chart-tooltip.vue';
Chart.register(
ArcElement,
@@ -48,6 +50,7 @@ Chart.register(
SubTitle,
Filler,
zoomPlugin,
+ gradient,
);
const sum = (...arr) => arr.reduce((r, a) => r.map((b, i) => a[i] + b));
@@ -60,9 +63,18 @@ const alpha = (hex, a) => {
return `rgba(${r}, ${g}, ${b}, ${a})`;
};
-const colors = ['#008FFB', '#00E396', '#FEB019', '#FF4560'];
+const colors = {
+ blue: '#008FFB',
+ green: '#00E396',
+ yellow: '#FEB019',
+ red: '#FF4560',
+ purple: '#e300db',
+ orange: '#fe6919',
+ lime: '#c7f400',
+};
+const colorSets = [colors.blue, colors.green, colors.yellow, colors.red, colors.purple];
const getColor = (i) => {
- return colors[i % colors.length];
+ return colorSets[i % colorSets.length];
};
export default defineComponent({
@@ -94,6 +106,11 @@ export default defineComponent({
required: false,
default: false
},
+ bar: {
+ type: Boolean,
+ required: false,
+ default: false
+ },
aspectRatio: {
type: Number,
required: false,
@@ -137,6 +154,43 @@ export default defineComponent({
}));
};
+ const tooltipShowing = ref(false);
+ const tooltipX = ref(0);
+ const tooltipY = ref(0);
+ const tooltipTitle = ref(null);
+ const tooltipSeries = ref(null);
+ let disposeTooltipComponent;
+
+ os.popup(MkChartTooltip, {
+ showing: tooltipShowing,
+ x: tooltipX,
+ y: tooltipY,
+ title: tooltipTitle,
+ series: tooltipSeries,
+ }, {}).then(({ dispose }) => {
+ disposeTooltipComponent = dispose;
+ });
+
+ function externalTooltipHandler(context) {
+ if (context.tooltip.opacity === 0) {
+ tooltipShowing.value = false;
+ return;
+ }
+
+ tooltipTitle.value = context.tooltip.title[0];
+ tooltipSeries.value = context.tooltip.body.map((b, i) => ({
+ backgroundColor: context.tooltip.labelColors[i].backgroundColor,
+ borderColor: context.tooltip.labelColors[i].borderColor,
+ text: b.lines[0],
+ }));
+
+ const rect = context.chart.canvas.getBoundingClientRect();
+
+ tooltipShowing.value = true;
+ tooltipX.value = rect.left + window.pageXOffset + context.tooltip.caretX;
+ tooltipY.value = rect.top + window.pageYOffset + context.tooltip.caretY;
+ }
+
const render = () => {
if (chartInstance) {
chartInstance.destroy();
@@ -148,22 +202,37 @@ export default defineComponent({
// フォントカラー
Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg');
+ const maxes = data.series.map((x, i) => Math.max(...x.data.map(d => d.y)));
+
chartInstance = new Chart(chartEl.value, {
- type: 'line',
+ type: props.bar ? 'bar' : 'line',
data: {
labels: new Array(props.limit).fill(0).map((_, i) => getDate(i).toLocaleString()).slice().reverse(),
datasets: data.series.map((x, i) => ({
parsing: false,
label: x.name,
data: x.data.slice().reverse(),
+ tension: 0.3,
pointRadius: 0,
- tension: 0,
- borderWidth: 2,
+ borderWidth: props.bar ? 0 : 2,
borderColor: x.color ? x.color : getColor(i),
borderDash: x.borderDash || [],
borderJoinStyle: 'round',
- backgroundColor: alpha(x.color ? x.color : getColor(i), 0.1),
+ borderRadius: props.bar ? 3 : undefined,
+ backgroundColor: props.bar ? (x.color ? x.color : getColor(i)) : alpha(x.color ? x.color : getColor(i), 0.1),
+ gradient: props.bar ? undefined : {
+ backgroundColor: {
+ axis: 'y',
+ colors: {
+ 0: alpha(x.color ? x.color : getColor(i), 0),
+ [maxes[i]]: alpha(x.color ? x.color : getColor(i), 0.175),
+ },
+ },
+ },
+ barPercentage: 0.9,
+ categoryPercentage: 0.9,
fill: x.type === 'area',
+ clip: 8,
hidden: !!x.hidden,
})),
},
@@ -172,7 +241,7 @@ export default defineComponent({
layout: {
padding: {
left: 0,
- right: 0,
+ right: 8,
top: 0,
bottom: 0,
},
@@ -180,6 +249,8 @@ export default defineComponent({
scales: {
x: {
type: 'time',
+ stacked: props.stacked,
+ offset: false,
time: {
stepSize: 1,
unit: props.span === 'day' ? 'month' : 'day',
@@ -190,6 +261,8 @@ export default defineComponent({
},
ticks: {
display: props.detailed,
+ maxRotation: 0,
+ autoSkipPadding: 16,
},
adapters: {
date: {
@@ -201,18 +274,28 @@ export default defineComponent({
y: {
position: 'left',
stacked: props.stacked,
+ suggestedMax: 100,
grid: {
color: gridColor,
borderColor: 'rgb(0, 0, 0, 0)',
},
ticks: {
display: props.detailed,
+ //mirror: true,
},
},
},
interaction: {
intersect: false,
+ mode: 'index',
},
+ elements: {
+ point: {
+ hoverRadius: 5,
+ hoverBorderWidth: 2,
+ },
+ },
+ animation: false,
plugins: {
legend: {
display: props.detailed,
@@ -222,12 +305,14 @@ export default defineComponent({
},
},
tooltip: {
+ enabled: false,
mode: 'index',
animation: {
duration: 0,
},
+ external: externalTooltipHandler,
},
- zoom: {
+ zoom: props.detailed ? {
pan: {
enabled: true,
},
@@ -253,7 +338,8 @@ export default defineComponent({
max: 'original',
},
}
- },
+ } : undefined,
+ gradient,
},
},
plugins: [{
@@ -284,31 +370,76 @@ export default defineComponent({
// TODO
};
- const fetchFederationInstancesChart = async (total: boolean): Promise<typeof data> => {
+ const fetchFederationChart = async (): Promise<typeof data> => {
const raw = await os.api('charts/federation', { limit: props.limit, span: props.span });
return {
series: [{
- name: 'Instances',
+ name: 'Received',
type: 'area',
- data: format(total
- ? raw.instance.total
- : sum(raw.instance.inc, negate(raw.instance.dec))
- ),
+ data: format(raw.inboxInstances),
+ color: colors.blue,
+ }, {
+ name: 'Delivered',
+ type: 'area',
+ data: format(raw.deliveredInstances),
+ color: colors.green,
+ }, {
+ name: 'Stalled',
+ type: 'area',
+ data: format(raw.stalled),
+ color: colors.red,
+ }, {
+ name: 'Pub & Sub',
+ type: 'area',
+ data: format(raw.pubsub),
+ color: colors.lime,
+ }, {
+ name: 'Pub',
+ type: 'area',
+ data: format(raw.pub),
+ color: colors.purple,
+ }, {
+ name: 'Sub',
+ type: 'area',
+ data: format(raw.sub),
+ color: colors.orange,
}],
};
};
+ const fetchApRequestChart = async (): Promise<typeof data> => {
+ const raw = await os.api('charts/ap-request', { limit: props.limit, span: props.span });
+ return {
+ series: [{
+ name: 'In',
+ type: 'area',
+ color: '#008FFB',
+ data: format(raw.inboxReceived)
+ }, {
+ name: 'Out (succ)',
+ type: 'area',
+ color: '#00E396',
+ data: format(raw.deliverSucceeded)
+ }, {
+ name: 'Out (fail)',
+ type: 'area',
+ color: '#FEB019',
+ data: format(raw.deliverFailed)
+ }]
+ };
+ };
+
const fetchNotesChart = async (type: string): Promise<typeof data> => {
const raw = await os.api('charts/notes', { limit: props.limit, span: props.span });
return {
series: [{
name: 'All',
type: 'line',
- borderDash: [5, 5],
data: format(type == 'combined'
? sum(raw.local.inc, negate(raw.local.dec), raw.remote.inc, negate(raw.remote.dec))
: sum(raw[type].inc, negate(raw[type].dec))
),
+ color: '#888888',
}, {
name: 'Renotes',
type: 'area',
@@ -316,6 +447,7 @@ export default defineComponent({
? sum(raw.local.diffs.renote, raw.remote.diffs.renote)
: raw[type].diffs.renote
),
+ color: colors.green,
}, {
name: 'Replies',
type: 'area',
@@ -323,6 +455,7 @@ export default defineComponent({
? sum(raw.local.diffs.reply, raw.remote.diffs.reply)
: raw[type].diffs.reply
),
+ color: colors.yellow,
}, {
name: 'Normal',
type: 'area',
@@ -330,6 +463,15 @@ export default defineComponent({
? sum(raw.local.diffs.normal, raw.remote.diffs.normal)
: raw[type].diffs.normal
),
+ color: colors.blue,
+ }, {
+ name: 'With file',
+ type: 'area',
+ data: format(type == 'combined'
+ ? sum(raw.local.diffs.withFile, raw.remote.diffs.withFile)
+ : raw[type].diffs.withFile
+ ),
+ color: colors.purple,
}],
};
};
@@ -385,17 +527,50 @@ export default defineComponent({
const raw = await os.api('charts/active-users', { limit: props.limit, span: props.span });
return {
series: [{
- name: 'Combined',
- type: 'line',
- data: format(sum(raw.local.users, raw.remote.users)),
+ name: 'Read & Write',
+ type: 'area',
+ data: format(raw.readWrite),
+ color: colors.orange,
}, {
- name: 'Local',
+ name: 'Write',
type: 'area',
- data: format(raw.local.users),
+ data: format(raw.write),
+ color: colors.lime,
}, {
- name: 'Remote',
+ name: 'Read',
+ type: 'area',
+ data: format(raw.read),
+ color: colors.blue,
+ }, {
+ name: '< Week',
+ type: 'area',
+ data: format(raw.registeredWithinWeek),
+ color: colors.green,
+ }, {
+ name: '< Month',
+ type: 'area',
+ data: format(raw.registeredWithinMonth),
+ color: colors.yellow,
+ }, {
+ name: '< Year',
type: 'area',
- data: format(raw.remote.users),
+ data: format(raw.registeredWithinYear),
+ color: colors.red,
+ }, {
+ name: '> Week',
+ type: 'area',
+ data: format(raw.registeredOutsideWeek),
+ color: colors.yellow,
+ }, {
+ name: '> Month',
+ type: 'area',
+ data: format(raw.registeredOutsideMonth),
+ color: colors.red,
+ }, {
+ name: '> Year',
+ type: 'area',
+ data: format(raw.registeredOutsideYear),
+ color: colors.purple,
}],
};
};
@@ -436,26 +611,6 @@ export default defineComponent({
};
};
- const fetchDriveTotalChart = async (): Promise<typeof data> => {
- const raw = await os.api('charts/drive', { limit: props.limit, span: props.span });
- return {
- bytes: true,
- series: [{
- name: 'Combined',
- type: 'line',
- data: format(sum(raw.local.totalSize, raw.remote.totalSize)),
- }, {
- name: 'Local',
- type: 'area',
- data: format(raw.local.totalSize),
- }, {
- name: 'Remote',
- type: 'area',
- data: format(raw.remote.totalSize),
- }],
- };
- };
-
const fetchDriveFilesChart = async (): Promise<typeof data> => {
const raw = await os.api('charts/drive', { limit: props.limit, span: props.span });
return {
@@ -491,25 +646,6 @@ export default defineComponent({
};
};
- const fetchDriveFilesTotalChart = async (): Promise<typeof data> => {
- const raw = await os.api('charts/drive', { limit: props.limit, span: props.span });
- return {
- series: [{
- name: 'Combined',
- type: 'line',
- data: format(sum(raw.local.totalCount, raw.remote.totalCount)),
- }, {
- name: 'Local',
- type: 'area',
- data: format(raw.local.totalCount),
- }, {
- name: 'Remote',
- type: 'area',
- data: format(raw.remote.totalCount),
- }],
- };
- };
-
const fetchInstanceRequestsChart = async (): Promise<typeof data> => {
const raw = await os.api('charts/instance', { host: props.args.host, limit: props.limit, span: props.span });
return {
@@ -622,20 +758,43 @@ export default defineComponent({
series: [...(props.args.withoutAll ? [] : [{
name: 'All',
type: 'line',
- borderDash: [5, 5],
data: format(sum(raw.inc, negate(raw.dec))),
+ color: '#888888',
}]), {
+ name: 'With file',
+ type: 'area',
+ data: format(raw.diffs.withFile),
+ color: colors.purple,
+ }, {
name: 'Renotes',
type: 'area',
data: format(raw.diffs.renote),
+ color: colors.green,
}, {
name: 'Replies',
type: 'area',
data: format(raw.diffs.reply),
+ color: colors.yellow,
}, {
name: 'Normal',
type: 'area',
data: format(raw.diffs.normal),
+ color: colors.blue,
+ }],
+ };
+ };
+
+ const fetchPerUserDriveChart = async (): Promise<typeof data> => {
+ const raw = await os.api('charts/user/drive', { userId: props.args.user.id, limit: props.limit, span: props.span });
+ return {
+ series: [{
+ name: 'Inc',
+ type: 'area',
+ data: format(raw.incSize),
+ }, {
+ name: 'Dec',
+ type: 'area',
+ data: format(raw.decSize),
}],
};
};
@@ -643,8 +802,8 @@ export default defineComponent({
const fetchAndRender = async () => {
const fetchData = () => {
switch (props.src) {
- case 'federation-instances': return fetchFederationInstancesChart(false);
- case 'federation-instances-total': return fetchFederationInstancesChart(true);
+ case 'federation': return fetchFederationChart();
+ case 'ap-request': return fetchApRequestChart();
case 'users': return fetchUsersChart(false);
case 'users-total': return fetchUsersChart(true);
case 'active-users': return fetchActiveUsersChart();
@@ -653,9 +812,7 @@ export default defineComponent({
case 'remote-notes': return fetchNotesChart('remote');
case 'notes-total': return fetchNotesTotalChart();
case 'drive': return fetchDriveChart();
- case 'drive-total': return fetchDriveTotalChart();
case 'drive-files': return fetchDriveFilesChart();
- case 'drive-files-total': return fetchDriveFilesTotalChart();
case 'instance-requests': return fetchInstanceRequestsChart();
case 'instance-users': return fetchInstanceUsersChart(false);
@@ -670,6 +827,7 @@ export default defineComponent({
case 'instance-drive-files-total': return fetchInstanceDriveFilesChart(true);
case 'per-user-notes': return fetchPerUserNotesChart();
+ case 'per-user-drive': return fetchPerUserDriveChart();
}
};
fetching.value = true;
@@ -684,6 +842,10 @@ export default defineComponent({
fetchAndRender();
});
+ onUnmounted(() => {
+ if (disposeTooltipComponent) disposeTooltipComponent();
+ });
+
return {
chartEl,
fetching,
diff --git a/packages/client/src/components/date-separated-list.vue b/packages/client/src/components/date-separated-list.vue
index c85a0a6ffc..085ef871e0 100644
--- a/packages/client/src/components/date-separated-list.vue
+++ b/packages/client/src/components/date-separated-list.vue
@@ -53,8 +53,8 @@ export default defineComponent({
if (el.key == null && item.id) el.key = item.id;
if (
- i != props.items.length - 1 &&
- new Date(item.createdAt).getDate() != new Date(props.items[i + 1].createdAt).getDate()
+ i !== props.items.length - 1 &&
+ new Date(item.createdAt).getDate() !== new Date(props.items[i + 1].createdAt).getDate()
) {
const separator = h('div', {
class: 'separator',
diff --git a/packages/client/src/components/emoji-picker.vue b/packages/client/src/components/emoji-picker.vue
index 6999ad6517..8601ea121c 100644
--- a/packages/client/src/components/emoji-picker.vue
+++ b/packages/client/src/components/emoji-picker.vue
@@ -1,5 +1,5 @@
<template>
-<div class="omfetrab" :class="['w' + width, 'h' + height, { big, asDrawer }]" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : undefined }">
+<div class="omfetrab" :class="['s' + size, 'w' + width, 'h' + height, { asDrawer }]" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : undefined }">
<input ref="search" v-model.trim="q" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" :placeholder="i18n.ts.search" @paste.stop="paste" @keyup.enter="done()">
<div ref="emojis" class="emojis">
<section class="result">
@@ -81,7 +81,7 @@ import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import Ripple from '@/components/ripple.vue';
import * as os from '@/os';
import { isTouchUsing } from '@/scripts/touch';
-import { isMobile } from '@/scripts/is-mobile';
+import { deviceKind } from '@/scripts/device-kind';
import { emojiCategories, instance } from '@/instance';
import XSection from './emoji-picker.section.vue';
import { i18n } from '@/i18n';
@@ -105,15 +105,16 @@ const emojis = ref<HTMLDivElement>();
const {
reactions: pinned,
+ reactionPickerSize,
reactionPickerWidth,
reactionPickerHeight,
disableShowingAnimatedImages,
recentlyUsedEmojis,
} = defaultStore.reactiveState;
+const size = computed(() => props.asReactionPicker ? reactionPickerSize.value : 1);
const width = computed(() => props.asReactionPicker ? reactionPickerWidth.value : 3);
const height = computed(() => props.asReactionPicker ? reactionPickerHeight.value : 2);
-const big = props.asReactionPicker ? isTouchUsing : false;
const customEmojiCategories = emojiCategories;
const customEmojis = instance.emojis;
const q = ref<string | null>(null);
@@ -263,7 +264,7 @@ watch(q, () => {
});
function focus() {
- if (!isMobile && !isTouchUsing) {
+ if (!['smartphone', 'tablet'].includes(deviceKind) && !isTouchUsing) {
search.value?.focus({
preventScroll: true
});
@@ -345,13 +346,20 @@ defineExpose({
<style lang="scss" scoped>
.omfetrab {
$pad: 8px;
- --eachSize: 40px;
display: flex;
flex-direction: column;
- &.big {
- --eachSize: 44px;
+ &.s1 {
+ --eachSize: 40px;
+ }
+
+ &.s2 {
+ --eachSize: 45px;
+ }
+
+ &.s3 {
+ --eachSize: 50px;
}
&.w1 {
@@ -369,6 +377,16 @@ defineExpose({
--columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
}
+ &.w4 {
+ width: calc((var(--eachSize) * 8) + (#{$pad} * 2));
+ --columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
+ }
+
+ &.w5 {
+ width: calc((var(--eachSize) * 9) + (#{$pad} * 2));
+ --columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
+ }
+
&.h1 {
height: calc((var(--eachSize) * 4) + (#{$pad} * 2));
}
@@ -381,6 +399,10 @@ defineExpose({
height: calc((var(--eachSize) * 8) + (#{$pad} * 2));
}
+ &.h4 {
+ height: calc((var(--eachSize) * 10) + (#{$pad} * 2));
+ }
+
&.asDrawer {
width: 100% !important;
diff --git a/packages/client/src/components/form/range.vue b/packages/client/src/components/form/range.vue
index 3e02cacb9b..a82348d317 100644
--- a/packages/client/src/components/form/range.vue
+++ b/packages/client/src/components/form/range.vue
@@ -117,7 +117,7 @@ export default defineComponent({
text: computed(() => {
return props.textConverter(finalValue.value);
}),
- source: thumbEl,
+ targetElement: thumbEl,
}, {}, 'closed');
const style = document.createElement('style');
diff --git a/packages/client/src/components/form/switch.vue b/packages/client/src/components/form/switch.vue
index f8a07b4caa..b5a30d635c 100644
--- a/packages/client/src/components/form/switch.vue
+++ b/packages/client/src/components/form/switch.vue
@@ -20,45 +20,33 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent, ref, toRefs } from 'vue';
+<script lang="ts" setup>
+import { toRefs, Ref } from 'vue';
import * as os from '@/os';
import Ripple from '@/components/ripple.vue';
-export default defineComponent({
- props: {
- modelValue: {
- type: Boolean,
- default: false
- },
- disabled: {
- type: Boolean,
- default: false
- }
- },
+const props = defineProps<{
+ modelValue: boolean | Ref<boolean>;
+ disabled?: boolean;
+}>();
- setup(props, context) {
- const button = ref<HTMLElement>();
- const checked = toRefs(props).modelValue;
- const toggle = () => {
- if (props.disabled) return;
- context.emit('update:modelValue', !checked.value);
+const emit = defineEmits<{
+ (e: 'update:modelValue', v: boolean): void;
+}>();
- if (!checked.value) {
- const rect = button.value.getBoundingClientRect();
- const x = rect.left + (button.value.offsetWidth / 2);
- const y = rect.top + (button.value.offsetHeight / 2);
- os.popup(Ripple, { x, y, particle: false }, {}, 'end');
- }
- };
+let button = $ref<HTMLElement>();
+const checked = toRefs(props).modelValue;
+const toggle = () => {
+ if (props.disabled) return;
+ emit('update:modelValue', !checked.value);
- return {
- button,
- checked,
- toggle,
- };
- },
-});
+ if (!checked.value) {
+ const rect = button.getBoundingClientRect();
+ const x = rect.left + (button.offsetWidth / 2);
+ const y = rect.top + (button.offsetHeight / 2);
+ os.popup(Ripple, { x, y, particle: false }, {}, 'end');
+ }
+};
</script>
<style lang="scss" scoped>
diff --git a/packages/client/src/components/global/a.vue b/packages/client/src/components/global/a.vue
index b1b6a0cdaf..52fef50f9b 100644
--- a/packages/client/src/components/global/a.vue
+++ b/packages/client/src/components/global/a.vue
@@ -23,8 +23,9 @@ const props = withDefaults(defineProps<{
behavior: null,
});
-const navHook = inject('navHook', null);
-const sideViewHook = inject('sideViewHook', null);
+type Navigate = (path: string, record?: boolean) => void;
+const navHook = inject<null | Navigate>('navHook', null);
+const sideViewHook = inject<null | Navigate>('sideViewHook', null);
const active = $computed(() => {
if (props.activeClass == null) return false;
diff --git a/packages/client/src/components/global/spacer.vue b/packages/client/src/components/global/spacer.vue
index 8a1d7a4e8a..f2eda1907b 100644
--- a/packages/client/src/components/global/spacer.vue
+++ b/packages/client/src/components/global/spacer.vue
@@ -7,6 +7,7 @@
</template>
<script lang="ts">
+import { deviceKind } from '@/scripts/device-kind';
import { defineComponent, inject, onMounted, onUnmounted, ref } from 'vue';
export default defineComponent({
@@ -35,7 +36,7 @@ export default defineComponent({
const margin = ref(0);
const shouldSpacerMin = inject('shouldSpacerMin', false);
const adjust = (rect: { width: number; height: number; }) => {
- if (shouldSpacerMin) {
+ if (shouldSpacerMin || deviceKind === 'smartphone') {
margin.value = props.marginMin;
return;
}
diff --git a/packages/client/src/components/google.vue b/packages/client/src/components/google.vue
index 210ca72bfe..bb4b439ee8 100644
--- a/packages/client/src/components/google.vue
+++ b/packages/client/src/components/google.vue
@@ -1,7 +1,7 @@
<template>
<div class="mk-google">
<input v-model="query" type="search" :placeholder="q">
- <button @click="search"><i class="fas fa-search"></i> {{ $ts.search }}</button>
+ <button @click="search"><i class="fas fa-search"></i> {{ $ts.searchByGoogle }}</button>
</div>
</template>
diff --git a/packages/client/src/components/instance-stats.vue b/packages/client/src/components/instance-stats.vue
index 409c3a49ca..f386a8de9a 100644
--- a/packages/client/src/components/instance-stats.vue
+++ b/packages/client/src/components/instance-stats.vue
@@ -3,8 +3,8 @@
<div class="selects" style="display: flex;">
<MkSelect v-model="chartSrc" style="margin: 0; flex: 1;">
<optgroup :label="$ts.federation">
- <option value="federation-instances">{{ $ts._charts.federationInstancesIncDec }}</option>
- <option value="federation-instances-total">{{ $ts._charts.federationInstancesTotal }}</option>
+ <option value="federation">{{ $ts._charts.federation }}</option>
+ <option value="ap-request">{{ $ts._charts.apRequest }}</option>
</optgroup>
<optgroup :label="$ts.users">
<option value="users">{{ $ts._charts.usersIncDec }}</option>
@@ -19,9 +19,7 @@
</optgroup>
<optgroup :label="$ts.drive">
<option value="drive-files">{{ $ts._charts.filesIncDec }}</option>
- <option value="drive-files-total">{{ $ts._charts.filesTotal }}</option>
<option value="drive">{{ $ts._charts.storageUsageIncDec }}</option>
- <option value="drive-total">{{ $ts._charts.storageUsageTotal }}</option>
</optgroup>
</MkSelect>
<MkSelect v-model="chartSpan" style="margin: 0 0 0 10px;">
@@ -61,7 +59,7 @@ export default defineComponent({
setup() {
const chartSpan = ref<'hour' | 'day'>('hour');
- const chartSrc = ref('notes');
+ const chartSrc = ref('active-users');
return {
chartSrc,
diff --git a/packages/client/src/components/instance-ticker.vue b/packages/client/src/components/instance-ticker.vue
index 77fd8bb344..9b0a18ec90 100644
--- a/packages/client/src/components/instance-ticker.vue
+++ b/packages/client/src/components/instance-ticker.vue
@@ -7,15 +7,27 @@
<script lang="ts" setup>
import { } from 'vue';
+import { instanceName } from '@/config';
const props = defineProps<{
- instance: any; // TODO
+ instance?: {
+ faviconUrl?: string
+ name: string
+ themeColor?: string
+ }
}>();
-const themeColor = props.instance.themeColor || '#777777';
+// if no instance data is given, this is for the local instance
+const instance = props.instance ?? {
+ faviconUrl: '/favicon.ico',
+ name: instanceName,
+ themeColor: (document.querySelector('meta[name="theme-color-orig"]') as HTMLMetaElement)?.content
+};
+
+const themeColor = instance.themeColor ?? '#777777';
const bg = {
- background: `linear-gradient(90deg, ${themeColor}, ${themeColor + '00'})`
+ background: `linear-gradient(90deg, ${themeColor}, ${themeColor}00)`
};
</script>
diff --git a/packages/client/src/components/launch-pad.vue b/packages/client/src/components/launch-pad.vue
index 9076cfb39f..ff8e995fd2 100644
--- a/packages/client/src/components/launch-pad.vue
+++ b/packages/client/src/components/launch-pad.vue
@@ -1,6 +1,6 @@
<template>
-<MkModal ref="modal" :prefer-type="'dialog'" @click="$refs.modal.close()" @closed="$emit('closed')">
- <div class="szkkfdyq _popup">
+<MkModal ref="modal" v-slot="{ type, maxHeight }" :prefer-type="preferedModalType" :transparent-bg="true" :src="src" @click="modal.close()" @closed="emit('closed')">
+ <div class="szkkfdyq _popup _shadow" :class="{ asDrawer: type === 'drawer' }" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : '' }">
<div class="main">
<template v-for="item in items">
<button v-if="item.action" v-click-anime class="_button" @click="$event => { item.action($event); close(); }">
@@ -33,97 +33,94 @@
</MkModal>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { } from 'vue';
import MkModal from '@/components/ui/modal.vue';
import { menuDef } from '@/menu';
import { instanceName } from '@/config';
+import { defaultStore } from '@/store';
+import { i18n } from '@/i18n';
+import { deviceKind } from '@/scripts/device-kind';
-export default defineComponent({
- components: {
- MkModal,
- },
+const props = withDefaults(defineProps<{
+ src?: HTMLElement;
+}>(), {
+});
- emits: ['closed'],
+const emit = defineEmits<{
+ (ev: 'closed'): void;
+}>();
- data() {
- return {
- menuDef: menuDef,
- items: [],
- instanceName,
- };
- },
+const preferedModalType = (deviceKind === 'desktop' && props.src != null) ? 'popup' :
+ deviceKind === 'smartphone' ? 'drawer' :
+ 'dialog';
- computed: {
- menu(): string[] {
- return this.$store.state.menu;
- },
- },
+const modal = $ref<InstanceType<typeof MkModal>>();
- created() {
- this.items = Object.keys(this.menuDef).filter(k => !this.menu.includes(k)).map(k => this.menuDef[k]).filter(def => def.show == null ? true : def.show).map(def => ({
- type: def.to ? 'link' : 'button',
- text: this.$ts[def.title],
- icon: def.icon,
- to: def.to,
- action: def.action,
- indicate: def.indicated,
- }));
- },
+const menu = defaultStore.state.menu;
- methods: {
- close() {
- this.$refs.modal.close();
- }
- }
-});
+const items = Object.keys(menuDef).filter(k => !menu.includes(k)).map(k => menuDef[k]).filter(def => def.show == null ? true : def.show).map(def => ({
+ type: def.to ? 'link' : 'button',
+ text: i18n.ts[def.title],
+ icon: def.icon,
+ to: def.to,
+ action: def.action,
+ indicate: def.indicated,
+}));
+
+function close() {
+ modal.close();
+}
</script>
<style lang="scss" scoped>
.szkkfdyq {
- width: 100%;
max-height: 100%;
- max-width: 800px;
- padding: 32px;
+ width: min(460px, 100vw);
+ padding: 24px;
box-sizing: border-box;
overflow: auto;
- text-align: center;
+ overscroll-behavior: contain;
+ text-align: left;
border-radius: 16px;
- @media (max-width: 500px) {
- padding: 16px;
+ &.asDrawer {
+ width: 100%;
+ padding: 16px 16px calc(env(safe-area-inset-bottom, 0px) + 16px) 16px;
+ border-radius: 24px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ text-align: center;
}
-
+
> .main, > .sub {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
+
> * {
position: relative;
- display: inline-flex;
+ display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
vertical-align: bottom;
- width: 128px;
- height: 128px;
- border-radius: var(--radius);
-
- @media (max-width: 500px) {
- width: 100px;
- height: 100px;
- }
+ height: 100px;
+ border-radius: 10px;
&:hover {
- background: rgba(0, 0, 0, 0.05);
+ color: var(--accent);
+ background: var(--accentedBg);
text-decoration: none;
}
> .icon {
- font-size: 26px;
- height: 32px;
+ font-size: 24px;
+ height: 24px;
}
> .text {
- margin-top: 8px;
- font-size: 0.9em;
+ margin-top: 12px;
+ font-size: 0.8em;
line-height: 1.5em;
}
diff --git a/packages/client/src/components/mfm.ts b/packages/client/src/components/mfm.ts
index 2e6d26476a..37076652fd 100644
--- a/packages/client/src/components/mfm.ts
+++ b/packages/client/src/components/mfm.ts
@@ -45,7 +45,7 @@ export default defineComponent({
},
render() {
- if (this.text == null || this.text == '') return;
+ if (this.text == null || this.text === '') return;
const ast = (this.plain ? mfm.parsePlain : mfm.parse)(this.text, { fnNameList: MFM_TAGS });
diff --git a/packages/client/src/components/note-detailed.vue b/packages/client/src/components/note-detailed.vue
index 5fc3a0f334..80233d608a 100644
--- a/packages/client/src/components/note-detailed.vue
+++ b/packages/client/src/components/note-detailed.vue
@@ -154,11 +154,13 @@ const props = defineProps<{
const inChannel = inject('inChannel', null);
+const note = $ref(JSON.parse(JSON.stringify(props.note)));
+
const isRenote = (
- props.note.renote != null &&
- props.note.text == null &&
- props.note.fileIds.length === 0 &&
- props.note.poll == null
+ note.renote != null &&
+ note.text == null &&
+ note.fileIds.length === 0 &&
+ note.poll == null
);
const el = ref<HTMLElement>();
@@ -166,8 +168,8 @@ const menuButton = ref<HTMLElement>();
const renoteButton = ref<InstanceType<typeof XRenoteButton>>();
const renoteTime = ref<HTMLElement>();
const reactButton = ref<HTMLElement>();
-let appearNote = $ref(isRenote ? props.note.renote as misskey.entities.Note : props.note);
-const isMyRenote = $i && ($i.id === props.note.userId);
+let appearNote = $ref(isRenote ? note.renote as misskey.entities.Note : note);
+const isMyRenote = $i && ($i.id === note.userId);
const showContent = ref(false);
const isDeleted = ref(false);
const muted = ref(checkWordMute(appearNote, $i, defaultStore.state.mutedWords));
@@ -188,8 +190,9 @@ const keymap = {
};
useNoteCapture({
- appearNote: $$(appearNote),
rootEl: el,
+ note: $$(appearNote),
+ isDeletedRef: isDeleted,
});
function reply(viaKeyboard = false): void {
@@ -237,12 +240,12 @@ function onContextmenu(ev: MouseEvent): void {
ev.preventDefault();
react();
} else {
- os.contextMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), ev).then(focus);
+ os.contextMenu(getNoteMenu({ note: note, translating, translation, menuButton }), ev).then(focus);
}
}
function menu(viaKeyboard = false): void {
- os.popupMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), menuButton.value, {
+ os.popupMenu(getNoteMenu({ note: note, translating, translation, menuButton }), menuButton.value, {
viaKeyboard
}).then(focus);
}
@@ -255,7 +258,7 @@ function showRenoteMenu(viaKeyboard = false): void {
danger: true,
action: () => {
os.api('notes/delete', {
- noteId: props.note.id
+ noteId: note.id
});
isDeleted.value = true;
}
diff --git a/packages/client/src/components/note.vue b/packages/client/src/components/note.vue
index 6c596fb60d..93286a28b2 100644
--- a/packages/client/src/components/note.vue
+++ b/packages/client/src/components/note.vue
@@ -138,11 +138,13 @@ const props = defineProps<{
const inChannel = inject('inChannel', null);
+const note = $ref(JSON.parse(JSON.stringify(props.note)));
+
const isRenote = (
- props.note.renote != null &&
- props.note.text == null &&
- props.note.fileIds.length === 0 &&
- props.note.poll == null
+ note.renote != null &&
+ note.text == null &&
+ note.fileIds.length === 0 &&
+ note.poll == null
);
const el = ref<HTMLElement>();
@@ -150,8 +152,8 @@ const menuButton = ref<HTMLElement>();
const renoteButton = ref<InstanceType<typeof XRenoteButton>>();
const renoteTime = ref<HTMLElement>();
const reactButton = ref<HTMLElement>();
-let appearNote = $ref(isRenote ? props.note.renote as misskey.entities.Note : props.note);
-const isMyRenote = $i && ($i.id === props.note.userId);
+let appearNote = $ref(isRenote ? note.renote as misskey.entities.Note : note);
+const isMyRenote = $i && ($i.id === note.userId);
const showContent = ref(false);
const collapsed = ref(appearNote.cw == null && appearNote.text != null && (
(appearNote.text.split('\n').length > 9) ||
@@ -176,8 +178,9 @@ const keymap = {
};
useNoteCapture({
- appearNote: $$(appearNote),
rootEl: el,
+ note: $$(appearNote),
+ isDeletedRef: isDeleted,
});
function reply(viaKeyboard = false): void {
@@ -225,12 +228,12 @@ function onContextmenu(ev: MouseEvent): void {
ev.preventDefault();
react();
} else {
- os.contextMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), ev).then(focus);
+ os.contextMenu(getNoteMenu({ note: note, translating, translation, menuButton }), ev).then(focus);
}
}
function menu(viaKeyboard = false): void {
- os.popupMenu(getNoteMenu({ note: props.note, translating, translation, menuButton }), menuButton.value, {
+ os.popupMenu(getNoteMenu({ note: note, translating, translation, menuButton }), menuButton.value, {
viaKeyboard
}).then(focus);
}
@@ -243,7 +246,7 @@ function showRenoteMenu(viaKeyboard = false): void {
danger: true,
action: () => {
os.api('notes/delete', {
- noteId: props.note.id
+ noteId: note.id
});
isDeleted.value = true;
}
diff --git a/packages/client/src/components/notification-toast.vue b/packages/client/src/components/notification-toast.vue
index b2ab1029ad..4c5783e523 100644
--- a/packages/client/src/components/notification-toast.vue
+++ b/packages/client/src/components/notification-toast.vue
@@ -6,33 +6,26 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { onMounted } from 'vue';
import XNotification from './notification.vue';
import * as os from '@/os';
-export default defineComponent({
- components: {
- XNotification
- },
- props: {
- notification: {
- type: Object,
- required: true
- }
- },
- emits: ['closed'],
- data() {
- return {
- showing: true,
- zIndex: os.claimZIndex('high'),
- };
- },
- mounted() {
- window.setTimeout(() => {
- this.showing = false;
- }, 6000);
- }
+defineProps<{
+ notification: any; // TODO
+}>();
+
+const emit = defineEmits<{
+ (ev: 'closed'): void;
+}>();
+
+const zIndex = os.claimZIndex('high');
+let showing = $ref(true);
+
+onMounted(() => {
+ window.setTimeout(() => {
+ showing = false;
+ }, 6000);
});
</script>
diff --git a/packages/client/src/components/notification.vue b/packages/client/src/components/notification.vue
index 5659c899be..d855f81f8a 100644
--- a/packages/client/src/components/notification.vue
+++ b/packages/client/src/components/notification.vue
@@ -153,7 +153,7 @@ export default defineComponent({
showing,
reaction: props.notification.reaction ? props.notification.reaction.replace(/^:(\w+):$/, ':$1@.:') : props.notification.reaction,
emojis: props.notification.note.emojis,
- source: reactionRef.value.$el,
+ targetElement: reactionRef.value.$el,
}, {}, 'closed');
});
diff --git a/packages/client/src/components/post-form.vue b/packages/client/src/components/post-form.vue
index 8c5027f8e7..656689ddcb 100644
--- a/packages/client/src/components/post-form.vue
+++ b/packages/client/src/components/post-form.vue
@@ -135,7 +135,10 @@ let showPreview = $ref(false);
let cw = $ref<string | null>(null);
let localOnly = $ref<boolean>(props.initialLocalOnly ?? defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly);
let visibility = $ref(props.initialVisibility ?? (defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility) as typeof misskey.noteVisibilities[number]);
-let visibleUsers = $ref(props.initialVisibleUsers ?? []);
+let visibleUsers = $ref([]);
+if (props.initialVisibleUsers) {
+ props.initialVisibleUsers.forEach(pushVisibleUser);
+}
let autocomplete = $ref(null);
let draghover = $ref(false);
let quoteId = $ref(null);
@@ -262,12 +265,12 @@ if (props.reply && ['home', 'followers', 'specified'].includes(props.reply.visib
os.api('users/show', {
userIds: props.reply.visibleUserIds.filter(uid => uid !== $i.id && uid !== props.reply.userId)
}).then(users => {
- visibleUsers.push(...users);
+ users.forEach(pushVisibleUser);
});
if (props.reply.userId !== $i.id) {
os.api('users/show', { userId: props.reply.userId }).then(user => {
- visibleUsers.push(user);
+ pushVisibleUser(user);
});
}
}
@@ -275,7 +278,7 @@ if (props.reply && ['home', 'followers', 'specified'].includes(props.reply.visib
if (props.specified) {
visibility = 'specified';
- visibleUsers.push(props.specified);
+ pushVisibleUser(props.specified);
}
// keep cw when reply
@@ -338,7 +341,10 @@ function addTag(tag: string) {
}
function focus() {
- textareaEl.focus();
+ if (textareaEl) {
+ textareaEl.focus();
+ textareaEl.setSelectionRange(textareaEl.value.length, textareaEl.value.length);
+ }
}
function chooseFileFrom(ev) {
@@ -397,9 +403,15 @@ function setVisibility() {
}, 'closed');
}
+function pushVisibleUser(user) {
+ if (!visibleUsers.some(u => u.username === user.username && u.host === user.host)) {
+ visibleUsers.push(user);
+ }
+}
+
function addVisibleUser() {
os.selectUser().then(user => {
- visibleUsers.push(user);
+ pushVisibleUser(user);
});
}
@@ -540,8 +552,8 @@ async function post() {
};
if (withHashtags && hashtags && hashtags.trim() !== '') {
- const hashtags = hashtags.trim().split(' ').map(x => x.startsWith('#') ? x : '#' + x).join(' ');
- data.text = data.text ? `${data.text} ${hashtags}` : hashtags;
+ const hashtags_ = hashtags.trim().split(' ').map(x => x.startsWith('#') ? x : '#' + x).join(' ');
+ data.text = data.text ? `${data.text} ${hashtags_}` : hashtags_;
}
// plugin
@@ -565,9 +577,9 @@ async function post() {
deleteDraft();
emit('posted');
if (data.text && data.text != '') {
- const hashtags = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
+ const hashtags_ = mfm.parse(data.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
- localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
+ localStorage.setItem('hashtags', JSON.stringify(unique(hashtags_.concat(history))));
}
posting = false;
postAccount = null;
diff --git a/packages/client/src/components/reaction-tooltip.vue b/packages/client/src/components/reaction-tooltip.vue
index 1b2a024e21..b53061df48 100644
--- a/packages/client/src/components/reaction-tooltip.vue
+++ b/packages/client/src/components/reaction-tooltip.vue
@@ -1,5 +1,5 @@
<template>
-<MkTooltip ref="tooltip" :source="source" :max-width="340" @closed="emit('closed')">
+<MkTooltip ref="tooltip" :target-element="targetElement" :max-width="340" @closed="emit('closed')">
<div class="beeadbfb">
<XReactionIcon :reaction="reaction" :custom-emojis="emojis" class="icon" :no-style="true"/>
<div class="name">{{ reaction.replace('@.', '') }}</div>
@@ -15,11 +15,11 @@ import XReactionIcon from './reaction-icon.vue';
const props = defineProps<{
reaction: string;
emojis: any[]; // TODO
- source: any; // TODO
+ targetElement: HTMLElement;
}>();
const emit = defineEmits<{
- (e: 'closed'): void;
+ (ev: 'closed'): void;
}>();
</script>
diff --git a/packages/client/src/components/reactions-viewer.details.vue b/packages/client/src/components/reactions-viewer.details.vue
index 8cec8dfa2f..eb889c4888 100644
--- a/packages/client/src/components/reactions-viewer.details.vue
+++ b/packages/client/src/components/reactions-viewer.details.vue
@@ -1,5 +1,5 @@
<template>
-<MkTooltip ref="tooltip" :source="source" :max-width="340" @closed="emit('closed')">
+<MkTooltip ref="tooltip" :target-element="targetElement" :max-width="340" @closed="emit('closed')">
<div class="bqxuuuey">
<div class="reaction">
<XReactionIcon :reaction="reaction" :custom-emojis="emojis" class="icon" :no-style="true"/>
@@ -26,11 +26,11 @@ const props = defineProps<{
users: any[]; // TODO
count: number;
emojis: any[]; // TODO
- source: any; // TODO
+ targetElement: HTMLElement;
}>();
const emit = defineEmits<{
- (e: 'closed'): void;
+ (ev: 'closed'): void;
}>();
</script>
diff --git a/packages/client/src/components/reactions-viewer.reaction.vue b/packages/client/src/components/reactions-viewer.reaction.vue
index bbf518549c..7dc079fde6 100644
--- a/packages/client/src/components/reactions-viewer.reaction.vue
+++ b/packages/client/src/components/reactions-viewer.reaction.vue
@@ -101,7 +101,7 @@ export default defineComponent({
emojis: props.note.emojis,
users,
count: props.count,
- source: buttonRef.value
+ targetElement: buttonRef.value,
}, {}, 'closed');
});
diff --git a/packages/client/src/components/renote-button.vue b/packages/client/src/components/renote-button.vue
index c1c0d285e1..8d9f08b4c2 100644
--- a/packages/client/src/components/renote-button.vue
+++ b/packages/client/src/components/renote-button.vue
@@ -52,7 +52,7 @@ export default defineComponent({
showing,
users,
count: props.count,
- source: buttonRef.value
+ targetElement: buttonRef.value
}, {}, 'closed');
});
diff --git a/packages/client/src/components/renote.details.vue b/packages/client/src/components/renote.details.vue
index cdbc71bdce..2df19bcd3f 100644
--- a/packages/client/src/components/renote.details.vue
+++ b/packages/client/src/components/renote.details.vue
@@ -1,5 +1,5 @@
<template>
-<MkTooltip ref="tooltip" :source="source" :max-width="250" @closed="emit('closed')">
+<MkTooltip ref="tooltip" :target-element="targetElement" :max-width="250" @closed="emit('closed')">
<div class="beaffaef">
<div v-for="u in users" :key="u.id" class="user">
<MkAvatar class="avatar" :user="u"/>
@@ -17,11 +17,11 @@ import MkTooltip from './ui/tooltip.vue';
const props = defineProps<{
users: any[]; // TODO
count: number;
- source: any; // TODO
+ targetElement: HTMLElement;
}>();
const emit = defineEmits<{
- (e: 'closed'): void;
+ (ev: 'closed'): void;
}>();
</script>
diff --git a/packages/client/src/components/toast.vue b/packages/client/src/components/toast.vue
index c114379716..99933f3846 100644
--- a/packages/client/src/components/toast.vue
+++ b/packages/client/src/components/toast.vue
@@ -22,12 +22,12 @@ const emit = defineEmits<{
(e: 'closed'): void;
}>();
-const showing = ref(true);
const zIndex = os.claimZIndex('high');
+let showing = $ref(true);
onMounted(() => {
window.setTimeout(() => {
- showing.value = false;
+ showing = false;
}, 4000);
});
</script>
diff --git a/packages/client/src/components/ui/context-menu.vue b/packages/client/src/components/ui/context-menu.vue
index 85606bf6d5..f491b43b46 100644
--- a/packages/client/src/components/ui/context-menu.vue
+++ b/packages/client/src/components/ui/context-menu.vue
@@ -1,88 +1,71 @@
<template>
<transition :name="$store.state.animation ? 'fade' : ''" appear>
- <div class="nvlagfpb" :style="{ zIndex }" @contextmenu.prevent.stop="() => {}">
+ <div ref="rootEl" class="nvlagfpb" :style="{ zIndex }" @contextmenu.prevent.stop="() => {}">
<MkMenu :items="items" class="_popup _shadow" :align="'left'" @close="$emit('closed')"/>
</div>
</transition>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { onMounted, onBeforeUnmount } from 'vue';
import contains from '@/scripts/contains';
import MkMenu from './menu.vue';
+import { MenuItem } from './types/menu.vue';
import * as os from '@/os';
-export default defineComponent({
- components: {
- MkMenu,
- },
- props: {
- items: {
- type: Array,
- required: true
- },
- ev: {
- required: true
- },
- viaKeyboard: {
- type: Boolean,
- required: false
- },
- },
- emits: ['closed'],
- data() {
- return {
- zIndex: os.claimZIndex('high'),
- };
- },
- computed: {
- keymap(): any {
- return {
- 'esc': () => this.$emit('closed'),
- };
- },
- },
- mounted() {
- let left = this.ev.pageX + 1; // 間違って右ダブルクリックした場合に意図せずアイテムがクリックされるのを防ぐため + 1
- let top = this.ev.pageY + 1; // 間違って右ダブルクリックした場合に意図せずアイテムがクリックされるのを防ぐため + 1
+const props = defineProps<{
+ items: MenuItem[];
+ ev: MouseEvent;
+}>();
- const width = this.$el.offsetWidth;
- const height = this.$el.offsetHeight;
+const emit = defineEmits<{
+ (e: 'closed'): void;
+}>();
- if (left + width - window.pageXOffset > window.innerWidth) {
- left = window.innerWidth - width + window.pageXOffset;
- }
+let rootEl = $ref<HTMLDivElement>();
- if (top + height - window.pageYOffset > window.innerHeight) {
- top = window.innerHeight - height + window.pageYOffset;
- }
+let zIndex = $ref<number>(os.claimZIndex('high'));
- if (top < 0) {
- top = 0;
- }
+onMounted(() => {
+ let left = props.ev.pageX + 1; // 間違って右ダブルクリックした場合に意図せずアイテムがクリックされるのを防ぐため + 1
+ let top = props.ev.pageY + 1; // 間違って右ダブルクリックした場合に意図せずアイテムがクリックされるのを防ぐため + 1
- if (left < 0) {
- left = 0;
- }
+ const width = rootEl.offsetWidth;
+ const height = rootEl.offsetHeight;
- this.$el.style.top = top + 'px';
- this.$el.style.left = left + 'px';
+ if (left + width - window.pageXOffset > window.innerWidth) {
+ left = window.innerWidth - width + window.pageXOffset;
+ }
+
+ if (top + height - window.pageYOffset > window.innerHeight) {
+ top = window.innerHeight - height + window.pageYOffset;
+ }
- for (const el of Array.from(document.querySelectorAll('body *'))) {
- el.addEventListener('mousedown', this.onMousedown);
- }
- },
- beforeUnmount() {
- for (const el of Array.from(document.querySelectorAll('body *'))) {
- el.removeEventListener('mousedown', this.onMousedown);
- }
- },
- methods: {
- onMousedown(e) {
- if (!contains(this.$el, e.target) && (this.$el != e.target)) this.$emit('closed');
- },
+ if (top < 0) {
+ top = 0;
+ }
+
+ if (left < 0) {
+ left = 0;
+ }
+
+ rootEl.style.top = `${top}px`;
+ rootEl.style.left = `${left}px`;
+
+ for (const el of Array.from(document.querySelectorAll('body *'))) {
+ el.addEventListener('mousedown', onMousedown);
+ }
+});
+
+onBeforeUnmount(() => {
+ for (const el of Array.from(document.querySelectorAll('body *'))) {
+ el.removeEventListener('mousedown', onMousedown);
}
});
+
+function onMousedown(e: Event) {
+ if (!contains(rootEl, e.target) && (rootEl != e.target)) emit('closed');
+}
</script>
<style lang="scss" scoped>
diff --git a/packages/client/src/components/ui/menu.vue b/packages/client/src/components/ui/menu.vue
index 41165c8d33..a93cc8cda8 100644
--- a/packages/client/src/components/ui/menu.vue
+++ b/packages/client/src/components/ui/menu.vue
@@ -1,8 +1,8 @@
<template>
-<div ref="items" v-hotkey="keymap"
+<div ref="itemsEl" v-hotkey="keymap"
class="rrevdjwt"
:class="{ center: align === 'center', asDrawer }"
- :style="{ width: (width && !asDrawer) ? width + 'px' : null, maxHeight: maxHeight ? maxHeight + 'px' : null }"
+ :style="{ width: (width && !asDrawer) ? width + 'px' : '', maxHeight: maxHeight ? maxHeight + 'px' : '' }"
@contextmenu.self="e => e.preventDefault()"
>
<template v-for="(item, i) in items2">
@@ -28,6 +28,9 @@
<MkAvatar :user="item.user" class="avatar"/><MkUserName :user="item.user"/>
<span v-if="item.indicate" class="indicator"><i class="fas fa-circle"></i></span>
</button>
+ <span v-else-if="item.type === 'switch'" :tabindex="i" class="item">
+ <FormSwitch v-model="item.ref" :disabled="item.disabled" class="form-switch">{{ item.text }}</FormSwitch>
+ </span>
<button v-else :tabindex="i" class="_button item" :class="{ danger: item.danger, active: item.active }" :disabled="item.active" @click="clicked(item.action, $event)">
<i v-if="item.icon" class="fa-fw" :class="item.icon"></i>
<MkAvatar v-if="item.avatar" :user="item.avatar" class="avatar"/>
@@ -41,114 +44,78 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent, ref, unref } from 'vue';
+<script lang="ts" setup>
+import { nextTick, onMounted, watch } from 'vue';
import { focusPrev, focusNext } from '@/scripts/focus';
-import contains from '@/scripts/contains';
+import FormSwitch from '@/components/form/switch.vue';
+import { MenuItem, InnerMenuItem, MenuPending, MenuAction } from '@/types/menu';
-export default defineComponent({
- props: {
- items: {
- type: Array,
- required: true
- },
- viaKeyboard: {
- type: Boolean,
- required: false
- },
- asDrawer: {
- type: Boolean,
- required: false
- },
- align: {
- type: String,
- requried: false
- },
- width: {
- type: Number,
- required: false
- },
- maxHeight: {
- type: Number,
- required: false
- },
- },
- emits: ['close'],
- data() {
- return {
- items2: [],
- };
- },
- computed: {
- keymap(): any {
- return {
- 'up|k|shift+tab': this.focusUp,
- 'down|j|tab': this.focusDown,
- 'esc': this.close,
- };
- },
- },
- watch: {
- items: {
- handler() {
- const items = ref(unref(this.items).filter(item => item !== undefined));
+const props = defineProps<{
+ items: MenuItem[];
+ viaKeyboard?: boolean;
+ asDrawer?: boolean;
+ align?: 'center' | string;
+ width?: number;
+ maxHeight?: number;
+}>();
- for (let i = 0; i < items.value.length; i++) {
- const item = items.value[i];
-
- if (item && item.then) { // if item is Promise
- items.value[i] = { type: 'pending' };
- item.then(actualItem => {
- items.value[i] = actualItem;
- });
- }
- }
+const emit = defineEmits<{
+ (e: 'close'): void;
+}>();
- this.items2 = items;
- },
- immediate: true
- }
- },
- mounted() {
- if (this.viaKeyboard) {
- this.$nextTick(() => {
- focusNext(this.$refs.items.children[0], true, false);
+let itemsEl = $ref<HTMLDivElement>();
+
+let items2: InnerMenuItem[] = $ref([]);
+
+let keymap = $computed(() => ({
+ 'up|k|shift+tab': focusUp,
+ 'down|j|tab': focusDown,
+ 'esc': close,
+}));
+
+watch(() => props.items, () => {
+ const items: (MenuItem | MenuPending)[] = [...props.items].filter(item => item !== undefined);
+
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+
+ if (item && 'then' in item) { // if item is Promise
+ items[i] = { type: 'pending' };
+ item.then(actualItem => {
+ items2[i] = actualItem;
});
}
+ }
- if (this.contextmenuEvent) {
- this.$el.style.top = this.contextmenuEvent.pageY + 'px';
- this.$el.style.left = this.contextmenuEvent.pageX + 'px';
+ items2 = items as InnerMenuItem[];
+}, {
+ immediate: true,
+});
- for (const el of Array.from(document.querySelectorAll('body *'))) {
- el.addEventListener('mousedown', this.onMousedown);
- }
- }
- },
- beforeUnmount() {
- for (const el of Array.from(document.querySelectorAll('body *'))) {
- el.removeEventListener('mousedown', this.onMousedown);
- }
- },
- methods: {
- clicked(fn, ev) {
- fn(ev);
- this.close();
- },
- close() {
- this.$emit('close');
- },
- focusUp() {
- focusPrev(document.activeElement);
- },
- focusDown() {
- focusNext(document.activeElement);
- },
- onMousedown(e) {
- if (!contains(this.$el, e.target) && (this.$el != e.target)) this.close();
- },
+onMounted(() => {
+ if (props.viaKeyboard) {
+ nextTick(() => {
+ focusNext(itemsEl.children[0], true, false);
+ });
}
});
+
+function clicked(fn: MenuAction, ev: MouseEvent) {
+ fn(ev);
+ close();
+}
+
+function close() {
+ emit('close');
+}
+
+function focusUp() {
+ focusPrev(document.activeElement);
+}
+
+function focusDown() {
+ focusNext(document.activeElement);
+}
</script>
<style lang="scss" scoped>
diff --git a/packages/client/src/components/ui/modal.vue b/packages/client/src/components/ui/modal.vue
index 3c3bb5c226..cba02c9355 100644
--- a/packages/client/src/components/ui/modal.vue
+++ b/packages/client/src/components/ui/modal.vue
@@ -14,6 +14,7 @@ import { nextTick, onMounted, computed, ref, watch, provide } from 'vue';
import * as os from '@/os';
import { isTouchUsing } from '@/scripts/touch';
import { defaultStore } from '@/store';
+import { deviceKind } from '@/scripts/device-kind';
function getFixedContainer(el: Element | null): Element | null {
if (el == null || el.tagName === 'BODY') return null;
@@ -62,7 +63,7 @@ const content = ref<HTMLElement>();
const zIndex = os.claimZIndex(props.zPriority);
const type = computed(() => {
if (props.preferType === 'auto') {
- if (!defaultStore.state.disableDrawer && isTouchUsing && window.innerWidth < 500 && window.innerHeight < 1000) {
+ if (!defaultStore.state.disableDrawer && isTouchUsing && deviceKind === 'smartphone') {
return 'drawer';
} else {
return props.src != null ? 'popup' : 'dialog';
@@ -87,7 +88,7 @@ const onBgClick = () => {
};
if (type.value === 'drawer') {
- maxHeight.value = window.innerHeight / 2;
+ maxHeight.value = window.innerHeight / 1.5;
}
const keymap = {
@@ -99,9 +100,9 @@ const MARGIN = 16;
const align = () => {
if (props.src == null) return;
if (type.value === 'drawer') return;
+ if (type.value === 'dialog') return;
const popover = content.value!;
-
if (popover == null) return;
const rect = props.src.getBoundingClientRect();
@@ -130,20 +131,23 @@ const align = () => {
left = window.innerWidth - width;
}
+ const underSpace = (window.innerHeight - MARGIN) - top;
+ const upperSpace = (rect.top - MARGIN);
+
// 画面から縦にはみ出る場合
if (top + height > (window.innerHeight - MARGIN)) {
if (props.noOverlap) {
- const underSpace = (window.innerHeight - MARGIN) - top;
- const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
- maxHeight.value = underSpace;
+ maxHeight.value = underSpace;
} else {
- maxHeight.value = upperSpace;
+ maxHeight.value = upperSpace;
top = (upperSpace + MARGIN) - height;
}
} else {
top = (window.innerHeight - MARGIN) - height;
}
+ } else {
+ maxHeight.value = underSpace;
}
} else {
// 画面から横にはみ出る場合
@@ -151,20 +155,23 @@ const align = () => {
left = window.innerWidth - width + window.pageXOffset - 1;
}
+ const underSpace = (window.innerHeight - MARGIN) - (top - window.pageYOffset);
+ const upperSpace = (rect.top - MARGIN);
+
// 画面から縦にはみ出る場合
if (top + height - window.pageYOffset > (window.innerHeight - MARGIN)) {
if (props.noOverlap) {
- const underSpace = (window.innerHeight - MARGIN) - (top - window.pageYOffset);
- const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
- maxHeight.value = underSpace;
+ maxHeight.value = underSpace;
} else {
- maxHeight.value = upperSpace;
+ maxHeight.value = upperSpace;
top = window.pageYOffset + ((upperSpace + MARGIN) - height);
}
} else {
top = (window.innerHeight - MARGIN) - height + window.pageYOffset - 1;
}
+ } else {
+ maxHeight.value = underSpace;
}
}
diff --git a/packages/client/src/components/ui/popup-menu.vue b/packages/client/src/components/ui/popup-menu.vue
index 8ffc4ad195..8d6c1b5695 100644
--- a/packages/client/src/components/ui/popup-menu.vue
+++ b/packages/client/src/components/ui/popup-menu.vue
@@ -1,44 +1,28 @@
<template>
-<MkModal ref="modal" v-slot="{ type, maxHeight }" :z-priority="'high'" :src="src" :transparent-bg="true" @click="$refs.modal.close()" @closed="$emit('closed')">
- <MkMenu :items="items" :align="align" :width="width" :max-height="maxHeight" :as-drawer="type === 'drawer'" class="sfhdhdhq _popup _shadow" :class="{ drawer: type === 'drawer' }" @close="$refs.modal.close()"/>
+<MkModal ref="modal" v-slot="{ type, maxHeight }" :z-priority="'high'" :src="src" :transparent-bg="true" @click="modal.close()" @closed="emit('closed')">
+ <MkMenu :items="items" :align="align" :width="width" :max-height="maxHeight" :as-drawer="type === 'drawer'" class="sfhdhdhq _popup _shadow" :class="{ drawer: type === 'drawer' }" @close="modal.close()"/>
</MkModal>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { } from 'vue';
import MkModal from './modal.vue';
import MkMenu from './menu.vue';
+import { MenuItem } from '@/types/menu';
-export default defineComponent({
- components: {
- MkModal,
- MkMenu,
- },
+defineProps<{
+ items: MenuItem[];
+ align?: 'center' | string;
+ width?: number;
+ viaKeyboard?: boolean;
+ src?: any;
+}>();
- props: {
- items: {
- type: Array,
- required: true
- },
- align: {
- type: String,
- required: false
- },
- width: {
- type: Number,
- required: false
- },
- viaKeyboard: {
- type: Boolean,
- required: false
- },
- src: {
- required: false
- },
- },
+const emit = defineEmits<{
+ (e: 'closed'): void;
+}>();
- emits: ['close', 'closed'],
-});
+let modal = $ref<InstanceType<typeof MkModal>>();
</script>
<style lang="scss" scoped>
diff --git a/packages/client/src/components/ui/tooltip.vue b/packages/client/src/components/ui/tooltip.vue
index 394b068352..ee1909554e 100644
--- a/packages/client/src/components/ui/tooltip.vue
+++ b/packages/client/src/components/ui/tooltip.vue
@@ -1,99 +1,205 @@
<template>
-<transition :name="$store.state.animation ? 'tooltip' : ''" appear @after-leave="$emit('closed')">
+<transition :name="$store.state.animation ? 'tooltip' : ''" appear @after-leave="emit('closed')">
<div v-show="showing" ref="el" class="buebdbiu _acrylic _shadow" :style="{ zIndex, maxWidth: maxWidth + 'px' }">
<slot>{{ text }}</slot>
</div>
</transition>
</template>
-<script lang="ts">
-import { defineComponent, nextTick, onMounted, onUnmounted, ref } from 'vue';
+<script lang="ts" setup>
+import { nextTick, onMounted, onUnmounted, ref } from 'vue';
import * as os from '@/os';
-export default defineComponent({
- props: {
- showing: {
- type: Boolean,
- required: true,
- },
- source: {
- required: true,
- },
- text: {
- type: String,
- required: false
- },
- maxWidth: {
- type: Number,
- required: false,
- default: 250,
- },
- },
+const props = withDefaults(defineProps<{
+ showing: boolean;
+ targetElement?: HTMLElement;
+ x?: number;
+ y?: number;
+ text?: string;
+ maxWidth?: number;
+ direction?: 'top' | 'bottom' | 'right' | 'left';
+ innerMargin?: number;
+}>(), {
+ maxWidth: 250,
+ direction: 'top',
+ innerMargin: 0,
+});
- emits: ['closed'],
+const emit = defineEmits<{
+ (ev: 'closed'): void;
+}>();
- setup(props, context) {
- const el = ref<HTMLElement>();
- const zIndex = os.claimZIndex('high');
+const el = ref<HTMLElement>();
+const zIndex = os.claimZIndex('high');
- const setPosition = () => {
- if (el.value == null) return;
+const setPosition = () => {
+ if (el.value == null) return;
- const rect = props.source.getBoundingClientRect();
+ const contentWidth = el.value.offsetWidth;
+ const contentHeight = el.value.offsetHeight;
- const contentWidth = el.value.offsetWidth;
- const contentHeight = el.value.offsetHeight;
+ let rect: DOMRect;
- let left = rect.left + window.pageXOffset + (props.source.offsetWidth / 2);
- let top = rect.top + window.pageYOffset - contentHeight;
+ if (props.targetElement) {
+ rect = props.targetElement.getBoundingClientRect();
+ }
- left -= (el.value.offsetWidth / 2);
+ const calcPosWhenTop = () => {
+ let left: number;
+ let top: number;
- if (left + contentWidth - window.pageXOffset > window.innerWidth) {
- left = window.innerWidth - contentWidth + window.pageXOffset - 1;
+ if (props.targetElement) {
+ left = rect.left + window.pageXOffset + (props.targetElement.offsetWidth / 2);
+ top = (rect.top + window.pageYOffset - contentHeight) - props.innerMargin;
+ } else {
+ left = props.x;
+ top = (props.y - contentHeight) - props.innerMargin;
+ }
+
+ left -= (el.value.offsetWidth / 2);
+
+ if (left + contentWidth - window.pageXOffset > window.innerWidth) {
+ left = window.innerWidth - contentWidth + window.pageXOffset - 1;
+ }
+
+ return [left, top];
+ }
+
+ const calcPosWhenBottom = () => {
+ let left: number;
+ let top: number;
+
+ if (props.targetElement) {
+ left = rect.left + window.pageXOffset + (props.targetElement.offsetWidth / 2);
+ top = (rect.top + window.pageYOffset + props.targetElement.offsetHeight) + props.innerMargin;
+ } else {
+ left = props.x;
+ top = (props.y) + props.innerMargin;
+ }
+
+ left -= (el.value.offsetWidth / 2);
+
+ if (left + contentWidth - window.pageXOffset > window.innerWidth) {
+ left = window.innerWidth - contentWidth + window.pageXOffset - 1;
+ }
+
+ return [left, top];
+ }
+
+ const calcPosWhenLeft = () => {
+ let left: number;
+ let top: number;
+
+ if (props.targetElement) {
+ left = (rect.left + window.pageXOffset - contentWidth) - props.innerMargin;
+ top = rect.top + window.pageYOffset + (props.targetElement.offsetHeight / 2);
+ } else {
+ left = (props.x - contentWidth) - props.innerMargin;
+ top = props.y;
+ }
+
+ top -= (el.value.offsetHeight / 2);
+
+ if (top + contentHeight - window.pageYOffset > window.innerHeight) {
+ top = window.innerHeight - contentHeight + window.pageYOffset - 1;
+ }
+
+ return [left, top];
+ }
+
+ const calcPosWhenRight = () => {
+ let left: number;
+ let top: number;
+
+ if (props.targetElement) {
+ left = (rect.left + window.pageXOffset) + props.innerMargin;
+ top = rect.top + window.pageYOffset + (props.targetElement.offsetHeight / 2);
+ } else {
+ left = props.x + props.innerMargin;
+ top = props.y;
+ }
+
+ top -= (el.value.offsetHeight / 2);
+
+ if (top + contentHeight - window.pageYOffset > window.innerHeight) {
+ top = window.innerHeight - contentHeight + window.pageYOffset - 1;
+ }
+
+ return [left, top];
+ }
+
+ const calc = (): {
+ left: number;
+ top: number;
+ transformOrigin: string;
+ } => {
+ switch (props.direction) {
+ case 'top': {
+ const [left, top] = calcPosWhenTop();
+
+ // ツールチップを上に向かって表示するスペースがなければ下に向かって出す
+ if (top - window.pageYOffset < 0) {
+ const [left, top] = calcPosWhenBottom();
+ return { left, top, transformOrigin: 'center top' };
+ }
+
+ return { left, top, transformOrigin: 'center bottom' };
}
- if (top - window.pageYOffset < 0) {
- top = rect.top + window.pageYOffset + props.source.offsetHeight;
- el.value.style.transformOrigin = 'center top';
+ case 'bottom': {
+ const [left, top] = calcPosWhenBottom();
+ // TODO: ツールチップを下に向かって表示するスペースがなければ上に向かって出す
+ return { left, top, transformOrigin: 'center top' };
}
- el.value.style.left = left + 'px';
- el.value.style.top = top + 'px';
- };
+ case 'left': {
+ const [left, top] = calcPosWhenLeft();
- onMounted(() => {
- nextTick(() => {
- if (props.source == null) {
- context.emit('closed');
- return;
+ // ツールチップを左に向かって表示するスペースがなければ右に向かって出す
+ if (left - window.pageXOffset < 0) {
+ const [left, top] = calcPosWhenRight();
+ return { left, top, transformOrigin: 'left center' };
}
- setPosition();
+ return { left, top, transformOrigin: 'right center' };
+ }
- let loopHandler;
+ case 'right': {
+ const [left, top] = calcPosWhenRight();
+ // TODO: ツールチップを右に向かって表示するスペースがなければ左に向かって出す
+ return { left, top, transformOrigin: 'left center' };
+ }
+ }
- const loop = () => {
- loopHandler = window.requestAnimationFrame(() => {
- setPosition();
- loop();
- });
- };
+ return null as never;
+ }
- loop();
+ const { left, top, transformOrigin } = calc();
+ el.value.style.transformOrigin = transformOrigin;
+ el.value.style.left = left + 'px';
+ el.value.style.top = top + 'px';
+};
- onUnmounted(() => {
- window.cancelAnimationFrame(loopHandler);
- });
- });
- });
+let loopHandler;
- return {
- el,
- zIndex,
+onMounted(() => {
+ nextTick(() => {
+ setPosition();
+
+ const loop = () => {
+ loopHandler = window.requestAnimationFrame(() => {
+ setPosition();
+ loop();
+ });
};
- },
-})
+
+ loop();
+ });
+});
+
+onUnmounted(() => {
+ window.cancelAnimationFrame(loopHandler);
+});
</script>
<style lang="scss" scoped>
@@ -118,6 +224,6 @@ export default defineComponent({
border-radius: 4px;
border: solid 0.5px var(--divider);
pointer-events: none;
- transform-origin: center bottom;
+ transform-origin: center center;
}
</style>
diff --git a/packages/client/src/components/url-preview.vue b/packages/client/src/components/url-preview.vue
index 6c57957617..c7bbd1fbd1 100644
--- a/packages/client/src/components/url-preview.vue
+++ b/packages/client/src/components/url-preview.vue
@@ -67,7 +67,7 @@ let tweetHeight = $ref(150);
const requestUrl = new URL(props.url);
-if (requestUrl.hostname == 'twitter.com') {
+if (requestUrl.hostname === 'twitter.com') {
const m = requestUrl.pathname.match(/^\/.+\/status(?:es)?\/(\d+)/);
if (m) tweetId = m[1];
}
diff --git a/packages/client/src/components/widgets.vue b/packages/client/src/components/widgets.vue
index ccde5fbe55..da9d935281 100644
--- a/packages/client/src/components/widgets.vue
+++ b/packages/client/src/components/widgets.vue
@@ -12,13 +12,14 @@
<XDraggable
v-model="widgets_"
item-key="id"
+ handle=".handle"
animation="150"
>
<template #item="{element}">
<div class="customize-container">
<button class="config _button" @click.prevent.stop="configWidget(element.id)"><i class="fas fa-cog"></i></button>
<button class="remove _button" @click.prevent.stop="removeWidget(element)"><i class="fas fa-times"></i></button>
- <component :ref="el => widgetRefs[element.id] = el" :is="`mkw-${element.name}`" :widget="element" @updateProps="updateWidget(element.id, $event)"/>
+ <component class="handle" :ref="el => widgetRefs[element.id] = el" :is="`mkw-${element.name}`" :widget="element" @updateProps="updateWidget(element.id, $event)"/>
</div>
</template>
</XDraggable>
@@ -121,10 +122,6 @@ export default defineComponent({
position: relative;
cursor: move;
- > *:not(.remove):not(.config) {
- pointer-events: none;
- }
-
> .config,
> .remove {
position: absolute;
diff --git a/packages/client/src/directives/get-size.ts b/packages/client/src/directives/get-size.ts
index e3b5dea0f3..1fcd0718dc 100644
--- a/packages/client/src/directives/get-size.ts
+++ b/packages/client/src/directives/get-size.ts
@@ -1,34 +1,55 @@
import { Directive } from 'vue';
-export default {
- mounted(src, binding, vn) {
- const calc = () => {
- const height = src.clientHeight;
- const width = src.clientWidth;
+const mountings = new Map<Element, {
+ resize: ResizeObserver;
+ intersection?: IntersectionObserver;
+ fn: (w: number, h: number) => void;
+}>();
+
+function calc(src: Element) {
+ const info = mountings.get(src);
+ const height = src.clientHeight;
+ const width = src.clientWidth;
- // 要素が(一時的に)DOMに存在しないときは計算スキップ
- if (height === 0) return;
+ if (!info) return;
- binding.value(width, height);
- };
+ // アクティベート前などでsrcが描画されていない場合
+ if (!height) {
+ // IntersectionObserverで表示検出する
+ if (!info.intersection) {
+ info.intersection = new IntersectionObserver(entries => {
+ if (entries.some(entry => entry.isIntersecting)) calc(src);
+ });
+ }
+ info.intersection.observe(src);
+ return;
+ }
+ if (info.intersection) {
+ info.intersection.disconnect()
+ delete info.intersection;
+ };
- calc();
+ info.fn(width, height);
+};
- // Vue3では使えなくなった
- // 無くても大丈夫か...?
- // TODO: ↑大丈夫じゃなかったので解決策を探す
- //vn.context.$on('hook:activated', calc);
+export default {
+ mounted(src, binding, vn) {
- const ro = new ResizeObserver((entries, observer) => {
- calc();
+ const resize = new ResizeObserver((entries, observer) => {
+ calc(src);
});
- ro.observe(src);
+ resize.observe(src);
- src._get_size_ro_ = ro;
+ mountings.set(src, { resize, fn: binding.value, });
+ calc(src);
},
unmounted(src, binding, vn) {
binding.value(0, 0);
- src._get_size_ro_.unobserve(src);
+ const info = mountings.get(src);
+ if (!info) return;
+ info.resize.disconnect();
+ if (info.intersection) info.intersection.disconnect();
+ mountings.delete(src);
}
-} as Directive;
+} as Directive<Element, (w: number, h: number) => void>;
diff --git a/packages/client/src/directives/size.ts b/packages/client/src/directives/size.ts
index a72a97abcc..36f649f180 100644
--- a/packages/client/src/directives/size.ts
+++ b/packages/client/src/directives/size.ts
@@ -1,68 +1,107 @@
import { Directive } from 'vue';
+type Value = { max?: number[]; min?: number[]; };
+
//const observers = new Map<Element, ResizeObserver>();
+const mountings = new Map<Element, {
+ value: Value;
+ resize: ResizeObserver;
+ intersection?: IntersectionObserver;
+ previousWidth: number;
+}>();
-export default {
- mounted(src, binding, vn) {
- const query = binding.value;
+type ClassOrder = {
+ add: string[];
+ remove: string[];
+};
- const addClass = (el: Element, cls: string) => {
- el.classList.add(cls);
- };
+const cache = new Map<string, ClassOrder>();
- const removeClass = (el: Element, cls: string) => {
- el.classList.remove(cls);
- };
+function getClassOrder(width: number, queue: Value): ClassOrder {
+ const getMaxClass = (v: number) => `max-width_${v}px`;
+ const getMinClass = (v: number) => `min-width_${v}px`;
- const calc = () => {
- const width = src.clientWidth;
+ return {
+ add: [
+ ...(queue.max ? queue.max.filter(v => width <= v).map(getMaxClass) : []),
+ ...(queue.min ? queue.min.filter(v => width >= v).map(getMinClass) : []),
+ ],
+ remove: [
+ ...(queue.max ? queue.max.filter(v => width > v).map(getMaxClass) : []),
+ ...(queue.min ? queue.min.filter(v => width < v).map(getMinClass) : []),
+ ]
+ };
+}
- // 要素が(一時的に)DOMに存在しないときは計算スキップ
- if (width === 0) return;
+function applyClassOrder(el: Element, order: ClassOrder) {
+ el.classList.add(...order.add);
+ el.classList.remove(...order.remove);
+}
- if (query.max) {
- for (const v of query.max) {
- if (width <= v) {
- addClass(src, 'max-width_' + v + 'px');
- } else {
- removeClass(src, 'max-width_' + v + 'px');
- }
- }
- }
- if (query.min) {
- for (const v of query.min) {
- if (width >= v) {
- addClass(src, 'min-width_' + v + 'px');
- } else {
- removeClass(src, 'min-width_' + v + 'px');
- }
- }
- }
- };
+function getOrderName(width: number, queue: Value): string {
+ return `${width}|${queue.max ? queue.max.join(',') : ''}|${queue.min ? queue.min.join(',') : ''}`;
+}
- calc();
+function calc(el: Element) {
+ const info = mountings.get(el);
+ const width = el.clientWidth;
- window.addEventListener('resize', calc);
+ if (!info || info.previousWidth === width) return;
- // Vue3では使えなくなった
- // 無くても大丈夫か...?
- // TODO: ↑大丈夫じゃなかったので解決策を探す
- //vn.context.$on('hook:activated', calc);
+ // アクティベート前などでsrcが描画されていない場合
+ if (!width) {
+ // IntersectionObserverで表示検出する
+ if (!info.intersection) {
+ info.intersection = new IntersectionObserver(entries => {
+ if (entries.some(entry => entry.isIntersecting)) calc(el);
+ });
+ }
+ info.intersection.observe(el);
+ return;
+ }
+ if (info.intersection) {
+ info.intersection.disconnect()
+ delete info.intersection;
+ };
+
+ mountings.set(el, Object.assign(info, { previousWidth: width }));
- //const ro = new ResizeObserver((entries, observer) => {
- // calc();
- //});
+ const cached = cache.get(getOrderName(width, info.value));
+ if (cached) {
+ applyClassOrder(el, cached);
+ } else {
+ const order = getClassOrder(width, info.value);
+ cache.set(getOrderName(width, info.value), order);
+ applyClassOrder(el, order);
+ }
+}
- //ro.observe(el);
+export default {
+ mounted(src, binding, vn) {
+ const resize = new ResizeObserver((entries, observer) => {
+ calc(src);
+ });
+
+ mountings.set(src, {
+ value: binding.value,
+ resize,
+ previousWidth: 0,
+ });
+
+ calc(src);
+ resize.observe(src);
+ },
- // TODO: 新たにプロパティを作るのをやめMapを使う
- // ただメモリ的には↓の方が省メモリかもしれないので検討中
- //el._ro_ = ro;
- src._calc_ = calc;
+ updated(src, binding, vn) {
+ mountings.set(src, Object.assign({}, mountings.get(src), { value: binding.value }));
+ calc(src);
},
unmounted(src, binding, vn) {
- //el._ro_.unobserve(el);
- window.removeEventListener('resize', src._calc_);
+ const info = mountings.get(src);
+ if (!info) return;
+ info.resize.disconnect();
+ if (info.intersection) info.intersection.disconnect();
+ mountings.delete(src);
}
-} as Directive;
+} as Directive<Element, Value>;
diff --git a/packages/client/src/directives/tooltip.ts b/packages/client/src/directives/tooltip.ts
index fffde14874..dd715227a4 100644
--- a/packages/client/src/directives/tooltip.ts
+++ b/packages/client/src/directives/tooltip.ts
@@ -48,7 +48,7 @@ export default {
popup(import('@/components/ui/tooltip.vue'), {
showing,
text: self.text,
- source: el
+ targetElement: el,
}, {}, 'closed');
self._close = () => {
@@ -56,8 +56,8 @@ export default {
};
};
- el.addEventListener('selectstart', e => {
- e.preventDefault();
+ el.addEventListener('selectstart', ev => {
+ ev.preventDefault();
});
el.addEventListener(start, () => {
diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts
index 9b670b4300..5809f25689 100644
--- a/packages/client/src/init.ts
+++ b/packages/client/src/init.ts
@@ -14,7 +14,8 @@ if (localStorage.getItem('accounts') != null) {
//#endregion
import { computed, createApp, watch, markRaw, version as vueVersion } from 'vue';
-import * as compareVersions from 'compare-versions';
+import compareVersions from 'compare-versions';
+import * as JSON5 from 'json5';
import widgets from '@/widgets';
import directives from '@/directives';
@@ -32,7 +33,7 @@ import { defaultStore, ColdDeviceStorage } from '@/store';
import { fetchInstance, instance } from '@/instance';
import { makeHotkey } from '@/scripts/hotkey';
import { search } from '@/scripts/search';
-import { isMobile } from '@/scripts/is-mobile';
+import { deviceKind } from '@/scripts/device-kind';
import { initializeSw } from '@/scripts/initialize-sw';
import { reloadChannel } from '@/scripts/unison-reload';
import { reactionPicker } from '@/scripts/reaction-picker';
@@ -95,11 +96,10 @@ window.addEventListener('resize', () => {
//#endregion
// If mobile, insert the viewport meta tag
-if (isMobile || window.innerWidth <= 1024) {
+if (['smartphone', 'tablet'].includes(deviceKind)) {
const viewport = document.getElementsByName('viewport').item(0);
viewport.setAttribute('content',
- `${viewport.getAttribute('content')},minimum-scale=1,maximum-scale=1,user-scalable=no`);
- document.head.appendChild(viewport);
+ `${viewport.getAttribute('content')}, minimum-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover`);
}
//#region Set lang attr
@@ -163,7 +163,9 @@ if ($i && $i.token) {
}
//#endregion
-fetchInstance().then(() => {
+const fetchInstanceMetaPromise = fetchInstance();
+
+fetchInstanceMetaPromise.then(() => {
localStorage.setItem('v', instance.version);
// Init service worker
@@ -274,6 +276,14 @@ window.matchMedia('(prefers-color-scheme: dark)').addListener(mql => {
});
//#endregion
+fetchInstanceMetaPromise.then(() => {
+ if (defaultStore.state.themeInitial) {
+ if (instance.defaultLightTheme != null) ColdDeviceStorage.set('lightTheme', JSON5.parse(instance.defaultLightTheme));
+ if (instance.defaultDarkTheme != null) ColdDeviceStorage.set('darkTheme', JSON5.parse(instance.defaultDarkTheme));
+ defaultStore.set('themeInitial', false);
+ }
+});
+
// shortcut
document.addEventListener('keydown', makeHotkey({
'd': () => {
diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts
index f3be5c68fb..5f1fb1ef96 100644
--- a/packages/client/src/os.ts
+++ b/packages/client/src/os.ts
@@ -7,8 +7,10 @@ import * as Misskey from 'misskey-js';
import { apiUrl, url } from '@/config';
import MkPostFormDialog from '@/components/post-form-dialog.vue';
import MkWaitingDialog from '@/components/waiting-dialog.vue';
+import { MenuItem } from '@/types/menu';
import { resolve } from '@/router';
import { $i } from '@/account';
+import { defaultStore } from '@/store';
export const pendingApiRequestsCount = ref(0);
@@ -470,7 +472,7 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea:
});
}
-export function popupMenu(items: any[] | Ref<any[]>, src?: HTMLElement, options?: {
+export function popupMenu(items: MenuItem[] | Ref<MenuItem[]>, src?: HTMLElement, options?: {
align?: string;
width?: number;
viaKeyboard?: boolean;
@@ -494,7 +496,7 @@ export function popupMenu(items: any[] | Ref<any[]>, src?: HTMLElement, options?
});
}
-export function contextMenu(items: any[], ev: MouseEvent) {
+export function contextMenu(items: MenuItem[] | Ref<MenuItem[]>, ev: MouseEvent) {
ev.preventDefault();
return new Promise((resolve, reject) => {
let dispose;
@@ -541,8 +543,8 @@ export const uploads = ref<{
img: string;
}[]>([]);
-export function upload(file: File, folder?: any, name?: string): Promise<Misskey.entities.DriveFile> {
- if (folder && typeof folder == 'object') folder = folder.id;
+export function upload(file: File, folder?: any, name?: string, keepOriginal: boolean = defaultStore.state.keepOriginalUploading): Promise<Misskey.entities.DriveFile> {
+ if (folder && typeof folder === 'object') folder = folder.id;
return new Promise((resolve, reject) => {
const id = Math.random().toString();
@@ -559,6 +561,8 @@ export function upload(file: File, folder?: any, name?: string): Promise<Misskey
uploads.value.push(ctx);
+ console.log(keepOriginal);
+
const data = new FormData();
data.append('i', $i.token);
data.append('force', 'true');
diff --git a/packages/client/src/pages/about-misskey.vue b/packages/client/src/pages/about-misskey.vue
index 0ffb6b9e1d..ff04ed84f2 100644
--- a/packages/client/src/pages/about-misskey.vue
+++ b/packages/client/src/pages/about-misskey.vue
@@ -149,6 +149,7 @@ const patrons = [
'oss',
'Weeble',
'蝉暮せせせ',
+ 'ThatOneCalculator',
];
let easterEggReady = false;
diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue
index d5bab4baf8..6cc2e387ec 100644
--- a/packages/client/src/pages/about.vue
+++ b/packages/client/src/pages/about.vue
@@ -1,5 +1,5 @@
<template>
-<MkSpacer :content-max="600" :margin-min="20">
+<MkSpacer v-if="tab === 'overview'" :content-max="600" :margin-min="20">
<div class="_formRoot">
<div class="_formBlock fwhjspax" :style="{ backgroundImage: `url(${ $instance.bannerUrl })` }">
<div class="content">
@@ -65,35 +65,50 @@
</FormSection>
</div>
</MkSpacer>
+<MkSpacer v-else-if="tab === 'charts'" :content-max="1200" :margin-min="20">
+ <MkInstanceStats :chart-limit="500" :detailed="true"/>
+</MkSpacer>
</template>
<script lang="ts" setup>
-import { ref } from 'vue';
+import { ref, computed } from 'vue';
import { version, instanceName } from '@/config';
import FormLink from '@/components/form/link.vue';
import FormSection from '@/components/form/section.vue';
import FormSuspense from '@/components/form/suspense.vue';
import FormSplit from '@/components/form/split.vue';
import MkKeyValue from '@/components/key-value.vue';
+import MkInstanceStats from '@/components/instance-stats.vue';
import * as os from '@/os';
import number from '@/filters/number';
import * as symbols from '@/symbols';
import { host } from '@/config';
import { i18n } from '@/i18n';
-const stats = ref(null);
+let stats = $ref(null);
+let tab = $ref('overview');
const initStats = () => os.api('stats', {
}).then((res) => {
- stats.value = res;
+ stats = res;
});
defineExpose({
- [symbols.PAGE_INFO]: {
+ [symbols.PAGE_INFO]: computed(() => ({
title: i18n.ts.instanceInfo,
icon: 'fas fa-info-circle',
bg: 'var(--bg)',
- },
+ tabs: [{
+ active: tab === 'overview',
+ title: i18n.ts.overview,
+ onClick: () => { tab = 'overview'; },
+ }, {
+ active: tab === 'charts',
+ title: i18n.ts.charts,
+ icon: 'fas fa-chart-bar',
+ onClick: () => { tab = 'charts'; },
+ },],
+ })),
});
</script>
diff --git a/packages/client/src/pages/admin/files.vue b/packages/client/src/pages/admin/files.vue
index 87dd12f489..c62f053092 100644
--- a/packages/client/src/pages/admin/files.vue
+++ b/packages/client/src/pages/admin/files.vue
@@ -28,7 +28,7 @@
<template #label>MIME type</template>
</MkInput>
</div>
- <MkPagination v-slot="{items}" ref="files" :pagination="pagination" class="urempief">
+ <MkPagination v-slot="{items}" :pagination="pagination" class="urempief">
<button v-for="file in items" :key="file.id" class="file _panel _button _gap" @click="show(file, $event)">
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
<div class="body">
@@ -54,8 +54,8 @@
</div>
</template>
-<script lang="ts">
-import { computed, defineComponent } from 'vue';
+<script lang="ts" setup>
+import { computed } from 'vue';
import MkButton from '@/components/ui/button.vue';
import MkInput from '@/components/form/input.vue';
import MkSelect from '@/components/form/select.vue';
@@ -65,80 +65,63 @@ import MkDriveFileThumbnail from '@/components/drive-file-thumbnail.vue';
import bytes from '@/filters/bytes';
import * as os from '@/os';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
-export default defineComponent({
- components: {
- MkButton,
- MkInput,
- MkSelect,
- MkPagination,
- MkContainer,
- MkDriveFileThumbnail,
- },
+let q = $ref(null);
+let origin = $ref('local');
+let type = $ref(null);
+let searchHost = $ref('');
+const pagination = {
+ endpoint: 'admin/drive/files' as const,
+ limit: 10,
+ params: computed(() => ({
+ type: (type && type !== '') ? type : null,
+ origin: origin,
+ hostname: (searchHost && searchHost !== '') ? searchHost : null,
+ })),
+};
- emits: ['info'],
+function clear() {
+ os.confirm({
+ type: 'warning',
+ text: i18n.ts.clearCachedFilesConfirm,
+ }).then(({ canceled }) => {
+ if (canceled) return;
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.files,
- icon: 'fas fa-cloud',
- bg: 'var(--bg)',
- actions: [{
- text: this.$ts.clearCachedFiles,
- icon: 'fas fa-trash-alt',
- handler: this.clear
- }]
- },
- q: null,
- origin: 'local',
- type: null,
- searchHost: '',
- pagination: {
- endpoint: 'admin/drive/files' as const,
- limit: 10,
- params: computed(() => ({
- type: (this.type && this.type !== '') ? this.type : null,
- origin: this.origin,
- hostname: (this.searchHost && this.searchHost !== '') ? this.searchHost : null,
- })),
- },
- }
- },
-
- methods: {
- clear() {
- os.confirm({
- type: 'warning',
- text: this.$ts.clearCachedFilesConfirm,
- }).then(({ canceled }) => {
- if (canceled) return;
-
- os.apiWithDialog('admin/drive/clean-remote-files', {});
- });
- },
+ os.apiWithDialog('admin/drive/clean-remote-files', {});
+ });
+}
- show(file, ev) {
- os.popup(import('./file-dialog.vue'), {
- fileId: file.id
- }, {}, 'closed');
- },
+function show(file) {
+ os.popup(import('./file-dialog.vue'), {
+ fileId: file.id
+ }, {}, 'closed');
+}
- find() {
- os.api('admin/drive/show-file', this.q.startsWith('http://') || this.q.startsWith('https://') ? { url: this.q.trim() } : { fileId: this.q.trim() }).then(file => {
- this.show(file);
- }).catch(e => {
- if (e.code === 'NO_SUCH_FILE') {
- os.alert({
- type: 'error',
- text: this.$ts.notFound
- });
- }
+function find() {
+ os.api('admin/drive/show-file', q.startsWith('http://') || q.startsWith('https://') ? { url: q.trim() } : { fileId: q.trim() }).then(file => {
+ show(file);
+ }).catch(err => {
+ if (err.code === 'NO_SUCH_FILE') {
+ os.alert({
+ type: 'error',
+ text: i18n.ts.notFound
});
- },
+ }
+ });
+}
- bytes
- }
+defineExpose({
+ [symbols.PAGE_INFO]: computed(() => ({
+ title: i18n.ts.files,
+ icon: 'fas fa-cloud',
+ bg: 'var(--bg)',
+ actions: [{
+ text: i18n.ts.clearCachedFiles,
+ icon: 'fas fa-trash-alt',
+ handler: clear,
+ }],
+ })),
});
</script>
diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue
index a4bac93834..c5d7821329 100644
--- a/packages/client/src/pages/admin/settings.vue
+++ b/packages/client/src/pages/admin/settings.vue
@@ -25,6 +25,22 @@
<template #label>{{ $ts.backgroundImageUrl }}</template>
</FormInput>
+ <FormInput v-model="themeColor" class="_formBlock">
+ <template #prefix><i class="fas fa-palette"></i></template>
+ <template #label>{{ $ts.themeColor }}</template>
+ <template #caption>#RRGGBB</template>
+ </FormInput>
+
+ <FormTextarea v-model="defaultLightTheme" class="_formBlock">
+ <template #label>{{ $ts.instanceDefaultLightTheme }}</template>
+ <template #caption>{{ $ts.instanceDefaultThemeDescription }}</template>
+ </FormTextarea>
+
+ <FormTextarea v-model="defaultDarkTheme" class="_formBlock">
+ <template #label>{{ $ts.instanceDefaultDarkTheme }}</template>
+ <template #caption>{{ $ts.instanceDefaultThemeDescription }}</template>
+ </FormTextarea>
+
<FormInput v-model="tosUrl" class="_formBlock">
<template #prefix><i class="fas fa-link"></i></template>
<template #label>{{ $ts.tosUrl }}</template>
@@ -46,11 +62,6 @@
<template #caption>{{ $ts.pinnedUsersDescription }}</template>
</FormTextarea>
- <FormInput v-model="maxNoteTextLength" type="number" class="_formBlock">
- <template #prefix><i class="fas fa-pencil-alt"></i></template>
- <template #label>{{ $ts.maxNoteTextLength }}</template>
- </FormInput>
-
<FormSection>
<FormSwitch v-model="enableRegistration" class="_formBlock">
<template #label>{{ $ts.enableRegistration }}</template>
@@ -75,11 +86,6 @@
<template #caption>{{ $ts.cacheRemoteFilesDescription }}</template>
</FormSwitch>
- <FormSwitch v-model="proxyRemoteFiles" class="_formBlock">
- <template #label>{{ $ts.proxyRemoteFiles }}</template>
- <template #caption>{{ $ts.proxyRemoteFilesDescription }}</template>
- </FormSwitch>
-
<FormSplit :min-width="280">
<FormInput v-model="localDriveCapacityMb" type="number" class="_formBlock">
<template #label>{{ $ts.driveCapacityPerLocalAccount }}</template>
@@ -179,12 +185,13 @@ export default defineComponent({
iconUrl: null,
bannerUrl: null,
backgroundImageUrl: null,
- maxNoteTextLength: 0,
+ themeColor: null,
+ defaultLightTheme: null,
+ defaultDarkTheme: null,
enableLocalTimeline: false,
enableGlobalTimeline: false,
pinnedUsers: '',
cacheRemoteFiles: false,
- proxyRemoteFiles: false,
localDriveCapacityMb: 0,
remoteDriveCapacityMb: 0,
enableRegistration: false,
@@ -206,14 +213,15 @@ export default defineComponent({
this.iconUrl = meta.iconUrl;
this.bannerUrl = meta.bannerUrl;
this.backgroundImageUrl = meta.backgroundImageUrl;
+ this.themeColor = meta.themeColor;
+ this.defaultLightTheme = meta.defaultLightTheme;
+ this.defaultDarkTheme = meta.defaultDarkTheme;
this.maintainerName = meta.maintainerName;
this.maintainerEmail = meta.maintainerEmail;
- this.maxNoteTextLength = meta.maxNoteTextLength;
this.enableLocalTimeline = !meta.disableLocalTimeline;
this.enableGlobalTimeline = !meta.disableGlobalTimeline;
this.pinnedUsers = meta.pinnedUsers.join('\n');
this.cacheRemoteFiles = meta.cacheRemoteFiles;
- this.proxyRemoteFiles = meta.proxyRemoteFiles;
this.localDriveCapacityMb = meta.driveCapacityPerLocalUserMb;
this.remoteDriveCapacityMb = meta.driveCapacityPerRemoteUserMb;
this.enableRegistration = !meta.disableRegistration;
@@ -233,14 +241,15 @@ export default defineComponent({
iconUrl: this.iconUrl,
bannerUrl: this.bannerUrl,
backgroundImageUrl: this.backgroundImageUrl,
+ themeColor: this.themeColor === '' ? null : this.themeColor,
+ defaultLightTheme: this.defaultLightTheme === '' ? null : this.defaultLightTheme,
+ defaultDarkTheme: this.defaultDarkTheme === '' ? null : this.defaultDarkTheme,
maintainerName: this.maintainerName,
maintainerEmail: this.maintainerEmail,
- maxNoteTextLength: this.maxNoteTextLength,
disableLocalTimeline: !this.enableLocalTimeline,
disableGlobalTimeline: !this.enableGlobalTimeline,
pinnedUsers: this.pinnedUsers.split('\n'),
cacheRemoteFiles: this.cacheRemoteFiles,
- proxyRemoteFiles: this.proxyRemoteFiles,
localDriveCapacityMb: parseInt(this.localDriveCapacityMb, 10),
remoteDriveCapacityMb: parseInt(this.remoteDriveCapacityMb, 10),
disableRegistration: !this.enableRegistration,
diff --git a/packages/client/src/pages/admin/users.vue b/packages/client/src/pages/admin/users.vue
index 03e155ddcf..f05aa5ff45 100644
--- a/packages/client/src/pages/admin/users.vue
+++ b/packages/client/src/pages/admin/users.vue
@@ -36,7 +36,7 @@
</MkInput>
</div>
- <MkPagination v-slot="{items}" ref="users" :pagination="pagination" class="users">
+ <MkPagination v-slot="{items}" ref="paginationComponent" :pagination="pagination" class="users">
<button v-for="user in items" :key="user.id" class="user _panel _button _gap" @click="show(user)">
<MkAvatar class="avatar" :user="user" :disable-link="true" :show-indicator="true"/>
<div class="body">
@@ -61,9 +61,8 @@
</div>
</template>
-<script lang="ts">
-import { computed, defineComponent } from 'vue';
-import MkButton from '@/components/ui/button.vue';
+<script lang="ts" setup>
+import { computed } from 'vue';
import MkInput from '@/components/form/input.vue';
import MkSelect from '@/components/form/select.vue';
import MkPagination from '@/components/ui/pagination.vue';
@@ -71,94 +70,79 @@ import { acct } from '@/filters/user';
import * as os from '@/os';
import * as symbols from '@/symbols';
import { lookupUser } from '@/scripts/lookup-user';
+import { i18n } from '@/i18n';
-export default defineComponent({
- components: {
- MkButton,
- MkInput,
- MkSelect,
- MkPagination,
- },
+let paginationComponent = $ref<InstanceType<typeof MkPagination>>();
- emits: ['info'],
+let sort = $ref('+createdAt');
+let state = $ref('all');
+let origin = $ref('local');
+let searchUsername = $ref('');
+let searchHost = $ref('');
+const pagination = {
+ endpoint: 'admin/show-users' as const,
+ limit: 10,
+ params: computed(() => ({
+ sort: sort,
+ state: state,
+ origin: origin,
+ username: searchUsername,
+ hostname: searchHost,
+ })),
+ offsetMode: true
+};
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: this.$ts.users,
- icon: 'fas fa-users',
- bg: 'var(--bg)',
- actions: [{
- icon: 'fas fa-search',
- text: this.$ts.search,
- handler: this.searchUser
- }, {
- asFullButton: true,
- icon: 'fas fa-plus',
- text: this.$ts.addUser,
- handler: this.addUser
- }, {
- asFullButton: true,
- icon: 'fas fa-search',
- text: this.$ts.lookup,
- handler: this.lookupUser
- }],
- },
- sort: '+createdAt',
- state: 'all',
- origin: 'local',
- searchUsername: '',
- searchHost: '',
- pagination: {
- endpoint: 'admin/show-users' as const,
- limit: 10,
- params: computed(() => ({
- sort: this.sort,
- state: this.state,
- origin: this.origin,
- username: this.searchUsername,
- hostname: this.searchHost,
- })),
- offsetMode: true
- },
- }
- },
-
- methods: {
- lookupUser,
-
- searchUser() {
- os.selectUser().then(user => {
- this.show(user);
- });
- },
+function searchUser() {
+ os.selectUser().then(user => {
+ show(user);
+ });
+}
- async addUser() {
- const { canceled: canceled1, result: username } = await os.inputText({
- title: this.$ts.username,
- });
- if (canceled1) return;
+async function addUser() {
+ const { canceled: canceled1, result: username } = await os.inputText({
+ title: i18n.ts.username,
+ });
+ if (canceled1) return;
- const { canceled: canceled2, result: password } = await os.inputText({
- title: this.$ts.password,
- type: 'password'
- });
- if (canceled2) return;
+ const { canceled: canceled2, result: password } = await os.inputText({
+ title: i18n.ts.password,
+ type: 'password'
+ });
+ if (canceled2) return;
- os.apiWithDialog('admin/accounts/create', {
- username: username,
- password: password,
- }).then(res => {
- this.$refs.users.reload();
- });
- },
+ os.apiWithDialog('admin/accounts/create', {
+ username: username,
+ password: password,
+ }).then(res => {
+ paginationComponent.reload();
+ });
+}
- show(user) {
- os.pageWindow(`/user-info/${user.id}`);
- },
+function show(user) {
+ os.pageWindow(`/user-info/${user.id}`);
+}
- acct
- }
+defineExpose({
+ [symbols.PAGE_INFO]: computed(() => ({
+ title: i18n.ts.users,
+ icon: 'fas fa-users',
+ bg: 'var(--bg)',
+ actions: [{
+ icon: 'fas fa-search',
+ text: i18n.ts.search,
+ handler: searchUser
+ }, {
+ asFullButton: true,
+ icon: 'fas fa-plus',
+ text: i18n.ts.addUser,
+ handler: addUser
+ }, {
+ asFullButton: true,
+ icon: 'fas fa-search',
+ text: i18n.ts.lookup,
+ handler: lookupUser
+ }],
+ })),
});
</script>
diff --git a/packages/client/src/pages/federation.vue b/packages/client/src/pages/federation.vue
index a4ae901f2a..3c5050cdb8 100644
--- a/packages/client/src/pages/federation.vue
+++ b/packages/client/src/pages/federation.vue
@@ -115,7 +115,7 @@ const pagination = {
offsetMode: true,
params: computed(() => ({
sort: sort,
- host: host != '' ? host : null,
+ host: host !== '' ? host : null,
...(
state === 'federating' ? { federating: true } :
state === 'subscribing' ? { subscribing: true } :
@@ -157,11 +157,10 @@ defineExpose({
> .instance {
padding: 16px;
- border: solid 1px var(--divider);
- border-radius: 6px;
+ background: var(--panel);
+ border-radius: 8px;
&:hover {
- border: solid 1px var(--accent);
text-decoration: none;
}
diff --git a/packages/client/src/pages/instance-info.vue b/packages/client/src/pages/instance-info.vue
index fa36db0659..f19cb9d1a2 100644
--- a/packages/client/src/pages/instance-info.vue
+++ b/packages/client/src/pages/instance-info.vue
@@ -29,6 +29,7 @@
<template #label>Moderation</template>
<FormSwitch v-model="suspended" class="_formBlock" @update:modelValue="toggleSuspend">{{ $ts.stopActivityDelivery }}</FormSwitch>
<FormSwitch v-model="isBlocked" class="_formBlock" @update:modelValue="toggleBlock">{{ $ts.blockThisInstance }}</FormSwitch>
+ <MkButton @click="refreshMetadata">Refresh metadata</MkButton>
</FormSection>
<FormSection>
@@ -111,6 +112,7 @@ import MkChart from '@/components/chart.vue';
import MkObjectView from '@/components/object-view.vue';
import FormLink from '@/components/form/link.vue';
import MkLink from '@/components/link.vue';
+import MkButton from '@/components/ui/button.vue';
import FormSection from '@/components/form/section.vue';
import MkKeyValue from '@/components/key-value.vue';
import MkSelect from '@/components/form/select.vue';
@@ -155,6 +157,15 @@ async function toggleSuspend(v) {
});
}
+function refreshMetadata() {
+ os.api('admin/federation/refresh-remote-instance-metadata', {
+ host: instance.host,
+ });
+ os.alert({
+ text: 'Refresh requested',
+ });
+}
+
fetch();
defineExpose({
diff --git a/packages/client/src/pages/mfm-cheat-sheet.vue b/packages/client/src/pages/mfm-cheat-sheet.vue
index ee9d807e71..83ae5741c3 100644
--- a/packages/client/src/pages/mfm-cheat-sheet.vue
+++ b/packages/client/src/pages/mfm-cheat-sheet.vue
@@ -121,6 +121,7 @@
</div>
</div>
</div>
+ <!-- deprecated
<div class="section _block">
<div class="title">{{ $ts._mfm.search }}</div>
<div class="content">
@@ -131,6 +132,7 @@
</div>
</div>
</div>
+ -->
<div class="section _block">
<div class="title">{{ $ts._mfm.flip }}</div>
<div class="content">
diff --git a/packages/client/src/pages/note.vue b/packages/client/src/pages/note.vue
index efeea345dc..29261ec484 100644
--- a/packages/client/src/pages/note.vue
+++ b/packages/client/src/pages/note.vue
@@ -10,7 +10,7 @@
<div class="main _gap">
<MkButton v-if="!showNext && hasNext" class="load next" @click="showNext = true"><i class="fas fa-chevron-up"></i></MkButton>
<div class="note _gap">
- <MkRemoteCaution v-if="note.user.host != null" :href="note.url || note.uri" class="_isolated"/>
+ <MkRemoteCaution v-if="note.user.host != null" :href="note.url ?? note.uri" class="_isolated"/>
<XNoteDetailed :key="note.id" v-model:note="note" class="_isolated note"/>
</div>
<div v-if="clips && clips.length > 0" class="_content clips _gap">
diff --git a/packages/client/src/pages/settings/drive.vue b/packages/client/src/pages/settings/drive.vue
index f1016ebd84..9309eb5ec7 100644
--- a/packages/client/src/pages/settings/drive.vue
+++ b/packages/client/src/pages/settings/drive.vue
@@ -19,7 +19,7 @@
<FormSection>
<template #label>{{ $ts.statistics }}</template>
- <div ref="chart"></div>
+ <MkChart src="per-user-drive" :args="{ user: $i }" span="day" :limit="7 * 5" :bar="true" :stacked="true" :detailed="false" :aspect-ratio="6"/>
</FormSection>
<FormSection>
@@ -28,6 +28,7 @@
<template #suffix>{{ uploadFolder ? uploadFolder.name : '-' }}</template>
<template #suffixIcon><i class="fas fa-folder-open"></i></template>
</FormLink>
+ <FormSwitch v-model="keepOriginalUploading" class="_formBlock">{{ $ts.keepOriginalUploading }}<template #caption>{{ $ts.keepOriginalUploadingDescription }}</template></FormSwitch>
</FormSection>
</div>
</template>
@@ -36,21 +37,24 @@
import { defineComponent } from 'vue';
import * as tinycolor from 'tinycolor2';
import FormLink from '@/components/form/link.vue';
+import FormSwitch from '@/components/form/switch.vue';
import FormSection from '@/components/form/section.vue';
import MkKeyValue from '@/components/key-value.vue';
import FormSplit from '@/components/form/split.vue';
import * as os from '@/os';
import bytes from '@/filters/bytes';
import * as symbols from '@/symbols';
-
-// TODO: render chart
+import { defaultStore } from '@/store';
+import MkChart from '@/components/chart.vue';
export default defineComponent({
components: {
FormLink,
+ FormSwitch,
FormSection,
MkKeyValue,
FormSplit,
+ MkChart,
},
emits: ['info'],
@@ -79,7 +83,8 @@ export default defineComponent({
l: 0.5
})
};
- }
+ },
+ keepOriginalUploading: defaultStore.makeGetterSetter('keepOriginalUploading'),
},
async created() {
diff --git a/packages/client/src/pages/settings/general.vue b/packages/client/src/pages/settings/general.vue
index 2e159e56a9..c8f6f58322 100644
--- a/packages/client/src/pages/settings/general.vue
+++ b/packages/client/src/pages/settings/general.vue
@@ -12,6 +12,14 @@
</template>
</FormSelect>
+ <FormRadios v-model="overridedDeviceKind" class="_formBlock">
+ <template #label>{{ $ts.overridedDeviceKind }}</template>
+ <option :value="null">{{ $ts.auto }}</option>
+ <option value="smartphone"><i class="fas fa-mobile-alt"/> {{ $ts.smartphone }}</option>
+ <option value="tablet"><i class="fas fa-tablet-alt"/> {{ $ts.tablet }}</option>
+ <option value="desktop"><i class="fas fa-desktop"/> {{ $ts.desktop }}</option>
+ </FormRadios>
+
<FormSwitch v-model="showFixedPostForm" class="_formBlock">{{ $ts.showFixedPostForm }}</FormSwitch>
<FormSection>
@@ -127,6 +135,7 @@ export default defineComponent({
},
computed: {
+ overridedDeviceKind: defaultStore.makeGetterSetter('overridedDeviceKind'),
serverDisconnectedBehavior: defaultStore.makeGetterSetter('serverDisconnectedBehavior'),
reduceAnimation: defaultStore.makeGetterSetter('animation', v => !v, v => !v),
useBlurEffectForModal: defaultStore.makeGetterSetter('useBlurEffectForModal'),
@@ -193,6 +202,10 @@ export default defineComponent({
instanceTicker() {
this.reloadAsk();
},
+
+ overridedDeviceKind() {
+ this.reloadAsk();
+ },
},
methods: {
diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue
index cfae7e9ca8..a84d2f8786 100644
--- a/packages/client/src/pages/settings/privacy.vue
+++ b/packages/client/src/pages/settings/privacy.vue
@@ -8,7 +8,7 @@
<template #caption>{{ $ts.makeReactionsPublicDescription }}</template>
</FormSwitch>
- <FormSelect v-model="ffVisibility" class="_formBlock">
+ <FormSelect v-model="ffVisibility" class="_formBlock" @update:modelValue="save()">
<template #label>{{ $ts.ffVisibility }}</template>
<option value="public">{{ $ts._ffVisibility.public }}</option>
<option value="followers">{{ $ts._ffVisibility.followers }}</option>
diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue
index 66b654d87f..8ed29d5c24 100644
--- a/packages/client/src/pages/settings/profile.vue
+++ b/packages/client/src/pages/settings/profile.vue
@@ -29,16 +29,32 @@
<FormSelect v-model="profile.lang" class="_formBlock">
<template #label>{{ i18n.ts.language }}</template>
- <option v-for="x in langs" :key="x[0]" :value="x[0]">{{ x[1] }}</option>
+ <option v-for="x in Object.keys(langmap)" :key="x" :value="x">{{ langmap[x].nativeName }}</option>
</FormSelect>
- <FormSlot>
- <MkButton @click="editMetadata">{{ i18n.ts._profile.metadataEdit }}</MkButton>
+ <FormSlot class="_formBlock">
+ <FormFolder>
+ <template #icon><i class="fas fa-table-list"></i></template>
+ <template #label>{{ i18n.ts._profile.metadataEdit }}</template>
+
+ <div class="_formRoot">
+ <FormSplit v-for="(record, i) in fields" :min-width="250" class="_formBlock">
+ <FormInput v-model="record.name">
+ <template #label>{{ i18n.ts._profile.metadataLabel }} #{{ i + 1 }}</template>
+ </FormInput>
+ <FormInput v-model="record.value">
+ <template #label>{{ i18n.ts._profile.metadataContent }} #{{ i + 1 }}</template>
+ </FormInput>
+ </FormSplit>
+ <MkButton :disabled="fields.length >= 16" inline style="margin-right: 8px;" @click="addField"><i class="fas fa-plus"></i> {{ i18n.ts.add }}</MkButton>
+ <MkButton inline primary @click="saveFields"><i class="fas fa-check"></i> {{ i18n.ts.save }}</MkButton>
+ </div>
+ </FormFolder>
<template #caption>{{ i18n.ts._profile.metadataDescription }}</template>
</FormSlot>
<FormSwitch v-model="profile.isCat" class="_formBlock">{{ i18n.ts.flagAsCat }}<template #caption>{{ i18n.ts.flagAsCatDescription }}</template></FormSwitch>
-
+ <FormSwitch v-model="profile.showTimelineReplies" class="_formBlock">{{ i18n.ts.flagShowTimelineReplies }}<template #caption>{{ i18n.ts.flagShowTimelineRepliesDescription }}</template></FormSwitch>
<FormSwitch v-model="profile.isBot" class="_formBlock">{{ i18n.ts.flagAsBot }}<template #caption>{{ i18n.ts.flagAsBotDescription }}</template></FormSwitch>
<FormSwitch v-model="profile.alwaysMarkNsfw" class="_formBlock">{{ i18n.ts.alwaysMarkSensitive }}</FormSwitch>
@@ -52,13 +68,16 @@ import FormInput from '@/components/form/input.vue';
import FormTextarea from '@/components/form/textarea.vue';
import FormSwitch from '@/components/form/switch.vue';
import FormSelect from '@/components/form/select.vue';
+import FormSplit from '@/components/form/split.vue';
+import FormFolder from '@/components/form/folder.vue';
import FormSlot from '@/components/form/slot.vue';
-import { host, langs } from '@/config';
+import { host } from '@/config';
import { selectFile } from '@/scripts/select-file';
import * as os from '@/os';
import * as symbols from '@/symbols';
import { i18n } from '@/i18n';
import { $i } from '@/account';
+import { langmap } from '@/scripts/langmap';
const profile = reactive({
name: $i.name,
@@ -68,26 +87,35 @@ const profile = reactive({
lang: $i.lang,
isBot: $i.isBot,
isCat: $i.isCat,
+ showTimelineReplies: $i.showTimelineReplies,
alwaysMarkNsfw: $i.alwaysMarkNsfw,
});
-const additionalFields = reactive({
- fieldName0: $i.fields[0] ? $i.fields[0].name : null,
- fieldValue0: $i.fields[0] ? $i.fields[0].value : null,
- fieldName1: $i.fields[1] ? $i.fields[1].name : null,
- fieldValue1: $i.fields[1] ? $i.fields[1].value : null,
- fieldName2: $i.fields[2] ? $i.fields[2].name : null,
- fieldValue2: $i.fields[2] ? $i.fields[2].value : null,
- fieldName3: $i.fields[3] ? $i.fields[3].name : null,
- fieldValue3: $i.fields[3] ? $i.fields[3].value : null,
-});
-
watch(() => profile, () => {
save();
}, {
deep: true,
});
+const fields = reactive($i.fields.map(field => ({ name: field.name, value: field.value })));
+
+function addField() {
+ fields.push({
+ name: '',
+ value: '',
+ });
+}
+
+while (fields.length < 4) {
+ addField();
+}
+
+function saveFields() {
+ os.apiWithDialog('i/update', {
+ fields: fields.filter(field => field.name !== '' && field.value !== ''),
+ });
+}
+
function save() {
os.apiWithDialog('i/update', {
name: profile.name || null,
@@ -97,6 +125,7 @@ function save() {
lang: profile.lang || null,
isBot: !!profile.isBot,
isCat: !!profile.isCat,
+ showTimelineReplies: !!profile.showTimelineReplies,
alwaysMarkNsfw: !!profile.alwaysMarkNsfw,
});
}
@@ -121,79 +150,6 @@ function changeBanner(ev) {
});
}
-async function editMetadata() {
- const { canceled, result } = await os.form(i18n.ts._profile.metadata, {
- fieldName0: {
- type: 'string',
- label: i18n.ts._profile.metadataLabel + ' 1',
- default: additionalFields.fieldName0,
- },
- fieldValue0: {
- type: 'string',
- label: i18n.ts._profile.metadataContent + ' 1',
- default: additionalFields.fieldValue0,
- },
- fieldName1: {
- type: 'string',
- label: i18n.ts._profile.metadataLabel + ' 2',
- default: additionalFields.fieldName1,
- },
- fieldValue1: {
- type: 'string',
- label: i18n.ts._profile.metadataContent + ' 2',
- default: additionalFields.fieldValue1,
- },
- fieldName2: {
- type: 'string',
- label: i18n.ts._profile.metadataLabel + ' 3',
- default: additionalFields.fieldName2,
- },
- fieldValue2: {
- type: 'string',
- label: i18n.ts._profile.metadataContent + ' 3',
- default: additionalFields.fieldValue2,
- },
- fieldName3: {
- type: 'string',
- label: i18n.ts._profile.metadataLabel + ' 4',
- default: additionalFields.fieldName3,
- },
- fieldValue3: {
- type: 'string',
- label: i18n.ts._profile.metadataContent + ' 4',
- default: additionalFields.fieldValue3,
- },
- });
- if (canceled) return;
-
- additionalFields.fieldName0 = result.fieldName0;
- additionalFields.fieldValue0 = result.fieldValue0;
- additionalFields.fieldName1 = result.fieldName1;
- additionalFields.fieldValue1 = result.fieldValue1;
- additionalFields.fieldName2 = result.fieldName2;
- additionalFields.fieldValue2 = result.fieldValue2;
- additionalFields.fieldName3 = result.fieldName3;
- additionalFields.fieldValue3 = result.fieldValue3;
-
- const fields = [
- { name: additionalFields.fieldName0, value: additionalFields.fieldValue0 },
- { name: additionalFields.fieldName1, value: additionalFields.fieldValue1 },
- { name: additionalFields.fieldName2, value: additionalFields.fieldValue2 },
- { name: additionalFields.fieldName3, value: additionalFields.fieldValue3 },
- ];
-
- os.api('i/update', {
- fields,
- }).then(i => {
- os.success();
- }).catch(err => {
- os.alert({
- type: 'error',
- text: err.id
- });
- });
-}
-
defineExpose({
[symbols.PAGE_INFO]: {
title: i18n.ts.profile,
diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue
index ae3e1a1187..a188ba353d 100644
--- a/packages/client/src/pages/settings/reaction.vue
+++ b/packages/client/src/pages/settings/reaction.vue
@@ -17,17 +17,26 @@
<template #caption>{{ $ts.reactionSettingDescription2 }} <button class="_textButton" @click="preview">{{ $ts.preview }}</button></template>
</FromSlot>
- <FormRadios v-model="reactionPickerWidth" class="_formBlock">
- <template #label>{{ $ts.width }}</template>
+ <FormRadios v-model="reactionPickerSize" class="_formBlock">
+ <template #label>{{ $ts.size }}</template>
<option :value="1">{{ $ts.small }}</option>
<option :value="2">{{ $ts.medium }}</option>
<option :value="3">{{ $ts.large }}</option>
</FormRadios>
+ <FormRadios v-model="reactionPickerWidth" class="_formBlock">
+ <template #label>{{ $ts.numberOfColumn }}</template>
+ <option :value="1">5</option>
+ <option :value="2">6</option>
+ <option :value="3">7</option>
+ <option :value="4">8</option>
+ <option :value="5">9</option>
+ </FormRadios>
<FormRadios v-model="reactionPickerHeight" class="_formBlock">
<template #label>{{ $ts.height }}</template>
<option :value="1">{{ $ts.small }}</option>
<option :value="2">{{ $ts.medium }}</option>
<option :value="3">{{ $ts.large }}</option>
+ <option :value="4">{{ $ts.large }}+</option>
</FormRadios>
<FormSwitch v-model="reactionPickerUseDrawerForMobile" class="_formBlock">
@@ -60,6 +69,7 @@ import { i18n } from '@/i18n';
let reactions = $ref(JSON.parse(JSON.stringify(defaultStore.state.reactions)));
+const reactionPickerSize = $computed(defaultStore.makeGetterSetter('reactionPickerSize'));
const reactionPickerWidth = $computed(defaultStore.makeGetterSetter('reactionPickerWidth'));
const reactionPickerHeight = $computed(defaultStore.makeGetterSetter('reactionPickerHeight'));
const reactionPickerUseDrawerForMobile = $computed(defaultStore.makeGetterSetter('reactionPickerUseDrawerForMobile'));
diff --git a/packages/client/src/pages/settings/theme.vue b/packages/client/src/pages/settings/theme.vue
index 3e4ec1b2af..92a6fee7a4 100644
--- a/packages/client/src/pages/settings/theme.vue
+++ b/packages/client/src/pages/settings/theme.vue
@@ -87,6 +87,7 @@
<script lang="ts">
import { computed, defineComponent, onActivated, onMounted, ref, watch } from 'vue';
+import * as JSON5 from 'json5';
import FormSwitch from '@/components/form/switch.vue';
import FormSelect from '@/components/form/select.vue';
import FormGroup from '@/components/form/group.vue';
@@ -99,6 +100,8 @@ import { isDeviceDarkmode } from '@/scripts/is-device-darkmode';
import { ColdDeviceStorage } from '@/store';
import { i18n } from '@/i18n';
import { defaultStore } from '@/store';
+import { instance } from '@/instance';
+import { concat } from '@/scripts/array';
import { fetchThemes, getThemes } from '@/theme-store';
import * as symbols from '@/symbols';
@@ -122,9 +125,12 @@ export default defineComponent({
};
const installedThemes = ref(getThemes());
- const themes = computed(() => builtinThemes.concat(installedThemes.value));
- const darkThemes = computed(() => themes.value.filter(t => t.base == 'dark' || t.kind == 'dark'));
- const lightThemes = computed(() => themes.value.filter(t => t.base == 'light' || t.kind == 'light'));
+ const instanceThemes = [];
+ if (instance.defaultLightTheme != null) instanceThemes.push(JSON5.parse(instance.defaultLightTheme));
+ if (instance.defaultDarkTheme != null) instanceThemes.push(JSON5.parse(instance.defaultDarkTheme));
+ const themes = computed(() => instanceThemes.concat(builtinThemes.concat(installedThemes.value)));
+ const darkThemes = computed(() => themes.value.filter(t => t.base === 'dark' || t.kind === 'dark'));
+ const lightThemes = computed(() => themes.value.filter(t => t.base === 'light' || t.kind === 'light'));
const darkTheme = ColdDeviceStorage.ref('darkTheme');
const darkThemeId = computed({
get() {
diff --git a/packages/client/src/pages/settings/word-mute.vue b/packages/client/src/pages/settings/word-mute.vue
index 19980dea14..2767e6351a 100644
--- a/packages/client/src/pages/settings/word-mute.vue
+++ b/packages/client/src/pages/settings/word-mute.vue
@@ -81,18 +81,67 @@ export default defineComponent({
},
async created() {
- this.softMutedWords = this.$store.state.mutedWords.map(x => x.join(' ')).join('\n');
- this.hardMutedWords = this.$i.mutedWords.map(x => x.join(' ')).join('\n');
+ const render = (mutedWords) => mutedWords.map(x => {
+ if (Array.isArray(x)) {
+ return x.join(' ');
+ } else {
+ return x;
+ }
+ }).join('\n');
+
+ this.softMutedWords = render(this.$store.state.mutedWords);
+ this.hardMutedWords = render(this.$i.mutedWords);
this.hardWordMutedNotesCount = (await os.api('i/get-word-muted-notes-count', {})).count;
},
methods: {
async save() {
- this.$store.set('mutedWords', this.softMutedWords.trim().split('\n').map(x => x.trim().split(' ')));
+ const parseMutes = (mutes, tab) => {
+ // split into lines, remove empty lines and unnecessary whitespace
+ let lines = mutes.trim().split('\n').map(line => line.trim()).filter(line => line != '');
+
+ // check each line if it is a RegExp or not
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i]
+ const regexp = line.match(/^\/(.+)\/(.*)$/);
+ if (regexp) {
+ // check that the RegExp is valid
+ try {
+ new RegExp(regexp[1], regexp[2]);
+ // note that regex lines will not be split by spaces!
+ } catch (err) {
+ // invalid syntax: do not save, do not reset changed flag
+ os.alert({
+ type: 'error',
+ title: this.$ts.regexpError,
+ text: this.$t('regexpErrorDescription', { tab, line: i + 1 }) + "\n" + err.toString()
+ });
+ // re-throw error so these invalid settings are not saved
+ throw err;
+ }
+ } else {
+ lines[i] = line.split(' ');
+ }
+ }
+
+ return lines;
+ };
+
+ let softMutes, hardMutes;
+ try {
+ softMutes = parseMutes(this.softMutedWords, this.$ts._wordMute.soft);
+ hardMutes = parseMutes(this.hardMutedWords, this.$ts._wordMute.hard);
+ } catch (err) {
+ // already displayed error message in parseMutes
+ return;
+ }
+
+ this.$store.set('mutedWords', softMutes);
await os.api('i/update', {
- mutedWords: this.hardMutedWords.trim().split('\n').map(x => x.trim().split(' ')),
+ mutedWords: hardMutes,
});
+
this.changed = false;
},
diff --git a/packages/client/src/pages/timeline.vue b/packages/client/src/pages/timeline.vue
index b2266d22c3..79f00c4b44 100644
--- a/packages/client/src/pages/timeline.vue
+++ b/packages/client/src/pages/timeline.vue
@@ -46,8 +46,10 @@ const keymap = {
const tlComponent = $ref<InstanceType<typeof XTimeline>>();
const rootEl = $ref<HTMLElement>();
-let src = $ref<'home' | 'local' | 'social' | 'global'>(defaultStore.state.tl.src);
let queue = $ref(0);
+const src = $computed(() => defaultStore.reactiveState.tl.value.src);
+
+watch ($$(src), () => queue = 0);
function queueUpdated(q: number): void {
queue = q;
@@ -60,7 +62,7 @@ function top(): void {
async function chooseList(ev: MouseEvent): Promise<void> {
const lists = await os.api('users/lists/list');
const items = lists.map(list => ({
- type: 'link',
+ type: 'link' as const,
text: list.name,
to: `/timeline/list/${list.id}`,
}));
@@ -70,7 +72,7 @@ async function chooseList(ev: MouseEvent): Promise<void> {
async function chooseAntenna(ev: MouseEvent): Promise<void> {
const antennas = await os.api('antennas/list');
const items = antennas.map(antenna => ({
- type: 'link',
+ type: 'link' as const,
text: antenna.name,
indicate: antenna.hasUnreadNote,
to: `/timeline/antenna/${antenna.id}`,
@@ -81,7 +83,7 @@ async function chooseAntenna(ev: MouseEvent): Promise<void> {
async function chooseChannel(ev: MouseEvent): Promise<void> {
const channels = await os.api('channels/followed');
const items = channels.map(channel => ({
- type: 'link',
+ type: 'link' as const,
text: channel.name,
indicate: channel.hasUnreadNote,
to: `/channels/${channel.id}`,
@@ -89,9 +91,10 @@ async function chooseChannel(ev: MouseEvent): Promise<void> {
os.popupMenu(items, ev.currentTarget ?? ev.target);
}
-function saveSrc(): void {
+function saveSrc(newSrc: 'home' | 'local' | 'social' | 'global'): void {
defaultStore.set('tl', {
- src: src,
+ ...defaultStore.state.tl,
+ src: newSrc,
});
}
@@ -135,25 +138,25 @@ defineExpose({
title: i18n.ts._timelines.home,
icon: 'fas fa-home',
iconOnly: true,
- onClick: () => { src = 'home'; saveSrc(); },
+ onClick: () => { saveSrc('home'); },
}, ...(isLocalTimelineAvailable ? [{
active: src === 'local',
title: i18n.ts._timelines.local,
icon: 'fas fa-comments',
iconOnly: true,
- onClick: () => { src = 'local'; saveSrc(); },
+ onClick: () => { saveSrc('local'); },
}, {
active: src === 'social',
title: i18n.ts._timelines.social,
icon: 'fas fa-share-alt',
iconOnly: true,
- onClick: () => { src = 'social'; saveSrc(); },
+ onClick: () => { saveSrc('social'); },
}] : []), ...(isGlobalTimelineAvailable ? [{
active: src === 'global',
title: i18n.ts._timelines.global,
icon: 'fas fa-globe',
iconOnly: true,
- onClick: () => { src = 'global'; saveSrc(); },
+ onClick: () => { saveSrc('global'); },
}] : [])],
})),
});
diff --git a/packages/client/src/pages/user/index.activity.vue b/packages/client/src/pages/user/index.activity.vue
index 43a4f476f1..f64e9d5b60 100644
--- a/packages/client/src/pages/user/index.activity.vue
+++ b/packages/client/src/pages/user/index.activity.vue
@@ -3,7 +3,7 @@
<template #header><i class="fas fa-chart-bar" style="margin-right: 0.5em;"></i>{{ $ts.activity }}</template>
<div style="padding: 8px;">
- <MkChart src="per-user-notes" :args="{ user, withoutAll: true }" span="day" :limit="limit" :stacked="true" :detailed="false" :aspect-ratio="6"/>
+ <MkChart src="per-user-notes" :args="{ user, withoutAll: true }" span="day" :limit="limit" :bar="true" :stacked="true" :detailed="false" :aspect-ratio="5"/>
</div>
</MkContainer>
</template>
@@ -18,6 +18,6 @@ const props = withDefaults(defineProps<{
user: misskey.entities.User;
limit?: number;
}>(), {
- limit: 40,
+ limit: 50,
});
</script>
diff --git a/packages/client/src/pages/welcome.setup.vue b/packages/client/src/pages/welcome.setup.vue
index 3dca5b3e78..ec23b76e29 100644
--- a/packages/client/src/pages/welcome.setup.vue
+++ b/packages/client/src/pages/welcome.setup.vue
@@ -1,22 +1,22 @@
<template>
<form class="mk-setup" @submit.prevent="submit()">
<h1>Welcome to Misskey!</h1>
- <div>
+ <div class="_formRoot">
<p>{{ $ts.intro }}</p>
- <MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" spellcheck="false" required data-cy-admin-username>
+ <MkInput v-model="username" pattern="^[a-zA-Z0-9_]{1,20}$" spellcheck="false" required data-cy-admin-username class="_formBlock">
<template #label>{{ $ts.username }}</template>
<template #prefix>@</template>
<template #suffix>@{{ host }}</template>
</MkInput>
- <MkInput v-model="password" type="password" data-cy-admin-password>
+ <MkInput v-model="password" type="password" data-cy-admin-password class="_formBlock">
<template #label>{{ $ts.password }}</template>
<template #prefix><i class="fas fa-lock"></i></template>
</MkInput>
- <footer>
- <MkButton primary type="submit" :disabled="submitting" data-cy-admin-ok>
+ <div class="bottom _formBlock">
+ <MkButton gradate type="submit" :disabled="submitting" data-cy-admin-ok>
{{ submitting ? $ts.processing : $ts.done }}<MkEllipsis v-if="submitting"/>
</MkButton>
- </footer>
+ </div>
</div>
</form>
</template>
@@ -92,7 +92,7 @@ export default defineComponent({
margin-top: 0;
}
- > footer {
+ > .bottom {
> * {
margin: 0 auto;
}
diff --git a/packages/client/src/pages/welcome.vue b/packages/client/src/pages/welcome.vue
index 4c038b5113..98808229da 100644
--- a/packages/client/src/pages/welcome.vue
+++ b/packages/client/src/pages/welcome.vue
@@ -5,34 +5,24 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { computed } from 'vue';
import XSetup from './welcome.setup.vue';
import XEntrance from './welcome.entrance.a.vue';
import { instanceName } from '@/config';
import * as os from '@/os';
import * as symbols from '@/symbols';
-export default defineComponent({
- components: {
- XSetup,
- XEntrance,
- },
+let meta = $ref(null);
- data() {
- return {
- [symbols.PAGE_INFO]: {
- title: instanceName,
- icon: null
- },
- meta: null
- }
- },
+os.api('meta', { detail: true }).then(res => {
+ meta = res;
+});
- created() {
- os.api('meta', { detail: true }).then(meta => {
- this.meta = meta;
- });
- }
+defineExpose({
+ [symbols.PAGE_INFO]: computed(() => ({
+ title: instanceName,
+ icon: null,
+ })),
});
</script>
diff --git a/packages/client/src/scripts/check-word-mute.ts b/packages/client/src/scripts/check-word-mute.ts
index 55637bb3b3..fa74c09939 100644
--- a/packages/client/src/scripts/check-word-mute.ts
+++ b/packages/client/src/scripts/check-word-mute.ts
@@ -1,23 +1,32 @@
-export function checkWordMute(note: Record<string, any>, me: Record<string, any> | null | undefined, mutedWords: string[][]): boolean {
+export function checkWordMute(note: Record<string, any>, me: Record<string, any> | null | undefined, mutedWords: Array<string | string[]>): boolean {
// 自分自身
if (me && (note.userId === me.id)) return false;
- const words = mutedWords
- // Clean up
- .map(xs => xs.filter(x => x !== ''))
- .filter(xs => xs.length > 0);
-
- if (words.length > 0) {
+ if (mutedWords.length > 0) {
if (note.text == null) return false;
- const matched = words.some(and =>
- and.every(keyword => {
- const regexp = keyword.match(/^\/(.+)\/(.*)$/);
- if (regexp) {
+ const matched = mutedWords.some(filter => {
+ if (Array.isArray(filter)) {
+ // Clean up
+ const filteredFilter = filter.filter(keyword => keyword !== '');
+ if (filteredFilter.length === 0) return false;
+
+ return filteredFilter.every(keyword => note.text!.includes(keyword));
+ } else {
+ // represents RegExp
+ const regexp = filter.match(/^\/(.+)\/(.*)$/);
+
+ // This should never happen due to input sanitisation.
+ if (!regexp) return false;
+
+ try {
return new RegExp(regexp[1], regexp[2]).test(note.text!);
+ } catch (err) {
+ // This should never happen due to input sanitisation.
+ return false;
}
- return note.text!.includes(keyword);
- }));
+ }
+ });
if (matched) return true;
}
diff --git a/packages/client/src/scripts/device-kind.ts b/packages/client/src/scripts/device-kind.ts
new file mode 100644
index 0000000000..544cac0604
--- /dev/null
+++ b/packages/client/src/scripts/device-kind.ts
@@ -0,0 +1,10 @@
+import { defaultStore } from '@/store';
+
+const ua = navigator.userAgent.toLowerCase();
+const isTablet = /ipad/.test(ua) || (/mobile|iphone|android/.test(ua) && window.innerWidth > 700);
+const isSmartphone = !isTablet && /mobile|iphone|android/.test(ua);
+
+export const deviceKind = defaultStore.state.overridedDeviceKind ? defaultStore.state.overridedDeviceKind
+ : isSmartphone ? 'smartphone'
+ : isTablet ? 'tablet'
+ : 'desktop';
diff --git a/packages/client/src/scripts/is-mobile.ts b/packages/client/src/scripts/is-mobile.ts
deleted file mode 100644
index 60cb59f91e..0000000000
--- a/packages/client/src/scripts/is-mobile.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-const ua = navigator.userAgent.toLowerCase();
-export const isMobile = /mobile|iphone|ipad|android/.test(ua);
diff --git a/packages/client/src/scripts/langmap.ts b/packages/client/src/scripts/langmap.ts
new file mode 100644
index 0000000000..25f5b366c8
--- /dev/null
+++ b/packages/client/src/scripts/langmap.ts
@@ -0,0 +1,666 @@
+// TODO: sharedに置いてバックエンドのと統合したい
+export const langmap = {
+ 'ach': {
+ nativeName: 'Lwo',
+ },
+ 'ady': {
+ nativeName: 'Адыгэбзэ',
+ },
+ 'af': {
+ nativeName: 'Afrikaans',
+ },
+ 'af-NA': {
+ nativeName: 'Afrikaans (Namibia)',
+ },
+ 'af-ZA': {
+ nativeName: 'Afrikaans (South Africa)',
+ },
+ 'ak': {
+ nativeName: 'Tɕɥi',
+ },
+ 'ar': {
+ nativeName: 'العربية',
+ },
+ 'ar-AR': {
+ nativeName: 'العربية',
+ },
+ 'ar-MA': {
+ nativeName: 'العربية',
+ },
+ 'ar-SA': {
+ nativeName: 'العربية (السعودية)',
+ },
+ 'ay-BO': {
+ nativeName: 'Aymar aru',
+ },
+ 'az': {
+ nativeName: 'Azərbaycan dili',
+ },
+ 'az-AZ': {
+ nativeName: 'Azərbaycan dili',
+ },
+ 'be-BY': {
+ nativeName: 'Беларуская',
+ },
+ 'bg': {
+ nativeName: 'Български',
+ },
+ 'bg-BG': {
+ nativeName: 'Български',
+ },
+ 'bn': {
+ nativeName: 'বাংলা',
+ },
+ 'bn-IN': {
+ nativeName: 'বাংলা (ভারত)',
+ },
+ 'bn-BD': {
+ nativeName: 'বাংলা(বাংলাদেশ)',
+ },
+ 'br': {
+ nativeName: 'Brezhoneg',
+ },
+ 'bs-BA': {
+ nativeName: 'Bosanski',
+ },
+ 'ca': {
+ nativeName: 'Català',
+ },
+ 'ca-ES': {
+ nativeName: 'Català',
+ },
+ 'cak': {
+ nativeName: 'Maya Kaqchikel',
+ },
+ 'ck-US': {
+ nativeName: 'ᏣᎳᎩ (tsalagi)',
+ },
+ 'cs': {
+ nativeName: 'Čeština',
+ },
+ 'cs-CZ': {
+ nativeName: 'Čeština',
+ },
+ 'cy': {
+ nativeName: 'Cymraeg',
+ },
+ 'cy-GB': {
+ nativeName: 'Cymraeg',
+ },
+ 'da': {
+ nativeName: 'Dansk',
+ },
+ 'da-DK': {
+ nativeName: 'Dansk',
+ },
+ 'de': {
+ nativeName: 'Deutsch',
+ },
+ 'de-AT': {
+ nativeName: 'Deutsch (Österreich)',
+ },
+ 'de-DE': {
+ nativeName: 'Deutsch (Deutschland)',
+ },
+ 'de-CH': {
+ nativeName: 'Deutsch (Schweiz)',
+ },
+ 'dsb': {
+ nativeName: 'Dolnoserbšćina',
+ },
+ 'el': {
+ nativeName: 'Ελληνικά',
+ },
+ 'el-GR': {
+ nativeName: 'Ελληνικά',
+ },
+ 'en': {
+ nativeName: 'English',
+ },
+ 'en-GB': {
+ nativeName: 'English (UK)',
+ },
+ 'en-AU': {
+ nativeName: 'English (Australia)',
+ },
+ 'en-CA': {
+ nativeName: 'English (Canada)',
+ },
+ 'en-IE': {
+ nativeName: 'English (Ireland)',
+ },
+ 'en-IN': {
+ nativeName: 'English (India)',
+ },
+ 'en-PI': {
+ nativeName: 'English (Pirate)',
+ },
+ 'en-SG': {
+ nativeName: 'English (Singapore)',
+ },
+ 'en-UD': {
+ nativeName: 'English (Upside Down)',
+ },
+ 'en-US': {
+ nativeName: 'English (US)',
+ },
+ 'en-ZA': {
+ nativeName: 'English (South Africa)',
+ },
+ 'en@pirate': {
+ nativeName: 'English (Pirate)',
+ },
+ 'eo': {
+ nativeName: 'Esperanto',
+ },
+ 'eo-EO': {
+ nativeName: 'Esperanto',
+ },
+ 'es': {
+ nativeName: 'Español',
+ },
+ 'es-AR': {
+ nativeName: 'Español (Argentine)',
+ },
+ 'es-419': {
+ nativeName: 'Español (Latinoamérica)',
+ },
+ 'es-CL': {
+ nativeName: 'Español (Chile)',
+ },
+ 'es-CO': {
+ nativeName: 'Español (Colombia)',
+ },
+ 'es-EC': {
+ nativeName: 'Español (Ecuador)',
+ },
+ 'es-ES': {
+ nativeName: 'Español (España)',
+ },
+ 'es-LA': {
+ nativeName: 'Español (Latinoamérica)',
+ },
+ 'es-NI': {
+ nativeName: 'Español (Nicaragua)',
+ },
+ 'es-MX': {
+ nativeName: 'Español (México)',
+ },
+ 'es-US': {
+ nativeName: 'Español (Estados Unidos)',
+ },
+ 'es-VE': {
+ nativeName: 'Español (Venezuela)',
+ },
+ 'et': {
+ nativeName: 'eesti keel',
+ },
+ 'et-EE': {
+ nativeName: 'Eesti (Estonia)',
+ },
+ 'eu': {
+ nativeName: 'Euskara',
+ },
+ 'eu-ES': {
+ nativeName: 'Euskara',
+ },
+ 'fa': {
+ nativeName: 'فارسی',
+ },
+ 'fa-IR': {
+ nativeName: 'فارسی',
+ },
+ 'fb-LT': {
+ nativeName: 'Leet Speak',
+ },
+ 'ff': {
+ nativeName: 'Fulah',
+ },
+ 'fi': {
+ nativeName: 'Suomi',
+ },
+ 'fi-FI': {
+ nativeName: 'Suomi',
+ },
+ 'fo': {
+ nativeName: 'Føroyskt',
+ },
+ 'fo-FO': {
+ nativeName: 'Føroyskt (Færeyjar)',
+ },
+ 'fr': {
+ nativeName: 'Français',
+ },
+ 'fr-CA': {
+ nativeName: 'Français (Canada)',
+ },
+ 'fr-FR': {
+ nativeName: 'Français (France)',
+ },
+ 'fr-BE': {
+ nativeName: 'Français (Belgique)',
+ },
+ 'fr-CH': {
+ nativeName: 'Français (Suisse)',
+ },
+ 'fy-NL': {
+ nativeName: 'Frysk',
+ },
+ 'ga': {
+ nativeName: 'Gaeilge',
+ },
+ 'ga-IE': {
+ nativeName: 'Gaeilge',
+ },
+ 'gd': {
+ nativeName: 'Gàidhlig',
+ },
+ 'gl': {
+ nativeName: 'Galego',
+ },
+ 'gl-ES': {
+ nativeName: 'Galego',
+ },
+ 'gn-PY': {
+ nativeName: 'Avañe\'ẽ',
+ },
+ 'gu-IN': {
+ nativeName: 'ગુજરાતી',
+ },
+ 'gv': {
+ nativeName: 'Gaelg',
+ },
+ 'gx-GR': {
+ nativeName: 'Ἑλληνική ἀρχαία',
+ },
+ 'he': {
+ nativeName: 'עברית‏',
+ },
+ 'he-IL': {
+ nativeName: 'עברית‏',
+ },
+ 'hi': {
+ nativeName: 'हिन्दी',
+ },
+ 'hi-IN': {
+ nativeName: 'हिन्दी',
+ },
+ 'hr': {
+ nativeName: 'Hrvatski',
+ },
+ 'hr-HR': {
+ nativeName: 'Hrvatski',
+ },
+ 'hsb': {
+ nativeName: 'Hornjoserbšćina',
+ },
+ 'ht': {
+ nativeName: 'Kreyòl',
+ },
+ 'hu': {
+ nativeName: 'Magyar',
+ },
+ 'hu-HU': {
+ nativeName: 'Magyar',
+ },
+ 'hy': {
+ nativeName: 'Հայերեն',
+ },
+ 'hy-AM': {
+ nativeName: 'Հայերեն (Հայաստան)',
+ },
+ 'id': {
+ nativeName: 'Bahasa Indonesia',
+ },
+ 'id-ID': {
+ nativeName: 'Bahasa Indonesia',
+ },
+ 'is': {
+ nativeName: 'Íslenska',
+ },
+ 'is-IS': {
+ nativeName: 'Íslenska (Iceland)',
+ },
+ 'it': {
+ nativeName: 'Italiano',
+ },
+ 'it-IT': {
+ nativeName: 'Italiano',
+ },
+ 'ja': {
+ nativeName: '日本語',
+ },
+ 'ja-JP': {
+ nativeName: '日本語 (日本)',
+ },
+ 'jv-ID': {
+ nativeName: 'Basa Jawa',
+ },
+ 'ka-GE': {
+ nativeName: 'ქართული',
+ },
+ 'kk-KZ': {
+ nativeName: 'Қазақша',
+ },
+ 'km': {
+ nativeName: 'ភាសាខ្មែរ',
+ },
+ 'kl': {
+ nativeName: 'kalaallisut',
+ },
+ 'km-KH': {
+ nativeName: 'ភាសាខ្មែរ',
+ },
+ 'kab': {
+ nativeName: 'Taqbaylit',
+ },
+ 'kn': {
+ nativeName: 'ಕನ್ನಡ',
+ },
+ 'kn-IN': {
+ nativeName: 'ಕನ್ನಡ (India)',
+ },
+ 'ko': {
+ nativeName: '한국어',
+ },
+ 'ko-KR': {
+ nativeName: '한국어 (한국)',
+ },
+ 'ku-TR': {
+ nativeName: 'Kurdî',
+ },
+ 'kw': {
+ nativeName: 'Kernewek',
+ },
+ 'la': {
+ nativeName: 'Latin',
+ },
+ 'la-VA': {
+ nativeName: 'Latin',
+ },
+ 'lb': {
+ nativeName: 'Lëtzebuergesch',
+ },
+ 'li-NL': {
+ nativeName: 'Lèmbörgs',
+ },
+ 'lt': {
+ nativeName: 'Lietuvių',
+ },
+ 'lt-LT': {
+ nativeName: 'Lietuvių',
+ },
+ 'lv': {
+ nativeName: 'Latviešu',
+ },
+ 'lv-LV': {
+ nativeName: 'Latviešu',
+ },
+ 'mai': {
+ nativeName: 'मैथिली, মৈথিলী',
+ },
+ 'mg-MG': {
+ nativeName: 'Malagasy',
+ },
+ 'mk': {
+ nativeName: 'Македонски',
+ },
+ 'mk-MK': {
+ nativeName: 'Македонски (Македонски)',
+ },
+ 'ml': {
+ nativeName: 'മലയാളം',
+ },
+ 'ml-IN': {
+ nativeName: 'മലയാളം',
+ },
+ 'mn-MN': {
+ nativeName: 'Монгол',
+ },
+ 'mr': {
+ nativeName: 'मराठी',
+ },
+ 'mr-IN': {
+ nativeName: 'मराठी',
+ },
+ 'ms': {
+ nativeName: 'Bahasa Melayu',
+ },
+ 'ms-MY': {
+ nativeName: 'Bahasa Melayu',
+ },
+ 'mt': {
+ nativeName: 'Malti',
+ },
+ 'mt-MT': {
+ nativeName: 'Malti',
+ },
+ 'my': {
+ nativeName: 'ဗမာစကာ',
+ },
+ 'no': {
+ nativeName: 'Norsk',
+ },
+ 'nb': {
+ nativeName: 'Norsk (bokmål)',
+ },
+ 'nb-NO': {
+ nativeName: 'Norsk (bokmål)',
+ },
+ 'ne': {
+ nativeName: 'नेपाली',
+ },
+ 'ne-NP': {
+ nativeName: 'नेपाली',
+ },
+ 'nl': {
+ nativeName: 'Nederlands',
+ },
+ 'nl-BE': {
+ nativeName: 'Nederlands (België)',
+ },
+ 'nl-NL': {
+ nativeName: 'Nederlands (Nederland)',
+ },
+ 'nn-NO': {
+ nativeName: 'Norsk (nynorsk)',
+ },
+ 'oc': {
+ nativeName: 'Occitan',
+ },
+ 'or-IN': {
+ nativeName: 'ଓଡ଼ିଆ',
+ },
+ 'pa': {
+ nativeName: 'ਪੰਜਾਬੀ',
+ },
+ 'pa-IN': {
+ nativeName: 'ਪੰਜਾਬੀ (ਭਾਰਤ ਨੂੰ)',
+ },
+ 'pl': {
+ nativeName: 'Polski',
+ },
+ 'pl-PL': {
+ nativeName: 'Polski',
+ },
+ 'ps-AF': {
+ nativeName: 'پښتو',
+ },
+ 'pt': {
+ nativeName: 'Português',
+ },
+ 'pt-BR': {
+ nativeName: 'Português (Brasil)',
+ },
+ 'pt-PT': {
+ nativeName: 'Português (Portugal)',
+ },
+ 'qu-PE': {
+ nativeName: 'Qhichwa',
+ },
+ 'rm-CH': {
+ nativeName: 'Rumantsch',
+ },
+ 'ro': {
+ nativeName: 'Română',
+ },
+ 'ro-RO': {
+ nativeName: 'Română',
+ },
+ 'ru': {
+ nativeName: 'Русский',
+ },
+ 'ru-RU': {
+ nativeName: 'Русский',
+ },
+ 'sa-IN': {
+ nativeName: 'संस्कृतम्',
+ },
+ 'se-NO': {
+ nativeName: 'Davvisámegiella',
+ },
+ 'sh': {
+ nativeName: 'српскохрватски',
+ },
+ 'si-LK': {
+ nativeName: 'සිංහල',
+ },
+ 'sk': {
+ nativeName: 'Slovenčina',
+ },
+ 'sk-SK': {
+ nativeName: 'Slovenčina (Slovakia)',
+ },
+ 'sl': {
+ nativeName: 'Slovenščina',
+ },
+ 'sl-SI': {
+ nativeName: 'Slovenščina',
+ },
+ 'so-SO': {
+ nativeName: 'Soomaaliga',
+ },
+ 'sq': {
+ nativeName: 'Shqip',
+ },
+ 'sq-AL': {
+ nativeName: 'Shqip',
+ },
+ 'sr': {
+ nativeName: 'Српски',
+ },
+ 'sr-RS': {
+ nativeName: 'Српски (Serbia)',
+ },
+ 'su': {
+ nativeName: 'Basa Sunda',
+ },
+ 'sv': {
+ nativeName: 'Svenska',
+ },
+ 'sv-SE': {
+ nativeName: 'Svenska',
+ },
+ 'sw': {
+ nativeName: 'Kiswahili',
+ },
+ 'sw-KE': {
+ nativeName: 'Kiswahili',
+ },
+ 'ta': {
+ nativeName: 'தமிழ்',
+ },
+ 'ta-IN': {
+ nativeName: 'தமிழ்',
+ },
+ 'te': {
+ nativeName: 'తెలుగు',
+ },
+ 'te-IN': {
+ nativeName: 'తెలుగు',
+ },
+ 'tg': {
+ nativeName: 'забо́ни тоҷикӣ́',
+ },
+ 'tg-TJ': {
+ nativeName: 'тоҷикӣ',
+ },
+ 'th': {
+ nativeName: 'ภาษาไทย',
+ },
+ 'th-TH': {
+ nativeName: 'ภาษาไทย (ประเทศไทย)',
+ },
+ 'fil': {
+ nativeName: 'Filipino',
+ },
+ 'tlh': {
+ nativeName: 'tlhIngan-Hol',
+ },
+ 'tr': {
+ nativeName: 'Türkçe',
+ },
+ 'tr-TR': {
+ nativeName: 'Türkçe',
+ },
+ 'tt-RU': {
+ nativeName: 'татарча',
+ },
+ 'uk': {
+ nativeName: 'Українська',
+ },
+ 'uk-UA': {
+ nativeName: 'Українська',
+ },
+ 'ur': {
+ nativeName: 'اردو',
+ },
+ 'ur-PK': {
+ nativeName: 'اردو',
+ },
+ 'uz': {
+ nativeName: 'O\'zbek',
+ },
+ 'uz-UZ': {
+ nativeName: 'O\'zbek',
+ },
+ 'vi': {
+ nativeName: 'Tiếng Việt',
+ },
+ 'vi-VN': {
+ nativeName: 'Tiếng Việt',
+ },
+ 'xh-ZA': {
+ nativeName: 'isiXhosa',
+ },
+ 'yi': {
+ nativeName: 'ייִדיש',
+ },
+ 'yi-DE': {
+ nativeName: 'ייִדיש (German)',
+ },
+ 'zh': {
+ nativeName: '中文',
+ },
+ 'zh-Hans': {
+ nativeName: '中文简体',
+ },
+ 'zh-Hant': {
+ nativeName: '中文繁體',
+ },
+ 'zh-CN': {
+ nativeName: '中文(中国大陆)',
+ },
+ 'zh-HK': {
+ nativeName: '中文(香港)',
+ },
+ 'zh-SG': {
+ nativeName: '中文(新加坡)',
+ },
+ 'zh-TW': {
+ nativeName: '中文(台灣)',
+ },
+ 'zu-ZA': {
+ nativeName: 'isiZulu',
+ },
+};
diff --git a/packages/client/src/scripts/select-file.ts b/packages/client/src/scripts/select-file.ts
index 56e0b564f3..23df4edf54 100644
--- a/packages/client/src/scripts/select-file.ts
+++ b/packages/client/src/scripts/select-file.ts
@@ -1,3 +1,4 @@
+import { ref } from 'vue';
import * as os from '@/os';
import { stream } from '@/stream';
import { i18n } from '@/i18n';
@@ -6,12 +7,14 @@ import { DriveFile } from 'misskey-js/built/entities';
function select(src: any, label: string | null, multiple: boolean): Promise<DriveFile | DriveFile[]> {
return new Promise((res, rej) => {
+ const keepOriginal = ref(defaultStore.state.keepOriginalUploading);
+
const chooseFileFromPc = () => {
const input = document.createElement('input');
input.type = 'file';
input.multiple = multiple;
input.onchange = () => {
- const promises = Array.from(input.files).map(file => os.upload(file, defaultStore.state.uploadFolder));
+ const promises = Array.from(input.files).map(file => os.upload(file, defaultStore.state.uploadFolder, undefined, keepOriginal.value));
Promise.all(promises).then(driveFiles => {
res(multiple ? driveFiles : driveFiles[0]);
@@ -74,6 +77,10 @@ function select(src: any, label: string | null, multiple: boolean): Promise<Driv
text: label,
type: 'label'
} : undefined, {
+ type: 'switch',
+ text: i18n.ts.keepOriginalUploading,
+ ref: keepOriginal
+ }, {
text: i18n.ts.upload,
icon: 'fas fa-upload',
action: chooseFileFromPc
diff --git a/packages/client/src/scripts/theme.ts b/packages/client/src/scripts/theme.ts
index 85c087331b..45743d0ffa 100644
--- a/packages/client/src/scripts/theme.ts
+++ b/packages/client/src/scripts/theme.ts
@@ -17,9 +17,11 @@ export const themeProps = Object.keys(lightTheme.props).filter(key => !key.start
export const builtinThemes = [
require('@/themes/l-light.json5'),
+ require('@/themes/l-coffee.json5'),
require('@/themes/l-apricot.json5'),
require('@/themes/l-rainy.json5'),
require('@/themes/l-vivid.json5'),
+ require('@/themes/l-cherry.json5'),
require('@/themes/l-sushi.json5'),
require('@/themes/d-dark.json5'),
@@ -27,6 +29,8 @@ export const builtinThemes = [
require('@/themes/d-astro.json5'),
require('@/themes/d-future.json5'),
require('@/themes/d-botanical.json5'),
+ require('@/themes/d-cherry.json5'),
+ require('@/themes/d-ice.json5'),
require('@/themes/d-pumpkin.json5'),
require('@/themes/d-black.json5'),
] as Theme[];
diff --git a/packages/client/src/scripts/use-note-capture.ts b/packages/client/src/scripts/use-note-capture.ts
index b7cf99d5e1..b2a96062c7 100644
--- a/packages/client/src/scripts/use-note-capture.ts
+++ b/packages/client/src/scripts/use-note-capture.ts
@@ -5,34 +5,35 @@ import { $i } from '@/account';
export function useNoteCapture(props: {
rootEl: Ref<HTMLElement>;
- appearNote: Ref<misskey.entities.Note>;
+ note: Ref<misskey.entities.Note>;
+ isDeletedRef: Ref<boolean>;
}) {
- const appearNote = props.appearNote;
+ const note = props.note;
const connection = $i ? stream : null;
function onStreamNoteUpdated(data): void {
const { type, id, body } = data;
- if (id !== appearNote.value.id) return;
+ if (id !== note.value.id) return;
switch (type) {
case 'reacted': {
const reaction = body.reaction;
if (body.emoji) {
- const emojis = appearNote.value.emojis || [];
+ const emojis = note.value.emojis || [];
if (!emojis.includes(body.emoji)) {
- appearNote.value.emojis = [...emojis, body.emoji];
+ note.value.emojis = [...emojis, body.emoji];
}
}
// TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる
- const currentCount = (appearNote.value.reactions || {})[reaction] || 0;
+ const currentCount = (note.value.reactions || {})[reaction] || 0;
- appearNote.value.reactions[reaction] = currentCount + 1;
+ note.value.reactions[reaction] = currentCount + 1;
if ($i && (body.userId === $i.id)) {
- appearNote.value.myReaction = reaction;
+ note.value.myReaction = reaction;
}
break;
}
@@ -41,12 +42,12 @@ export function useNoteCapture(props: {
const reaction = body.reaction;
// TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる
- const currentCount = (appearNote.value.reactions || {})[reaction] || 0;
+ const currentCount = (note.value.reactions || {})[reaction] || 0;
- appearNote.value.reactions[reaction] = Math.max(0, currentCount - 1);
+ note.value.reactions[reaction] = Math.max(0, currentCount - 1);
if ($i && (body.userId === $i.id)) {
- appearNote.value.myReaction = null;
+ note.value.myReaction = null;
}
break;
}
@@ -54,7 +55,7 @@ export function useNoteCapture(props: {
case 'pollVoted': {
const choice = body.choice;
- const choices = [...appearNote.value.poll.choices];
+ const choices = [...note.value.poll.choices];
choices[choice] = {
...choices[choice],
votes: choices[choice].votes + 1,
@@ -63,12 +64,12 @@ export function useNoteCapture(props: {
} : {})
};
- appearNote.value.poll.choices = choices;
+ note.value.poll.choices = choices;
break;
}
case 'deleted': {
- appearNote.value.deletedAt = new Date();
+ props.isDeletedRef.value = true;
break;
}
}
@@ -77,7 +78,7 @@ export function useNoteCapture(props: {
function capture(withHandler = false): void {
if (connection) {
// TODO: このノートがストリーミング経由で流れてきた場合のみ sr する
- connection.send(document.body.contains(props.rootEl.value) ? 'sr' : 's', { id: appearNote.value.id });
+ connection.send(document.body.contains(props.rootEl.value) ? 'sr' : 's', { id: note.value.id });
if (withHandler) connection.on('noteUpdated', onStreamNoteUpdated);
}
}
@@ -85,7 +86,7 @@ export function useNoteCapture(props: {
function decapture(withHandler = false): void {
if (connection) {
connection.send('un', {
- id: appearNote.value.id,
+ id: note.value.id,
});
if (withHandler) connection.off('noteUpdated', onStreamNoteUpdated);
}
diff --git a/packages/client/src/store.ts b/packages/client/src/store.ts
index cd358d29d0..e6a2f42906 100644
--- a/packages/client/src/store.ts
+++ b/packages/client/src/store.ts
@@ -17,7 +17,7 @@ export const defaultStore = markRaw(new Storage('base', {
},
keepCw: {
where: 'account',
- default: false
+ default: true
},
showFullAcct: {
where: 'account',
@@ -43,6 +43,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'account',
default: 'yyyy-MM-dd HH-mm-ss [{{number}}]'
},
+ keepOriginalUploading: {
+ where: 'account',
+ default: false
+ },
memo: {
where: 'account',
default: null
@@ -102,6 +106,10 @@ export const defaultStore = markRaw(new Storage('base', {
}
},
+ overridedDeviceKind: {
+ where: 'device',
+ default: null as null | 'smartphone' | 'tablet' | 'desktop',
+ },
serverDisconnectedBehavior: {
where: 'device',
default: 'quiet' as 'quiet' | 'reload' | 'dialog'
@@ -174,6 +182,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: 'remote' as 'none' | 'remote' | 'always'
},
+ reactionPickerSize: {
+ where: 'device',
+ default: 1
+ },
reactionPickerWidth: {
where: 'device',
default: 1
@@ -218,6 +230,10 @@ export const defaultStore = markRaw(new Storage('base', {
where: 'device',
default: ''
},
+ themeInitial: {
+ where: 'device',
+ default: true,
+ },
aiChanMode: {
where: 'device',
default: false
diff --git a/packages/client/src/themes/d-cherry.json5 b/packages/client/src/themes/d-cherry.json5
new file mode 100644
index 0000000000..a7e1ad1c80
--- /dev/null
+++ b/packages/client/src/themes/d-cherry.json5
@@ -0,0 +1,20 @@
+{
+ id: '679b3b87-a4e9-4789-8696-b56c15cc33b0',
+
+ name: 'Mi Cherry Dark',
+ author: 'syuilo',
+
+ base: 'dark',
+
+ props: {
+ accent: 'rgb(255, 89, 117)',
+ bg: 'rgb(28, 28, 37)',
+ fg: 'rgb(236, 239, 244)',
+ panel: 'rgb(35, 35, 47)',
+ renote: '@accent',
+ link: '@accent',
+ mention: '@accent',
+ hashtag: '@accent',
+ divider: 'rgb(63, 63, 80)',
+ },
+}
diff --git a/packages/client/src/themes/d-ice.json5 b/packages/client/src/themes/d-ice.json5
new file mode 100644
index 0000000000..179b060dcf
--- /dev/null
+++ b/packages/client/src/themes/d-ice.json5
@@ -0,0 +1,13 @@
+{
+ id: '66e7e5a9-cd43-42cd-837d-12f47841fa34',
+
+ name: 'Mi Ice Dark',
+ author: 'syuilo',
+
+ base: 'dark',
+
+ props: {
+ accent: '#47BFE8',
+ bg: '#212526',
+ },
+}
diff --git a/packages/client/src/themes/l-cherry.json5 b/packages/client/src/themes/l-cherry.json5
new file mode 100644
index 0000000000..5ad240241e
--- /dev/null
+++ b/packages/client/src/themes/l-cherry.json5
@@ -0,0 +1,21 @@
+{
+ id: 'ac168876-f737-4074-a3fc-a370c732ef48',
+
+ name: 'Mi Cherry Light',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: 'rgb(219, 96, 114)',
+ bg: 'rgb(254, 248, 249)',
+ fg: 'rgb(152, 13, 26)',
+ panel: 'rgb(255, 255, 255)',
+ renote: '@accent',
+ link: 'rgb(156, 187, 5)',
+ mention: '@accent',
+ hashtag: '@accent',
+ divider: 'rgba(134, 51, 51, 0.1)',
+ inputBorderHover: 'rgb(238, 221, 222)',
+ },
+}
diff --git a/packages/client/src/themes/l-coffee.json5 b/packages/client/src/themes/l-coffee.json5
new file mode 100644
index 0000000000..fbcd4fa9ef
--- /dev/null
+++ b/packages/client/src/themes/l-coffee.json5
@@ -0,0 +1,21 @@
+{
+ id: '6ed80faa-74f0-42c2-98e4-a64d9e138eab',
+
+ name: 'Mi Coffee Light',
+ author: 'syuilo',
+
+ base: 'light',
+
+ props: {
+ accent: '#9f8989',
+ bg: '#f5f3f3',
+ fg: '#7f6666',
+ panel: '#fff',
+ divider: 'rgba(87, 68, 68, 0.1)',
+ renote: 'rgb(160, 172, 125)',
+ link: 'rgb(137, 151, 159)',
+ mention: '@accent',
+ mentionMe: 'rgb(170, 149, 98)',
+ hashtag: '@accent',
+ },
+}
diff --git a/packages/client/src/types/menu.ts b/packages/client/src/types/menu.ts
new file mode 100644
index 0000000000..ed67e6ab88
--- /dev/null
+++ b/packages/client/src/types/menu.ts
@@ -0,0 +1,20 @@
+import * as Misskey from 'misskey-js';
+import { Ref } from 'vue';
+
+export type MenuAction = (ev: MouseEvent) => void;
+
+export type MenuDivider = null;
+export type MenuNull = undefined;
+export type MenuLabel = { type: 'label', text: string };
+export type MenuLink = { type: 'link', to: string, text: string, icon?: string, indicate?: boolean, avatar?: Misskey.entities.User };
+export type MenuA = { type: 'a', href: string, target?: string, download?: string, text: string, icon?: string, indicate?: boolean };
+export type MenuUser = { type: 'user', user: Misskey.entities.User, active?: boolean, indicate?: boolean, action: MenuAction };
+export type MenuSwitch = { type: 'switch', ref: Ref<boolean>, text: string, disabled?: boolean };
+export type MenuButton = { type?: 'button', text: string, icon?: string, indicate?: boolean, danger?: boolean, active?: boolean, avatar?: Misskey.entities.User; action: MenuAction };
+
+export type MenuPending = { type: 'pending' };
+
+type OuterMenuItem = MenuDivider | MenuNull | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton;
+type OuterPromiseMenuItem = Promise<MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton>;
+export type MenuItem = OuterMenuItem | OuterPromiseMenuItem;
+export type InnerMenuItem = MenuDivider | MenuPending | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton;
diff --git a/packages/client/src/ui/_common_/common.vue b/packages/client/src/ui/_common_/common.vue
index 98069258d9..98364b9631 100644
--- a/packages/client/src/ui/_common_/common.vue
+++ b/packages/client/src/ui/_common_/common.vue
@@ -11,6 +11,8 @@
<XStreamIndicator/>
<div v-if="pendingApiRequestsCount > 0" id="wait"></div>
+
+<div v-if="dev" id="devTicker"><span>DEV BUILD</span></div>
</template>
<script lang="ts">
@@ -52,12 +54,28 @@ export default defineComponent({
uploads,
popups,
pendingApiRequestsCount,
+ dev: _DEV_,
};
},
});
</script>
<style lang="scss">
+@keyframes dev-ticker-blink {
+ 0% { opacity: 1; }
+ 50% { opacity: 0; }
+ 100% { opacity: 1; }
+}
+
+@keyframes progress-spinner {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
#wait {
display: block;
position: fixed;
@@ -79,12 +97,19 @@ export default defineComponent({
}
}
-@keyframes progress-spinner {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
+#devTicker {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 2147483647;
+ color: #ff0;
+ background: rgba(0, 0, 0, 0.5);
+ padding: 4px 5px;
+ font-size: 14px;
+ pointer-events: none;
+
+ > span {
+ animation: dev-ticker-blink 2s infinite;
}
}
</style>
diff --git a/packages/client/src/ui/_common_/sidebar.vue b/packages/client/src/ui/_common_/sidebar.vue
index 94baacbee9..a23b7d4152 100644
--- a/packages/client/src/ui/_common_/sidebar.vue
+++ b/packages/client/src/ui/_common_/sidebar.vue
@@ -25,69 +25,55 @@
<MkA v-click-anime class="item" active-class="active" to="/settings">
<i class="fas fa-cog fa-fw"></i><span class="text">{{ $ts.settings }}</span>
</MkA>
- <button class="item _button post" data-cy-open-post-form @click="post">
+ <button class="item _button post" data-cy-open-post-form @click="os.post">
<i class="fas fa-pencil-alt fa-fw"></i><span class="text">{{ $ts.note }}</span>
</button>
</div>
</div>
</template>
-<script lang="ts">
-import { computed, defineComponent, ref, watch } from 'vue';
-import { host } from '@/config';
-import { search } from '@/scripts/search';
+<script lang="ts" setup>
+import { computed, ref, watch } from 'vue';
import * as os from '@/os';
import { menuDef } from '@/menu';
-import { openAccountMenu } from '@/account';
+import { $i, openAccountMenu as openAccountMenu_ } from '@/account';
import { defaultStore } from '@/store';
-export default defineComponent({
- setup(props, context) {
- const iconOnly = ref(false);
+const iconOnly = ref(false);
- const menu = computed(() => defaultStore.state.menu);
- const otherMenuItemIndicated = computed(() => {
- for (const def in menuDef) {
- if (menu.value.includes(def)) continue;
- if (menuDef[def].indicated) return true;
- }
- return false;
- });
-
- const calcViewState = () => {
- iconOnly.value = (window.innerWidth <= 1279) || (defaultStore.state.menuDisplay === 'sideIcon');
- };
+const menu = computed(() => defaultStore.state.menu);
+const otherMenuItemIndicated = computed(() => {
+ for (const def in menuDef) {
+ if (menu.value.includes(def)) continue;
+ if (menuDef[def].indicated) return true;
+ }
+ return false;
+});
- calcViewState();
+const calcViewState = () => {
+ iconOnly.value = (window.innerWidth <= 1279) || (defaultStore.state.menuDisplay === 'sideIcon');
+};
- window.addEventListener('resize', calcViewState);
+calcViewState();
- watch(defaultStore.reactiveState.menuDisplay, () => {
- calcViewState();
- });
+window.addEventListener('resize', calcViewState);
- return {
- host: host,
- accounts: [],
- connection: null,
- menu,
- menuDef: menuDef,
- otherMenuItemIndicated,
- iconOnly,
- post: os.post,
- search,
- openAccountMenu:(ev) => {
- openAccountMenu({
- withExtraOperation: true,
- }, ev);
- },
- more: () => {
- os.popup(import('@/components/launch-pad.vue'), {}, {
- }, 'closed');
- },
- };
- },
+watch(defaultStore.reactiveState.menuDisplay, () => {
+ calcViewState();
});
+
+function openAccountMenu(ev: MouseEvent) {
+ openAccountMenu_({
+ withExtraOperation: true,
+ }, ev);
+}
+
+function more(ev: MouseEvent) {
+ os.popup(import('@/components/launch-pad.vue'), {
+ src: ev.currentTarget ?? ev.target,
+ }, {
+ }, 'closed');
+}
</script>
<style lang="scss" scoped>
@@ -305,7 +291,7 @@ export default defineComponent({
&.post:before {
width: calc(100% - 28px);
- height: min-content;
+ height: auto;
aspect-ratio: 1/1;
border-radius: 100%;
}
diff --git a/packages/client/src/ui/classic.header.vue b/packages/client/src/ui/classic.header.vue
index 699b992668..a9187ed734 100644
--- a/packages/client/src/ui/classic.header.vue
+++ b/packages/client/src/ui/classic.header.vue
@@ -101,11 +101,13 @@ export default defineComponent({
},
more(ev) {
- os.popup(import('@/components/launch-pad.vue'), {}, {
+ os.popup(import('@/components/launch-pad.vue'), {
+ src: ev.currentTarget ?? ev.target,
+ }, {
}, 'closed');
},
- openAccountMenu:(ev) => {
+ openAccountMenu: (ev) => {
openAccountMenu({
withExtraOperation: true,
}, ev);
diff --git a/packages/client/src/ui/classic.side.vue b/packages/client/src/ui/classic.side.vue
index f816834141..6c2329194e 100644
--- a/packages/client/src/ui/classic.side.vue
+++ b/packages/client/src/ui/classic.side.vue
@@ -4,7 +4,7 @@
<header class="header" @contextmenu.prevent.stop="onContextmenu">
<button v-if="history.length > 0" class="_button" @click="back()"><i class="fas fa-chevron-left"></i></button>
<button v-else class="_button" style="pointer-events: none;"><!-- マージンのバランスを取るためのダミー --></button>
- <span class="title">{{ pageInfo.title }}</span>
+ <span class="title" v-text="pageInfo?.title" />
<button class="_button" @click="close()"><i class="fas fa-times"></i></button>
</header>
<MkHeader class="pageHeader" :info="pageInfo"/>
@@ -13,99 +13,89 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
+<script lang="ts" setup>
+import { provide } from 'vue';
import * as os from '@/os';
import copyToClipboard from '@/scripts/copy-to-clipboard';
-import { resolve } from '@/router';
-import { url } from '@/config';
+import { resolve, router } from '@/router';
+import { url as root } from '@/config';
import * as symbols from '@/symbols';
+import { i18n } from '@/i18n';
-export default defineComponent({
- provide() {
- return {
- navHook: (path) => {
- this.navigate(path);
- }
- };
- },
+provide('navHook', navigate);
- data() {
- return {
- path: null,
- component: null,
- props: {},
- pageInfo: null,
- history: [],
- };
- },
+let path: string | null = $ref(null);
+let component: ReturnType<typeof resolve>['component'] | null = $ref(null);
+let props: any | null = $ref(null);
+let pageInfo: any | null = $ref(null);
+let history: string[] = $ref([]);
- computed: {
- url(): string {
- return url + this.path;
- }
- },
+let url = $computed(() => `${root}${path}`);
- methods: {
- changePage(page) {
- if (page == null) return;
- if (page[symbols.PAGE_INFO]) {
- this.pageInfo = page[symbols.PAGE_INFO];
- }
- },
+function changePage(page) {
+ if (page == null) return;
+ if (page[symbols.PAGE_INFO]) {
+ pageInfo = page[symbols.PAGE_INFO];
+ }
+}
- navigate(path, record = true) {
- if (record && this.path) this.history.push(this.path);
- this.path = path;
- const { component, props } = resolve(path);
- this.component = component;
- this.props = props;
- },
+function navigate(_path: string, record = true) {
+ if (record && path) history.push($$(path).value);
+ path = _path;
+ const resolved = resolve(path);
+ component = resolved.component;
+ props = resolved.props;
+}
- back() {
- this.navigate(this.history.pop(), false);
- },
+function back() {
+ const prev = history.pop();
+ if (prev) navigate(prev, false);
+}
- close() {
- this.path = null;
- this.component = null;
- this.props = {};
- },
+function close() {
+ path = null;
+ component = null;
+ props = {};
+}
- onContextmenu(ev: MouseEvent) {
- os.contextMenu([{
- type: 'label',
- text: this.path,
- }, {
- icon: 'fas fa-expand-alt',
- text: this.$ts.showInPage,
- action: () => {
- this.$router.push(this.path);
- this.close();
- }
- }, {
- icon: 'fas fa-window-maximize',
- text: this.$ts.openInWindow,
- action: () => {
- os.pageWindow(this.path);
- this.close();
- }
- }, null, {
- icon: 'fas fa-external-link-alt',
- text: this.$ts.openInNewTab,
- action: () => {
- window.open(this.url, '_blank');
- this.close();
- }
- }, {
- icon: 'fas fa-link',
- text: this.$ts.copyLink,
- action: () => {
- copyToClipboard(this.url);
- }
- }], ev);
+function onContextmenu(ev: MouseEvent) {
+ os.contextMenu([{
+ type: 'label',
+ text: path || '',
+ }, {
+ icon: 'fas fa-expand-alt',
+ text: i18n.ts.showInPage,
+ action: () => {
+ if (path) router.push(path);
+ close();
}
- }
+ }, {
+ icon: 'fas fa-window-maximize',
+ text: i18n.ts.openInWindow,
+ action: () => {
+ if (path) os.pageWindow(path);
+ close();
+ }
+ }, null, {
+ icon: 'fas fa-external-link-alt',
+ text: i18n.ts.openInNewTab,
+ action: () => {
+ window.open(url, '_blank');
+ close();
+ }
+ }, {
+ icon: 'fas fa-link',
+ text: i18n.ts.copyLink,
+ action: () => {
+ copyToClipboard(url);
+ }
+ }], ev);
+}
+
+defineExpose({
+ navigate,
+ back,
+ close,
});
</script>
diff --git a/packages/client/src/ui/classic.sidebar.vue b/packages/client/src/ui/classic.sidebar.vue
index afbca06c8e..b08977ac3a 100644
--- a/packages/client/src/ui/classic.sidebar.vue
+++ b/packages/client/src/ui/classic.sidebar.vue
@@ -122,6 +122,7 @@ export default defineComponent({
more(ev) {
os.popup(import('@/components/launch-pad.vue'), {}, {
+ src: ev.currentTarget ?? ev.target,
}, 'closed');
},
diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue
index 9accc34a88..e4571d4091 100644
--- a/packages/client/src/ui/deck.vue
+++ b/packages/client/src/ui/deck.vue
@@ -276,7 +276,7 @@ export default defineComponent({
}
> * {
- font-size: 22px;
+ font-size: 20px;
}
&:disabled {
diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue
index 8fe9dcffaf..000fec9b40 100644
--- a/packages/client/src/ui/universal.vue
+++ b/packages/client/src/ui/universal.vue
@@ -20,7 +20,7 @@
</main>
</div>
- <XSideView v-if="isDesktop" ref="side" class="side"/>
+ <XSideView v-if="isDesktop" ref="sideEl" class="side"/>
<div v-if="isDesktop" ref="widgetsEl" class="widgets">
<XWidgets @mounted="attachSticky"/>
@@ -31,9 +31,9 @@
<div v-if="isMobile" class="buttons">
<button class="button nav _button" @click="drawerMenuShowing = true"><i class="fas fa-bars"></i><span v-if="menuIndicated" class="indicator"><i class="fas fa-circle"></i></span></button>
<button class="button home _button" @click="$route.name === 'index' ? top() : $router.push('/')"><i class="fas fa-home"></i></button>
- <button class="button notifications _button" @click="$router.push('/my/notifications')"><i class="fas fa-bell"></i><span v-if="$i.hasUnreadNotification" class="indicator"><i class="fas fa-circle"></i></span></button>
+ <button class="button notifications _button" @click="$router.push('/my/notifications')"><i class="fas fa-bell"></i><span v-if="$i?.hasUnreadNotification" class="indicator"><i class="fas fa-circle"></i></span></button>
<button class="button widget _button" @click="widgetsShowing = true"><i class="fas fa-layer-group"></i></button>
- <button class="button post _button" @click="post()"><i class="fas fa-pencil-alt"></i></button>
+ <button class="button post _button" @click="os.post()"><i class="fas fa-pencil-alt"></i></button>
</div>
<transition :name="$store.state.animation ? 'menuDrawer-back' : ''">
@@ -64,155 +64,133 @@
</div>
</template>
-<script lang="ts">
-import { defineComponent, defineAsyncComponent, provide, onMounted, computed, ref, watch } from 'vue';
+<script lang="ts" setup>
+import { defineAsyncComponent, provide, onMounted, computed, ref, watch } from 'vue';
import { instanceName } from '@/config';
import { StickySidebar } from '@/scripts/sticky-sidebar';
-import XSidebar from '@/ui/_common_/sidebar.vue';
import XDrawerMenu from '@/ui/_common_/sidebar-for-mobile.vue';
import XCommon from './_common_/common.vue';
import XSideView from './classic.side.vue';
import * as os from '@/os';
import * as symbols from '@/symbols';
import { defaultStore } from '@/store';
-import * as EventEmitter from 'eventemitter3';
import { menuDef } from '@/menu';
import { useRoute } from 'vue-router';
import { i18n } from '@/i18n';
+import { $i } from '@/account';
+const XWidgets = defineAsyncComponent(() => import('./universal.widgets.vue'));
+const XSidebar = defineAsyncComponent(() => import('@/ui/_common_/sidebar.vue'));
const DESKTOP_THRESHOLD = 1100;
const MOBILE_THRESHOLD = 500;
-export default defineComponent({
- components: {
- XCommon,
- XSidebar,
- XDrawerMenu,
- XWidgets: defineAsyncComponent(() => import('./universal.widgets.vue')),
- XSideView, // NOTE: dynamic importするとAsyncComponentWrapperが間に入るせいでref取得できなくて面倒になる
- },
+const isDesktop = ref(window.innerWidth >= DESKTOP_THRESHOLD);
+const isMobile = ref(window.innerWidth <= MOBILE_THRESHOLD);
+window.addEventListener('resize', () => {
+ isMobile.value = window.innerWidth <= MOBILE_THRESHOLD;
+});
- setup() {
- const isDesktop = ref(window.innerWidth >= DESKTOP_THRESHOLD);
- const isMobile = ref(window.innerWidth <= MOBILE_THRESHOLD);
- window.addEventListener('resize', () => {
- isMobile.value = window.innerWidth <= MOBILE_THRESHOLD;
- });
+const pageInfo = ref();
+const widgetsEl = $ref<HTMLElement>();
+const widgetsShowing = ref(false);
- const pageInfo = ref();
- const widgetsEl = ref<HTMLElement>();
- const widgetsShowing = ref(false);
+let sideEl = $ref<InstanceType<typeof XSideView>>();
- const sideViewController = new EventEmitter();
+provide('sideViewHook', isDesktop.value ? (url) => {
+ sideEl.navigate(url);
+} : null);
- provide('sideViewHook', isDesktop.value ? (url) => {
- sideViewController.emit('navigate', url);
- } : null);
+const menuIndicated = computed(() => {
+ for (const def in menuDef) {
+ if (def === 'notifications') continue; // 通知は下にボタンとして表示されてるから
+ if (menuDef[def].indicated) return true;
+ }
+ return false;
+});
- const menuIndicated = computed(() => {
- for (const def in menuDef) {
- if (def === 'notifications') continue; // 通知は下にボタンとして表示されてるから
- if (menuDef[def].indicated) return true;
- }
- return false;
- });
+const drawerMenuShowing = ref(false);
- const drawerMenuShowing = ref(false);
+const route = useRoute();
+watch(route, () => {
+ drawerMenuShowing.value = false;
+});
- const route = useRoute();
- watch(route, () => {
- drawerMenuShowing.value = false;
- });
+document.documentElement.style.overflowY = 'scroll';
- document.documentElement.style.overflowY = 'scroll';
+if (defaultStore.state.widgets.length === 0) {
+ defaultStore.set('widgets', [{
+ name: 'calendar',
+ id: 'a', place: 'right', data: {}
+ }, {
+ name: 'notifications',
+ id: 'b', place: 'right', data: {}
+ }, {
+ name: 'trends',
+ id: 'c', place: 'right', data: {}
+ }]);
+}
- if (defaultStore.state.widgets.length === 0) {
- defaultStore.set('widgets', [{
- name: 'calendar',
- id: 'a', place: 'right', data: {}
- }, {
- name: 'notifications',
- id: 'b', place: 'right', data: {}
- }, {
- name: 'trends',
- id: 'c', place: 'right', data: {}
- }]);
- }
+onMounted(() => {
+ if (!isDesktop.value) {
+ window.addEventListener('resize', () => {
+ if (window.innerWidth >= DESKTOP_THRESHOLD) isDesktop.value = true;
+ }, { passive: true });
+ }
+});
- onMounted(() => {
- if (!isDesktop.value) {
- window.addEventListener('resize', () => {
- if (window.innerWidth >= DESKTOP_THRESHOLD) isDesktop.value = true;
- }, { passive: true });
- }
- });
+const changePage = (page) => {
+ if (page == null) return;
+ if (page[symbols.PAGE_INFO]) {
+ pageInfo.value = page[symbols.PAGE_INFO];
+ document.title = `${pageInfo.value.title} | ${instanceName}`;
+ }
+};
- const changePage = (page) => {
- if (page == null) return;
- if (page[symbols.PAGE_INFO]) {
- pageInfo.value = page[symbols.PAGE_INFO];
- document.title = `${pageInfo.value.title} | ${instanceName}`;
- }
- };
+const onContextmenu = (ev) => {
+ const isLink = (el: HTMLElement) => {
+ if (el.tagName === 'A') return true;
+ if (el.parentElement) {
+ return isLink(el.parentElement);
+ }
+ };
+ if (isLink(ev.target)) return;
+ if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(ev.target.tagName) || ev.target.attributes['contenteditable']) return;
+ if (window.getSelection()?.toString() !== '') return;
+ const path = route.path;
+ os.contextMenu([{
+ type: 'label',
+ text: path,
+ }, {
+ icon: 'fas fa-columns',
+ text: i18n.ts.openInSideView,
+ action: () => {
+ sideEl.navigate(path);
+ }
+ }, {
+ icon: 'fas fa-window-maximize',
+ text: i18n.ts.openInWindow,
+ action: () => {
+ os.pageWindow(path);
+ }
+ }], ev);
+};
- const onContextmenu = (ev) => {
- const isLink = (el: HTMLElement) => {
- if (el.tagName === 'A') return true;
- if (el.parentElement) {
- return isLink(el.parentElement);
- }
- };
- if (isLink(ev.target)) return;
- if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(ev.target.tagName) || ev.target.attributes['contenteditable']) return;
- if (window.getSelection().toString() !== '') return;
- const path = route.path;
- os.contextMenu([{
- type: 'label',
- text: path,
- }, {
- icon: 'fas fa-columns',
- text: i18n.ts.openInSideView,
- action: () => {
- this.$refs.side.navigate(path);
- }
- }, {
- icon: 'fas fa-window-maximize',
- text: i18n.ts.openInWindow,
- action: () => {
- os.pageWindow(path);
- }
- }], ev);
- };
+const attachSticky = (el) => {
+ const sticky = new StickySidebar(widgetsEl);
+ window.addEventListener('scroll', () => {
+ sticky.calc(window.scrollY);
+ }, { passive: true });
+};
+
+function top() {
+ window.scroll({ top: 0, behavior: 'smooth' });
+}
- const attachSticky = (el) => {
- const sticky = new StickySidebar(widgetsEl.value);
- window.addEventListener('scroll', () => {
- sticky.calc(window.scrollY);
- }, { passive: true });
- };
+function onTransition() {
+ if (window._scroll) window._scroll();
+}
- return {
- pageInfo,
- isDesktop,
- isMobile,
- widgetsEl,
- widgetsShowing,
- drawerMenuShowing,
- menuIndicated,
- wallpaper: localStorage.getItem('wallpaper') != null,
- changePage,
- top: () => {
- window.scroll({ top: 0, behavior: 'smooth' });
- },
- onTransition: () => {
- if (window._scroll) window._scroll();
- },
- post: os.post,
- onContextmenu,
- attachSticky,
- };
- },
-});
+const wallpaper = localStorage.getItem('wallpaper') != null;
</script>
<style lang="scss" scoped>
@@ -362,13 +340,14 @@ export default defineComponent({
z-index: 1000;
bottom: 0;
left: 0;
- padding: 16px;
+ padding: 16px 16px calc(env(safe-area-inset-bottom, 0px) + 16px) 16px;
display: flex;
width: 100%;
box-sizing: border-box;
-webkit-backdrop-filter: var(--blur, blur(32px));
backdrop-filter: var(--blur, blur(32px));
background-color: var(--header);
+ border-top: solid 0.5px var(--divider);
> .button {
position: relative;
@@ -414,7 +393,7 @@ export default defineComponent({
}
> * {
- font-size: 22px;
+ font-size: 20px;
}
&:disabled {
diff --git a/packages/client/src/widgets/federation.vue b/packages/client/src/widgets/federation.vue
index 4c43117e48..5f1131dce1 100644
--- a/packages/client/src/widgets/federation.vue
+++ b/packages/client/src/widgets/federation.vue
@@ -54,13 +54,13 @@ const charts = ref([]);
const fetching = ref(true);
const fetch = async () => {
- const instances = await os.api('federation/instances', {
+ const fetchedInstances = await os.api('federation/instances', {
sort: '+lastCommunicatedAt',
limit: 5
});
- const charts = await Promise.all(instances.map(i => os.api('charts/instance', { host: i.host, limit: 16, span: 'hour' })));
- instances.value = instances;
- charts.value = charts;
+ const fetchedCharts = await Promise.all(fetchedInstances.map(i => os.api('charts/instance', { host: i.host, limit: 16, span: 'hour' })));
+ instances.value = fetchedInstances;
+ charts.value = fetchedCharts;
fetching.value = false;
};
diff --git a/packages/client/yarn.lock b/packages/client/yarn.lock
index 434bf733e5..36280c1abb 100644
--- a/packages/client/yarn.lock
+++ b/packages/client/yarn.lock
@@ -56,18 +56,6 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
-"@cspotcode/source-map-consumer@0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
- integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
-
-"@cspotcode/source-map-support@0.7.0":
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
- integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
- dependencies:
- "@cspotcode/source-map-consumer" "0.8.0"
-
"@cypress/request@^2.88.10":
version "2.88.10"
resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
@@ -115,14 +103,14 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752"
integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==
-"@eslint/eslintrc@^1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318"
- integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==
+"@eslint/eslintrc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.1.0.tgz#583d12dbec5d4f22f333f9669f7d0b7c7815b4d3"
+ integrity sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.2.0"
+ espree "^9.3.1"
globals "^13.9.0"
ignore "^4.0.6"
import-fresh "^3.2.1"
@@ -130,6 +118,11 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
+"@fortawesome/fontawesome-free@6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.0.0.tgz#6f3bd8e42997c7d536a1246877ed8bcd4f005a54"
+ integrity sha512-6LB4PYBST1Rx40klypw1SmSDArjFOcfBf2LeX9Zg5EKJT2eXiyiJq+CyBYKeXyK0sXS2FsCJWSPr/luyhuvh0Q==
+
"@hapi/hoek@^9.0.0":
version "9.2.0"
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131"
@@ -177,32 +170,6 @@
"@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0"
-"@redocly/ajv@^8.6.4":
- version "8.6.4"
- resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.6.4.tgz#94053e7a9d4146d1a4feacd3813892873f229a85"
- integrity sha512-y9qNj0//tZtWB2jfXNK3BX18BSBp9zNR7KE7lMysVHwbZtY392OJCjm6Rb/h4UHH2r1AqjNEHFD6bRn+DqU9Mw==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-"@redocly/openapi-core@1.0.0-beta.79":
- version "1.0.0-beta.79"
- resolved "https://registry.yarnpkg.com/@redocly/openapi-core/-/openapi-core-1.0.0-beta.79.tgz#7512b3507ab99dc78226f9069669c5302abb0969"
- integrity sha512-do79vGt3iiHsaVG9LKY8dH+d1E7TLHr+3T+CQ1lqagtWVjYOxqGaoxAT8tRD7R1W0z8BmS4e2poNON6c1sxP5g==
- dependencies:
- "@redocly/ajv" "^8.6.4"
- "@types/node" "^14.11.8"
- colorette "^1.2.0"
- js-levenshtein "^1.1.6"
- js-yaml "^4.1.0"
- lodash.isequal "^4.5.0"
- minimatch "^3.0.4"
- node-fetch "^2.6.1"
- pluralize "^8.0.0"
- yaml-ast-parser "0.0.43"
-
"@sideway/address@^4.1.0":
version "4.1.2"
resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1"
@@ -236,26 +203,6 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
-"@tsconfig/node10@^1.0.7":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606"
- integrity sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==
-
-"@tsconfig/node12@^1.0.7":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.7.tgz#677bd9117e8164dc319987dd6ff5fc1ba6fbf18b"
- integrity sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==
-
-"@tsconfig/node14@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.0.tgz#5bd046e508b1ee90bc091766758838741fdefd6e"
- integrity sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==
-
-"@tsconfig/node16@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
- integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
-
"@types/anymatch@*":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
@@ -266,11 +213,6 @@
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
-"@types/dateformat@3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-3.0.1.tgz#98d747a2e5e9a56070c6bf14e27bff56204e34cc"
- integrity sha512-KlPPdikagvL6ELjWsljbyDIPzNCeliYkqRpI+zea99vBBbCIA5JNshZAwQKTON139c87y9qvTFVgkFd14rtS4g==
-
"@types/escape-regexp@0.0.1":
version "0.0.1"
resolved "https://registry.yarnpkg.com/@types/escape-regexp/-/escape-regexp-0.0.1.tgz#f1a977ccdf2ef059e9862bd3af5e92cbbe723e0e"
@@ -284,6 +226,14 @@
"@types/eslint" "*"
"@types/estree" "*"
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
"@types/eslint@*":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.0.tgz#eb5c5b575237334df24c53195e37b53d66478d7b"
@@ -297,10 +247,10 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe"
integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==
-"@types/estree@^0.0.50":
- version "0.0.50"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
- integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
"@types/events@*":
version "3.0.0"
@@ -312,13 +262,6 @@
resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5"
integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==
-"@types/fluent-ffmpeg@2.1.20":
- version "2.1.20"
- resolved "https://registry.yarnpkg.com/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.20.tgz#3b5f42fc8263761d58284fa46ee6759a64ce54ac"
- integrity sha512-B+OvhCdJ3LgEq2PhvWNOiB/EfwnXLElfMCgc4Z1K5zXgSfo9I6uGKwR/lqmNPFQuebNnes7re3gqkV77SyypLg==
- dependencies:
- "@types/node" "*"
-
"@types/glob-stream@*":
version "6.1.0"
resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc"
@@ -396,27 +339,27 @@
resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5"
integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==
-"@types/matter-js@0.17.6":
- version "0.17.6"
- resolved "https://registry.yarnpkg.com/@types/matter-js/-/matter-js-0.17.6.tgz#525bb33a7289105e1981ef51b987972fa9739011"
- integrity sha512-i6WLNuM7/89SLqO2aOyaUkom9tc3B/qo4ekh7BD99xQ8+wOVVZO0F4RzKNYZCaFwr+xp3pK3oIb6sSVjLpz+pA==
+"@types/matter-js@0.17.7":
+ version "0.17.7"
+ resolved "https://registry.yarnpkg.com/@types/matter-js/-/matter-js-0.17.7.tgz#4919813a91fb0424ea8aa4f4c6eaf9b79cf65ff5"
+ integrity sha512-LHx3Kf1vY68wEgSAuQkMShfGxB9YVKtcFYqPTMAcmUCnHuvcPkfnlbveMkH8xG/s1EIYcbBVTnUNDV/CA5B2RA==
"@types/minimatch@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-"@types/mocha@8.2.3":
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323"
- integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==
+"@types/mocha@9.1.0":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5"
+ integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==
"@types/node@*":
version "16.6.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50"
integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==
-"@types/node@^14.11.8", "@types/node@^14.14.31":
+"@types/node@^14.14.31":
version "14.17.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.9.tgz#b97c057e6138adb7b720df2bd0264b03c9f504fd"
integrity sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g==
@@ -460,13 +403,6 @@
resolved "https://registry.yarnpkg.com/@types/random-seed/-/random-seed-0.3.3.tgz#7741f7b0a4513198a9396ce4ad25832f799a6727"
integrity sha512-kHsCbIRHNXJo6EN5W8EA5b4i1hdT6jaZke5crBPLUcLqaLdZ0QBq8QVMbafHzhjFF83Cl9qlee2dChD18d/kPg==
-"@types/request-stats@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/request-stats/-/request-stats-3.0.0.tgz#d3909a9f778b8ae0b42fb8c1ed20cb936ed95f99"
- integrity sha512-POsDF7nETH8up49iBNvbZuO0pEk9F+TG0rXCkvjxCClcOS99xfF+mKmJteYlwKYpuRKkixzysKlL8rwN1hU2lw==
- dependencies:
- "@types/node" "*"
-
"@types/seedrandom@2.4.28":
version "2.4.28"
resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f"
@@ -502,11 +438,6 @@
resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz#ed4a0901f954b126e6a914b4839c77462d56e706"
integrity sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==
-"@types/tmp@0.2.3":
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165"
- integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==
-
"@types/uglify-js@*":
version "3.9.0"
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87"
@@ -548,13 +479,6 @@
"@types/expect" "^1.20.4"
"@types/node" "*"
-"@types/web-push@3.3.2":
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/@types/web-push/-/web-push-3.3.2.tgz#8c32434147c0396415862e86405c9edc9c50fc15"
- integrity sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==
- dependencies:
- "@types/node" "*"
-
"@types/webpack-sources@*":
version "0.1.7"
resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141"
@@ -593,17 +517,17 @@
"@types/webpack-sources" "*"
source-map "^0.6.0"
-"@types/websocket@1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.4.tgz#1dc497280d8049a5450854dd698ee7e6ea9e60b8"
- integrity sha512-qn1LkcFEKK8RPp459jkjzsfpbsx36BBt3oC3pITYtkoBw/aVX+EZFa5j3ThCRTNpLFvIMr5dSTD4RaMdilIOpA==
+"@types/websocket@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.5.tgz#3fb80ed8e07f88e51961211cd3682a3a4a81569c"
+ integrity sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==
dependencies:
"@types/node" "*"
-"@types/ws@8.2.2":
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21"
- integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==
+"@types/ws@8.2.3":
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.3.tgz#0bca6b03ba2f41e0fab782d4a573fe284aa907ae"
+ integrity sha512-ahRJZquUYCdOZf/rCsWg88S0/+cb9wazUBHv6HZEe3XdYaBe2zr/slM8J28X07Hn88Pnm4ezo7N8/ofnOgrPVQ==
dependencies:
"@types/node" "*"
@@ -614,14 +538,14 @@
dependencies:
"@types/node" "*"
-"@typescript-eslint/eslint-plugin@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz#e90afea96dff8620892ad216b0e4ccdf8ee32d3a"
- integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==
+"@typescript-eslint/eslint-plugin@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.12.1.tgz#b2cd3e288f250ce8332d5035a2ff65aba3374ac4"
+ integrity sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==
dependencies:
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/type-utils" "5.10.0"
- "@typescript-eslint/utils" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/type-utils" "5.12.1"
+ "@typescript-eslint/utils" "5.12.1"
debug "^4.3.2"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
@@ -629,69 +553,69 @@
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/parser@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.0.tgz#8f59e036f5f1cffc178cacbd5ccdd02aeb96c91c"
- integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==
+"@typescript-eslint/parser@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.12.1.tgz#b090289b553b8aa0899740d799d0f96e6f49771b"
+ integrity sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==
dependencies:
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/typescript-estree" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/typescript-estree" "5.12.1"
debug "^4.3.2"
-"@typescript-eslint/scope-manager@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb"
- integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==
+"@typescript-eslint/scope-manager@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.12.1.tgz#58734fd45d2d1dec49641aacc075fba5f0968817"
+ integrity sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==
dependencies:
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/visitor-keys" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/visitor-keys" "5.12.1"
-"@typescript-eslint/type-utils@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz#8524b9479c19c478347a7df216827e749e4a51e5"
- integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==
+"@typescript-eslint/type-utils@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.12.1.tgz#8d58c6a0bb176b5e9a91581cda1a7f91a114d3f0"
+ integrity sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==
dependencies:
- "@typescript-eslint/utils" "5.10.0"
+ "@typescript-eslint/utils" "5.12.1"
debug "^4.3.2"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c"
- integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==
+"@typescript-eslint/types@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.12.1.tgz#46a36a28ff4d946821b58fe5a73c81dc2e12aa89"
+ integrity sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==
-"@typescript-eslint/typescript-estree@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224"
- integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==
+"@typescript-eslint/typescript-estree@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.12.1.tgz#6a9425b9c305bcbc38e2d1d9a24c08e15e02b722"
+ integrity sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==
dependencies:
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/visitor-keys" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/visitor-keys" "5.12.1"
debug "^4.3.2"
globby "^11.0.4"
is-glob "^4.0.3"
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65"
- integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==
+"@typescript-eslint/utils@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.12.1.tgz#447c24a05d9c33f9c6c64cb48f251f2371eef920"
+ integrity sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==
dependencies:
"@types/json-schema" "^7.0.9"
- "@typescript-eslint/scope-manager" "5.10.0"
- "@typescript-eslint/types" "5.10.0"
- "@typescript-eslint/typescript-estree" "5.10.0"
+ "@typescript-eslint/scope-manager" "5.12.1"
+ "@typescript-eslint/types" "5.12.1"
+ "@typescript-eslint/typescript-estree" "5.12.1"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
-"@typescript-eslint/visitor-keys@5.10.0":
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281"
- integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==
+"@typescript-eslint/visitor-keys@5.12.1":
+ version "5.12.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.12.1.tgz#f722da106c8f9695ae5640574225e45af3e52ec3"
+ integrity sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==
dependencies:
- "@typescript-eslint/types" "5.10.0"
+ "@typescript-eslint/types" "5.12.1"
eslint-visitor-keys "^3.0.0"
"@ungap/promise-all-settled@1.1.2":
@@ -699,95 +623,100 @@
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
-"@vue/compiler-core@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.29.tgz#b06097ab8ff0493177c68c5ea5b63d379a061097"
- integrity sha512-RePZ/J4Ub3sb7atQw6V6Rez+/5LCRHGFlSetT3N4VMrejqJnNPXKUt5AVm/9F5MJriy2w/VudEIvgscCfCWqxw==
+"@vue/compiler-core@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.31.tgz#d38f06c2cf845742403b523ab4596a3fda152e89"
+ integrity sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==
dependencies:
"@babel/parser" "^7.16.4"
- "@vue/shared" "3.2.29"
+ "@vue/shared" "3.2.31"
estree-walker "^2.0.2"
source-map "^0.6.1"
-"@vue/compiler-dom@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.29.tgz#ad0ead405bd2f2754161335aad9758aa12430715"
- integrity sha512-y26vK5khdNS9L3ckvkqJk/78qXwWb75Ci8iYLb67AkJuIgyKhIOcR1E8RIt4mswlVCIeI9gQ+fmtdhaiTAtrBQ==
+"@vue/compiler-dom@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e"
+ integrity sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==
dependencies:
- "@vue/compiler-core" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-core" "3.2.31"
+ "@vue/shared" "3.2.31"
-"@vue/compiler-sfc@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.29.tgz#f76d556cd5fca6a55a3ea84c88db1a2a53a36ead"
- integrity sha512-X9+0dwsag2u6hSOP/XsMYqFti/edvYvxamgBgCcbSYuXx1xLZN+dS/GvQKM4AgGS4djqo0jQvWfIXdfZ2ET68g==
+"@vue/compiler-sfc@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f"
+ integrity sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==
dependencies:
"@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.29"
- "@vue/compiler-dom" "3.2.29"
- "@vue/compiler-ssr" "3.2.29"
- "@vue/reactivity-transform" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-core" "3.2.31"
+ "@vue/compiler-dom" "3.2.31"
+ "@vue/compiler-ssr" "3.2.31"
+ "@vue/reactivity-transform" "3.2.31"
+ "@vue/shared" "3.2.31"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
-"@vue/compiler-ssr@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.29.tgz#37b15b32dcd2f6b410bb61fca3f37b1a92b7eb1e"
- integrity sha512-LrvQwXlx66uWsB9/VydaaqEpae9xtmlUkeSKF6aPDbzx8M1h7ukxaPjNCAXuFd3fUHblcri8k42lfimHfzMICA==
+"@vue/compiler-ssr@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz#4fa00f486c9c4580b40a4177871ebbd650ecb99c"
+ integrity sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==
dependencies:
- "@vue/compiler-dom" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-dom" "3.2.31"
+ "@vue/shared" "3.2.31"
+
+"@vue/devtools-api@^6.0.0-beta.18":
+ version "6.0.12"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.0.12.tgz#7b57cce215ae9f37a86984633b3aa3d595aa5b46"
+ integrity sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw==
-"@vue/reactivity-transform@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.29.tgz#a08d606e10016b7cf588d1a43dae4db2953f9354"
- integrity sha512-YF6HdOuhdOw6KyRm59+3rML8USb9o8mYM1q+SH0G41K3/q/G7uhPnHGKvspzceD7h9J3VR1waOQ93CUZj7J7OA==
+"@vue/reactivity-transform@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz#0f5b25c24e70edab2b613d5305c465b50fc00911"
+ integrity sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==
dependencies:
"@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-core" "3.2.31"
+ "@vue/shared" "3.2.31"
estree-walker "^2.0.2"
magic-string "^0.25.7"
-"@vue/reactivity@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.29.tgz#afdc9c111d4139b14600be17ad80267212af6052"
- integrity sha512-Ryhb6Gy62YolKXH1gv42pEqwx7zs3n8gacRVZICSgjQz8Qr8QeCcFygBKYfJm3o1SccR7U+bVBQDWZGOyG1k4g==
+"@vue/reactivity@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.31.tgz#fc90aa2cdf695418b79e534783aca90d63a46bbd"
+ integrity sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==
dependencies:
- "@vue/shared" "3.2.29"
+ "@vue/shared" "3.2.31"
-"@vue/runtime-core@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.29.tgz#fb8577b2fcf52e8d967bd91cdf49ab9fb91f9417"
- integrity sha512-VMvQuLdzoTGmCwIKTKVwKmIL0qcODIqe74JtK1pVr5lnaE0l25hopodmPag3RcnIcIXe+Ye3B2olRCn7fTCgig==
+"@vue/runtime-core@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.31.tgz#9d284c382f5f981b7a7b5971052a1dc4ef39ac7a"
+ integrity sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==
dependencies:
- "@vue/reactivity" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/reactivity" "3.2.31"
+ "@vue/shared" "3.2.31"
-"@vue/runtime-dom@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.29.tgz#35e9a2bf04ef80b86ac2ca0e7b2ceaccf1e18f01"
- integrity sha512-YJgLQLwr+SQyORzTsBQLL5TT/5UiV83tEotqjL7F9aFDIQdFBTCwpkCFvX9jqwHoyi9sJqM9XtTrMcc8z/OjPA==
+"@vue/runtime-dom@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz#79ce01817cb3caf2c9d923f669b738d2d7953eff"
+ integrity sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==
dependencies:
- "@vue/runtime-core" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/runtime-core" "3.2.31"
+ "@vue/shared" "3.2.31"
csstype "^2.6.8"
-"@vue/server-renderer@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.29.tgz#ea6afa361b9c781a868c8da18c761f9b7bc89102"
- integrity sha512-lpiYx7ciV7rWfJ0tPkoSOlLmwqBZ9FTmQm33S+T4g0j1fO/LmhJ9b9Ctl1o5xvIFVDk9QkSUWANZn7H2pXuxVw==
+"@vue/server-renderer@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.31.tgz#201e9d6ce735847d5989403af81ef80960da7141"
+ integrity sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==
dependencies:
- "@vue/compiler-ssr" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-ssr" "3.2.31"
+ "@vue/shared" "3.2.31"
-"@vue/shared@3.2.29":
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.29.tgz#07dac7051117236431d2f737d16932aa38bbb925"
- integrity sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw==
+"@vue/shared@3.2.31":
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e"
+ integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==
"@webassemblyjs/ast@1.11.0":
version "1.11.0"
@@ -1031,22 +960,22 @@
"@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043"
- integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==
+"@webpack-cli/configtest@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
+ integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
-"@webpack-cli/info@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223"
- integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==
+"@webpack-cli/info@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
+ integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
dependencies:
envinfo "^7.7.3"
-"@webpack-cli/serve@^1.6.0":
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2"
- integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==
+"@webpack-cli/serve@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
+ integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -1075,11 +1004,6 @@ acorn-jsx@^5.3.1:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
-acorn-walk@^8.1.1:
- version "8.1.1"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc"
- integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==
-
acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
@@ -1100,23 +1024,11 @@ acorn@^8.5.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
-acorn@^8.6.0:
- version "8.6.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895"
- integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==
-
acorn@^8.7.0:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
-agent-base@6:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
aggregate-error@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
@@ -1140,11 +1052,6 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-alphanum-sort@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
- integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
-
ansi-colors@4.1.1, ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
@@ -1157,11 +1064,6 @@ ansi-escapes@^4.3.0:
dependencies:
type-fest "^0.21.3"
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
- integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
-
ansi-regex@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
@@ -1200,11 +1102,6 @@ arch@^2.2.0:
resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
-arg@^4.1.0:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
- integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
-
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -1247,16 +1144,6 @@ asap@~2.0.3:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-asn1.js@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.3.0.tgz#439099fe9174e09cff5a54a9dda70260517e8689"
- integrity sha512-WHnQJFcOrIWT1RLOkFFBQkFVvyt9BPOOrH+Dp152Zk4R993rSzXUGPmkybIcUFhHE2d/iHH+nCaOWVCDbO8fgA==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- safer-buffer "^2.1.0"
-
asn1@~0.2.3:
version "0.2.4"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
@@ -1329,11 +1216,11 @@ aws4@^1.8.0:
integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
axios@^0.21.1:
- version "0.21.1"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
- integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+ version "0.21.4"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+ integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
dependencies:
- follow-redirects "^1.10.0"
+ follow-redirects "^1.14.0"
babel-walk@3.0.0-canary-5:
version "3.0.0-canary-5"
@@ -1384,15 +1271,10 @@ bluebird@3.7.2, bluebird@^3.7.2:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-blurhash@1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.4.tgz#a7010ceb3019cd2c9809b17c910ebf6175d29244"
- integrity sha512-MXIPz6zwYUKayju+Uidf83KhH0vodZfeRl6Ich8Gu+KGl0JgKiFq9LsfqV7cVU5fKD/AotmduZqvOfrGKOfTaA==
-
-bn.js@^4.0.0:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
- integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+blurhash@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.1.5.tgz#3034104cd5dce5a3e5caa871ae2f0f1f2d0ab566"
+ integrity sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==
boolbase@^1.0.0, boolbase@~1.0.0:
version "1.0.0"
@@ -1414,10 +1296,10 @@ braces@^3.0.1, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-broadcast-channel@4.9.0:
- version "4.9.0"
- resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-4.9.0.tgz#8af337d4ea19aeb6b819ec2eb3dda942b28c724c"
- integrity sha512-xWzFb3wrOZGJF2kOSs2D3KvHXdLDMVb+WypEIoNvwblcHgUBydVy65pDJ9RS4WN9Kyvs0UVQuCCzfKme0G6Qjw==
+broadcast-channel@4.10.0:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-4.10.0.tgz#d19fb902df227df40b1b580351713d30c302d198"
+ integrity sha512-hOUh312XyHk6JTVyX9cyXaH1UYs+2gHVtnW16oQAu9FL7ALcXGXc/YoJWqlkV8vUn14URQPMmRi4A9q4UrwVEQ==
dependencies:
"@babel/runtime" "^7.16.0"
detect-node "^2.1.0"
@@ -1433,49 +1315,22 @@ browser-stdout@1.3.1:
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
-browserslist@^4.0.0, browserslist@^4.14.5:
- version "4.16.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
- integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
- dependencies:
- caniuse-lite "^1.0.30001181"
- colorette "^1.2.1"
- electron-to-chromium "^1.3.649"
- escalade "^3.1.1"
- node-releases "^1.1.70"
-
-browserslist@^4.16.0:
- version "4.16.4"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.4.tgz#7ebf913487f40caf4637b892b268069951c35d58"
- integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==
- dependencies:
- caniuse-lite "^1.0.30001208"
- colorette "^1.2.2"
- electron-to-chromium "^1.3.712"
- escalade "^3.1.1"
- node-releases "^1.1.71"
-
-browserslist@^4.16.6:
- version "4.16.6"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
- integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
+browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6:
+ version "4.19.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3"
+ integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==
dependencies:
- caniuse-lite "^1.0.30001219"
- colorette "^1.2.2"
- electron-to-chromium "^1.3.723"
+ caniuse-lite "^1.0.30001286"
+ electron-to-chromium "^1.4.17"
escalade "^3.1.1"
- node-releases "^1.1.71"
+ node-releases "^2.0.1"
+ picocolors "^1.0.0"
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-buffer-equal-constant-time@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
- integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
-
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -1534,10 +1389,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001208, caniuse-lite@^1.0.30001219:
- version "1.0.30001279"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz"
- integrity sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001286:
+ version "1.0.30001311"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001311.tgz#682ef3f4e617f1a177ad943de59775ed3032e511"
+ integrity sha512-mleTFtFKfykEeW34EyfhGIFjGCqzhh38Y0LhdQ9aWF+HorZTtdgKV/1hEE0NlFkG2ubvisPV6l400tlbPys98A==
caseless@~0.12.0:
version "0.12.0"
@@ -1581,16 +1436,21 @@ character-parser@^2.2.0:
dependencies:
is-regex "^1.0.3"
-chart.js@3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.7.0.tgz#7a19c93035341df801d613993c2170a1fcf1d882"
- integrity sha512-31gVuqqKp3lDIFmzpKIrBeum4OpZsQjSIAqlOpgjosHDJZlULtvwLEZKtEhIAZc7JMPaHlYMys40Qy9Mf+1AAg==
+chart.js@3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.7.1.tgz#0516f690c6a8680c6c707e31a4c1807a6f400ada"
+ integrity sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA==
chartjs-adapter-date-fns@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-2.0.0.tgz#5e53b2f660b993698f936f509c86dddf9ed44c6b"
integrity sha512-rmZINGLe+9IiiEB0kb57vH3UugAtYw33anRiw5kS2Tu87agpetDDoouquycWc9pRsKtQo5j+vLsYHyr8etAvFw==
+chartjs-plugin-gradient@0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/chartjs-plugin-gradient/-/chartjs-plugin-gradient-0.2.1.tgz#9d6d4f1a04a8d2ffca769adb068df4d0678b8f8f"
+ integrity sha512-hcNQ+B0LuiK9QXhbEc0tUtW3s0a8lOBUJViOCw2xHbnNCIp3Pul/tQHR1aIjMo3HiHu4nOb7NKqFd4NTUEsi4Q==
+
chartjs-plugin-zoom@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/chartjs-plugin-zoom/-/chartjs-plugin-zoom-1.2.0.tgz#dad0861b2d171bca1f6d11b3e3e917bc12b950ff"
@@ -1603,7 +1463,7 @@ check-more-types@2.24.0, check-more-types@^2.24.0:
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=
-chokidar@3.5.1, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.1, chokidar@^3.5.2:
+chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.3.1, chokidar@^3.5.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
@@ -1724,7 +1584,7 @@ colord@^2.9.1:
resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e"
integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==
-colorette@^1.2.0, colorette@^1.2.1, colorette@^1.2.2:
+colorette@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
@@ -1817,19 +1677,6 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
-crc-32@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
- integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
- dependencies:
- exit-on-epipe "~1.0.1"
- printj "~1.1.0"
-
-create-require@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
- integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-
cross-env@7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
@@ -1853,18 +1700,18 @@ css-declaration-sorter@^6.0.3:
dependencies:
timsort "^0.3.0"
-css-loader@6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1"
- integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==
+css-loader@6.6.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.6.0.tgz#c792ad5510bd1712618b49381bd0310574fafbd3"
+ integrity sha512-FK7H2lisOixPT406s5gZM1S3l8GrfhEBT3ZiL2UX1Ng1XWs0y2GPllz/OTyvbaHe12VgQrIXIzuEGVlbUhodqg==
dependencies:
icss-utils "^5.1.0"
- postcss "^8.2.15"
+ postcss "^8.4.5"
postcss-modules-extract-imports "^3.0.0"
postcss-modules-local-by-default "^4.0.0"
postcss-modules-scope "^3.0.0"
postcss-modules-values "^4.0.0"
- postcss-value-parser "^4.1.0"
+ postcss-value-parser "^4.2.0"
semver "^7.3.5"
css-select-base-adapter@^0.1.1:
@@ -1932,52 +1779,52 @@ cssesc@^3.0.0:
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssnano-preset-default@^5.1.10:
- version "5.1.10"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz#9350765fdf3c49bf78fac7673354fa58fa95daa4"
- integrity sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==
+cssnano-preset-default@^5.1.12:
+ version "5.1.12"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.12.tgz#64e2ad8e27a279e1413d2d2383ef89a41c909be9"
+ integrity sha512-rO/JZYyjW1QNkWBxMGV28DW7d98UDLaF759frhli58QFehZ+D/LSmwQ2z/ylBAe2hUlsIWTq6NYGfQPq65EF9w==
dependencies:
css-declaration-sorter "^6.0.3"
- cssnano-utils "^3.0.0"
+ cssnano-utils "^3.0.2"
postcss-calc "^8.2.0"
- postcss-colormin "^5.2.3"
- postcss-convert-values "^5.0.2"
- postcss-discard-comments "^5.0.1"
- postcss-discard-duplicates "^5.0.1"
- postcss-discard-empty "^5.0.1"
- postcss-discard-overridden "^5.0.2"
- postcss-merge-longhand "^5.0.4"
- postcss-merge-rules "^5.0.4"
- postcss-minify-font-values "^5.0.2"
- postcss-minify-gradients "^5.0.4"
- postcss-minify-params "^5.0.3"
- postcss-minify-selectors "^5.1.1"
- postcss-normalize-charset "^5.0.1"
- postcss-normalize-display-values "^5.0.2"
- postcss-normalize-positions "^5.0.2"
- postcss-normalize-repeat-style "^5.0.2"
- postcss-normalize-string "^5.0.2"
- postcss-normalize-timing-functions "^5.0.2"
- postcss-normalize-unicode "^5.0.2"
- postcss-normalize-url "^5.0.4"
- postcss-normalize-whitespace "^5.0.2"
- postcss-ordered-values "^5.0.3"
- postcss-reduce-initial "^5.0.2"
- postcss-reduce-transforms "^5.0.2"
- postcss-svgo "^5.0.3"
- postcss-unique-selectors "^5.0.2"
+ postcss-colormin "^5.2.5"
+ postcss-convert-values "^5.0.4"
+ postcss-discard-comments "^5.0.3"
+ postcss-discard-duplicates "^5.0.3"
+ postcss-discard-empty "^5.0.3"
+ postcss-discard-overridden "^5.0.4"
+ postcss-merge-longhand "^5.0.6"
+ postcss-merge-rules "^5.0.6"
+ postcss-minify-font-values "^5.0.4"
+ postcss-minify-gradients "^5.0.6"
+ postcss-minify-params "^5.0.5"
+ postcss-minify-selectors "^5.1.3"
+ postcss-normalize-charset "^5.0.3"
+ postcss-normalize-display-values "^5.0.3"
+ postcss-normalize-positions "^5.0.4"
+ postcss-normalize-repeat-style "^5.0.4"
+ postcss-normalize-string "^5.0.4"
+ postcss-normalize-timing-functions "^5.0.3"
+ postcss-normalize-unicode "^5.0.4"
+ postcss-normalize-url "^5.0.5"
+ postcss-normalize-whitespace "^5.0.4"
+ postcss-ordered-values "^5.0.5"
+ postcss-reduce-initial "^5.0.3"
+ postcss-reduce-transforms "^5.0.4"
+ postcss-svgo "^5.0.4"
+ postcss-unique-selectors "^5.0.4"
-cssnano-utils@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.0.0.tgz#c0b9fcd6e4f05c5155b07e9ab11bf94b97163057"
- integrity sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==
+cssnano-utils@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.0.2.tgz#d82b4991a27ba6fec644b39bab35fe027137f516"
+ integrity sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==
-cssnano@5.0.15:
- version "5.0.15"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.15.tgz#8779eaf60e3665e6a12687c814d375cc9f78db76"
- integrity sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==
+cssnano@5.0.17:
+ version "5.0.17"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.17.tgz#ff45713c05cfc780a1aeb3e663b6f224d091cabf"
+ integrity sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==
dependencies:
- cssnano-preset-default "^5.1.10"
+ cssnano-preset-default "^5.1.12"
lilconfig "^2.0.3"
yaml "^1.10.2"
@@ -2000,10 +1847,10 @@ csstype@^2.6.8:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f"
integrity sha512-ul26pfSQTZW8dcOnD2iiJssfXw0gdNVX9IJDH/X3K5DGPfj+fUYe3kB+swUY6BF3oZDxaID3AJt+9/ojSAE05A==
-cypress@9.3.1:
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.3.1.tgz#8116f52d49d6daf90a91e88f3eafd940234d2958"
- integrity sha512-BODdPesxX6bkVUnH8BVsV8I/jn57zQtO1FEOUTiuG2us3kslW7g0tcuwiny7CKCmJUZz8S/D587ppC+s58a+5Q==
+cypress@9.5.0:
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/cypress/-/cypress-9.5.0.tgz#704a79f0d3d4e775f433334eb8f5ae065e3bea31"
+ integrity sha512-rC5QPolKsVjJ8QJZ7IeZ6HlKM4gswBGZc0XvoAJNL8urQCSL8zTX0A/ai/h35WfF47NQ0iSZnwIXBlHX3MOUIQ==
dependencies:
"@cypress/request" "^2.88.10"
"@cypress/xvfb" "^1.2.4"
@@ -2042,10 +1889,10 @@ cypress@9.3.1:
pretty-bytes "^5.6.0"
proxy-from-env "1.0.0"
request-progress "^3.0.0"
+ semver "^7.3.2"
supports-color "^8.1.1"
tmp "~0.2.1"
untildify "^4.0.0"
- url "^0.11.0"
yauzl "^2.10.0"
d@1, d@^1.0.1:
@@ -2073,13 +1920,6 @@ dayjs@^1.10.4:
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.6.tgz#288b2aa82f2d8418a6c9d4df5898c0737ad02a63"
integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==
-debug@4, debug@4.3.1, debug@^4.1.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
- integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
- dependencies:
- ms "2.1.2"
-
debug@4.3.2, debug@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
@@ -2087,6 +1927,13 @@ debug@4.3.2, debug@^4.3.2:
dependencies:
ms "2.1.2"
+debug@4.3.3:
+ version "4.3.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
+ integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+ dependencies:
+ ms "2.1.2"
+
debug@^2.2.0, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -2101,6 +1948,13 @@ debug@^3.1.0, debug@^3.2.7:
dependencies:
ms "^2.1.1"
+debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -2150,11 +2004,6 @@ diff@5.0.0:
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
-diff@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
- integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-
dijkstrajs@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b"
@@ -2262,27 +2111,10 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
-ecdsa-sig-formatter@1.0.11:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
- integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
- dependencies:
- safe-buffer "^5.0.1"
-
-electron-to-chromium@^1.3.649:
- version "1.3.672"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.672.tgz#3a6e335016dab4bc584d5292adc4f98f54541f6a"
- integrity sha512-gFQe7HBb0lbOMqK2GAS5/1F+B0IMdYiAgB9OT/w1F4M7lgJK2aNOMNOM622aEax+nS1cTMytkiT0uMOkbtFmHw==
-
-electron-to-chromium@^1.3.712:
- version "1.3.717"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz#78d4c857070755fb58ab64bcc173db1d51cbc25f"
- integrity sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==
-
-electron-to-chromium@^1.3.723:
- version "1.3.742"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.742.tgz#7223215acbbd3a5284962ebcb6df85d88b95f200"
- integrity sha512-ihL14knI9FikJmH2XUIDdZFWJxvr14rPSdOhJ7PpS27xbz8qmaRwCwyg/bmFwjWKmWK9QyamiCZVCvXm5CH//Q==
+electron-to-chromium@^1.4.17:
+ version "1.4.68"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz#d79447b6bd1bec9183f166bb33d4bef0d5e4e568"
+ integrity sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==
emoji-regex@^8.0.0:
version "8.0.0"
@@ -2497,10 +2329,10 @@ eslint-plugin-import@2.25.4:
resolve "^1.20.0"
tsconfig-paths "^3.12.0"
-eslint-plugin-vue@8.3.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.3.0.tgz#2ae4f915ed3541a58c4a4c1145c1e60b86aa7e85"
- integrity sha512-IIuLHw4vQxGlHcoP2dG6t/2OVdQf2qoyAzEGAxreU1afZOHGA7y3TWq8I+r3ZA6Wjs6xpeUWGHlT31QGr9Rb5g==
+eslint-plugin-vue@8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-8.5.0.tgz#65832bba43ca713fa5da16bdfcf55d0095677f6f"
+ integrity sha512-i1uHCTAKOoEj12RDvdtONWrGzjFm/djkzqfhmQ0d6M/W8KM81mhswd/z+iTZ0jCpdUedW3YRgcVfQ37/J4zoYQ==
dependencies:
eslint-utils "^3.0.0"
natural-compare "^1.4.0"
@@ -2523,10 +2355,10 @@ eslint-scope@^6.0.0:
esrecurse "^4.3.0"
estraverse "^5.2.0"
-eslint-scope@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153"
- integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
@@ -2548,22 +2380,17 @@ eslint-visitor-keys@^3.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186"
integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==
-eslint-visitor-keys@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2"
- integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==
-
-eslint-visitor-keys@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
- integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-eslint@8.7.0:
- version "8.7.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.7.0.tgz#22e036842ee5b7cf87b03fe237731675b4d3633c"
- integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==
+eslint@8.9.0:
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb"
+ integrity sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==
dependencies:
- "@eslint/eslintrc" "^1.0.5"
+ "@eslint/eslintrc" "^1.1.0"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -2571,10 +2398,10 @@ eslint@8.7.0:
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
- eslint-scope "^7.1.0"
+ eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
- eslint-visitor-keys "^3.2.0"
- espree "^9.3.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.1"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
@@ -2608,23 +2435,14 @@ espree@^9.0.0:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^3.0.0"
-espree@^9.2.0:
- version "9.2.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.2.0.tgz#c50814e01611c2d0f8bd4daa83c369eabba80dbc"
- integrity sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==
- dependencies:
- acorn "^8.6.0"
- acorn-jsx "^5.3.1"
- eslint-visitor-keys "^3.1.0"
-
-espree@^9.3.0:
- version "9.3.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8"
- integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==
+espree@^9.3.1:
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
+ integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
dependencies:
acorn "^8.7.0"
acorn-jsx "^5.3.1"
- eslint-visitor-keys "^3.1.0"
+ eslint-visitor-keys "^3.3.0"
esprima@^4.0.0:
version "4.0.1"
@@ -2755,11 +2573,6 @@ executable@^4.1.1:
dependencies:
pify "^2.2.0"
-exit-on-epipe@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
- integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
-
expand-tilde@^2.0.0, expand-tilde@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
@@ -2938,10 +2751,10 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067"
integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==
-follow-redirects@^1.10.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
- integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+follow-redirects@^1.14.0:
+ version "1.14.8"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
+ integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
forever-agent@~0.6.1:
version "0.6.1"
@@ -3050,9 +2863,9 @@ getpass@^0.1.1:
assert-plus "^1.0.0"
glob-parent@^5.1.0, glob-parent@~5.1.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
- integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
@@ -3068,10 +2881,10 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-glob@7.1.6, glob@^7.1.3:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
- integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+glob@7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3080,10 +2893,10 @@ glob@7.1.6, glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+glob@^7.1.3:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@@ -3231,13 +3044,6 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
-http-headers@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/http-headers/-/http-headers-3.0.2.tgz#5147771292f0b39d6778d930a3a59a76fc7ef44d"
- integrity sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==
- dependencies:
- next-line "^1.1.0"
-
http-signature@~1.3.6:
version "1.3.6"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9"
@@ -3247,21 +3053,6 @@ http-signature@~1.3.6:
jsprim "^2.0.2"
sshpk "^1.14.1"
-http_ece@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75"
- integrity sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==
- dependencies:
- urlsafe-base64 "~1.0.0"
-
-https-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
- integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
- dependencies:
- agent-base "6"
- debug "4"
-
human-signals@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
@@ -3353,7 +3144,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1:
+inherits@2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3496,24 +3287,12 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-glob@^4.0.3:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -3693,11 +3472,6 @@ joi@^17.4.0:
"@sideway/formula" "^3.0.0"
"@sideway/pinpoint" "^2.0.0"
-js-levenshtein@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
- integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
-
js-stringify@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
@@ -3708,10 +3482,10 @@ js-tokens@^4.0.0:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f"
- integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==
+js-yaml@4.1.0, js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
@@ -3723,13 +3497,6 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
- integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
- dependencies:
- argparse "^2.0.1"
-
jsbn@1.1.0, jsbn@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
@@ -3755,11 +3522,6 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-schema@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
@@ -3848,23 +3610,6 @@ jstransformer@1.0.0:
is-promise "^2.0.0"
promise "^7.0.1"
-jwa@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc"
- integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==
- dependencies:
- buffer-equal-constant-time "1.0.1"
- ecdsa-sig-formatter "1.0.11"
- safe-buffer "^5.0.1"
-
-jws@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
- integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
- dependencies:
- jwa "^2.0.0"
- safe-buffer "^5.0.1"
-
katex@0.15.2:
version "0.15.2"
resolved "https://registry.yarnpkg.com/katex/-/katex-0.15.2.tgz#c05ece41ab497597b17abca2cecde3e4c0127f9d"
@@ -3887,11 +3632,6 @@ klona@^2.0.5:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
-langmap@0.0.16:
- version "0.0.16"
- resolved "https://registry.yarnpkg.com/langmap/-/langmap-0.0.16.tgz#2fe3e98a531fec0fec546624ebe168c2855bab56"
- integrity sha512-AtYvBK7BsDvWwnSfmO7CfgeUy7GUT1wK3QX8eKH/Ey/eXodqoHuAtvdQ82hmWD9QVFVKnuiNjym9fGY4qSJeLA==
-
lazy-ass@1.6.0, lazy-ass@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
@@ -3973,11 +3713,6 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
-lodash.isequal@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
- integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
-
lodash.isfinite@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3"
@@ -4008,14 +3743,7 @@ lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-log-symbols@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
- integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
- dependencies:
- chalk "^4.0.0"
-
-log-symbols@^4.0.0:
+log-symbols@4.1.0, log-symbols@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
@@ -4047,11 +3775,6 @@ magic-string@^0.25.7:
dependencies:
sourcemap-codec "^1.4.4"
-make-error@^1.1.1:
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
- integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
-
map-stream@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
@@ -4129,11 +3852,6 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-minimalistic-assert@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
minimatch@3.0.4, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -4146,10 +3864,10 @@ minimist@^1.2.0, minimist@^1.2.5:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
-misskey-js@0.0.13:
- version "0.0.13"
- resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.13.tgz#03a4e469186e28752d599dc4093519eb64647970"
- integrity sha512-kBdJdfe281gtykzzsrN3IAxWUQIimzPiJGyKWf863ggWJlWYVPmP9hTFlX2z8oPOaypgVBPEPHyw/jNUdc2DbQ==
+misskey-js@0.0.14:
+ version "0.0.14"
+ resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.14.tgz#1a616bdfbe81c6ee6900219eaf425bb5c714dd4d"
+ integrity sha512-bvLx6U3OwQwqHfp/WKwIVwdvNYAAPk0+YblXyxmSG3dwlzCgBRRLcB8o6bNruUDyJgh3t73pLDcOz3myxcUmww==
dependencies:
autobind-decorator "^2.4.0"
eventemitter3 "^4.0.7"
@@ -4162,33 +3880,32 @@ mkdirp@~0.5.1:
dependencies:
minimist "^1.2.5"
-mocha@8.4.0:
- version "8.4.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff"
- integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==
+mocha@9.2.1:
+ version "9.2.1"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.1.tgz#a1abb675aa9a8490798503af57e8782a78f1338e"
+ integrity sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==
dependencies:
"@ungap/promise-all-settled" "1.1.2"
ansi-colors "4.1.1"
browser-stdout "1.3.1"
- chokidar "3.5.1"
- debug "4.3.1"
+ chokidar "3.5.3"
+ debug "4.3.3"
diff "5.0.0"
escape-string-regexp "4.0.0"
find-up "5.0.0"
- glob "7.1.6"
+ glob "7.2.0"
growl "1.10.5"
he "1.2.0"
- js-yaml "4.0.0"
- log-symbols "4.0.0"
+ js-yaml "4.1.0"
+ log-symbols "4.1.0"
minimatch "3.0.4"
ms "2.1.3"
- nanoid "3.1.20"
- serialize-javascript "5.0.1"
+ nanoid "3.2.0"
+ serialize-javascript "6.0.0"
strip-json-comments "3.1.1"
supports-color "8.1.1"
which "2.0.2"
- wide-align "1.1.3"
- workerpool "6.1.0"
+ workerpool "6.2.0"
yargs "16.2.0"
yargs-parser "20.2.4"
yargs-unparser "2.0.0"
@@ -4220,20 +3937,20 @@ nano-time@1.0.0:
dependencies:
big-integer "^1.6.16"
-nanoid@3.1.20, nanoid@^3.1.20:
+nanoid@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
+ integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
+
+nanoid@^3.1.20:
version "3.1.20"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788"
integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==
-nanoid@^3.1.23:
- version "3.1.23"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
- integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
-
-nanoid@^3.1.30:
- version "3.1.30"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
- integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
+nanoid@^3.2.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
+ integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
natural-compare@^1.4.0:
version "1.4.0"
@@ -4255,30 +3972,20 @@ netmask@^2.0.2:
resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
-next-line@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/next-line/-/next-line-1.1.0.tgz#fcae57853052b6a9bae8208e40dd7d3c2d304603"
- integrity sha1-/K5XhTBStqm66CCOQN19PC0wRgM=
-
next-tick@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
-node-fetch@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
node-gyp-build@~3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d"
integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==
-node-releases@^1.1.70, node-releases@^1.1.71:
- version "1.1.71"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
- integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
+node-releases@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+ integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
@@ -4553,9 +4260,9 @@ path-key@^3.0.0, path-key@^3.1.0:
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
- integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-type@^4.0.0:
version "4.0.0"
@@ -4605,11 +4312,6 @@ pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
-pluralize@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
- integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
-
pngjs@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
@@ -4631,42 +4333,42 @@ postcss-calc@^8.2.0:
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.0.2"
-postcss-colormin@^5.2.3:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.3.tgz#da7fb80e81ad80d2867ea9e38672a892add5df15"
- integrity sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==
+postcss-colormin@^5.2.5:
+ version "5.2.5"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.5.tgz#d1fc269ac2ad03fe641d462b5d1dada35c69968a"
+ integrity sha512-+X30aDaGYq81mFqwyPpnYInsZQnNpdxMX0ajlY7AExCexEFkPVV+KrO7kXwayqEWL2xwEbNQ4nUO0ZsRWGnevg==
dependencies:
browserslist "^4.16.6"
caniuse-api "^3.0.0"
colord "^2.9.1"
postcss-value-parser "^4.2.0"
-postcss-convert-values@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059"
- integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==
+postcss-convert-values@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.4.tgz#3e74dd97c581f475ae7b4500bc0a7c4fb3a6b1b6"
+ integrity sha512-bugzSAyjIexdObovsPZu/sBCTHccImJxLyFgeV0MmNBm/Lw5h5XnjfML6gzEmJ3A6nyfCW7hb1JXzcsA4Zfbdw==
dependencies:
- postcss-value-parser "^4.1.0"
+ postcss-value-parser "^4.2.0"
-postcss-discard-comments@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe"
- integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==
+postcss-discard-comments@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz#011acb63418d600fdbe18804e1bbecb543ad2f87"
+ integrity sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==
-postcss-discard-duplicates@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d"
- integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==
+postcss-discard-duplicates@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz#10f202a4cfe9d407b73dfea7a477054d21ea0c1f"
+ integrity sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==
-postcss-discard-empty@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8"
- integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==
+postcss-discard-empty@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz#ec185af4a3710b88933b0ff751aa157b6041dd6a"
+ integrity sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==
-postcss-discard-overridden@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz#e6f51d83e66feffcf05ed94c4ad20b814d0aab5f"
- integrity sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==
+postcss-discard-overridden@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz#cc999d6caf18ea16eff8b2b58f48ec3ddee35c9c"
+ integrity sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==
postcss-loader@6.2.1:
version "6.2.1"
@@ -4677,56 +4379,54 @@ postcss-loader@6.2.1:
klona "^2.0.5"
semver "^7.3.5"
-postcss-merge-longhand@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz#41f4f3270282ea1a145ece078b7679f0cef21c32"
- integrity sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==
+postcss-merge-longhand@^5.0.6:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.6.tgz#090e60d5d3b3caad899f8774f8dccb33217d2166"
+ integrity sha512-rkmoPwQO6ymJSmWsX6l2hHeEBQa7C4kJb9jyi5fZB1sE8nSCv7sqchoYPixRwX/yvLoZP2y6FA5kcjiByeJqDg==
dependencies:
- postcss-value-parser "^4.1.0"
- stylehacks "^5.0.1"
+ postcss-value-parser "^4.2.0"
+ stylehacks "^5.0.3"
-postcss-merge-rules@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz#a50640fd832380f322bd2861a9b33fbde4219f9b"
- integrity sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==
+postcss-merge-rules@^5.0.6:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.6.tgz#26b37411fe1e80202fcef61cab027265b8925f2b"
+ integrity sha512-nzJWJ9yXWp8AOEpn/HFAW72WKVGD2bsLiAmgw4hDchSij27bt6TF+sIK0cJUBAYT3SGcjtGGsOR89bwkkMuMgQ==
dependencies:
browserslist "^4.16.6"
caniuse-api "^3.0.0"
- cssnano-utils "^3.0.0"
+ cssnano-utils "^3.0.2"
postcss-selector-parser "^6.0.5"
-postcss-minify-font-values@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz#4603e956d85cd0719156e2b3eb68e3cd2f917092"
- integrity sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==
+postcss-minify-font-values@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.4.tgz#627d824406b0712243221891f40a44fffe1467fd"
+ integrity sha512-RN6q3tyuEesvyCYYFCRGJ41J1XFvgV+dvYGHr0CeHv8F00yILlN8Slf4t8XW4IghlfZYCeyRrANO6HpJ948ieA==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-minify-gradients@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz#f13146950513f5a201015306914e3c76d10b591d"
- integrity sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==
+postcss-minify-gradients@^5.0.6:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.6.tgz#b07cef51a93f075e94053fd972ff1cba2eaf6503"
+ integrity sha512-E/dT6oVxB9nLGUTiY/rG5dX9taugv9cbLNTFad3dKxOO+BQg25Q/xo2z2ddG+ZB1CbkZYaVwx5blY8VC7R/43A==
dependencies:
colord "^2.9.1"
- cssnano-utils "^3.0.0"
+ cssnano-utils "^3.0.2"
postcss-value-parser "^4.2.0"
-postcss-minify-params@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz#9f933d37098ef1dcf007e159a47bb2c1cf06989d"
- integrity sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==
+postcss-minify-params@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.5.tgz#86cb624358cd45c21946f8c317893f0449396646"
+ integrity sha512-YBNuq3Rz5LfLFNHb9wrvm6t859b8qIqfXsWeK7wROm3jSKNpO1Y5e8cOyBv6Acji15TgSrAwb3JkVNCqNyLvBg==
dependencies:
- alphanum-sort "^1.0.2"
browserslist "^4.16.6"
- cssnano-utils "^3.0.0"
+ cssnano-utils "^3.0.2"
postcss-value-parser "^4.2.0"
-postcss-minify-selectors@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz#20ae03b411f7fb397451e3d7d85b989f944b871c"
- integrity sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==
+postcss-minify-selectors@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.3.tgz#6ac12d52aa661fd509469d87ab2cebb0a1e3a1b5"
+ integrity sha512-9RJfTiQEKA/kZhMaEXND893nBqmYQ8qYa/G+uPdVnXF6D/FzpfI6kwBtWEcHx5FqDbA79O9n6fQJfrIj6M8jvQ==
dependencies:
- alphanum-sort "^1.0.2"
postcss-selector-parser "^6.0.5"
postcss-modules-extract-imports@^3.0.0:
@@ -4757,89 +4457,89 @@ postcss-modules-values@^4.0.0:
dependencies:
icss-utils "^5.0.0"
-postcss-normalize-charset@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0"
- integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==
+postcss-normalize-charset@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz#719fb9f9ca9835fcbd4fed8d6e0d72a79e7b5472"
+ integrity sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==
-postcss-normalize-display-values@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz#8b5273c6c7d0a445e6ef226b8a5bb3204a55fb99"
- integrity sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==
+postcss-normalize-display-values@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.3.tgz#94cc82e20c51cc4ffba6b36e9618adc1e50db8c1"
+ integrity sha512-FIV5FY/qs4Ja32jiDb5mVj5iWBlS3N8tFcw2yg98+8MkRgyhtnBgSC0lxU+16AMHbjX5fbSJgw5AXLMolonuRQ==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-positions@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz#799fa494b352a5da183be8f050024af6d92fa29c"
- integrity sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==
+postcss-normalize-positions@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.4.tgz#4001f38c99675437b83277836fb4291887fcc6cc"
+ integrity sha512-qynirjBX0Lc73ROomZE3lzzmXXTu48/QiEzKgMeqh28+MfuHLsuqC9po4kj84igZqqFGovz8F8hf44hA3dPYmQ==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-repeat-style@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz#fd9bddba3e6fd5f5d95c18dfb42a09ecd563adea"
- integrity sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==
+postcss-normalize-repeat-style@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.4.tgz#d005adf9ee45fae78b673031a376c0c871315145"
+ integrity sha512-Innt+wctD7YpfeDR7r5Ik6krdyppyAg2HBRpX88fo5AYzC1Ut/l3xaxACG0KsbX49cO2n5EB13clPwuYVt8cMA==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-string@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz#1b2bbf91526f61266f28abf7f773e4136b2c4bd2"
- integrity sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==
+postcss-normalize-string@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.4.tgz#b5e00a07597e7aa8a871817bfeac2bfaa59c3333"
+ integrity sha512-Dfk42l0+A1CDnVpgE606ENvdmksttLynEqTQf5FL3XGQOyqxjbo25+pglCUvziicTxjtI2NLUR6KkxyUWEVubQ==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-timing-functions@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz#db4f4f49721f47667afd1fdc5edb032f8d9cdb2e"
- integrity sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==
+postcss-normalize-timing-functions@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.3.tgz#47210227bfcba5e52650d7a18654337090de7072"
+ integrity sha512-QRfjvFh11moN4PYnJ7hia4uJXeFotyK3t2jjg8lM9mswleGsNw2Lm3I5wO+l4k1FzK96EFwEVn8X8Ojrp2gP4g==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-normalize-unicode@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz#c4db89a0116066716b9e9fcb6444ce63178f5ced"
- integrity sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==
+postcss-normalize-unicode@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.4.tgz#02866096937005cdb2c17116c690f29505a1623d"
+ integrity sha512-W79Regn+a+eXTzB+oV/8XJ33s3pDyFTND2yDuUCo0Xa3QSy1HtNIfRVPXNubHxjhlqmMFADr3FSCHT84ITW3ig==
dependencies:
browserslist "^4.16.6"
postcss-value-parser "^4.2.0"
-postcss-normalize-url@^5.0.4:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz#3b0322c425e31dd275174d0d5db0e466f50810fb"
- integrity sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==
+postcss-normalize-url@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.5.tgz#c39efc12ff119f6f45f0b4f516902b12c8080e3a"
+ integrity sha512-Ws3tX+PcekYlXh+ycAt0wyzqGthkvVtZ9SZLutMVvHARxcpu4o7vvXcNoiNKyjKuWecnjS6HDI3fjBuDr5MQxQ==
dependencies:
normalize-url "^6.0.1"
postcss-value-parser "^4.2.0"
-postcss-normalize-whitespace@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz#92c5eaffe5255b5c43fca0baf19227e607c534db"
- integrity sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==
+postcss-normalize-whitespace@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.4.tgz#1d477e7da23fecef91fc4e37d462272c7b55c5ca"
+ integrity sha512-wsnuHolYZjMwWZJoTC9jeI2AcjA67v4UuidDrPN9RnX8KIZfE+r2Nd6XZRwHVwUiHmRvKQtxiqo64K+h8/imaw==
dependencies:
postcss-value-parser "^4.2.0"
-postcss-ordered-values@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz#d80a8565f2e21efe8a06abacd60629a783bbcf54"
- integrity sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==
+postcss-ordered-values@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.5.tgz#e878af822a130c3f3709737e24cb815ca7c6d040"
+ integrity sha512-mfY7lXpq+8bDEHfP+muqibDPhZ5eP9zgBEF9XRvoQgXcQe2Db3G1wcvjbnfjXG6wYsl+0UIjikqq4ym1V2jGMQ==
dependencies:
- cssnano-utils "^3.0.0"
+ cssnano-utils "^3.0.2"
postcss-value-parser "^4.2.0"
-postcss-reduce-initial@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048"
- integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==
+postcss-reduce-initial@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.3.tgz#68891594defd648253703bbd8f1093162f19568d"
+ integrity sha512-c88TkSnQ/Dnwgb4OZbKPOBbCaauwEjbECP5uAuFPOzQ+XdjNjRH7SG0dteXrpp1LlIFEKK76iUGgmw2V0xeieA==
dependencies:
browserslist "^4.16.6"
caniuse-api "^3.0.0"
-postcss-reduce-transforms@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz#9242758629f9ad4d90312eadbc921259d15bee4d"
- integrity sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==
+postcss-reduce-transforms@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.4.tgz#717e72d30befe857f7d2784dba10eb1157863712"
+ integrity sha512-VIJB9SFSaL8B/B7AXb7KHL6/GNNbbCHslgdzS9UDfBZYIA2nx8NLY7iD/BXFSO/1sRUILzBTfHCoW5inP37C5g==
dependencies:
postcss-value-parser "^4.2.0"
@@ -4861,20 +4561,19 @@ postcss-selector-parser@^6.0.5:
cssesc "^3.0.0"
util-deprecate "^1.0.2"
-postcss-svgo@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30"
- integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==
+postcss-svgo@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.4.tgz#cfa8682f47b88f7cd75108ec499e133b43102abf"
+ integrity sha512-yDKHvULbnZtIrRqhZoA+rxreWpee28JSRH/gy9727u0UCgtpv1M/9WEWY3xySlFa0zQJcqf6oCBJPR5NwkmYpg==
dependencies:
- postcss-value-parser "^4.1.0"
+ postcss-value-parser "^4.2.0"
svgo "^2.7.0"
-postcss-unique-selectors@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz#5d6893daf534ae52626708e0d62250890108c0c1"
- integrity sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==
+postcss-unique-selectors@^5.0.4:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.4.tgz#08e188126b634ddfa615fb1d6c262bafdd64826e"
+ integrity sha512-5ampwoSDJCxDPoANBIlMgoBcYUHnhaiuLYJR5pj1DLnYQvMRVyFuTA5C3Bvt+aHtiqWpJkD/lXT50Vo1D0ZsAQ==
dependencies:
- alphanum-sort "^1.0.2"
postcss-selector-parser "^6.0.5"
postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
@@ -4887,14 +4586,14 @@ postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@8.4.5:
- version "8.4.5"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95"
- integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==
+postcss@8.4.6, postcss@^8.4.5:
+ version "8.4.6"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.6.tgz#c5ff3c3c457a23864f32cb45ac9b741498a09ae1"
+ integrity sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==
dependencies:
- nanoid "^3.1.30"
+ nanoid "^3.2.0"
picocolors "^1.0.0"
- source-map-js "^1.0.1"
+ source-map-js "^1.0.2"
postcss@^8.1.10:
version "8.2.8"
@@ -4905,15 +4604,6 @@ postcss@^8.1.10:
nanoid "^3.1.20"
source-map "^0.6.1"
-postcss@^8.2.15:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.0.tgz#b1a713f6172ca427e3f05ef1303de8b65683325f"
- integrity sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==
- dependencies:
- colorette "^1.2.2"
- nanoid "^3.1.23"
- source-map-js "^0.6.2"
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -4924,15 +4614,10 @@ pretty-bytes@^5.6.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
-printj@~1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
- integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
-
-prismjs@1.26.0:
- version "1.26.0"
- resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.26.0.tgz#16881b594828bb6b45296083a8cbab46b0accd47"
- integrity sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==
+prismjs@1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057"
+ integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==
private-ip@2.3.3:
version "2.3.3"
@@ -5084,11 +4769,6 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
- integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
-
punycode@2.1.1, punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -5114,11 +4794,6 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
- integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
-
querystring@0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd"
@@ -5184,24 +4859,11 @@ request-progress@^3.0.0:
dependencies:
throttleit "^1.0.0"
-request-stats@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/request-stats/-/request-stats-3.0.0.tgz#769155dc8974d78d4a1cb87bbf14eaab985afe25"
- integrity sha1-dpFV3Il0141KHLh7vxTqq5ha/iU=
- dependencies:
- http-headers "^3.0.1"
- once "^1.4.0"
-
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@@ -5320,18 +4982,18 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sass-loader@12.4.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.4.0.tgz#260b0d51a8a373bb8e88efc11f6ba5583fea0bcf"
- integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==
+sass-loader@12.6.0:
+ version "12.6.0"
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb"
+ integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==
dependencies:
klona "^2.0.4"
neo-async "^2.6.2"
-sass@1.49.0:
- version "1.49.0"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.0.tgz#65ec1b1d9a6bc1bae8d2c9d4b392c13f5d32c078"
- integrity sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==
+sass@1.49.8:
+ version "1.49.8"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.8.tgz#9bbbc5d43d14862db07f1c04b786c9da9b641828"
+ integrity sha512-NoGOjvDDOU9og9oAxhRnap71QaTjjlzrvLnKecUJ3GxhaQBrV6e7gPuSPF28u1OcVAArVojPAe4ZhOXwwC4tGw==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@@ -5384,20 +5046,20 @@ semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
-serialize-javascript@5.0.1, serialize-javascript@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
- integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
- dependencies:
- randombytes "^2.1.0"
-
-serialize-javascript@^6.0.0:
+serialize-javascript@6.0.0, serialize-javascript@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
+serialize-javascript@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -5469,15 +5131,15 @@ source-list-map@^2.0.1:
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1:
+"source-map-js@>=0.6.2 <2.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf"
integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==
-source-map-js@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e"
- integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map-support@~0.5.19:
version "0.5.19"
@@ -5564,14 +5226,6 @@ strict-event-emitter-types@2.0.0:
resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f"
integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==
-"string-width@^1.0.2 || 2":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
- dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
-
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
@@ -5638,13 +5292,6 @@ stringz@2.1.0:
dependencies:
char-regex "^1.0.2"
-strip-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
- dependencies:
- ansi-regex "^3.0.0"
-
strip-ansi@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
@@ -5679,12 +5326,12 @@ style-loader@3.3.1:
resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575"
integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==
-stylehacks@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb"
- integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==
+stylehacks@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.3.tgz#2ef3de567bfa2be716d29a93bf3d208c133e8d04"
+ integrity sha512-ENcUdpf4yO0E1rubu8rkxI+JGQk4CgjchynZ4bDBJDfqdy+uhTRSWb8/F3Jtu+Bw5MW45Po3/aQGeIyyxgQtxg==
dependencies:
- browserslist "^4.16.0"
+ browserslist "^4.16.6"
postcss-selector-parser "^6.0.4"
supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1:
@@ -5832,7 +5479,7 @@ tinycolor2@1.4.2:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
-tmp@0.2.1, tmp@~0.2.1:
+tmp@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
@@ -5874,24 +5521,6 @@ ts-loader@9.2.6:
micromatch "^4.0.0"
semver "^7.3.4"
-ts-node@10.4.0:
- version "10.4.0"
- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7"
- integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==
- dependencies:
- "@cspotcode/source-map-support" "0.7.0"
- "@tsconfig/node10" "^1.0.7"
- "@tsconfig/node12" "^1.0.7"
- "@tsconfig/node14" "^1.0.0"
- "@tsconfig/node16" "^1.0.2"
- acorn "^8.4.1"
- acorn-walk "^8.1.1"
- arg "^4.1.0"
- create-require "^1.1.0"
- diff "^4.0.1"
- make-error "^1.1.1"
- yn "3.1.1"
-
tsc-alias@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.5.0.tgz#bc26f8dccf96e4ea350adc3f64ad3d2325cad967"
@@ -6042,19 +5671,6 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
- integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
-urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
- integrity sha1-I/iQaabGL0bPOh07ABac77kL4MY=
-
utf-8-validate@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3"
@@ -6143,10 +5759,12 @@ vue-prism-editor@2.0.0-alpha.2:
resolved "https://registry.yarnpkg.com/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz#aa53a88efaaed628027cbb282c2b1d37fc7c5c69"
integrity sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==
-vue-router@4.0.5:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.5.tgz#dd0a4134bc950c37aef64b973e9ee1008428d8fa"
- integrity sha512-AQq+pllb6FCc7rS6vh4PPcce3XA1jgK3hKNkQ4hXHwoVN7jOeAOMKCnX7XAX3etV9rmN7iNW8iIwgPk95ckBjw==
+vue-router@4.0.12:
+ version "4.0.12"
+ resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.12.tgz#8dc792cddf5bb1abcc3908f9064136de7e13c460"
+ integrity sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==
+ dependencies:
+ "@vue/devtools-api" "^6.0.0-beta.18"
vue-style-loader@4.1.3:
version "4.1.3"
@@ -6165,16 +5783,16 @@ vue-svg-loader@0.17.0-beta.2:
semver "^7.3.2"
svgo "^1.3.2"
-vue@3.2.29:
- version "3.2.29"
- resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.29.tgz#3571b65dbd796d3a6347e2fd45a8e6e11c13d56a"
- integrity sha512-cFIwr7LkbtCRanjNvh6r7wp2yUxfxeM2yPpDQpAfaaLIGZSrUmLbNiSze9nhBJt5MrZ68Iqt0O5scwAMEVxF+Q==
+vue@3.2.31:
+ version "3.2.31"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.31.tgz#e0c49924335e9f188352816788a4cca10f817ce6"
+ integrity sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==
dependencies:
- "@vue/compiler-dom" "3.2.29"
- "@vue/compiler-sfc" "3.2.29"
- "@vue/runtime-dom" "3.2.29"
- "@vue/server-renderer" "3.2.29"
- "@vue/shared" "3.2.29"
+ "@vue/compiler-dom" "3.2.31"
+ "@vue/compiler-sfc" "3.2.31"
+ "@vue/runtime-dom" "3.2.31"
+ "@vue/server-renderer" "3.2.31"
+ "@vue/shared" "3.2.31"
vuedraggable@4.0.1:
version "4.0.1"
@@ -6210,27 +5828,15 @@ watchpack@^2.3.1:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-web-push@3.4.5:
- version "3.4.5"
- resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.4.5.tgz#f94074ff150538872c7183e4d8881c8305920cf1"
- integrity sha512-2njbTqZ6Q7ZqqK14YpK1GGmaZs3NmuGYF5b7abCXulUIWFSlSYcZ3NBJQRFcMiQDceD7vQknb8FUuvI1F7Qe/g==
- dependencies:
- asn1.js "^5.3.0"
- http_ece "1.1.0"
- https-proxy-agent "^5.0.0"
- jws "^4.0.0"
- minimist "^1.2.5"
- urlsafe-base64 "^1.0.0"
-
-webpack-cli@4.9.1:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3"
- integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==
+webpack-cli@4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
+ integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.1.0"
- "@webpack-cli/info" "^1.4.0"
- "@webpack-cli/serve" "^1.6.0"
+ "@webpack-cli/configtest" "^1.1.1"
+ "@webpack-cli/info" "^1.4.1"
+ "@webpack-cli/serve" "^1.6.1"
colorette "^2.0.14"
commander "^7.0.0"
execa "^5.0.0"
@@ -6256,18 +5862,18 @@ webpack-sources@^2.1.1:
source-list-map "^2.0.1"
source-map "^0.6.1"
-webpack-sources@^3.2.2:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260"
- integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@5.66.0:
- version "5.66.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.66.0.tgz#789bf36287f407fc92b3e2d6f978ddff1bfc2dbb"
- integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==
+webpack@5.69.1:
+ version "5.69.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5"
+ integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A==
dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.50"
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
"@webassemblyjs/ast" "1.11.1"
"@webassemblyjs/wasm-edit" "1.11.1"
"@webassemblyjs/wasm-parser" "1.11.1"
@@ -6289,7 +5895,7 @@ webpack@5.66.0:
tapable "^2.1.1"
terser-webpack-plugin "^5.1.3"
watchpack "^2.3.1"
- webpack-sources "^3.2.2"
+ webpack-sources "^3.2.3"
webpack@^5:
version "5.33.2"
@@ -6362,13 +5968,6 @@ which@^1.2.14:
dependencies:
isexe "^2.0.0"
-wide-align@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
- integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
- dependencies:
- string-width "^1.0.2 || 2"
-
wildcard@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
@@ -6389,10 +5988,10 @@ word-wrap@^1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-workerpool@6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b"
- integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==
+workerpool@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
+ integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
wrap-ansi@^6.2.0:
version "6.2.0"
@@ -6417,10 +6016,10 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-ws@8.4.2:
- version "8.4.2"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b"
- integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==
+ws@8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
+ integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
xml-js@^1.6.11:
version "1.6.11"
@@ -6449,11 +6048,6 @@ yallist@^4.0.0:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-yaml-ast-parser@0.0.43:
- version "0.0.43"
- resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb"
- integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==
-
yaml@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
@@ -6525,11 +6119,6 @@ yauzl@^2.10.0:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
-yn@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
- integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
diff --git a/packages/shared/.eslintrc.js b/packages/shared/.eslintrc.js
index 9d7d4159ec..2d3356c3a6 100644
--- a/packages/shared/.eslintrc.js
+++ b/packages/shared/.eslintrc.js
@@ -37,6 +37,7 @@ module.exports = {
]
}],
*/
+ 'eqeqeq': ['error', 'always', { 'null': 'ignore' }],
'no-multi-spaces': ['error'],
'no-var': ['error'],
'prefer-arrow-callback': ['error'],
@@ -56,7 +57,7 @@ module.exports = {
'object-curly-spacing': ['error', 'always'],
'space-infix-ops': ['error'],
'space-before-blocks': ['error', 'always'],
- '@typescript-eslint/no-unnecessary-condition': ['error'],
+ '@typescript-eslint/no-unnecessary-condition': ['warn'],
'@typescript-eslint/no-var-requires': ['warn'],
'@typescript-eslint/no-inferrable-types': ['warn'],
'@typescript-eslint/no-empty-function': ['off'],