Merge branch 'develop' into ft/use-env-for-dburls

This commit is contained in:
naskya 2024-03-29 06:50:43 +09:00
commit bc3a773cae
No known key found for this signature in database
GPG Key ID: 712D413B3A9FED5C
51 changed files with 757 additions and 330 deletions

View File

@ -0,0 +1,18 @@
<!-- This template is used only when merging the develop branch into the main branch. Please don't use this for other merge requests. -->
## Checklist
- [ ] There are no pending changes on Weblate
I have updated...
- [ ] `package.json`
- [ ] `docs/changelog.md`
- [ ] `docs/notice-for-admins.md`
- [ ] `docs/api-change.md`
- [ ] OCI container image
<!-- TODO: Add automated tests (task runners are currently down) -->
## Remarks

View File

@ -1,7 +1,5 @@
ifneq (dev,$(wildcard config.env))
include ./dev/config.env
export
endif
include ./dev/config.env
export
.PHONY: pre-commit

View File

@ -5,6 +5,16 @@ Critical security updates are indicated by the :warning: icon.
- Server administrators should check [notice-for-admins.md](./notice-for-admins.md) as well.
- Third-party client/bot developers may want to check [api-change.md](./api-change.md) as well.
## Unreleased
- Fix bugs
## [v20240326](https://firefish.dev/firefish/firefish/-/merge_requests/10713/commits)
- Fix bugs
- Add an icon in the posting form to indicate that attached files have alt text
- Add a toggleable setting to show a warning if the post language setting might be incorrect
## [v20240319](https://firefish.dev/firefish/firefish/-/compare/v20240301...v20240319?from_project_id=7&straight=false)
- Introduce new full-text search engine and post search filters

View File

@ -54,7 +54,7 @@
POSTGRES_USER=user_name # user name
POSTGRES_DB=database_name # database name
```
1. Change the image tag to `registry.firefish.dev/firefish/firefish:v20240206`
1. Change Firefish image tag from `latest` to `v20240206`
```sh
vim docker-compose.yml
```
@ -66,6 +66,9 @@
web:
image: registry.firefish.dev/firefish/firefish:v20240206 # here
```
1. Change database image from `docker.io/groonga/pgroonga` to `docker.io/postgres`
Please make sure to use the same PostgreSQL version. For example, if you are using `docker.io/groonga/pgroonga:3.1.8-alpine-16`, you should change it to `docker.io/postgres:16-alpine`. PGroonga images are tagged as `{PGroonga version}-{alpine or debian}-{PostgreSQL major version}`. PostgreSQL image tags can be found at <https://hub.docker.com/_/postgres/tags>.
1. Start the container and confirm that Firefish is downgraded
```sh
docker-compose up --detach

View File

@ -1,6 +1,7 @@
BEGIN;
DELETE FROM "migrations" WHERE name IN (
'markLocalFilesNsfwByDefault1709305200000',
'FixMutingIndices1710690239308',
'NoteFile1710304584214',
'RenameMetaColumns1705944717480',
@ -18,6 +19,9 @@ DELETE FROM "migrations" WHERE name IN (
'RemoveNativeUtilsMigration1705877093218'
);
-- markLocalFilesNsfwByDefault
ALTER TABLE "meta" DROP COLUMN "markLocalFilesNsfwByDefault";
-- fix-muting-indices
DROP INDEX "IDX_renote_muting_createdAt";
DROP INDEX "IDX_renote_muting_muteeId";

View File

@ -33,6 +33,13 @@ docker pull registry.firefish.dev/firefish/firefish:latest
# or podman pull registry.firefish.dev/firefish/firefish:latest
```
## Enable database extension
```sh
docker-compose up db --detach && sleep 5 && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
# or podman-compose up db --detach && sleep 5 && podman-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
```
## Run
```sh

View File

@ -2,7 +2,7 @@
You can skip intermediate versions when upgrading from an old version, but please read the notices and follow the instructions for each intermediate version before [upgrading](./upgrade.md).
## Unreleased
## v20240326
### For Docker/Podman users
@ -17,7 +17,9 @@ The full-text search engine used in Firefish has been changed to [PGroonga](http
- Required Node.js version has been bumped from v18.16.0 to v18.17.0.
- You need to install PGroonga on your system. Please follow the instructions below.
[Edit (2024/03/23 23:55 UTC+9)] **Warning**: You may fail to install PGroonga, since the package registry of Apache Arrow (one of the subdependencies of PGroonga) is currently down ([GitHub issue](https://github.com/apache/arrow/issues/40759)). **We recommend that you hold off on upgrading until this problem is resolved.**
[Edit (2024/03/23 23:55 UTC+9)] ~~**Warning**: You may fail to install PGroonga, since the package registry of Apache Arrow (one of the subdependencies of PGroonga) is currently down ([GitHub issue](https://github.com/apache/arrow/issues/40759)). We recommend that you hold off on upgrading until this problem is resolved.~~
[Edit (2024/03/25 22:31 UTC+9)] The Apache Arrow repository is now back up and running again.
#### 1. Install PGroonga
@ -33,7 +35,7 @@ There are official installation instructions for many operating systems on <http
##### Ubuntu
1. Add apt repository
1. Install subdependencies and add apt repository
```sh
sudo apt install -y software-properties-common
sudo add-apt-repository -y universe
@ -129,8 +131,8 @@ db:
After that, execute this command to enable PGroonga:
```sh
docker-compose up db --detach && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
# or podman-compose up db --detach && podman-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
docker-compose up db --detach && sleep 5 && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
# or podman-compose up db --detach && sleep 5 && podman-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
```
Once this is done, you can start Firefish as usual.
@ -224,7 +226,7 @@ A new setting item has been added to control the log levels, so please consider
### For systemd/pm2 users
- Required Rust version has been bumped from v1.68 to v1.70.
- `libvips` is no longer required (unless your server os is *BSD), so you may uninstall it from your system. Make sure to execute the following commands after that:
- `libvips` is no longer required (unless your server OS is *BSD), so you may uninstall it from your system. Make sure to execute the following commands after that:
```sh
pnpm clean-npm
pnpm install

View File

@ -9,14 +9,14 @@ notifications: "Notificacions"
username: "Nom d'usuari"
password: "Contrasenya"
forgotPassword: "Contrasenya oblidada"
fetchingAsApObject: "Cercant en el Fediverse"
fetchingAsApObject: "Obtenint des de el Fediverse"
ok: "D'acord"
gotIt: "Ho he entès!"
cancel: "Cancel·la"
enterUsername: "Introdueix el teu nom d'usuari"
renotedBy: "Impulsat per {user}"
noNotes: "Cap publicació"
noNotifications: "Cap notificació"
noNotes: "Sense publicacions"
noNotifications: "Sense notificacions"
instance: "Servidor"
settings: "Preferències"
basicSettings: "Configuració bàsica"
@ -35,23 +35,23 @@ users: "Usuaris"
addUser: "Afegeix un usuari"
favorite: "Afegeix a les adreces d'interès"
favorites: "Adreces d'interès"
unfavorite: "Eliminar de les adreces d'interès"
favorited: "Afegit a les adreces d'interès."
alreadyFavorited: "Ja es troba a les adreces d'interès."
unfavorite: "Suprimeix de les adreces d'interès"
favorited: "S'ha afegit a les adreces d'interès."
alreadyFavorited: "Ja s'ha afegit a les adreces d'interès."
cantFavorite: "No s'ha pogut afegir a les adreces d'interès."
pin: "Fixar al perfil"
unpin: "Deixa de fixar al perfil"
pin: "Fixa al perfil"
unpin: "No fixis al perfil"
copyContent: "Copia el contingut"
copyLink: "Copia l'enllaç"
delete: "Elimina"
deleteAndEdit: "Elimina i edita"
deleteAndEditConfirm: "Segur que vols eliminar la publicació i editar-la? Perdràs
delete: "Suprimeix"
deleteAndEdit: "Suprimeix i edita"
deleteAndEditConfirm: "Segur que vols suprimir aquesta publicació i editar-la? Perdràs
totes les reaccions, impulsos i respostes."
addToList: "Afegeix a la llista"
sendMessage: "Envia un missatge"
copyUsername: "Copia el nom d'usuari"
searchUser: "Cerca un usuari"
reply: "Respon"
reply: "Resposta"
loadMore: "Carrega'n més"
showMore: "Mostra'n més"
youGotNewFollower: "t'ha seguit"
@ -66,20 +66,20 @@ export: "Exporta"
files: "Fitxers"
download: "Baixa"
driveFileDeleteConfirm: "Segur que vols eliminar el fitxer «{name}»? S'eliminarà de
totes les notes que el continguin com a fitxer adjunt."
totes les publicacions que el continguin com a fitxer adjunt."
unfollowConfirm: "Segur que vols deixar de seguir a {name}?"
exportRequested: "Has demanat exportar dades. Això pot trigar una estona. S'afegirà
al teu Disc un cop completada."
importRequested: "Has demanat importar dades. Això pot trigar una estona."
exportRequested: "Has sol·licitat una exportació. Això pot trigar una estona. S'afegirà
al teu Disc un cop finalitzada."
importRequested: "Has sol·licitat una importació de dades. Això pot trigar una estona."
lists: "Llistes"
noLists: "No tens cap llista"
note: "Publica"
note: "Publicació"
notes: "Publicacions"
following: "Seguint"
followers: "Seguidors"
followsYou: "Et segueix"
createList: "Crear una llista"
manageLists: "Gestionar les llistes"
createList: "Crea una llista"
manageLists: "Gestiona les llistes"
error: "Error"
somethingHappened: "S'ha produït un error"
retry: "Torna-ho a intentar"
@ -91,7 +91,7 @@ serverIsDead: "Aquest servidor no respon. Espera una estona i torna-ho a provar.
youShouldUpgradeClient: "Per veure aquesta pàgina, actualitzeu-la per actualitzar
el vostre client."
enterListName: "Introdueix un nom per a la llista"
privacy: "Privadesa"
privacy: "Privacitat"
makeFollowManuallyApprove: "Les sol·licituds de seguiment requereixen aprovació"
defaultNoteVisibility: "Visibilitat per defecte"
follow: "Segueix"
@ -135,7 +135,7 @@ userList: "Llistes"
smtpUser: "Nom d'usuari"
smtpPass: "Contrasenya"
user: "Usuari"
searchByGoogle: "Cercar"
searchByGoogle: "Cerca"
file: "Fitxer"
_email:
_follow:
@ -145,7 +145,7 @@ _email:
_mfm:
mention: "Menció"
quote: "Citar"
search: "Cercar"
search: "Cerca"
dummy: Firefish amplia el món del Fediverse
hashtag: Etiqueta
intro: MFM és un llenguatge de marques utilitzat a Misskey, Firefish, Akkoma i més
@ -2066,7 +2066,7 @@ _relayStatus:
rejected: Rebutjat
deleted: Eliminat
editNote: Edita la publicació
edited: 'Editat el {date} {time}'
edited: 'Editat a les {time} {date}'
signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades.
Si teniu un codi d'invitació per a aquest servidor, introduïu-lo a continuació.
userSaysSomethingReasonQuote: '{name} ha citat una publicació que conté {reason}'
@ -2096,7 +2096,7 @@ newer: Més nou
older: Més antic
silencedWarning: S'està mostrant aquesta pàgina per què aquest usuari és d'un servidor
que l'administrador a silenciat, així que pot ser spam.
jumpToPrevious: Vés a l'anterior
jumpToPrevious: Salta a l'anterior
cw: Avís de contingut
antennasDesc: "Les antenes mostren publicacions noves que coincideixen amb els criteris
establerts!\nS'hi pot accedir des de la pàgina de línies de temps."
@ -2104,7 +2104,7 @@ expandOnNoteClick: Obre la publicació amb un clic
expandOnNoteClickDesc: Si està desactivat, encara pots obrir les publicacions al menú
del botó dret o fent clic a la marca de temps.
channelFederationWarn: Els canals encara no es federen amb altres servidors
searchPlaceholder: Cerca a Firefish
searchPlaceholder: Cercar a Firefish
listsDesc: Les llistes et permeten crear línies de temps amb usuaris específics. Es
pot accedir des de la pàgina de línies de temps.
clipsDesc: Els clips són com marcadors categoritzats que es poden compartir. Podeu
@ -2264,8 +2264,8 @@ publishTimelinesDescription: Si està activat, les línies de temps Global i Loc
noAltTextWarning: Alguns fitxers adjunts no tenen una descripció. T'has s oblidat
d'escriure-les?
showNoAltTextWarning: Mostra un avís si públiques un fitxer sense descripció
toReply: Respon
toQuote: Cita
toReply: Resposta
toQuote: Citar
toEdit: Edita
searchUsersDescription: "Per buscar publicacions concretes d'un usuari/servidor, escriu
la ID (@usuari@exemple.com, o @usuari per un usuari local) o nom del domini (exemple.com).\n
@ -2285,3 +2285,12 @@ searchRangeDescription: "Si vols filtrar per un període de temps, has de fer se
moderationNote: Nota de moderació
ipFirstAcknowledged: Data en què es va veure la adreça IP per primera vegada
driveCapacityOverride: Capacitat del disc esgotada
incorrectLanguageWarning: "Semblar ser que la teva publicació es troba en {detected},
però has seleccionat {current}.\nVols canviar l'idioma a {detected}?"
markLocalFilesNsfwByDefault: Marcar tots els fitxers locals nous com a sensibles per
defecte
markLocalFilesNsfwByDefaultDescription: Independentment d'aquest ajust, els usuaris
poden treure l'etiqueta NSFW els mateixos. Els fitxers que ja existeixen no es veuen
afectats.
autocorrectNoteLanguage: Mostra un avís si l'idioma de la publicació no coincideix
amb el resultat de l'idioma detectat automàticament

View File

@ -174,6 +174,9 @@ cacheRemoteFiles: "Cache remote files"
cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded
directly from the remote server. Disabling this will decrease storage usage, but
increase traffic, as thumbnails will not be generated."
markLocalFilesNsfwByDefault: "Mark all new local file as sensitive by default"
markLocalFilesNsfwByDefaultDescription: "Regardless of this setting, users can remove
the NSFW flag themselves. Existing files are unaffected."
flagAsBot: "Mark this account as automated"
flagAsBotDescription: "Enable this option if this account is controlled by a program.
If enabled, it will act as a flag for other developers to prevent endless interaction
@ -1193,16 +1196,16 @@ releaseToReload: "Release to reload"
reloading: "Reloading"
enableTimelineStreaming: "Update timelines automatically"
searchWords: "Words to search / ID or URL to lookup"
searchWordsDescription: "Enter the search term here to search for posts. Separate words
with a space for an AND search, or 'OR' (without quotes) between words for an OR
search.\nFor example, 'morning night' will find posts that contain both 'morning'
searchWordsDescription: "Enter the search term here to search for posts. Separate
words with a space for an AND search, or 'OR' (without quotes) between words for
an OR search.\nFor example, 'morning night' will find posts that contain both 'morning'
and 'night', and 'morning OR night' will find posts that contain either 'morning'
or 'night' (or both).\nYou can also combine AND/OR conditions like '(morning OR
night) sleepy'.\nIf you want to search for a sequence of words (e.g., a sentence), you
must put it in double quotes, not to make it an AND search: \"Today I learned\"\n\n
If you want to go to a specific user page or post page, enter
the ID or URL in this field and click the 'Lookup' button. Clicking 'Search' will
search for posts that literally contain the ID/URL."
night) sleepy'.\nIf you want to search for a sequence of words (e.g., a sentence),
you must put it in double quotes, not to make it an AND search: \"Today I learned\"\
\n\n If you want to go to a specific user page or post page, enter the ID or URL
in this field and click the 'Lookup' button. Clicking 'Search' will search for posts
that literally contain the ID/URL."
searchUsers: "Posted by (optional)"
searchUsersDescription: "To search for posts by a specific user/server, enter the
ID (@user@example.com, or @user for a local user) or domain name (example.com).\n
@ -2227,3 +2230,7 @@ moreUrlsDescription: "Enter the pages you want to pin to the help menu in the lo
left corner using this notation:\n\"Display name\": https://example.com/"
messagingUnencryptedInfo: "Chats on Firefish are not end-to-end encrypted. Don't share
any sensitive infomation over Firefish."
autocorrectNoteLanguage: "Show a warning if the post language does not match the auto-detected
result"
incorrectLanguageWarning: "It looks like your post is in {detected}, but you selected
{current}.\nWould you like to set the language to {detected} instead?"

View File

@ -2277,15 +2277,18 @@ searchPostsWithFiles: Publications uniquement avec fichiers
publishTimelines: Publier les fils d'actualité pour les visiteurs
publishTimelinesDescription: Si cette option est activée, les fils Local et Global
sera affichée sur {url} même en cas de déconnexion.
searchWordsDescription: "Pour rechercher des publications, saisissez le terme de recherche.
Des mots séparés avec un espace pour une recherche ET, ou « OR » (sans citations)
searchWordsDescription: "Saisissez le terme de recherche ici pour rechercher des publications.
Séparez les mots avec un espace pour une recherche ET, ou « OR » (sans guillemets)
entre des mots pour une recherche OU.\nPar exemple, « matin nuit » trouvera des
publications contenant à la fois « matin » et « nuit », et « matin ou nuit » trouveront
des messages qui contiennent soit « matin » ou « nuit » (ou les deux).\nVous pouvez
également combiner des conditions ET/OU comme « (matin OR nuit) ensommeillé ».\n
\nSi vous souhaitez accéder à une page d'utilisateur ou à une page d'affichage spécifique,
saisissez l'ID ou l'URL dans ce champ et cliquez sur le bouton « Rechercher ». Cliquez
sur « Rechercher » recherchera des messages qui contiennent littéralement l'ID/URL."
Si vous voulez chercher une séquence de mots (par exemple, une phrase), vous devez
le mettre en double citations, pour ne pas en faire une recherche ET: \"Aujourd'hui
j'ai appris\"\n\nSi vous souhaitez accéder à une page d'utilisateur ou à une page
d'affichage spécifique, saisissez l'ID ou l'URL dans ce champ et cliquez sur le
bouton « Rechercher ». Cliquez sur « Rechercher » recherchera des messages qui contiennent
littéralement l'ID/URL."
searchUsersDescription: "Pour rechercher des messages par un utilisateur/serveur spécifique,
saisissez l'ID (@utilisateur@exemple.com, ou @utilisateur pour un utilisateur local)
ou le nom de domaine (exemple.com).\n\nSi vous saisissez « me » (sans guillemets),
@ -2312,3 +2315,12 @@ noAltTextWarning: Certains fichiers joints n'ont aucune description. Avez-vous o
de l'écrire?
showNoAltTextWarning: Afficher un avertissement si vous essayez de publier des fichiers
sans description
autocorrectNoteLanguage: Afficher un avertissement si la langue de publication ne
correspond pas au résultat autodétecté
incorrectLanguageWarning: "Il semble que votre publication est en {detected}, mais
vous avez sélectionné {current}.\nVoulez-vous sélectionner {detected} à la place?"
markLocalFilesNsfwByDefault: Marquer tous les nouveaux fichiers locaux comme sensibles
par défaut
markLocalFilesNsfwByDefaultDescription: Indépendamment de ce réglage, les utilisateurs
peuvent supprimer le drapeau « sensible » (NSFW) eux-mêmes. Les fichiers existants
ne sont pas affectés.

View File

@ -2225,7 +2225,7 @@ searchPostsWithFiles: Hanya kiriman dengan berkas
publishTimelines: Terbitkan lini masa untuk pengunjung
publishTimelinesDescription: Jika diaktifkan, lini masa Lokal dan Global akan ditampilkan
di {url} bahkan ketika keluar dari akun.
searchWordsDescription: "Untuk mencari kiriman, masukkan istilah pencarian. Pisahkan
searchWordsDescription: "Masukkan kata kunci di sini untuk mencari kiriman. Pisahkan
kata dengan spasi untuk pencarian AND (dan), atau 'OR' ('atau', tanpa tanda kutip)
di antara kata-kata untuk pencarian OR.\nMisalnya, 'pagi malam' akan menemukan postingan
yang mengandung 'pagi' dan 'malam', dan 'pagi OR malam' akan menemukan postingan
@ -2265,3 +2265,10 @@ messagingUnencryptedInfo: Percakapan di Firefish tidak terenkripsi secara ujung
moderationNote: Catatan Moderasi
driveCapacityOverride: Penimpaan Kapasitas Drive
ipFirstAcknowledged: Tanggal akuisisi pertama dari alamat IP
incorrectLanguageWarning: "Sepertinya kirimanmu dalam bahasa {detected}, tetapi Anda
memilih {current}.\nApakah kamu ingin ubah bahasanya ke bahasa {detected} saja?"
autocorrectNoteLanguage: Tampilkan peringatan jika bahasa kiriman tidak cocok dengan
hasil yang dideteksi secara otomatis
markLocalFilesNsfwByDefault: Tandai semua berkas lokal baru sensitif secara bawaan
markLocalFilesNsfwByDefaultDescription: Terlepas dari pengaturan ini, pengguna dapat
menghapus sendiri tanda NSFW. Berkas yang ada tidak berpengaruh.

View File

@ -2056,3 +2056,7 @@ messagingUnencryptedInfo: FirefishのチャットはE2E暗号化されていま
moderationNote: モデレーション用のメモ
ipFirstAcknowledged: IPアドレスが最初に取得された日
driveCapacityOverride: ドライブ容量の変更
autocorrectNoteLanguage: 設定した投稿言語が自動検出されたものと異なる場合に警告する
incorrectLanguageWarning: "この投稿は{detected}で書かれていると判定されました。\n投稿言語を{current}ではなく{detected}にしますか?"
markLocalFilesNsfwByDefault: このサーバーの全てのファイルをデフォルトでNSFWに設定する
markLocalFilesNsfwByDefaultDescription: この設定が有効でも、ユーザーは自分でNSFWのフラグを外すことができます。また、この設定は既存のファイルには影響しません。

View File

@ -152,6 +152,8 @@ cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远
flagAsBot: "标记此账号为自动化账号"
flagAsBotDescription: "如果此账号由程序控制,请启用此项。启用后,此标志可以帮助其它开发人员防止自动化账号之间产生无限互动的行为,并让 Firefish
的内部系统将此账号识别为自动化账号。"
markLocalFilesNsfwByDefault: "将所有新增本地文件默认标注为敏感内容"
markLocalFilesNsfwByDefaultDescription: "无论此设置如何,用户都可以自行删除内容的敏感内容标志。现有文件也不受影响。"
flagAsCat: "将这个账号设定为一只猫😺"
flagAsCatDescription: "您会长出猫耳朵并像猫一样说话!"
flagShowTimelineReplies: "在时间线上显示帖子的回复"
@ -168,7 +170,7 @@ searchWith: "搜索:{q}"
youHaveNoLists: "列表为空"
followConfirm: "您确定要关注 {name} 吗?"
proxyAccount: "代理账号"
proxyAccountDescription: "代理账号是在某些情况下充当用户的远程关注者的账号。 例如,当一个用户添加一个远程用户为代理账号时,如果没有本地用户关注该用户,远程用户的活动将不会被传递到服务器,因此代理账号将被关注。"
proxyAccountDescription: "代理账号是在某些情况下充当远程用户的关注者的账号。 例如,当一个用户把一个远程用户添加到列表时,如果没有本地用户关注该用户,远程用户的活动将不会被传递到服务器,为了避免此情况,代理账号将关注它。"
host: "主机名"
selectUser: "选择用户"
recipient: "接收者"
@ -849,7 +851,7 @@ auto: "自动"
themeColor: "服务器滚动条颜色"
size: "大小"
numberOfColumn: "列数"
searchByGoogle: "Google"
searchByGoogle: "搜索"
instanceDefaultLightTheme: "服务器默认浅色主题"
instanceDefaultDarkTheme: "服务器默认深色主题"
instanceDefaultThemeDescription: "以对象格式键入主题代码。"
@ -2000,7 +2002,7 @@ _iconSets:
bold: 加粗
light: 减细
emojiModPerm: 自定义表情符号管理权限
squareCatAvatars: 猫模式账号显示圆形头像
squareCatAvatars: 为猫账号显示方形头像图标
makePrivate: 设为私有
makePrivateConfirm: 此操作将向远程服务器发送删除请求并将可见性更改为私有。是否继续?
_emojiModPerm:
@ -2056,3 +2058,5 @@ searchRangeDescription: "如果您要过滤时间段,请按以下格式输入
messagingUnencryptedInfo: "Firefish 上的聊天没有经过端到端加密,请不要在聊天中分享您的敏感信息。"
noAltTextWarning: 有些附件没有描述。您是否忘记写描述了?
showNoAltTextWarning: 当您尝试发布没有描述的帖子附件时显示警告
autocorrectNoteLanguage: 当帖子语言不符合自动检测的结果的时候显示警告
incorrectLanguageWarning: "看上去您帖子使用的语言是{detected},但您选择的语言是{current}。\n要改为以{detected}发帖吗?"

View File

@ -149,6 +149,8 @@ addEmoji: "加入表情符號"
settingGuide: "推薦設定"
cacheRemoteFiles: "快取遠端檔案"
cacheRemoteFilesDescription: "禁用此設定會停止遠端檔案的緩存,從而節省儲存空間,但資料會因直接連線從而產生額外數據花費。"
markLocalFilesNsfwByDefault: "將所有新增本地檔案預設標註為敏感內容"
markLocalFilesNsfwByDefaultDescription: "無論此設置如何,使用者都可以自行刪除檔案的敏感內容標誌。現有檔案也不受影響。"
flagAsBot: "標記此帳號為自動化帳號"
flagAsBotDescription: "如果本帳戶是由程式控制請啟用此選項。此選項將作為一個標示以幫助其他開發者防止自動化帳號之間產生無限互動的行為並會調整Firefish內部系統將此帳號識別為自動化帳號。"
flagAsCat: "你是喵咪嗎w😺"
@ -2054,3 +2056,5 @@ ipFirstAcknowledged: 首次取得此 IP 位址的日期
driveCapacityOverride: 雲端硬碟容量變更
showNoAltTextWarning: 在嘗試發佈包含沒有替代文字的貼文時顯示警告
messagingUnencryptedInfo: Firefish 上的聊天沒有經過點對點加密,請不要發送敏感資訊。
autocorrectNoteLanguage: 在設定的貼文語言不符合自動偵測的結果時顯示警告
incorrectLanguageWarning: "此貼文的語言似乎為{detected},但您選擇的語言為{current}。\n要將貼文語言變更為{detected}嗎?"

View File

@ -1,6 +1,6 @@
{
"name": "firefish",
"version": "20240319",
"version": "20240326",
"repository": {
"type": "git",
"url": "https://firefish.dev/firefish/firefish.git"
@ -39,11 +39,11 @@
"gulp-terser": "2.1.0"
},
"devDependencies": {
"@biomejs/biome": "1.6.2",
"@biomejs/cli-darwin-arm64": "^1.6.2",
"@biomejs/cli-darwin-x64": "^1.6.2",
"@biomejs/cli-linux-arm64": "^1.6.2",
"@biomejs/cli-linux-x64": "^1.6.2",
"@biomejs/biome": "1.6.3",
"@biomejs/cli-darwin-arm64": "^1.6.3",
"@biomejs/cli-darwin-x64": "^1.6.3",
"@biomejs/cli-linux-arm64": "^1.6.3",
"@biomejs/cli-linux-x64": "^1.6.3",
"@types/node": "20.11.30",
"execa": "8.0.1",
"pnpm": "8.15.5",

View File

@ -6,5 +6,5 @@ This directory contains all of the packages Firefish uses.
- `backend-rs`: Backend code written in Rust, bound to NodeJS by [NAPI-RS](https://napi.rs/)
- `client`: Web interface written in Vue3 and TypeScript
- `sw`: Web [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) written in TypeScript
- `firefish-js`: TypeScript SDK for both backend and client, also published on [NPM](https://www.npmjs.com/package/firefish-js) for public use
- `firefish-js`: TypeScript SDK for both backend and client
- `megalodon`: TypeScript library used for partial Mastodon API compatibility

View File

@ -157,18 +157,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
name = "async-trait"
version = "0.1.78"
version = "0.1.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85"
checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -182,9 +182,9 @@ dependencies = [
[[package]]
name = "autocfg"
version = "1.1.0"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
[[package]]
name = "backend-rs"
@ -326,7 +326,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
"syn_derive",
]
@ -411,9 +411,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.3"
version = "4.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813"
checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
dependencies = [
"clap_builder",
"clap_derive",
@ -433,14 +433,14 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.3"
version = "4.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f"
checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64"
dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -542,7 +542,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c"
dependencies = [
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -688,9 +688,9 @@ dependencies = [
[[package]]
name = "fastrand"
version = "2.0.1"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
[[package]]
name = "finl_unicode"
@ -1066,7 +1066,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -1095,9 +1095,9 @@ dependencies = [
[[package]]
name = "itoa"
version = "1.0.10"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "js-sys"
@ -1261,9 +1261,9 @@ dependencies = [
[[package]]
name = "napi"
version = "2.16.0"
version = "2.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a63d0570e4c3e0daf7a8d380563610e159f538e20448d6c911337246f40e84"
checksum = "c4ca998356d8ff9fba7a070dae4508a2298439c98c9f3bc9c07669538b999e8f"
dependencies = [
"bitflags 2.5.0",
"ctor",
@ -1281,23 +1281,23 @@ checksum = "2f9130fccc5f763cf2069b34a089a18f0d0883c66aceb81f2fad541a3d823c43"
[[package]]
name = "napi-derive"
version = "2.16.0"
version = "2.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05bb7c37e3c1dda9312fdbe4a9fc7507fca72288ba154ec093e2d49114e727ce"
checksum = "b138cecf1141ae0ff5d62f4aa0e2f269aec339f66070f346ba6fb4279f1fc178"
dependencies = [
"cfg-if",
"convert_case",
"napi-derive-backend",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
name = "napi-derive-backend"
version = "1.0.62"
version = "1.0.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f785a8b8d7b83e925f5aa6d2ae3c159d17fe137ac368dc185bef410e7acdaeb4"
checksum = "ce5126b64f6ad9e28e30e6d15213dd378626b38f556454afebc42f7f02a90902"
dependencies = [
"convert_case",
"once_cell",
@ -1305,7 +1305,7 @@ dependencies = [
"quote",
"regex",
"semver",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -1487,7 +1487,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -1536,7 +1536,7 @@ dependencies = [
"regex",
"regex-syntax 0.7.5",
"structmeta",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2003,7 +2003,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2044,7 +2044,7 @@ dependencies = [
"proc-macro2",
"quote",
"sea-bae",
"syn 2.0.53",
"syn 2.0.55",
"unicode-ident",
]
@ -2110,7 +2110,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2126,9 +2126,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.114"
version = "1.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd"
dependencies = [
"itoa",
"ryu",
@ -2513,7 +2513,7 @@ dependencies = [
"proc-macro2",
"quote",
"structmeta-derive",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2524,7 +2524,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2552,9 +2552,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.53"
version = "2.0.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032"
checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0"
dependencies = [
"proc-macro2",
"quote",
@ -2570,7 +2570,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2635,7 +2635,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2711,7 +2711,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2782,7 +2782,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]
@ -2931,7 +2931,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
"wasm-bindgen-shared",
]
@ -2965,7 +2965,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@ -3194,7 +3194,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.53",
"syn 2.0.55",
]
[[package]]

View File

@ -12,7 +12,7 @@ napi = ["dep:napi", "dep:napi-derive"]
crate-type = ["cdylib", "lib"]
[dependencies]
async-trait = "0.1.78"
async-trait = "0.1.79"
cfg-if = "1.0.0"
chrono = "0.4.35"
cuid2 = "0.1.2"
@ -23,13 +23,13 @@ rand = "0.8.5"
schemars = { version = "0.8.16", features = ["chrono"] }
sea-orm = { version = "0.12.15", features = ["sqlx-postgres", "runtime-tokio-rustls"] }
serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.114"
serde_json = "1.0.115"
thiserror = "1.0.58"
tokio = { version = "1.36.0", features = ["full"] }
# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
napi = { version = "2.16.0", default-features = false, features = ["napi9", "tokio_rt"], optional = true }
napi-derive = { version = "2.16.0", optional = true }
napi = { version = "2.16.1", default-features = false, features = ["napi9", "tokio_rt"], optional = true }
napi-derive = { version = "2.16.1", optional = true }
basen = "0.1.0"
[dev-dependencies]

View File

@ -33,10 +33,10 @@
},
"scripts": {
"artifacts": "napi artifacts",
"build": "napi build --features napi --platform --release --cargo-flags=--locked ./built/",
"build:debug": "napi build --features napi --platform --cargo-flags=--locked ./built/",
"build": "napi build --features napi --platform --release ./built/",
"build:debug": "napi build --features napi --platform ./built/",
"prepublishOnly": "napi prepublish -t npm",
"test": "pnpm run cargo:test && pnpm run build:napi && ava",
"test": "pnpm run cargo:test && pnpm run build:debug && ava",
"universal": "napi universal",
"version": "napi version",
"format": "cargo fmt --all --",

View File

@ -36,6 +36,8 @@ pub struct Model {
pub icon_url: Option<String>,
#[sea_orm(column_name = "cacheRemoteFiles")]
pub cache_remote_files: bool,
#[sea_orm(column_name = "markLocalFilesNsfwByDefault")]
pub always_make_server_file_nsfw: bool,
#[sea_orm(column_name = "enableRecaptcha")]
pub enable_recaptcha: bool,
#[sea_orm(column_name = "recaptchaSiteKey")]

View File

@ -22,30 +22,30 @@
"@swc/core-android-arm64": "1.3.11"
},
"dependencies": {
"@bull-board/api": "5.15.1",
"@bull-board/koa": "5.15.1",
"@bull-board/ui": "5.15.1",
"@bull-board/api": "5.15.2",
"@bull-board/koa": "5.15.2",
"@bull-board/ui": "5.15.2",
"@discordapp/twemoji": "^15.0.2",
"@koa/cors": "5.0.0",
"@koa/multer": "3.0.2",
"@koa/router": "12.0.1",
"@ladjs/koa-views": "9.0.0",
"@peertube/http-signature": "1.7.0",
"@redocly/openapi-core": "1.10.5",
"@redocly/openapi-core": "1.10.6",
"@sinonjs/fake-timers": "11.2.2",
"@twemoji/parser": "^15.0.0",
"adm-zip": "^0.5.12",
"adm-zip": "0.5.10",
"ajv": "8.12.0",
"archiver": "7.0.1",
"argon2": "^0.40.1",
"aws-sdk": "2.1584.0",
"aws-sdk": "2.1585.0",
"axios": "^1.6.8",
"backend-rs": "workspace:*",
"bcryptjs": "2.4.3",
"blurhash": "2.0.5",
"bull": "4.12.2",
"cacheable-lookup": "TheEssem/cacheable-lookup",
"cbor-x": "^1.5.8",
"cbor-x": "^1.5.9",
"chalk": "5.3.0",
"chalk-template": "1.1.0",
"cli-highlight": "2.1.11",
@ -62,7 +62,7 @@
"form-data": "^4.0.0",
"got": "14.2.1",
"gunzip-maybe": "^1.4.2",
"happy-dom": "^14.3.1",
"happy-dom": "^14.3.8",
"hpagent": "1.2.0",
"ioredis": "5.3.2",
"ip-cidr": "4.0.0",
@ -129,7 +129,7 @@
},
"devDependencies": {
"@swc/cli": "0.3.10",
"@swc/core": "1.4.8",
"@swc/core": "1.4.11",
"@types/adm-zip": "^0.5.5",
"@types/bcryptjs": "2.4.6",
"@types/color-convert": "^2.0.3",

View File

@ -0,0 +1,18 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class markLocalFilesNsfwByDefault1709305200000
implements MigrationInterface
{
async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "meta" ADD "markLocalFilesNsfwByDefault" boolean NOT NULL DEFAULT false`,
undefined,
);
}
async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "meta" DROP COLUMN "markLocalFilesNsfwByDefault"`,
undefined,
);
}
}

View File

@ -207,6 +207,11 @@ export class Meta {
})
public cacheRemoteFiles: boolean;
@Column("boolean", {
default: false,
})
public markLocalFilesNsfwByDefault: boolean;
@Column({
...id(),
nullable: true,

View File

@ -296,7 +296,7 @@ export class Note {
nullable: true,
comment: "The updated date of the Note.",
})
public updatedAt: Date;
public updatedAt: Date | null;
//#endregion
constructor(data: Partial<Note>) {

View File

@ -3,7 +3,6 @@ import type { EndoRelation, Predicate } from "./relation.js";
/**
* Count the number of elements that satisfy the predicate
*/
export function countIf<T>(f: Predicate<T>, xs: T[]): number {
return xs.filter(f).length;
}
@ -60,6 +59,21 @@ export function maximum(xs: number[]): number {
return Math.max(...xs);
}
/**
* Returns if two arrays are equal
*
* examples:
* equal([1, 2, 3], [1, 2, 3]) === true
* equal([1, 2, 3], [1, 3, 2]) === false
* equal([1, 2, 3], [1, 2]) === false
*/
export function equal<T>(lhs: T[], rhs: T[]): boolean {
return (
lhs.length === rhs.length &&
lhs.every((value, index) => value === rhs[index])
);
}
/**
* Splits an array based on the equivalence relation.
* The concatenation of the result is equal to the argument.

View File

@ -29,6 +29,11 @@ export const meta = {
optional: false,
nullable: false,
},
markLocalFilesNsfwByDefault: {
type: "boolean",
optional: false,
nullable: false,
},
emailRequiredForSignup: {
type: "boolean",
optional: false,
@ -506,6 +511,7 @@ export default define(meta, paramDef, async () => {
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
markLocalFilesNsfwByDefault: instance.markLocalFilesNsfwByDefault,
defaultReaction: instance.defaultReaction,
recommendedInstances: instance.recommendedInstances,
pinnedUsers: instance.pinnedUsers,

View File

@ -95,6 +95,7 @@ export const paramDef = {
localDriveCapacityMb: { type: "integer" },
remoteDriveCapacityMb: { type: "integer" },
cacheRemoteFiles: { type: "boolean" },
markLocalFilesNsfwByDefault: { type: "boolean" },
emailRequiredForSignup: { type: "boolean" },
enableHcaptcha: { type: "boolean" },
hcaptchaSiteKey: { type: "string", nullable: true },
@ -330,6 +331,10 @@ export default define(meta, paramDef, async (ps, me) => {
set.cacheRemoteFiles = ps.cacheRemoteFiles;
}
if (ps.markLocalFilesNsfwByDefault !== undefined) {
set.markLocalFilesNsfwByDefault = ps.markLocalFilesNsfwByDefault;
}
if (ps.emailRequiredForSignup !== undefined) {
set.emailRequiredForSignup = ps.emailRequiredForSignup;
}

View File

@ -131,6 +131,11 @@ export const meta = {
optional: false,
nullable: false,
},
markLocalFilesNsfwByDefault: {
type: "boolean",
optional: false,
nullable: false,
},
emailRequiredForSignup: {
type: "boolean",
optional: false,
@ -490,6 +495,7 @@ export default define(meta, paramDef, async (ps, me) => {
pinnedClipId:
instance.privateMode && !me ? [] : instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
markLocalFilesNsfwByDefault: instance.markLocalFilesNsfwByDefault,
requireSetup:
(await Users.countBy({
host: IsNull(),

View File

@ -9,6 +9,7 @@ import {
UserProfiles,
Polls,
NoteEdits,
NoteFiles,
} from "@/models/index.js";
import type { DriveFile } from "@/models/entities/drive-file.js";
import type { IMentionedRemoteUsers, Note } from "@/models/entities/note.js";
@ -34,7 +35,6 @@ import renderUpdate from "@/remote/activitypub/renderer/update.js";
import { deliverToRelays } from "@/services/relay.js";
// import { deliverQuestionUpdate } from "@/services/note/polls/update.js";
import { langmap } from "@/misc/langmap.js";
import detectLanguage from "@/misc/detect-language.js";
export const meta = {
tags: ["notes"],
@ -606,13 +606,20 @@ export default define(meta, paramDef, async (ps, user) => {
update.updatedAt = new Date();
await Notes.update(note.id, update);
// Add NoteEdit history
if (update.fileIds != null) {
await NoteFiles.delete({ noteId: note.id });
await NoteFiles.insert(
update.fileIds.map((fileId) => ({ noteId: note.id, fileId })),
);
}
// Add NoteEdit history for the previous one
await NoteEdits.insert({
id: genId(),
noteId: note.id,
text: ps.text || undefined,
cw: ps.cw,
fileIds: ps.fileIds,
text: note.text || undefined,
cw: note.cw,
fileIds: note.fileIds,
updatedAt: new Date(),
});

View File

@ -567,6 +567,7 @@ export async function addFile({
: null;
const folder = await fetchFolder();
const instance = await fetchMeta();
let file = new DriveFile();
file.id = genId();
@ -581,7 +582,8 @@ export async function addFile({
file.requestIp = requestIp;
file.requestHeaders = requestHeaders;
file.isSensitive = user
? Users.isLocalUser(user) && profile!.alwaysMarkNsfw
? Users.isLocalUser(user) &&
(instance!.markLocalFilesNsfwByDefault || profile!.alwaysMarkNsfw)
? true
: sensitive != null
? sensitive

View File

@ -59,7 +59,7 @@
"idb-keyval": "6.2.1",
"insert-text-at-cursor": "0.3.0",
"json5": "2.2.3",
"katex": "0.16.9",
"katex": "0.16.10",
"libopenmpt-wasm": "github:TheEssem/libopenmpt-packaging#build",
"matter-js": "0.19.0",
"mfm-js": "0.24.0",
@ -83,7 +83,7 @@
"typescript": "5.4.3",
"unicode-emoji-json": "^0.6.0",
"uuid": "9.0.1",
"vite": "5.2.4",
"vite": "5.2.6",
"vite-plugin-compression": "^0.5.1",
"vue": "3.4.21",
"vue-draggable-plus": "^0.3.5",

View File

@ -56,7 +56,7 @@ const ripples = ref<HTMLElement | null>(null);
onMounted(() => {
if (props.autofocus) {
nextTick(() => {
el.value!.focus();
el.value?.focus();
});
}
});

View File

@ -4,9 +4,10 @@
v-if="isThumbnailAvailable"
:hash="file.blurhash"
:src="file.thumbnailUrl"
:alt="file.name"
:alt="file.comment"
:title="file.name"
:cover="fit !== 'contain'"
:show-alt-indicator="showAltIndicator"
/>
<i v-else-if="is === 'image'" :class="icon('ph-file-image icon')"></i>
<i v-else-if="is === 'video'" :class="icon('ph-file-video icon')"></i>
@ -33,10 +34,16 @@ import type { entities } from "firefish-js";
import ImgWithBlurhash from "@/components/MkImgWithBlurhash.vue";
import icon from "@/scripts/icon";
const props = defineProps<{
file: entities.DriveFile;
fit: string;
}>();
const props = withDefaults(
defineProps<{
file: entities.DriveFile;
fit: string;
showAltIndicator?: boolean;
}>(),
{
showAltIndicator: false,
},
);
const is = computed(() => {
if (props.file.type.startsWith("image/")) return "image";

View File

@ -21,30 +21,44 @@
loading="lazy"
@load="onLoad"
/>
<i
class="alt-indicator"
:class="icon('ph-subtitles')"
v-if="alt && showAltIndicator"
v-tooltip.noLabel="
`${i18n.ts.alt}: ${
alt.length > 200 ? alt.trim().slice(0, 200) + '...' : alt.trim()
}`
"
></i>
</template>
<script lang="ts" setup>
import { onMounted, ref } from "vue";
import { decodeBlurHash } from "fast-blurhash";
import icon from "@/scripts/icon";
import { i18n } from "@/i18n";
const props = withDefaults(
defineProps<{
src?: string | null;
hash?: string;
alt?: string;
alt?: string | null;
type?: string | null;
title?: string | null;
size?: number;
cover?: boolean;
largestDimension?: "width" | "height";
showAltIndicator?: boolean;
}>(),
{
src: null,
type: null,
alt: "",
alt: null,
title: null,
size: 64,
cover: true,
showAltIndicator: false,
},
);
@ -96,4 +110,21 @@ img {
height: 100%;
}
}
i.alt-indicator {
display: flex;
gap: 4px;
position: absolute;
border-radius: 6px;
overflow: hidden;
top: 0;
right: 0;
background-color: var(--accentedBg);
-webkit-backdrop-filter: var(--blur, blur(15px));
backdrop-filter: var(--blur, blur(15px));
color: var(--accent);
font-size: 1em;
padding: 6px 8px;
text-align: center;
}
</style>

View File

@ -286,7 +286,7 @@ import XStarButtonNoEmoji from "@/components/MkStarButtonNoEmoji.vue";
import XQuoteButton from "@/components/MkQuoteButton.vue";
import MkVisibility from "@/components/MkVisibility.vue";
import copyToClipboard from "@/scripts/copy-to-clipboard";
import detectLanguage from "@/scripts/detect-language";
import { detectLanguage } from "@/scripts/language-utils";
import { url } from "@/config";
import { pleaseLogin } from "@/scripts/please-login";
import { focusNext, focusPrev } from "@/scripts/focus";

View File

@ -201,7 +201,7 @@ import XStarButtonNoEmoji from "@/components/MkStarButtonNoEmoji.vue";
import XRenoteButton from "@/components/MkRenoteButton.vue";
import XQuoteButton from "@/components/MkQuoteButton.vue";
import copyToClipboard from "@/scripts/copy-to-clipboard";
import detectLanguage from "@/scripts/detect-language";
import { detectLanguage } from "@/scripts/language-utils";
import { url } from "@/config";
import { pleaseLogin } from "@/scripts/please-login";
import { getNoteMenu } from "@/scripts/get-note-menu";

View File

@ -329,8 +329,14 @@ import XCheatSheet from "@/components/MkCheatSheetDialog.vue";
import preprocess from "@/scripts/preprocess";
import { vibrate } from "@/scripts/vibrate";
import { langmap } from "@/scripts/langmap";
import {
detectLanguage,
isSupportedLang,
isSameLanguage,
languageContains,
parentLanguage,
} from "@/scripts/language-utils";
import type { MenuItem } from "@/types/menu";
import detectLanguage from "@/scripts/detect-language";
import icon from "@/scripts/icon";
const modal = inject("modal");
@ -758,22 +764,14 @@ const language = ref<string | null>(
localStorage.getItem("lang")?.split("-")[0],
);
function filterLangmapByPrefix(
prefix: string,
function filterSubclassLanguages(
langCode: string,
): { langCode: string; nativeName: string }[] {
let to_return = Object.entries(langmap)
.filter(([langCode, _]) => langCode.startsWith(prefix))
return Object.entries(langmap)
.filter(([lc, _]) => languageContains(langCode, lc))
.map(([langCode, v]) => {
return { langCode, nativeName: v.nativeName };
});
if (prefix === "zh")
to_return = to_return.concat([
{ langCode: "yue", nativeName: langmap.yue.nativeName },
{ langCode: "nan", nativeName: langmap.nan.nativeName },
]);
return to_return;
}
function setLanguage() {
@ -785,7 +783,7 @@ function setLanguage() {
type: "label",
text: i18n.ts.suggested,
});
filterLangmapByPrefix(detectedLanguage).forEach((v) => {
for (const v of filterSubclassLanguages(detectedLanguage)) {
actions.push({
text: v.nativeName,
danger: false,
@ -794,7 +792,7 @@ function setLanguage() {
language.value = v.langCode;
},
});
});
}
actions.push(null);
}
@ -1020,6 +1018,39 @@ function deleteDraft() {
}
async function post() {
// For text that is too short, the false positive rate may be too high, so we don't show alarm.
if (defaultStore.state.autocorrectNoteLanguage && text.value.length > 10) {
const detectedLanguage: string = detectLanguage(text.value) ?? "";
const currentLanguageName: string | undefined | false =
language.value && langmap[language.value]?.nativeName;
const detectedLanguageName: string | undefined | false =
detectedLanguage !== "" && langmap[detectedLanguage]?.nativeName;
if (
currentLanguageName &&
detectedLanguageName &&
!isSameLanguage(detectedLanguage, language.value) &&
isSupportedLang(parentLanguage(language.value))
) {
// "canceled" means "post with detected language".
const { canceled } = await os.confirm({
type: "warning",
text: i18n.t("incorrectLanguageWarning", {
detected: detectedLanguageName,
current: currentLanguageName,
}),
okText: i18n.ts.no,
cancelText: i18n.ts.yes,
isPlaintext: true,
});
if (canceled) {
language.value = detectedLanguage;
}
}
}
if (
defaultStore.state.showNoAltTextWarning &&
files.value.some((f) => f.comment == null || f.comment.length === 0)

View File

@ -19,6 +19,7 @@
class="thumbnail"
:file="element"
fit="cover"
:show-alt-indicator="true"
/>
<div v-if="element.isSensitive" class="sensitive">
<i :class="icon('ph-warning icon')"></i>

View File

@ -142,6 +142,10 @@ function done(canceled: boolean, result?: searchQuery) {
}
function search() {
searchWords.value = searchWords.value.trim();
searchUsers.value = searchUsers.value.trim();
searchRange.value = searchRange.value.trim();
if (
searchWords.value === "" &&
searchUsers.value === "" &&
@ -160,6 +164,8 @@ function search() {
}
function lookup() {
searchWords.value = searchWords.value.trim();
if (searchWords.value === "") return;
done(false, {

View File

@ -22,7 +22,7 @@ class I18n<T extends Record<string, any>> {
if (args) {
for (const [k, v] of Object.entries(args)) {
str = str.replace(`{${k}}`, v.toString());
str = str.replaceAll(`{${k}}`, v.toString());
}
}
return str;

View File

@ -305,6 +305,19 @@
}}</template>
</FormSwitch>
<FormSwitch
v-model="markLocalFilesNsfwByDefault"
class="_formBlock"
>
<template #label>{{
i18n.ts.markLocalFilesNsfwByDefault
}}</template>
<template #caption>{{
i18n.ts
.markLocalFilesNsfwByDefaultDescription
}}</template>
</FormSwitch>
<FormSplit :min-width="280">
<FormInput
v-model="localDriveCapacityMb"
@ -486,6 +499,7 @@ const customMOTD = ref("");
const recommendedInstances = ref("");
const customSplashIcons = ref("");
const cacheRemoteFiles = ref(false);
const markLocalFilesNsfwByDefault = ref(false);
const localDriveCapacityMb = ref(0);
const remoteDriveCapacityMb = ref(0);
const enableRegistration = ref(false);
@ -561,6 +575,7 @@ async function init() {
customSplashIcons.value = meta.customSplashIcons.join("\n");
recommendedInstances.value = meta.recommendedInstances.join("\n");
cacheRemoteFiles.value = meta.cacheRemoteFiles;
markLocalFilesNsfwByDefault.value = meta.markLocalFilesNsfwByDefault;
localDriveCapacityMb.value = meta.driveCapacityPerLocalUserMb;
remoteDriveCapacityMb.value = meta.driveCapacityPerRemoteUserMb;
enableRegistration.value = !meta.disableRegistration;
@ -614,6 +629,7 @@ function save() {
customSplashIcons: customSplashIcons.value.split("\n"),
recommendedInstances: recommendedInstances.value.split("\n"),
cacheRemoteFiles: cacheRemoteFiles.value,
markLocalFilesNsfwByDefault: markLocalFilesNsfwByDefault.value,
localDriveCapacityMb: localDriveCapacityMb.value,
remoteDriveCapacityMb: remoteDriveCapacityMb.value,
disableRegistration: !enableRegistration.value,

View File

@ -40,9 +40,11 @@
>
</div>
<FormSwitch v-model="isSensitive">{{
i18n.ts.markAsSensitive
}}</FormSwitch>
<FormSwitch
v-if="!instance.markLocalFilesNsfwByDefault"
v-model="isSensitive"
>{{ i18n.ts.markAsSensitive }}</FormSwitch
>
<FormButton v-if="postId" primary @click="save"
><i :class="icon('ph-floppy-disk-back')"></i>
@ -73,6 +75,7 @@ import { selectFiles } from "@/scripts/select-file";
import * as os from "@/os";
import { useRouter } from "@/router";
import { definePageMetadata } from "@/scripts/page-metadata";
import { instance } from "@/instance";
import { i18n } from "@/i18n";
import icon from "@/scripts/icon";

View File

@ -124,6 +124,9 @@
<FormSwitch v-model="showNoAltTextWarning" class="_formBlock">{{
i18n.ts.showNoAltTextWarning
}}</FormSwitch>
<FormSwitch v-model="autocorrectNoteLanguage" class="_formBlock">{{
i18n.ts.autocorrectNoteLanguage
}}</FormSwitch>
<FormSelect v-model="serverDisconnectedBehavior" class="_formBlock">
<template #label>{{ i18n.ts.whenServerDisconnected }}</template>
@ -530,6 +533,9 @@ const pullToRefreshThreshold = computed(
const showNoAltTextWarning = computed(
defaultStore.makeGetterSetter("showNoAltTextWarning"),
);
const autocorrectNoteLanguage = computed(
defaultStore.makeGetterSetter("autocorrectNoteLanguage"),
);
// This feature (along with injectPromo) is currently disabled
// function onChangeInjectFeaturedNote(v) {

View File

@ -125,6 +125,7 @@ const defaultStoreSaveKeys: (keyof (typeof defaultStore)["state"])[] = [
"enablePullToRefresh",
"pullToRefreshThreshold",
"showNoAltTextWarning",
"autocorrectNoteLanguage",
];
const coldDeviceStorageSaveKeys: (keyof typeof ColdDeviceStorage.default)[] = [
"lightTheme",

View File

@ -1,11 +0,0 @@
import { detect } from "tinyld";
import * as mfm from "mfm-js";
export default function detectLanguage(text: string): string {
const nodes = mfm.parse(text);
const filtered = mfm.extract(nodes, (node) => {
return node.type === "text" || node.type === "quote";
});
const purified = mfm.toString(filtered);
return detect(purified);
}

View File

@ -380,3 +380,131 @@ export const iso639Regional = {
};
export const langmap = Object.assign({}, langmapNoRegion, iso639Regional);
/**
* @see https://github.com/komodojp/tinyld/blob/develop/docs/langs.md
*/
export const supportedLangs: Record<string, boolean> = {
af: true,
afr: true,
am: true,
amh: true,
ber: true,
rn: true,
run: true,
my: true,
mya: true,
id: true,
ind: true,
km: true,
khm: true,
tl: true,
tgl: true,
th: true,
tha: true,
vi: true,
vie: true,
zh: true,
cmn: true,
ja: true,
jpn: true,
ko: true,
kor: true,
bn: true,
ben: true,
gu: true,
guj: true,
hi: true,
hin: true,
kn: true,
kan: true,
ta: true,
tam: true,
te: true,
tel: true,
ur: true,
urd: true,
cs: true,
ces: true,
el: true,
ell: true,
la: true,
lat: true,
mk: true,
mkd: true,
sr: true,
srp: true,
sk: true,
slk: true,
be: true,
bel: true,
bg: true,
bul: true,
et: true,
est: true,
hu: true,
hun: true,
lv: true,
lvs: true,
lt: true,
lit: true,
pl: true,
pol: true,
ro: true,
ron: true,
ru: true,
rus: true,
uk: true,
ukr: true,
da: true,
dan: true,
fi: true,
fin: true,
is: true,
isl: true,
no: true,
nob: true,
sv: true,
swe: true,
nl: true,
nld: true,
en: true,
eng: true,
fr: true,
fra: true,
de: true,
deu: true,
ga: true,
gle: true,
it: true,
ita: true,
pt: true,
por: true,
es: true,
spa: true,
ar: true,
ara: true,
hy: true,
hye: true,
he: true,
heb: true,
kk: true,
kaz: true,
mn: true,
mon: true,
fa: true,
pes: true,
tt: true,
tat: true,
tr: true,
tur: true,
tk: true,
tuk: true,
yi: true,
yid: true,
eo: true,
epo: true,
tlh: true,
vo: true,
vol: true,
};

View File

@ -0,0 +1,54 @@
import { supportedLangs } from "@/scripts/langmap";
import { detect } from "tinyld";
import * as mfm from "mfm-js";
export function detectLanguage(text: string): string {
const nodes = mfm.parse(text);
const filtered = mfm.extract(nodes, (node) => {
return node.type === "text" || node.type === "quote";
});
const purified = mfm.toString(filtered);
return detect(purified);
}
export function isSupportedLang(langCode: string | null) {
if (!langCode) return false;
return supportedLangs[langCode] ?? false;
}
/**
* Compare two language codes to determine whether they are decisively different
* @returns false if they are close enough
*/
export function isSameLanguage(
langCode1: string | null,
langCode2: string | null,
) {
return (
languageContains(langCode1, langCode2) ||
languageContains(langCode2, langCode1)
);
}
/**
* Returns true if langCode1 contains langCode2
*/
export function languageContains(
langCode1: string | null,
langCode2: string | null,
) {
if (!langCode1 || !langCode2) return false;
return parentLanguage(langCode2) === langCode1;
}
export function parentLanguage(langCode: string | null) {
if (!langCode) return null;
if (["zh-hant", "zh-hans", "yue", "nan"].includes(langCode)) {
return "zh";
}
if (["nb", "nn"].includes(langCode)) {
return "no";
}
return langCode;
}

View File

@ -432,6 +432,10 @@ export const defaultStore = markRaw(
where: "account",
default: true,
},
autocorrectNoteLanguage: {
where: "account",
default: true,
},
}),
);

View File

@ -4,11 +4,10 @@
"description": "Firefish SDK for JavaScript",
"homepage": "https://firefish.dev/firefish/firefish/-/tree/develop/packages/firefish-js",
"main": "./built/index.js",
"types": "./built/index.d.ts",
"types": "./src/index.ts",
"license": "MIT",
"scripts": {
"build": "pnpm swc src --out-dir built --source-maps false --copy-files --strip-leading-paths",
"build:types": "pnpm tsc --emitDeclarationOnly",
"build:debug": "pnpm swc src --out-dir built --source-maps true --copy-files --strip-leading-paths",
"watch": "pnpm swc src --out-dir built --source-maps true --copy-files --strip-leading-paths --watch",
"lint": "pnpm biome check --apply src",
@ -22,7 +21,7 @@
},
"devDependencies": {
"@swc/cli": "0.3.10",
"@swc/core": "1.4.8",
"@swc/core": "1.4.11",
"@swc/types": "^0.1.6",
"@types/jest": "^29.5.12",
"@types/node": "20.11.30",

View File

@ -11,7 +11,7 @@
"devDependencies": {
"firefish-js": "workspace:*",
"idb-keyval": "^6.2.1",
"vite": "5.2.4",
"vite": "5.2.6",
"vite-plugin-compression": "^0.5.1"
}
}

View File

@ -25,20 +25,20 @@ importers:
version: 4.1.0
devDependencies:
'@biomejs/biome':
specifier: 1.6.2
version: 1.6.2
specifier: 1.6.3
version: 1.6.3
'@biomejs/cli-darwin-arm64':
specifier: ^1.6.2
version: 1.6.2
specifier: ^1.6.3
version: 1.6.3
'@biomejs/cli-darwin-x64':
specifier: ^1.6.2
version: 1.6.2
specifier: ^1.6.3
version: 1.6.3
'@biomejs/cli-linux-arm64':
specifier: ^1.6.2
version: 1.6.2
specifier: ^1.6.3
version: 1.6.3
'@biomejs/cli-linux-x64':
specifier: ^1.6.2
version: 1.6.2
specifier: ^1.6.3
version: 1.6.3
'@types/node':
specifier: 20.11.30
version: 20.11.30
@ -55,14 +55,14 @@ importers:
packages/backend:
dependencies:
'@bull-board/api':
specifier: 5.15.1
version: 5.15.1(@bull-board/ui@5.15.1)
specifier: 5.15.2
version: 5.15.2(@bull-board/ui@5.15.2)
'@bull-board/koa':
specifier: 5.15.1
version: 5.15.1(@types/koa@2.15.0)(pug@3.0.2)
specifier: 5.15.2
version: 5.15.2(@types/koa@2.15.0)(pug@3.0.2)
'@bull-board/ui':
specifier: 5.15.1
version: 5.15.1
specifier: 5.15.2
version: 5.15.2
'@discordapp/twemoji':
specifier: ^15.0.2
version: 15.0.2
@ -82,8 +82,8 @@ importers:
specifier: 1.7.0
version: 1.7.0
'@redocly/openapi-core':
specifier: 1.10.5
version: 1.10.5
specifier: 1.10.6
version: 1.10.6
'@sinonjs/fake-timers':
specifier: 11.2.2
version: 11.2.2
@ -91,8 +91,8 @@ importers:
specifier: ^15.0.0
version: 15.0.0
adm-zip:
specifier: ^0.5.12
version: 0.5.12
specifier: 0.5.10
version: 0.5.10
ajv:
specifier: 8.12.0
version: 8.12.0
@ -103,8 +103,8 @@ importers:
specifier: ^0.40.1
version: 0.40.1
aws-sdk:
specifier: 2.1584.0
version: 2.1584.0
specifier: 2.1585.0
version: 2.1585.0
axios:
specifier: ^1.6.8
version: 1.6.8
@ -124,8 +124,8 @@ importers:
specifier: TheEssem/cacheable-lookup
version: github.com/TheEssem/cacheable-lookup/dd2fb616366a3c68dcf321a57a67295967b204bf
cbor-x:
specifier: ^1.5.8
version: 1.5.8
specifier: ^1.5.9
version: 1.5.9
chalk:
specifier: 5.3.0
version: 5.3.0
@ -175,8 +175,8 @@ importers:
specifier: ^1.4.2
version: 1.4.2
happy-dom:
specifier: ^14.3.1
version: 14.3.1
specifier: ^14.3.8
version: 14.3.8
hpagent:
specifier: 1.2.0
version: 1.2.0
@ -373,10 +373,10 @@ importers:
devDependencies:
'@swc/cli':
specifier: 0.3.10
version: 0.3.10(@swc/core@1.4.8)
version: 0.3.10(@swc/core@1.4.11)
'@swc/core':
specifier: 1.4.8
version: 1.4.8
specifier: 1.4.11
version: 1.4.11
'@types/adm-zip':
specifier: ^0.5.5
version: 0.5.5
@ -526,13 +526,13 @@ importers:
version: 2.0.0
swc-loader:
specifier: ^0.2.6
version: 0.2.6(@swc/core@1.4.8)(webpack@5.91.0)
version: 0.2.6(@swc/core@1.4.11)(webpack@5.91.0)
ts-loader:
specifier: 9.5.1
version: 9.5.1(typescript@5.4.3)(webpack@5.91.0)
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.3)
version: 10.9.2(@swc/core@1.4.11)(@types/node@20.11.30)(typescript@5.4.3)
tsconfig-paths:
specifier: 4.2.0
version: 4.2.0
@ -541,7 +541,7 @@ importers:
version: 5.4.3
webpack:
specifier: ^5.91.0
version: 5.91.0(@swc/core@1.4.8)
version: 5.91.0(@swc/core@1.4.11)
ws:
specifier: 8.16.0
version: 8.16.0
@ -622,7 +622,7 @@ importers:
version: 9.0.8
'@vitejs/plugin-vue':
specifier: 5.0.4
version: 5.0.4(vite@5.2.4)(vue@3.4.21)
version: 5.0.4(vite@5.2.6)(vue@3.4.21)
'@vue/runtime-core':
specifier: 3.4.21
version: 3.4.21
@ -702,8 +702,8 @@ importers:
specifier: 2.2.3
version: 2.2.3
katex:
specifier: 0.16.9
version: 0.16.9
specifier: 0.16.10
version: 0.16.10
libopenmpt-wasm:
specifier: github:TheEssem/libopenmpt-packaging#build
version: github.com/TheEssem/libopenmpt-packaging/d05d151a72b638c6312227af0417aca69521172c
@ -774,11 +774,11 @@ importers:
specifier: 9.0.1
version: 9.0.1
vite:
specifier: 5.2.4
version: 5.2.4(@types/node@20.11.30)(sass@1.72.0)
specifier: 5.2.6
version: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vite-plugin-compression:
specifier: ^0.5.1
version: 0.5.1(vite@5.2.4)
version: 0.5.1(vite@5.2.6)
vue:
specifier: 3.4.21
version: 3.4.21(typescript@5.4.3)
@ -807,10 +807,10 @@ importers:
devDependencies:
'@swc/cli':
specifier: 0.3.10
version: 0.3.10(@swc/core@1.4.8)
version: 0.3.10(@swc/core@1.4.11)
'@swc/core':
specifier: 1.4.8
version: 1.4.8
specifier: 1.4.11
version: 1.4.11
'@swc/types':
specifier: ^0.1.6
version: 0.1.6
@ -837,7 +837,7 @@ importers:
version: 29.1.2(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.4.3)
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.3)
version: 10.9.2(@swc/core@1.4.11)(@types/node@20.11.30)(typescript@5.4.3)
tsd:
specifier: ^0.30.7
version: 0.30.7
@ -972,11 +972,11 @@ importers:
specifier: ^6.2.1
version: 6.2.1
vite:
specifier: 5.2.4
version: 5.2.4(@types/node@20.11.30)(sass@1.72.0)
specifier: 5.2.6
version: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vite-plugin-compression:
specifier: ^0.5.1
version: 0.5.1(vite@5.2.4)
version: 0.5.1(vite@5.2.6)
packages:
@ -1536,38 +1536,38 @@ packages:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
/@biomejs/biome@1.6.2:
resolution: {integrity: sha512-vw6JhYnpLRRDaawI+d7NaQj17F7LSSJrgT03IQUETwRUG3Q1/a4ByJRphTVXPuhiTnaKVmUlEF3I5NSitcdD+g==}
/@biomejs/biome@1.6.3:
resolution: {integrity: sha512-Xnp/TIpIcTnRA4LwerJuoGYQJEqwXtn5AL0U0OPXll/QGbAKmcUAfizU880xTwZRD4f53iceqODLDaD3wxYlIw==}
engines: {node: '>=14.*'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@biomejs/cli-darwin-arm64': 1.6.2
'@biomejs/cli-darwin-x64': 1.6.2
'@biomejs/cli-linux-arm64': 1.6.2
'@biomejs/cli-linux-arm64-musl': 1.6.2
'@biomejs/cli-linux-x64': 1.6.2
'@biomejs/cli-linux-x64-musl': 1.6.2
'@biomejs/cli-win32-arm64': 1.6.2
'@biomejs/cli-win32-x64': 1.6.2
'@biomejs/cli-darwin-arm64': 1.6.3
'@biomejs/cli-darwin-x64': 1.6.3
'@biomejs/cli-linux-arm64': 1.6.3
'@biomejs/cli-linux-arm64-musl': 1.6.3
'@biomejs/cli-linux-x64': 1.6.3
'@biomejs/cli-linux-x64-musl': 1.6.3
'@biomejs/cli-win32-arm64': 1.6.3
'@biomejs/cli-win32-x64': 1.6.3
dev: true
/@biomejs/cli-darwin-arm64@1.6.2:
resolution: {integrity: sha512-2sGcNO1wDuQ6r97/SDaPzP3ehrCL7qHXpVggcB/OonbVBEamqIkN1tHsID/snnX3R2ax2QTarjb4bQ+1BpEWzA==}
/@biomejs/cli-darwin-arm64@1.6.3:
resolution: {integrity: sha512-0E8PGu3/8HSkBJdtjno+niJE1ANS/12D7sPK65vw5lTBYmmaYwJdfclDp6XO0IAX7uVd3/YtXlsEua0SVrNt3Q==}
engines: {node: '>=14.*'}
cpu: [arm64]
os: [darwin]
dev: true
/@biomejs/cli-darwin-x64@1.6.2:
resolution: {integrity: sha512-qtHDXIHd7eRIHv41XdG6pt1dbw+qiD0OgLlJn5rvW20kSSFfLxW8yc4upcC1PzlruP1BQpKFec3r5rx1duTtzw==}
/@biomejs/cli-darwin-x64@1.6.3:
resolution: {integrity: sha512-UWu0We/aIRtWXgJKe6ygWt2xR0yXs64BwWqtZbfxBojRn3jgW8UdFAkV5yiUOX3TQlsV6BZH1EQaUAVsccUeeA==}
engines: {node: '>=14.*'}
cpu: [x64]
os: [darwin]
dev: true
/@biomejs/cli-linux-arm64-musl@1.6.2:
resolution: {integrity: sha512-ej3Jj6O9KUSCJUWqVs+9aOo6IcRIALHaGFB20wnQTWtRMFhu1PluM48MrQtMKputgdk5/CopQ662IdKf1PeuEg==}
/@biomejs/cli-linux-arm64-musl@1.6.3:
resolution: {integrity: sha512-AntGCSfLN1nPcQj4VOk3X2JgnDw07DaPC8BuBmRcsRmn+7GPSWLllVN5awIKlRPZEbGJtSnLkTiDc5Bxw8OiuA==}
engines: {node: '>=14.*'}
cpu: [arm64]
os: [linux]
@ -1575,15 +1575,15 @@ packages:
dev: true
optional: true
/@biomejs/cli-linux-arm64@1.6.2:
resolution: {integrity: sha512-e1FJ59lx84QoqQgu1/uzAPIcYGcTkZY/m6Aj8ZHwi7KoWAE5xSogximFHNQ82lS4qkUfG7KaPTbYT6cGJjN9jQ==}
/@biomejs/cli-linux-arm64@1.6.3:
resolution: {integrity: sha512-wFVkQw38kOssfnkbpSh6ums5TaElw3RAt5i/VZwHmgR2nQgE0fHXLO7HwIE9VBkOEdbiIFq+2PxvFIHuJF3z3Q==}
engines: {node: '>=14.*'}
cpu: [arm64]
os: [linux]
dev: true
/@biomejs/cli-linux-x64-musl@1.6.2:
resolution: {integrity: sha512-uOVt4UBkFTFtdXgPX3QuSHRPVIvj07FP0P7A0UOP++idd0r9Bxyt5iIBaAORM3eQyGQqzCGPln1GuM6GalYKzg==}
/@biomejs/cli-linux-x64-musl@1.6.3:
resolution: {integrity: sha512-GelAvGsUwbxfFpKLG+7+dvDmbrfkGqn08sL8CMQrGnhjE1krAqHWiXQsjfmi0UMFdMsk7hbc4oSAP+1+mrXcHQ==}
engines: {node: '>=14.*'}
cpu: [x64]
os: [linux]
@ -1591,15 +1591,15 @@ packages:
dev: true
optional: true
/@biomejs/cli-linux-x64@1.6.2:
resolution: {integrity: sha512-S6Wc5YX6aLDLMzwlDmiw/kjK62Ex+xzE432M5ge9q8tSCluGeHIzrenrJlu8E0xPG2FEipDaK4iqwnjS9O6e2A==}
/@biomejs/cli-linux-x64@1.6.3:
resolution: {integrity: sha512-vyn8TQaTZg617hjqFitwGmb1St5XXvq6I3vmxU/QFalM74BryMSvYCrYWb2Yw/TkykdEwZTMGYp+SWHRb04fTg==}
engines: {node: '>=14.*'}
cpu: [x64]
os: [linux]
dev: true
/@biomejs/cli-win32-arm64@1.6.2:
resolution: {integrity: sha512-5zuxNyvnKy7oLN7KLkqcYpsMKGubfMaeQ+RqnpFsmrofQAxpOo6EL/TyJvr8g533Z0a2/cQ/ALqnwl0mN3KQoQ==}
/@biomejs/cli-win32-arm64@1.6.3:
resolution: {integrity: sha512-Gx8N2Tixke6pAI1BniteCVZgUUmaFEDYosdWxoaCus15BZI/7RcBxhsRM0ZL/lC66StSQ8vHl8JBrrld1k570Q==}
engines: {node: '>=14.*'}
cpu: [arm64]
os: [win32]
@ -1607,8 +1607,8 @@ packages:
dev: true
optional: true
/@biomejs/cli-win32-x64@1.6.2:
resolution: {integrity: sha512-O3nf09/m3cb3/U3M+uO4l236iTZr4F4SmLNG3okKXPfyZqKLNnF6OjdTHOYEiNXnGEtlRuUeemqb3vht9JkXaw==}
/@biomejs/cli-win32-x64@1.6.3:
resolution: {integrity: sha512-meungPJw64SqoR7LXY1wG7GC4+4wgpyThdFUMGXa6PCe0BLFOIOcZ9VMj9PstuczMPdgmt/BUMPsj25dK1VO8A==}
engines: {node: '>=14.*'}
cpu: [x64]
os: [win32]
@ -1616,20 +1616,20 @@ packages:
dev: true
optional: true
/@bull-board/api@5.15.1(@bull-board/ui@5.15.1):
resolution: {integrity: sha512-yJqv2uhMTC5BE2SwK/zG7kTloZyOFOujzPtP09OF9S8GvTalCwSTk7EsLQOUMHTUhyiVZ8JpUyJz8oytZ77+xQ==}
/@bull-board/api@5.15.2(@bull-board/ui@5.15.2):
resolution: {integrity: sha512-HOqh5/Z0W5GR0WHVS/G83DTn8JwDn0NZs2H5u0bMFnvEmKZexysdnZyeox8Y31A6azRO/tqK3o/LrT1Hhtaxtw==}
peerDependencies:
'@bull-board/ui': 5.15.1
'@bull-board/ui': 5.15.2
dependencies:
'@bull-board/ui': 5.15.1
'@bull-board/ui': 5.15.2
redis-info: 3.1.0
dev: false
/@bull-board/koa@5.15.1(@types/koa@2.15.0)(pug@3.0.2):
resolution: {integrity: sha512-O6Mq0qoVK125YHXfNYUY7g3QrhvPcU0Vg81TC7mEbt+rrdPJa7twvP0VAqd/Ga3SiDS+cth+9S2bnPQQ3CoOoA==}
/@bull-board/koa@5.15.2(@types/koa@2.15.0)(pug@3.0.2):
resolution: {integrity: sha512-tT1gjfcEF/87ITR0Scfh5V3Qy74NOCEOwIPWV78F4/5oIcSvdhjhFWBvCMZ/RLQSozS49/2gK5AucJW5pmf2ww==}
dependencies:
'@bull-board/api': 5.15.1(@bull-board/ui@5.15.1)
'@bull-board/ui': 5.15.1
'@bull-board/api': 5.15.2(@bull-board/ui@5.15.2)
'@bull-board/ui': 5.15.2
ejs: 3.1.9
koa: 2.15.2
koa-mount: 4.0.0
@ -1693,10 +1693,10 @@ packages:
- whiskers
dev: false
/@bull-board/ui@5.15.1:
resolution: {integrity: sha512-+jpHdBTaqC2D9QDlix9j0EeqiJgN+RB8aH/A7J0VwVMLnbM820ZFPbrlXIN3Ph0hX2hgc+aHabZjs4Rjmwpqng==}
/@bull-board/ui@5.15.2:
resolution: {integrity: sha512-OlDCAaBOjdR7ke3vGkm/vEwC8Cwrt/r9ivc8jL+hQbgDluauKl/o9NSPp3BgC2Fo0MRszAxTgSitR0pGLRhAwg==}
dependencies:
'@bull-board/api': 5.15.1(@bull-board/ui@5.15.1)
'@bull-board/api': 5.15.2(@bull-board/ui@5.15.2)
dev: false
/@cbor-extract/cbor-extract-darwin-arm64@2.2.0:
@ -3308,8 +3308,8 @@ packages:
resolution: {integrity: sha512-OEdCW1HRpFiZaZNrXQq8LoBxX3APijZaa/Xyoc6r44LnyAPWkjQqvPoBxE7IRqSvMihf8bl+ZRc1gtc1KuFLHw==}
dev: false
/@redocly/openapi-core@1.10.5:
resolution: {integrity: sha512-RaVwWLbGuzQxK6ezbvPGnz4rtVMTo5DOrxyII/sKJiTexBHplZzUVqrpU6aeRckl3iY9xe9+w07c/kDiLEeWRQ==}
/@redocly/openapi-core@1.10.6:
resolution: {integrity: sha512-qWZszssMMe/UrJ4LN4qh2mdcIx5uMHwnvtkAEdmWYWlUv+LNaBeqazjDt0UrCOX5EsrD4d+21oxQJNdbyGMVVA==}
engines: {node: '>=14.19.0', npm: '>=7.0.0'}
dependencies:
'@redocly/ajv': 8.11.0
@ -3518,7 +3518,7 @@ packages:
resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==}
dev: false
/@swc/cli@0.3.10(@swc/core@1.4.8):
/@swc/cli@0.3.10(@swc/core@1.4.11):
resolution: {integrity: sha512-YWfYo9kXdbmIuGwIPth9geKgb0KssCMTdZa44zAN5KoqcuCP2rTW9s60heQDSRNpbtCmUr7BKF1VivsoHXrvrQ==}
engines: {node: '>= 16.14.0'}
hasBin: true
@ -3530,7 +3530,7 @@ packages:
optional: true
dependencies:
'@mole-inc/bin-wrapper': 8.0.1
'@swc/core': 1.4.8
'@swc/core': 1.4.11
'@swc/counter': 0.1.3
commander: 8.3.0
fast-glob: 3.3.2
@ -3552,88 +3552,88 @@ packages:
dev: false
optional: true
/@swc/core-darwin-arm64@1.4.8:
resolution: {integrity: sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==}
/@swc/core-darwin-arm64@1.4.11:
resolution: {integrity: sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
optional: true
/@swc/core-darwin-x64@1.4.8:
resolution: {integrity: sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==}
/@swc/core-darwin-x64@1.4.11:
resolution: {integrity: sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
optional: true
/@swc/core-linux-arm-gnueabihf@1.4.8:
resolution: {integrity: sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==}
/@swc/core-linux-arm-gnueabihf@1.4.11:
resolution: {integrity: sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
requiresBuild: true
optional: true
/@swc/core-linux-arm64-gnu@1.4.8:
resolution: {integrity: sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==}
/@swc/core-linux-arm64-gnu@1.4.11:
resolution: {integrity: sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
/@swc/core-linux-arm64-musl@1.4.8:
resolution: {integrity: sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==}
/@swc/core-linux-arm64-musl@1.4.11:
resolution: {integrity: sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
/@swc/core-linux-x64-gnu@1.4.8:
resolution: {integrity: sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==}
/@swc/core-linux-x64-gnu@1.4.11:
resolution: {integrity: sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
/@swc/core-linux-x64-musl@1.4.8:
resolution: {integrity: sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==}
/@swc/core-linux-x64-musl@1.4.11:
resolution: {integrity: sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
/@swc/core-win32-arm64-msvc@1.4.8:
resolution: {integrity: sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==}
/@swc/core-win32-arm64-msvc@1.4.11:
resolution: {integrity: sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
optional: true
/@swc/core-win32-ia32-msvc@1.4.8:
resolution: {integrity: sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==}
/@swc/core-win32-ia32-msvc@1.4.11:
resolution: {integrity: sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
optional: true
/@swc/core-win32-x64-msvc@1.4.8:
resolution: {integrity: sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==}
/@swc/core-win32-x64-msvc@1.4.11:
resolution: {integrity: sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
requiresBuild: true
optional: true
/@swc/core@1.4.8:
resolution: {integrity: sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==}
/@swc/core@1.4.11:
resolution: {integrity: sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==}
engines: {node: '>=10'}
requiresBuild: true
peerDependencies:
@ -3643,30 +3643,26 @@ packages:
optional: true
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.5
'@swc/types': 0.1.6
optionalDependencies:
'@swc/core-darwin-arm64': 1.4.8
'@swc/core-darwin-x64': 1.4.8
'@swc/core-linux-arm-gnueabihf': 1.4.8
'@swc/core-linux-arm64-gnu': 1.4.8
'@swc/core-linux-arm64-musl': 1.4.8
'@swc/core-linux-x64-gnu': 1.4.8
'@swc/core-linux-x64-musl': 1.4.8
'@swc/core-win32-arm64-msvc': 1.4.8
'@swc/core-win32-ia32-msvc': 1.4.8
'@swc/core-win32-x64-msvc': 1.4.8
'@swc/core-darwin-arm64': 1.4.11
'@swc/core-darwin-x64': 1.4.11
'@swc/core-linux-arm-gnueabihf': 1.4.11
'@swc/core-linux-arm64-gnu': 1.4.11
'@swc/core-linux-arm64-musl': 1.4.11
'@swc/core-linux-x64-gnu': 1.4.11
'@swc/core-linux-x64-musl': 1.4.11
'@swc/core-win32-arm64-msvc': 1.4.11
'@swc/core-win32-ia32-msvc': 1.4.11
'@swc/core-win32-x64-msvc': 1.4.11
/@swc/counter@0.1.3:
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
/@swc/types@0.1.5:
resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==}
/@swc/types@0.1.6:
resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==}
dependencies:
'@swc/counter': 0.1.3
dev: true
/@swc/wasm@1.2.130:
resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==}
@ -4790,14 +4786,14 @@ packages:
- supports-color
dev: true
/@vitejs/plugin-vue@5.0.4(vite@5.2.4)(vue@3.4.21):
/@vitejs/plugin-vue@5.0.4(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0
vue: ^3.2.25
dependencies:
vite: 5.2.4(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vue: 3.4.21(typescript@5.4.3)
dev: true
@ -4822,7 +4818,7 @@ packages:
resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==}
dependencies:
'@babel/parser': 7.23.9
postcss: 8.4.35
postcss: 8.4.38
source-map: 0.6.1
dev: true
@ -5068,8 +5064,8 @@ packages:
hasBin: true
dev: true
/adm-zip@0.5.12:
resolution: {integrity: sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==}
/adm-zip@0.5.10:
resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==}
engines: {node: '>=6.0'}
dev: false
@ -5658,8 +5654,8 @@ packages:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
/aws-sdk@2.1584.0:
resolution: {integrity: sha512-57Qizb+bLOhrBLWQSWw6WXTtbO/lFKzLouHxTfm/QeXm38gs0Q0knFxhdH+sWc/DPPJYSRGy7MNiuQcmsq5zxA==}
/aws-sdk@2.1585.0:
resolution: {integrity: sha512-zDJ76hivdnBLH2+hXTO0F5y3Sdx5RRSDCf4EqZILZCUkPLTwaVmKmaU6XO3pyhrMTcWk58m7UBgHFyARE5SCkQ==}
engines: {node: '>= 10.0.0'}
requiresBuild: true
dependencies:
@ -6272,8 +6268,8 @@ packages:
dev: false
optional: true
/cbor-x@1.5.8:
resolution: {integrity: sha512-gc3bHBsvG6GClCY6c0/iip+ghlqizkVp+TtaL927lwvP4VP9xBdi1HmqPR5uj/Mj/0TOlngMkIYa25wKg+VNrQ==}
/cbor-x@1.5.9:
resolution: {integrity: sha512-OEI5rEu3MeR0WWNUXuIGkxmbXVhABP+VtgAXzm48c9ulkrsvxshjjk94XSOGphyAKeNGLPfAxxzEtgQ6rEVpYQ==}
optionalDependencies:
cbor-extract: 2.2.0
dev: false
@ -7581,6 +7577,7 @@ packages:
/detect-libc@2.0.2:
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
engines: {node: '>=8'}
dev: true
/detect-libc@2.0.3:
resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
@ -10087,8 +10084,8 @@ packages:
engines: {node: '>=0.8.0'}
dev: true
/happy-dom@14.3.1:
resolution: {integrity: sha512-uv2mE7jUH0S3cTnDPqNQj+J+Z5wOevqzopc7e8URXtcCH2STubCjPFVyEJ1ONGSv/aL/uvNwo5WWjsinpWpADQ==}
/happy-dom@14.3.8:
resolution: {integrity: sha512-jP7p/VQJ08lbIoCsw1Adna3RA86eE+2CNkqvJRWIhrKP7XKZ0e0s2TJSt5lwGS4b7x0z0Ztw0A9P4uQGMHPiiA==}
engines: {node: '>=16.0.0'}
dependencies:
entities: 4.5.0
@ -11272,7 +11269,7 @@ packages:
pretty-format: 29.7.0
slash: 3.0.0
strip-json-comments: 3.1.1
ts-node: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.3)
ts-node: 10.9.2(@swc/core@1.4.11)(@types/node@20.11.30)(typescript@5.4.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@ -11867,8 +11864,8 @@ packages:
safe-buffer: 5.2.1
dev: false
/katex@0.16.9:
resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==}
/katex@0.16.10:
resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==}
hasBin: true
dependencies:
commander: 8.3.0
@ -13077,7 +13074,7 @@ packages:
hasBin: true
requiresBuild: true
dependencies:
detect-libc: 2.0.2
detect-libc: 2.0.3
dev: false
optional: true
@ -16027,15 +16024,15 @@ packages:
whet.extend: 0.9.9
dev: false
/swc-loader@0.2.6(@swc/core@1.4.8)(webpack@5.91.0):
/swc-loader@0.2.6(@swc/core@1.4.11)(webpack@5.91.0):
resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==}
peerDependencies:
'@swc/core': ^1.2.147
webpack: '>=2'
dependencies:
'@swc/core': 1.4.8
'@swc/core': 1.4.11
'@swc/counter': 0.1.3
webpack: 5.91.0(@swc/core@1.4.8)
webpack: 5.91.0(@swc/core@1.4.11)
dev: true
/swiper@11.0.7:
@ -16122,7 +16119,7 @@ packages:
engines: {node: '>=14.16'}
dev: true
/terser-webpack-plugin@5.3.10(@swc/core@1.4.8)(webpack@5.91.0):
/terser-webpack-plugin@5.3.10(@swc/core@1.4.11)(webpack@5.91.0):
resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
engines: {node: '>= 10.13.0'}
peerDependencies:
@ -16139,12 +16136,12 @@ packages:
optional: true
dependencies:
'@jridgewell/trace-mapping': 0.3.20
'@swc/core': 1.4.8
'@swc/core': 1.4.11
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.1
terser: 5.27.0
webpack: 5.91.0(@swc/core@1.4.8)
webpack: 5.91.0(@swc/core@1.4.11)
dev: true
/terser@5.19.2:
@ -16466,10 +16463,10 @@ packages:
semver: 7.6.0
source-map: 0.7.4
typescript: 5.4.3
webpack: 5.91.0(@swc/core@1.4.8)
webpack: 5.91.0(@swc/core@1.4.11)
dev: true
/ts-node@10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.3):
/ts-node@10.9.2(@swc/core@1.4.11)(@types/node@20.11.30)(typescript@5.4.3):
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
peerDependencies:
@ -16484,7 +16481,7 @@ packages:
optional: true
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@swc/core': 1.4.8
'@swc/core': 1.4.11
'@tsconfig/node10': 1.0.9
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
@ -16772,7 +16769,7 @@ packages:
pg: 8.11.3
reflect-metadata: 0.2.1
sha.js: 2.4.11
ts-node: 10.9.2(@swc/core@1.4.8)(@types/node@20.11.30)(typescript@5.4.3)
ts-node: 10.9.2(@swc/core@1.4.11)(@types/node@20.11.30)(typescript@5.4.3)
tslib: 2.6.1
uuid: 9.0.1
yargs: 17.7.2
@ -17116,7 +17113,7 @@ packages:
replace-ext: 1.0.1
dev: false
/vite-plugin-compression@0.5.1(vite@5.2.4):
/vite-plugin-compression@0.5.1(vite@5.2.6):
resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
peerDependencies:
vite: '>=2.0.0'
@ -17124,13 +17121,13 @@ packages:
chalk: 4.1.2
debug: 4.3.4(supports-color@8.1.1)
fs-extra: 10.1.0
vite: 5.2.4(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
transitivePeerDependencies:
- supports-color
dev: true
/vite@5.2.4(@types/node@20.11.30)(sass@1.72.0):
resolution: {integrity: sha512-vjFghvHWidBTinu5TCymJk/lRHlR5ljqB83yugr0HA1xspUPdOZHqbqDLnZ8f9/jINrtFHTCYYyIUi+o+Q5iyg==}
/vite@5.2.6(@types/node@20.11.30)(sass@1.72.0):
resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@ -17340,7 +17337,7 @@ packages:
engines: {node: '>=10.13.0'}
dev: true
/webpack@5.91.0(@swc/core@1.4.8):
/webpack@5.91.0(@swc/core@1.4.11):
resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==}
engines: {node: '>=10.13.0'}
hasBin: true
@ -17371,7 +17368,7 @@ packages:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.10(@swc/core@1.4.8)(webpack@5.91.0)
terser-webpack-plugin: 5.3.10(@swc/core@1.4.11)(webpack@5.91.0)
watchpack: 2.4.1
webpack-sources: 3.2.3
transitivePeerDependencies: