Merge branch 'develop' into fix-dev-enviroment

This commit is contained in:
kartonrad 2023-05-31 12:05:15 +00:00
commit d1efcd1247
34 changed files with 501 additions and 876 deletions

View file

@ -1 +1 @@
v16.15.0
v18.16.0

View file

@ -76,10 +76,10 @@ If you have access to a server that supports one of the sources below, I recomme
## 🧑‍💻 Dependencies
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.12.1 (v19 recommended)
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.16.0 (v20 recommended)
- Install with [nvm](https://github.com/nvm-sh/nvm)
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommend)
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12 (v14 recommended)
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommended)
- Web Proxy (one of the following)
- 🍀 Nginx (recommended)
- 🦦 Caddy
@ -104,7 +104,7 @@ If you have access to a server that supports one of the sources below, I recomme
## 👀 Get folder ready
```sh
git clone --depth 1 https://codeberg.org/calckey/calckey.git
git clone https://codeberg.org/calckey/calckey.git
cd calckey/
```

View file

@ -1802,8 +1802,8 @@ pushNotificationNotSupported: El vostre navegador o servidor no admet notificaci
push
license: Llicència
indexPosts: Índex de notes
indexFrom: Índex a partir de l'ID de Publicacions (deixeu en blanc per indexar cada
publicació)
indexFrom: Índex a partir de l'ID de Publicacions
indexFromDescription: Deixeu en blanc per indexar cada publicació
indexNotice: Ara indexant. Això probablement trigarà una estona, si us plau, no reinicieu
el servidor durant almenys una hora.
_instanceTicker:

View file

@ -83,6 +83,7 @@ exportRequested: "You've requested an export. This may take a while. It will be
\ to your Drive once completed."
importRequested: "You've requested an import. This may take a while."
lists: "Lists"
listsDesc: "Lists let you create timelines with specified users. They can be accessed from the timelines page."
noLists: "You don't have any lists"
note: "Post"
notes: "Posts"
@ -405,6 +406,7 @@ avoidMultiCaptchaConfirm: "Using multiple Captcha systems may cause interference
\ them. Would you like to disable the other Captcha systems currently active? If\
\ you would like them to stay enabled, press cancel."
antennas: "Antennas"
antennasDesc: "Antennas display new posts matching the criteria you set!\n They can be accessed from the timelines page."
manageAntennas: "Manage Antennas"
name: "Name"
antennaSource: "Antenna source"
@ -686,6 +688,7 @@ logs: "Logs"
delayed: "Delayed"
database: "Database"
channel: "Channels"
channelFederationWarn: "Channels do not yet federate to other servers"
create: "Create"
notificationSetting: "Notification settings"
notificationSettingDesc: "Select the types of notification to display."
@ -771,6 +774,7 @@ pageLikedCount: "Number of received Page likes"
contact: "Contact"
useSystemFont: "Use the system's default font"
clips: "Clips"
clipsDesc: "Clips are like share-able categorized bookmarks. You can create clips from the menu of individual posts."
experimentalFeatures: "Experimental features"
developer: "Developer"
makeExplorable: "Make account visible in \"Explore\""
@ -1065,7 +1069,8 @@ migrationConfirm: "Are you absolutely sure you want to migrate your account to {
defaultReaction: "Default emoji reaction for outgoing and incoming posts"
license: "License"
indexPosts: "Index Posts"
indexFrom: "Index from Post ID onwards (leave blank to index every post)"
indexFrom: "Index from Post ID onwards"
indexFromDescription: "Leave blank to index every post"
indexNotice: "Now indexing. This will probably take a while, please don't restart\
\ your server for at least an hour."
customKaTeXMacro: "Custom KaTeX macros"
@ -1446,7 +1451,7 @@ _tutorial:
\ you follow."
step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this server."
step5_5: "The Social {icon} timeline is a combination of the Home and Local timelines."
step5_6: "The Recommended {icon} timeline is where you can see posts from server\
step5_6: "The Recommended {icon} timeline is where you can see posts from servers\
\ the admins recommend."
step5_7: "The Global {icon} timeline is where you can see posts from every other\
\ connected server."

View file

@ -966,7 +966,8 @@ migrationConfirm: "本当にこのアカウントを {account} に引っ越し
defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション"
license: "ライセンス"
indexPosts: "投稿をインデックス"
indexFrom: "この投稿ID以降をインデックスする空白で全ての投稿を指定します"
indexFrom: "この投稿ID以降をインデックスする"
indexFromDescription: "空白で全ての投稿を指定します"
indexNotice: "インデックスを開始しました。完了まで時間がかかる場合があるため、少なくとも1時間はサーバーを再起動しないでください。"
customKaTeXMacro: "カスタムKaTeXマクロ"
customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\\

View file

@ -1898,7 +1898,8 @@ sendPushNotificationReadMessageCaption: Powiadomienie zawierające tekst "{empty
defaultReaction: Domyślna reakcja emoji dla wychodzących i przychodzących wpisów
license: Licencja
indexPosts: Indeksuj wpisy
indexFrom: Indeksuj wpisy od ID (zostaw puste dla indeksowania wszystkich wpisów)
indexFrom: Indeksuj wpisy od ID
indexFromDescription: Zostaw puste dla indeksowania wszystkich wpisów
indexNotice: Indeksuję. Zapewne zajmie to chwilę, nie restartuj serwera przez co najmniej
godzinę.
customKaTeXMacro: Niestandardowe makra KaTeX

View file

@ -1909,8 +1909,8 @@ recommendedInstances: Рекомендованные инстансы
defaultReaction: Эмодзи реакция по умолчанию для выходящих и исходящих постов
license: Лицензия
indexPosts: Индексировать посты
indexFrom: Индексировать начиная с идентификатора поста и далее (оставьте пустым для
индексации каждого поста)
indexFrom: Индексировать начиная с идентификатора поста и далее
indexFromDescription: оставьте пустым для индексации каждого поста
indexNotice: Теперь индексирование. Вероятно, это займет некоторое время, пожалуйста,
не перезагружайте свой сервер по крайней мере в течение часа.
customKaTeXMacro: Кастомные KaTex макросы

View file

@ -1,6 +1,6 @@
{
"name": "calckey",
"version": "14.0.0-dev32",
"version": "14.0.0-dev35",
"codename": "aqua",
"repository": {
"type": "git",
@ -36,8 +36,8 @@
"chokidar": "^3.3.1"
},
"dependencies": {
"@bull-board/api": "^4.10.2",
"@bull-board/ui": "^4.10.2",
"@bull-board/api": "5.2.0",
"@bull-board/ui": "5.2.0",
"@napi-rs/cli": "^2.15.0",
"@tensorflow/tfjs": "^3.21.0",
"focus-trap": "^7.2.0",

View file

@ -23,9 +23,9 @@
"@tensorflow/tfjs-node": "3.21.1"
},
"dependencies": {
"@bull-board/api": "^4.6.4",
"@bull-board/koa": "^4.6.4",
"@bull-board/ui": "^4.6.4",
"@bull-board/api": "5.2.0",
"@bull-board/koa": "5.2.0",
"@bull-board/ui": "5.2.0",
"@calckey/megalodon": "5.2.0",
"@discordapp/twemoji": "14.0.2",
"@elastic/elasticsearch": "7.17.0",
@ -68,7 +68,7 @@
"fluent-ffmpeg": "2.1.2",
"got": "12.5.3",
"hpagent": "0.1.2",
"ioredis": "5.2.4",
"ioredis": "5.3.2",
"ip-cidr": "3.0.11",
"is-svg": "4.3.2",
"js-yaml": "4.1.0",

View file

@ -1,21 +1,48 @@
<template>
<div class="fpezltsf" :class="{ warn }">
<div v-if="visible" class="info" :class="{ warn, card }">
<i v-if="warn" class="ph-warning ph-bold ph-lg"></i>
<i v-else class="ph-info ph-bold ph-lg"></i>
<i
v-else
class="ph-bold ph-lg"
:class="icon ? `ph-${icon}` : 'ph-info'"
></i>
<slot></slot>
<button
v-if="closeable"
v-tooltip="i18n.ts.close"
class="_button close"
@click.stop="close"
>
<i class="ph-x ph-bold ph-lg"></i>
</button>
</div>
</template>
<script lang="ts" setup>
import {} from "vue";
import { ref } from "vue";
import { i18n } from "@/i18n";
const visible = ref(true);
defineProps<{
icon?: string;
warn?: boolean;
card?: boolean;
closeable?: boolean;
}>();
const emit = defineEmits<{
(ev: "close"): void;
}>();
function close() {
visible.value = false;
emit("close");
}
</script>
<style lang="scss" scoped>
.fpezltsf {
.info {
padding: 16px;
font-size: 90%;
background: var(--infoBg);
@ -27,8 +54,34 @@ defineProps<{
color: var(--infoWarnFg);
}
&.card {
background: var(--panel);
color: var(--fg);
padding: 48px;
font-size: 1em;
text-align: center;
> i {
display: block;
font-size: 4em;
margin: 0;
}
> :deep(*) {
margin-inline: auto;
}
> :deep(:not(:last-child)) {
margin-bottom: 20px;
}
> :deep(p) {
max-width: 30em;
}
}
> i {
margin-right: 4px;
}
> .close {
margin-left: auto;
float: right;
}
}
</style>

View file

@ -17,7 +17,7 @@
</slot>
</div>
<div v-else ref="rootEl">
<div v-else ref="rootEl" class="list">
<div
v-show="pagination.reversed && more"
key="_more_"
@ -487,4 +487,11 @@ defineExpose({
margin-right: auto;
}
}
.list > :deep(._button) {
margin-inline: auto;
margin-bottom: 16px;
&:last-of-type:not(:first-child) {
margin-top: 16px;
}
}
</style>

View file

@ -1030,6 +1030,8 @@ onMounted(() => {
}
> header {
display: flex;
flex-wrap: wrap;
z-index: 1000;
height: 66px;

View file

@ -1,4 +1,14 @@
<template>
<MkInfo
v-if="tlHint && !tlHintClosed"
:closeable="true"
class="_gap"
@close="closeHint"
>
<I18n :src="tlHint">
<template #icon></template>
</I18n>
</MkInfo>
<XNotes
ref="tlComponent"
:no-gap="!$store.state.showGapBetweenNotesInTimeline"
@ -10,10 +20,13 @@
<script lang="ts" setup>
import { ref, computed, provide, onUnmounted } from "vue";
import XNotes from "@/components/MkNotes.vue";
import MkInfo from "@/components/MkInfo.vue";
import * as os from "@/os";
import { stream } from "@/stream";
import * as sound from "@/scripts/sound";
import { $i } from "@/account";
import { i18n } from "@/i18n";
import { defaultStore } from "@/store";
const props = defineProps<{
src: string;
@ -64,6 +77,9 @@ let query;
let connection;
let connection2;
let tlHint;
let tlHintClosed;
if (props.src === "antenna") {
endpoint = "antennas/notes";
query = {
@ -81,22 +97,37 @@ if (props.src === "antenna") {
connection2 = stream.useChannel("main");
connection2.on("follow", onChangeFollowing);
connection2.on("unfollow", onChangeFollowing);
tlHint = i18n.ts._tutorial.step5_3;
tlHintClosed = defaultStore.state.tlHomeHintClosed;
} else if (props.src === "local") {
endpoint = "notes/local-timeline";
connection = stream.useChannel("localTimeline");
connection.on("note", prepend);
tlHint = i18n.ts._tutorial.step5_4;
tlHintClosed = defaultStore.state.tlLocalHintClosed;
} else if (props.src === "recommended") {
endpoint = "notes/recommended-timeline";
connection = stream.useChannel("recommendedTimeline");
connection.on("note", prepend);
tlHint = i18n.ts._tutorial.step5_6;
tlHintClosed = defaultStore.state.tlRecommendedHintClosed;
} else if (props.src === "social") {
endpoint = "notes/hybrid-timeline";
connection = stream.useChannel("hybridTimeline");
connection.on("note", prepend);
tlHint = i18n.ts._tutorial.step5_5;
tlHintClosed = defaultStore.state.tlSocialHintClosed;
} else if (props.src === "global") {
endpoint = "notes/global-timeline";
connection = stream.useChannel("globalTimeline");
connection.on("note", prepend);
tlHint = i18n.ts._tutorial.step5_7;
tlHintClosed = defaultStore.state.tlGlobalHintClosed;
} else if (props.src === "mentions") {
endpoint = "notes/mentions";
connection = stream.useChannel("main");
@ -135,6 +166,26 @@ if (props.src === "antenna") {
connection.on("note", prepend);
}
function closeHint() {
switch (props.src) {
case "home":
defaultStore.set("tlHomeHintClosed", true);
break;
case "local":
defaultStore.set("tlLocalHintClosed", true);
break;
case "recommended":
defaultStore.set("tlRecommendedHintClosed", true);
break;
case "social":
defaultStore.set("tlSocialHintClosed", true);
break;
case "global":
defaultStore.set("tlGlobalHintClosed", true);
break;
}
}
const pagination = {
endpoint: endpoint,
limit: 10,

View file

@ -227,7 +227,7 @@ onUnmounted(() => {
.mk-url-preview {
> .expand-tweet {
margin-top: 1rem;
margin-top: 0.5rem;
}
&.max-width_400px {

View file

@ -1,554 +0,0 @@
<template>
<div class="_debobigegoItem">
<div class="_debobigegoLabel">
<i class="ph-microchip ph-bold ph-lg"></i>
{{ i18n.ts.cpuAndMemory }}
</div>
<div class="_debobigegoPanel xhexznfu">
<div>
<canvas :ref="cpumem"></canvas>
</div>
<div v-if="serverInfo">
<div class="_table">
<div class="_row">
<div class="_cell">
<div class="_label">MEM total</div>
{{ bytes(serverInfo.mem.total) }}
</div>
<div class="_cell">
<div class="_label">MEM used</div>
{{ bytes(memUsage) }} ({{
(
(memUsage / serverInfo.mem.total) *
100
).toFixed(0)
}}%)
</div>
<div class="_cell">
<div class="_label">MEM free</div>
{{ bytes(serverInfo.mem.total - memUsage) }} ({{
(
((serverInfo.mem.total - memUsage) /
serverInfo.mem.total) *
100
).toFixed(0)
}}%)
</div>
</div>
</div>
</div>
</div>
</div>
<div class="_debobigegoItem">
<div class="_debobigegoLabel">
<i class="ph-hard-drives ph-bold ph-lg"></i> {{ i18n.ts.disk }}
</div>
<div class="_debobigegoPanel xhexznfu">
<div>
<canvas :ref="disk"></canvas>
</div>
<div v-if="serverInfo">
<div class="_table">
<div class="_row">
<div class="_cell">
<div class="_label">Disk total</div>
{{ bytes(serverInfo.fs.total) }}
</div>
<div class="_cell">
<div class="_label">Disk used</div>
{{ bytes(serverInfo.fs.used) }} ({{
(
(serverInfo.fs.used / serverInfo.fs.total) *
100
).toFixed(0)
}}%)
</div>
<div class="_cell">
<div class="_label">Disk free</div>
{{
bytes(serverInfo.fs.total - serverInfo.fs.used)
}}
({{
(
((serverInfo.fs.total -
serverInfo.fs.used) /
serverInfo.fs.total) *
100
).toFixed(0)
}}%)
</div>
</div>
</div>
</div>
</div>
</div>
<div class="_debobigegoItem">
<div class="_debobigegoLabel">
<i class="ph-swap ph-bold ph-lg"></i> {{ i18n.ts.network }}
</div>
<div class="_debobigegoPanel xhexznfu">
<div>
<canvas :ref="net"></canvas>
</div>
<div v-if="serverInfo">
<div class="_table">
<div class="_row">
<div class="_cell">
<div class="_label">Interface</div>
{{ serverInfo.net.interface }}
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, markRaw } from "vue";
import {
Chart,
ArcElement,
LineElement,
BarElement,
PointElement,
BarController,
LineController,
CategoryScale,
LinearScale,
Legend,
Title,
Tooltip,
SubTitle,
} from "chart.js";
import MkwFederation from "../../widgets/federation.vue";
import MkButton from "@/components/MkButton.vue";
import MkSelect from "@/components/form/select.vue";
import MkInput from "@/components/form/input.vue";
import MkContainer from "@/components/MkContainer.vue";
import MkFolder from "@/components/MkFolder.vue";
import { version, url } from "@/config";
import bytes from "@/filters/bytes";
import number from "@/filters/number";
import { i18n } from "@/i18n";
Chart.register(
ArcElement,
LineElement,
BarElement,
PointElement,
BarController,
LineController,
CategoryScale,
LinearScale,
Legend,
Title,
Tooltip,
SubTitle
);
const alpha = (hex, a) => {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!;
const r = parseInt(result[1], 16);
const g = parseInt(result[2], 16);
const b = parseInt(result[3], 16);
return `rgba(${r}, ${g}, ${b}, ${a})`;
};
import * as os from "@/os";
import { stream } from "@/stream";
export default defineComponent({
components: {
MkButton,
MkSelect,
MkInput,
MkContainer,
MkFolder,
MkwFederation,
},
data() {
return {
version,
url,
stats: null,
serverInfo: null,
connection: null,
queueConnection: markRaw(stream.useChannel("queueStats")),
memUsage: 0,
chartCpuMem: null,
chartNet: null,
jobs: [],
logs: [],
logLevel: "all",
logDomain: "",
modLogs: [],
dbInfo: null,
overviewHeight: "1fr",
queueHeight: "1fr",
paused: false,
i18n,
};
},
computed: {
gridColor() {
// TODO: var(--panel)
return this.$store.state.darkMode
? "rgba(255, 255, 255, 0.1)"
: "rgba(0, 0, 0, 0.1)";
},
},
mounted() {
this.fetchJobs();
Chart.defaults.color = getComputedStyle(
document.documentElement
).getPropertyValue("--fg");
os.api("admin/server-info", {}).then((res) => {
this.serverInfo = res;
this.connection = markRaw(stream.useChannel("serverStats"));
this.connection.on("stats", this.onStats);
this.connection.on("statsLog", this.onStatsLog);
this.connection.send("requestLog", {
id: Math.random().toString().substr(2, 8),
length: 150,
});
this.$nextTick(() => {
this.queueConnection.send("requestLog", {
id: Math.random().toString().substr(2, 8),
length: 200,
});
});
});
},
beforeUnmount() {
if (this.connection) {
this.connection.off("stats", this.onStats);
this.connection.off("statsLog", this.onStatsLog);
this.connection.dispose();
}
this.queueConnection.dispose();
},
methods: {
cpumem(el) {
if (this.chartCpuMem != null) return;
this.chartCpuMem = markRaw(
new Chart(el, {
type: "line",
data: {
labels: [],
datasets: [
{
label: "CPU",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#31748f",
backgroundColor: alpha("#31748f", 0.1),
data: [],
},
{
label: "MEM (active)",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#c4a7e7",
backgroundColor: alpha("#c4a7e7", 0.02),
data: [],
},
{
label: "MEM (used)",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#ebbcba",
borderDash: [5, 5],
fill: false,
data: [],
},
],
},
options: {
aspectRatio: 3,
layout: {
padding: {
left: 16,
right: 16,
top: 16,
bottom: 0,
},
},
legend: {
position: "bottom",
labels: {
boxWidth: 16,
},
},
scales: {
x: {
gridLines: {
display: false,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
},
},
y: {
position: "right",
gridLines: {
display: true,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
max: 100,
},
},
},
tooltips: {
intersect: false,
mode: "index",
},
},
})
);
},
net(el) {
if (this.chartNet != null) return;
this.chartNet = markRaw(
new Chart(el, {
type: "line",
data: {
labels: [],
datasets: [
{
label: "In",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#94a029",
backgroundColor: alpha("#94a029", 0.1),
data: [],
},
{
label: "Out",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#ff9156",
backgroundColor: alpha("#ff9156", 0.1),
data: [],
},
],
},
options: {
aspectRatio: 3,
layout: {
padding: {
left: 16,
right: 16,
top: 16,
bottom: 0,
},
},
legend: {
position: "bottom",
labels: {
boxWidth: 16,
},
},
scales: {
x: {
gridLines: {
display: false,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
},
},
y: {
position: "right",
gridLines: {
display: true,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
},
},
},
tooltips: {
intersect: false,
mode: "index",
},
},
})
);
},
disk(el) {
if (this.chartDisk != null) return;
this.chartDisk = markRaw(
new Chart(el, {
type: "line",
data: {
labels: [],
datasets: [
{
label: "Read",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#94a029",
backgroundColor: alpha("#94a029", 0.1),
data: [],
},
{
label: "Write",
pointRadius: 0,
tension: 0,
borderWidth: 2,
borderColor: "#ff9156",
backgroundColor: alpha("#ff9156", 0.1),
data: [],
},
],
},
options: {
aspectRatio: 3,
layout: {
padding: {
left: 16,
right: 16,
top: 16,
bottom: 0,
},
},
legend: {
position: "bottom",
labels: {
boxWidth: 16,
},
},
scales: {
x: {
gridLines: {
display: false,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
},
},
y: {
position: "right",
gridLines: {
display: true,
color: this.gridColor,
zeroLineColor: this.gridColor,
},
ticks: {
display: false,
},
},
},
tooltips: {
intersect: false,
mode: "index",
},
},
})
);
},
fetchJobs() {
os.api("admin/queue/deliver-delayed", {}).then((jobs) => {
this.jobs = jobs;
});
},
onStats(stats) {
if (this.paused) return;
const cpu = (stats.cpu * 100).toFixed(0);
const memActive = (
(stats.mem.active / this.serverInfo.mem.total) *
100
).toFixed(0);
const memUsed = (
(stats.mem.used / this.serverInfo.mem.total) *
100
).toFixed(0);
this.memUsage = stats.mem.active;
this.chartCpuMem.data.labels.push("");
this.chartCpuMem.data.datasets[0].data.push(cpu);
this.chartCpuMem.data.datasets[1].data.push(memActive);
this.chartCpuMem.data.datasets[2].data.push(memUsed);
this.chartNet.data.labels.push("");
this.chartNet.data.datasets[0].data.push(stats.net.rx);
this.chartNet.data.datasets[1].data.push(stats.net.tx);
this.chartDisk.data.labels.push("");
this.chartDisk.data.datasets[0].data.push(stats.fs.r);
this.chartDisk.data.datasets[1].data.push(stats.fs.w);
if (this.chartCpuMem.data.datasets[0].data.length > 150) {
this.chartCpuMem.data.labels.shift();
this.chartCpuMem.data.datasets[0].data.shift();
this.chartCpuMem.data.datasets[1].data.shift();
this.chartCpuMem.data.datasets[2].data.shift();
this.chartNet.data.labels.shift();
this.chartNet.data.datasets[0].data.shift();
this.chartNet.data.datasets[1].data.shift();
this.chartDisk.data.labels.shift();
this.chartDisk.data.datasets[0].data.shift();
this.chartDisk.data.datasets[1].data.shift();
}
this.chartCpuMem.update();
this.chartNet.update();
this.chartDisk.update();
},
onStatsLog(statsLog) {
for (const stats of [...statsLog].reverse()) {
this.onStats(stats);
}
},
bytes,
number,
pause() {
this.paused = true;
},
resume() {
this.paused = false;
},
},
});
</script>
<style lang="scss" scoped>
.xhexznfu {
> div:nth-child(2) {
padding: 16px;
border-top: solid 0.5px var(--divider);
}
}
</style>

View file

@ -0,0 +1,145 @@
<template>
<div class="_panel" :class="$style.root">
<div class="ntjkdlsfk">
<div class="_panel">
<XPie class="pie" :value="cpuUsage" />
<div>
<p><i class="ph-cpu ph-bold ph-lg"></i>CPU</p>
<p>{{ meta.cpu.cores }} Logical cores</p>
<p>{{ meta.cpu.model }}</p>
</div>
</div>
<div class="_panel">
<XPie class="pie" :value="memUsage" />
<div>
<p><i class="ph-microchip ph-bold ph-lg"></i>RAM</p>
<p>Total: {{ bytes(memTotal, 1) }}</p>
<p>Used: {{ bytes(memUsed, 1) }}</p>
<p>Free: {{ bytes(memFree, 1) }}</p>
</div>
</div>
<div class="_panel">
<XPie class="pie" :value="diskUsage" />
<div>
<p><i class="ph-hard-drives ph-bold ph-lg"></i>Disk</p>
<p>Total: {{ bytes(diskTotal, 1) }}</p>
<p>Free: {{ bytes(diskAvailable, 1) }}</p>
<p>Used: {{ bytes(diskUsed, 1) }}</p>
</div>
</div>
<div class="_panel">
<XPie class="pie" :value="meiliProgress" />
<div>
<p>
<i class="ph-file-search ph-bold ph-lg"></i>MeiliSearch
</p>
<p>
{{ i18n.ts._widgets.meiliStatus }}: {{ meiliAvailable }}
</p>
<p>
{{ i18n.ts._widgets.meiliSize }}:
{{ bytes(meiliTotalSize, 1) }}
</p>
<p>
{{ i18n.ts._widgets.meiliIndexCount }}:
{{ meiliIndexCount }}
</p>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { onMounted, onUnmounted } from "vue";
import XPie from "../../widgets/server-metric/pie.vue";
import bytes from "@/filters/bytes";
import { stream } from "@/stream";
import * as os from "@/os";
import { i18n } from "@/i18n";
const meta = await os.api("server-info", {});
const serverStats = await os.api("stats");
let cpuUsage: number = $ref(0);
let memUsage: number = $ref(0);
let memTotal: number = $ref(0);
let memUsed: number = $ref(0);
let memFree: number = $ref(0);
let meiliProgress: number = $ref(0);
let meiliTotalSize: number = $ref(0);
let meiliIndexCount: number = $ref(0);
let meiliAvailable: string = $ref("unavailable");
const diskUsage = $computed(() => meta.fs.used / meta.fs.total);
const diskTotal = $computed(() => meta.fs.total);
const diskUsed = $computed(() => meta.fs.used);
const diskAvailable = $computed(() => meta.fs.total - meta.fs.used);
function onStats(stats) {
cpuUsage = stats.cpu;
memUsage = stats.mem.active / meta.mem.total;
memTotal = meta.mem.total;
memUsed = stats.mem.active;
memFree = memTotal - memUsed;
meiliTotalSize = stats.meilisearch.size;
meiliIndexCount = stats.meilisearch.indexed_count;
meiliAvailable = stats.meilisearch.health;
meiliProgress = meiliIndexCount / serverStats.notesCount;
}
const connection = stream.useChannel("serverStats");
onMounted(() => {
connection.on("stats", onStats);
connection.dispose();
});
onUnmounted(() => {
connection.off("stats", onStats);
connection.dispose();
});
</script>
<style lang="scss" module>
.root {
padding: 20px;
}
.ntjkdlsfk {
display: flex;
padding: 16px;
> ._panel {
> .pie {
height: 82px;
flex-shrink: 0;
margin-right: 16px;
}
> div {
flex: 1;
> p {
margin: 0;
font-size: 0.8em;
&:first-child {
font-weight: bold;
margin-bottom: 4px;
> i {
margin-right: 4px;
}
}
}
}
}
}
</style>

View file

@ -50,6 +50,11 @@
<template #header>Inbox queue</template>
<XQueue domain="inbox" />
</MkFolder>
<MkFolder class="item">
<template #header>Server metrics</template>
<XMetrics domain="inbox" />
</MkFolder>
</div>
</MkSpacer>
</template>
@ -71,6 +76,7 @@ import XActiveUsers from "./overview.active-users.vue";
import XStats from "./overview.stats.vue";
import XModerators from "./overview.moderators.vue";
import XHeatmap from "./overview.heatmap.vue";
import XMetrics from "./overview.metrics.vue";
import MkTagCloud from "@/components/MkTagCloud.vue";
import { version, url } from "@/config";
import * as os from "@/os";

View file

@ -7,6 +7,9 @@
:tabs="headerTabs"
/></template>
<MkSpacer :content-max="700">
<MkInfo class="_gap" :warn="true">{{
i18n.ts.channelFederationWarn
}}</MkInfo>
<swiper
:round-lengths="true"
:touch-angle="25"
@ -119,6 +122,7 @@ import MkInput from "@/components/form/input.vue";
import MkRadios from "@/components/form/radios.vue";
import MkButton from "@/components/MkButton.vue";
import MkFolder from "@/components/MkFolder.vue";
import MkInfo from "@/components/MkInfo.vue";
import { useRouter } from "@/router";
import { definePageMetadata } from "@/scripts/page-metadata";
import { deviceKind } from "@/scripts/device-kind";

View file

@ -1,7 +1,9 @@
<template>
<div class="geegznzt">
<XAntenna :antenna="draft" @created="onAntennaCreated" />
</div>
<MkSpacer :content-max="700">
<div class="geegznzt">
<XAntenna :antenna="draft" @created="onAntennaCreated" />
</div>
</MkSpacer>
</template>
<script lang="ts" setup>

View file

@ -8,43 +8,45 @@
/></template>
<MkSpacer :content-max="700">
<div class="ieepwinx">
<MkButton
:link="true"
to="/my/antennas/create"
primary
class="add"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts.add }}</MkButton
>
<div class="">
<MkPagination
v-slot="{ items }"
ref="list"
:pagination="pagination"
<MkInfo class="_gap" :icon="'flying-saucer'" :card="true">
<p>{{ i18n.ts.antennasDesc }}</p>
<MkButton
:link="true"
to="/my/antennas/create"
primary
class="add"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts.add }}</MkButton
>
<div v-for="antenna in items" :key="antenna.id">
<MkA
class="uopelskx"
:link="true"
:to="`/timeline/antenna/${antenna.id}`"
>
<i class="ph-flying-saucer ph-bold ph-lg"></i
><i
:class="`${
antenna.hasUnreadNote
? 'ph-circle ph-fill'
: 'ph-check'
} ph-xs notify-icon`"
></i>
</MkA>
<MkA
class="ljoevbzj"
:to="`/my/antennas/${antenna.id}`"
>
<div class="name">{{ antenna.name }}</div>
</MkA>
</div>
</MkInfo>
<div class="">
<MkPagination ref="list" :pagination="pagination">
<template #default="{ items }">
<div v-for="antenna in items" :key="antenna.id">
<MkA
class="uopelskx"
:link="true"
:to="`/timeline/antenna/${antenna.id}`"
>
<i
class="ph-flying-saucer ph-bold ph-lg"
></i
><i
:class="`${
antenna.hasUnreadNote
? 'ph-circle ph-fill'
: 'ph-check'
} ph-xs notify-icon`"
></i>
</MkA>
<MkA
class="ljoevbzj"
:to="`/my/antennas/${antenna.id}`"
>
<div class="name">{{ antenna.name }}</div>
</MkA>
</div>
</template>
</MkPagination>
</div>
</div>
@ -56,6 +58,7 @@
import { onActivated, onDeactivated, ref } from "vue";
import MkPagination from "@/components/MkPagination.vue";
import MkButton from "@/components/MkButton.vue";
import MkInfo from "@/components/MkInfo.vue";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
@ -101,10 +104,6 @@ definePageMetadata({
<style lang="scss" scoped>
.ieepwinx {
> .add {
margin: 0 auto 16px auto;
}
.uopelskx {
float: left;
min-width: 25px;

View file

@ -8,28 +8,29 @@
/></template>
<MkSpacer :content-max="700">
<div class="qtcaoidl">
<MkButton primary class="add" @click="create"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts.add }}</MkButton
>
<MkPagination
v-slot="{ items }"
ref="pagingComponent"
:pagination="pagination"
class="list"
>
<MkA
v-for="item in items"
:key="item.id"
:to="`/clips/${item.id}`"
class="item _panel _gap"
>
<b>{{ item.name }}</b>
<div v-if="item.description" class="description">
{{ item.description }}
</div>
</MkA>
<template #empty>
<MkInfo :icon="'paperclip'" :card="true">
<p>{{ i18n.ts.clipsDesc }}</p>
</MkInfo>
</template>
<template #default="{ items }">
<MkA
v-for="item in items"
:key="item.id"
:to="`/clips/${item.id}`"
class="item _panel _gap"
>
<b>{{ item.name }}</b>
<div v-if="item.description" class="description">
{{ item.description }}
</div>
</MkA>
</template>
</MkPagination>
</div>
</MkSpacer>
@ -40,6 +41,7 @@
import {} from "vue";
import MkPagination from "@/components/MkPagination.vue";
import MkButton from "@/components/MkButton.vue";
import MkInfo from "@/components/MkInfo.vue";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
@ -100,10 +102,6 @@ definePageMetadata({
<style lang="scss" scoped>
.qtcaoidl {
> .add {
margin: 0 auto 16px auto;
}
> .list {
> .item {
display: block;

View file

@ -111,6 +111,10 @@ async function leave(group) {
</script>
<style lang="scss" scoped>
._fullinfo {
display: none !important;
}
._card {
margin-bottom: 1rem;
._title {

View file

@ -8,16 +8,13 @@
/></template>
<MkSpacer :content-max="700">
<div class="qkcjvfiv">
<div class="buttonWrapper">
<MkInfo class="_gap" :icon="'list-bullets'" :card="true">
<p>{{ i18n.ts.listsDesc }}</p>
<MkButton primary class="add" @click="create"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts.createList }}</MkButton
>
<MkButton @click="deleteAll"
><i class="ph-trash ph-bold ph-lg"></i>
{{ i18n.ts.deleteAll }}</MkButton
>
</div>
</MkInfo>
<MkPagination
v-slot="{ items }"
@ -34,6 +31,10 @@
<div class="name">{{ list.name }}</div>
<MkAvatars :user-ids="list.userIds" />
</MkA>
<MkButton @click="deleteAll"
><i class="ph-trash ph-bold ph-lg"></i>
{{ i18n.ts.deleteAll }}</MkButton
>
</MkPagination>
</div>
</MkSpacer>
@ -45,6 +46,7 @@ import {} from "vue";
import MkPagination from "@/components/MkPagination.vue";
import MkButton from "@/components/MkButton.vue";
import MkAvatars from "@/components/MkAvatars.vue";
import MkInfo from "@/components/MkInfo.vue";
import * as os from "@/os";
import { i18n } from "@/i18n";
import { definePageMetadata } from "@/scripts/page-metadata";
@ -92,15 +94,6 @@ definePageMetadata({
<style lang="scss" scoped>
.qkcjvfiv {
> .buttonWrapper {
display: grid;
justify-content: center;
> .add {
margin: 0 auto var(--margin) auto;
}
}
> .lists {
> .list {
display: block;

View file

@ -4,6 +4,7 @@ import * as os from "@/os";
export async function indexPosts() {
const { canceled, result: index } = await os.inputText({
title: i18n.ts.indexFrom,
text: i18n.ts.indexFromDescription,
});
if (canceled) return;

View file

@ -3,30 +3,21 @@ import { i18n } from "@/i18n";
import { mainRouter } from "@/router";
export async function search() {
let searchOptions = "";
// const searchOptions =
// "Advanced search operators\n" +
// "from:user => filter by user\n" +
// "has:image/video/audio/text/file => filter by attachment types\n" +
// "domain:domain.com => filter by domain\n" +
// "before:Date => show posts made before Date\n" +
// "after:Date => show posts made after Date\n" +
// '"text" => get posts with exact text between quotes\n' +
// "filter:following => show results only from users you follow\n" +
// "filter:followers => show results only from followers\n";
let meta = null;
os.api("server-info", {}).then((res) => {
meta = res;
});
if (meta.meilisearch.health === "available") {
searchOptions =
"Advanced search operators\n" +
"from:user => filter by user\n" +
"has:image/video/audio/text/file => filter by attachment types\n" +
"domain:domain.com => filter by domain\n" +
"before:Date => show posts made before Date\n" +
"after:Date => show posts made after Date\n" +
'"text" => get posts with exact text between quotes\n' +
"filter:following => show results only from users you follow\n" +
"filter:followers => show results only from followers\n";
}
const { canceled, result: query } = await os.inputText({
title: i18n.ts.search,
placeholder: i18n.ts.searchPlaceholder,
text: searchOptions,
// text: searchOptions,
});
if (canceled || query == null || query === "") return;

View file

@ -26,6 +26,26 @@ export const defaultStore = markRaw(
where: "account",
default: 0,
},
tlHomeHintClosed: {
where: "device",
default: false,
},
tlLocalHintClosed: {
where: "device",
default: false,
},
tlRecommendedHintClosed: {
where: "device",
default: false,
},
tlSocialHintClosed: {
where: "device",
default: false,
},
tlGlobalHintClosed: {
where: "device",
default: false,
},
keepCw: {
where: "account",
default: true,

View file

@ -114,7 +114,7 @@ html, body {
}
.swiper-slide {
height: unset !important;
min-height: 100vh;
}
a {
@ -303,6 +303,9 @@ hr {
._gap {
margin: var(--margin) 0;
&:first-child {
margin-top: 0;
}
}
// TODO: 廃止

View file

@ -252,6 +252,9 @@ function more(ev: MouseEvent) {
#calckey_app > :not(.wallpaper) & {
background: var(--navBg);
}
#calckey_app > .wallpaper:not(.centered) & {
border-right: 1px solid var(--divider);
}
contain: strict;
display: flex;
flex-direction: column;

View file

@ -3,19 +3,17 @@
<div
:class="$style.container"
:style="{
backgroundImage: $instance.bannerUrl
? `url(${$instance.bannerUrl})`
: null,
backgroundImage: `url(${$instance.bannerUrl})`,
}"
>
<div :class="$style.iconContainer">
<img
:src="
$instance.iconUrl ??
$instance.faviconUrl ??
$instance.iconUrl ||
$instance.faviconUrl ||
'/favicon.ico'
"
alt=""
alt="Instance logo"
:class="$style.icon"
/>
</div>
@ -107,7 +105,7 @@ defineExpose<WidgetComponentExpose>({
-1px 1px 0 var(--bg), 1px 1px 0 var(--bg);
}
.host {
.name {
font-weight: bold;
}
</style>

View file

@ -2,7 +2,7 @@
<div class="vrvdvrys">
<XPie class="pie" :value="usage" />
<div>
<p><i class="ph-microchip ph-bold ph-lg"></i>CPU</p>
<p><i class="ph-cpu ph-bold ph-lg"></i>CPU</p>
<p>{{ meta.cpu.cores }} Logical cores</p>
<p>{{ meta.cpu.model }}</p>
</div>

View file

@ -1,11 +1,15 @@
<template>
<div class="verusivbr">
<XPie class="pie" :value="progress" />
<XPie
v-tooltip="i18n.ts.meiliIndexCount"
class="pie"
:value="progress"
/>
<div>
<p><i class="ph-file-search ph-bold ph-lg"></i>MeiliSearch</p>
<p>{{ i18n.ts._widgets.meiliStatus }}: {{ available }}</p>
<p>{{ i18n.ts._widgets.meiliSize }}: {{ bytes(total_size, 2) }}</p>
<p>{{ i18n.ts._widgets.meiliIndexCount }}: {{ index_count }}</p>
<p>{{ i18n.ts._widgets.meiliSize }}: {{ bytes(totalSize, 1) }}</p>
<p>{{ i18n.ts._widgets.meiliIndexCount }}: {{ indexCount }}</p>
</div>
</div>
<br />
@ -25,15 +29,15 @@ const props = defineProps<{
let progress: number = $ref(0);
let serverStats = $ref(null);
let total_size: number = $ref(0);
let index_count: number = $ref(0);
let totalSize: number = $ref(0);
let indexCount: number = $ref(0);
let available: string = $ref("unavailable");
function onStats(stats) {
total_size = stats.meilisearch.size;
index_count = stats.meilisearch.indexed_count;
totalSize = stats.meilisearch.size;
indexCount = stats.meilisearch.indexed_count;
available = stats.meilisearch.health;
progress = index_count / serverStats.notesCount;
progress = indexCount / serverStats.notesCount;
}
onMounted(() => {

View file

@ -2,7 +2,7 @@
<div class="zlxnikvl">
<XPie class="pie" :value="usage" />
<div>
<p><i class="ph-cpu ph-bold ph-lg"></i>RAM</p>
<p><i class="ph-microchip ph-bold ph-lg"></i>RAM</p>
<p>Total: {{ bytes(total, 1) }}</p>
<p>Used: {{ bytes(used, 1) }}</p>
<p>Free: {{ bytes(free, 1) }}</p>

View file

@ -12,11 +12,11 @@ importers:
.:
dependencies:
'@bull-board/api':
specifier: ^4.10.2
version: 4.10.2
specifier: 5.2.0
version: 5.2.0(@bull-board/ui@5.2.0)
'@bull-board/ui':
specifier: ^4.10.2
version: 4.10.2
specifier: 5.2.0
version: 5.2.0
'@napi-rs/cli':
specifier: ^2.15.0
version: 2.15.0
@ -28,7 +28,7 @@ importers:
version: 7.2.0
focus-trap-vue:
specifier: ^4.0.1
version: 4.0.1(focus-trap@7.2.0)(vue@3.3.4)
version: 4.0.1(focus-trap@7.2.0)(vue@3.2.45)
js-yaml:
specifier: 4.1.0
version: 4.1.0
@ -82,14 +82,14 @@ importers:
packages/backend:
dependencies:
'@bull-board/api':
specifier: ^4.6.4
version: 4.10.2
specifier: 5.2.0
version: 5.2.0(@bull-board/ui@5.2.0)
'@bull-board/koa':
specifier: ^4.6.4
version: 4.10.2(@types/koa@2.13.5)(pug@3.0.2)
specifier: 5.2.0
version: 5.2.0(@types/koa@2.13.5)(pug@3.0.2)
'@bull-board/ui':
specifier: ^4.6.4
version: 4.10.2
specifier: 5.2.0
version: 5.2.0
'@calckey/megalodon':
specifier: 5.2.0
version: 5.2.0
@ -217,8 +217,8 @@ importers:
specifier: 0.1.2
version: 0.1.2
ioredis:
specifier: 5.2.4
version: 5.2.4
specifier: 5.3.2
version: 5.3.2
ip-cidr:
specifier: 3.0.11
version: 3.0.11
@ -398,7 +398,7 @@ importers:
version: 14.0.0
typeorm:
specifier: 0.3.11
version: 0.3.11(ioredis@5.2.4)(pg@8.8.0)(ts-node@10.9.1)
version: 0.3.11(ioredis@5.3.2)(pg@8.8.0)(ts-node@10.9.1)
ulid:
specifier: 2.3.0
version: 2.3.0
@ -1087,11 +1087,6 @@ packages:
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
engines: {node: '>=6.9.0'}
/@babel/helper-string-parser@7.21.5:
resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
engines: {node: '>=6.9.0'}
dev: false
/@babel/helper-validator-identifier@7.19.1:
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
engines: {node: '>=6.9.0'}
@ -1135,14 +1130,6 @@ packages:
'@babel/types': 7.21.4
dev: true
/@babel/parser@7.22.3:
resolution: {integrity: sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.22.3
dev: false
/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4):
resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
peerDependencies:
@ -1329,30 +1316,24 @@ packages:
to-fast-properties: 2.0.0
dev: true
/@babel/types@7.22.3:
resolution: {integrity: sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-string-parser': 7.21.5
'@babel/helper-validator-identifier': 7.19.1
to-fast-properties: 2.0.0
dev: false
/@bcoe/v8-coverage@0.2.3:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
/@bull-board/api@4.10.2:
resolution: {integrity: sha512-lRHo0A7hsz71aOx1ZN0SmLLWfSuvKdL6EZ4imlgo5SuXGozybvlRc5KPIJU2/E1w5meoUGi+nFezBwp1gT/SMw==}
/@bull-board/api@5.2.0(@bull-board/ui@5.2.0):
resolution: {integrity: sha512-1HGF2EF/4zI3+Cj414nQzwFprLXOJTlVdqXUf5UEBS4HtYafWv93mGIwkrD8S4Bpz4VSvM87adF6tQPJ7Ewt+w==}
peerDependencies:
'@bull-board/ui': 5.2.0
dependencies:
'@bull-board/ui': 5.2.0
redis-info: 3.1.0
dev: false
/@bull-board/koa@4.10.2(@types/koa@2.13.5)(pug@3.0.2):
resolution: {integrity: sha512-gabPtsMOt2SQHkS5VcY1q/FCpbBRFiFrbWbcouZ7zWKg413J8nG+yErz3pc0rbmp23kbKX6wTG/diWKhE7EWbA==}
/@bull-board/koa@5.2.0(@types/koa@2.13.5)(pug@3.0.2):
resolution: {integrity: sha512-jntDAl/POouD0PS/iiKXBNl26SuUf7Y5uL3EgpDN7isvwFcpKhvdk0VdBypjrkRHN6rPaEJJPkEtK30qv01XYw==}
dependencies:
'@bull-board/api': 4.10.2
'@bull-board/ui': 4.10.2
'@bull-board/api': 5.2.0(@bull-board/ui@5.2.0)
'@bull-board/ui': 5.2.0
ejs: 3.1.8
koa: 2.13.4
koa-mount: 4.0.0
@ -1416,10 +1397,10 @@ packages:
- whiskers
dev: false
/@bull-board/ui@4.10.2:
resolution: {integrity: sha512-vaHGojG5D3xjnaed3nwOaLy4Y06RgDJdYRaFR5E06SjZ0vOvjVYGD6s4cykK512Aw/ElFhKDPwzhf8BvpwAtDQ==}
/@bull-board/ui@5.2.0:
resolution: {integrity: sha512-f2sgs7AjOVch7tFhbmlVCkhZjJWboxwNxWEfAsIUd1WidUC+Ef5J02tpQvu7apzRtu5zcn8IiJtI5HFO6oKaCA==}
dependencies:
'@bull-board/api': 4.10.2
'@bull-board/api': 5.2.0(@bull-board/ui@5.2.0)
dev: false
/@calckey/megalodon@5.2.0:
@ -2120,10 +2101,6 @@ packages:
/@jridgewell/sourcemap-codec@1.4.14:
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
/@jridgewell/sourcemap-codec@1.4.15:
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
dev: false
/@jridgewell/trace-mapping@0.3.17:
resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
dependencies:
@ -3240,7 +3217,7 @@ packages:
resolution: {integrity: sha512-zJbJ3FVE17CNl5KXzdeSPtdltc4tMT3TzC6fxQS0sQngkbFZ6h+0uTafsRqu+eSLIugf6Yb0Ea0SUuRr42Nk9g==}
deprecated: This is a stub types definition. ioredis provides its own type definitions, so you do not need this installed.
dependencies:
ioredis: 5.2.4
ioredis: 5.3.2
transitivePeerDependencies:
- supports-color
dev: true
@ -3852,30 +3829,12 @@ packages:
'@vue/shared': 3.2.45
estree-walker: 2.0.2
source-map: 0.6.1
dev: true
/@vue/compiler-core@3.3.4:
resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==}
dependencies:
'@babel/parser': 7.22.3
'@vue/shared': 3.3.4
estree-walker: 2.0.2
source-map-js: 1.0.2
dev: false
/@vue/compiler-dom@3.2.45:
resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==}
dependencies:
'@vue/compiler-core': 3.2.45
'@vue/shared': 3.2.45
dev: true
/@vue/compiler-dom@3.3.4:
resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==}
dependencies:
'@vue/compiler-core': 3.3.4
'@vue/shared': 3.3.4
dev: false
/@vue/compiler-sfc@2.7.14:
resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==}
@ -3898,36 +3857,12 @@ packages:
magic-string: 0.25.9
postcss: 8.4.21
source-map: 0.6.1
dev: true
/@vue/compiler-sfc@3.3.4:
resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==}
dependencies:
'@babel/parser': 7.22.3
'@vue/compiler-core': 3.3.4
'@vue/compiler-dom': 3.3.4
'@vue/compiler-ssr': 3.3.4
'@vue/reactivity-transform': 3.3.4
'@vue/shared': 3.3.4
estree-walker: 2.0.2
magic-string: 0.30.0
postcss: 8.4.24
source-map-js: 1.0.2
dev: false
/@vue/compiler-ssr@3.2.45:
resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==}
dependencies:
'@vue/compiler-dom': 3.2.45
'@vue/shared': 3.2.45
dev: true
/@vue/compiler-ssr@3.3.4:
resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==}
dependencies:
'@vue/compiler-dom': 3.3.4
'@vue/shared': 3.3.4
dev: false
/@vue/reactivity-transform@3.2.45:
resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
@ -3937,43 +3872,17 @@ packages:
'@vue/shared': 3.2.45
estree-walker: 2.0.2
magic-string: 0.25.9
dev: true
/@vue/reactivity-transform@3.3.4:
resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==}
dependencies:
'@babel/parser': 7.22.3
'@vue/compiler-core': 3.3.4
'@vue/shared': 3.3.4
estree-walker: 2.0.2
magic-string: 0.30.0
dev: false
/@vue/reactivity@3.2.45:
resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==}
dependencies:
'@vue/shared': 3.2.45
dev: true
/@vue/reactivity@3.3.4:
resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==}
dependencies:
'@vue/shared': 3.3.4
dev: false
/@vue/runtime-core@3.2.45:
resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==}
dependencies:
'@vue/reactivity': 3.2.45
'@vue/shared': 3.2.45
dev: true
/@vue/runtime-core@3.3.4:
resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==}
dependencies:
'@vue/reactivity': 3.3.4
'@vue/shared': 3.3.4
dev: false
/@vue/runtime-dom@3.2.45:
resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==}
@ -3981,15 +3890,6 @@ packages:
'@vue/runtime-core': 3.2.45
'@vue/shared': 3.2.45
csstype: 2.6.21
dev: true
/@vue/runtime-dom@3.3.4:
resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==}
dependencies:
'@vue/runtime-core': 3.3.4
'@vue/shared': 3.3.4
csstype: 3.1.2
dev: false
/@vue/server-renderer@3.2.45(vue@3.2.45):
resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==}
@ -3999,25 +3899,9 @@ packages:
'@vue/compiler-ssr': 3.2.45
'@vue/shared': 3.2.45
vue: 3.2.45
dev: true
/@vue/server-renderer@3.3.4(vue@3.3.4):
resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==}
peerDependencies:
vue: 3.3.4
dependencies:
'@vue/compiler-ssr': 3.3.4
'@vue/shared': 3.3.4
vue: 3.3.4
dev: false
/@vue/shared@3.2.45:
resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
dev: true
/@vue/shared@3.3.4:
resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==}
dev: false
/@webassemblyjs/ast@1.11.1:
resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==}
@ -5106,7 +4990,7 @@ packages:
cron-parser: 4.7.1
debuglog: 1.0.1
get-port: 5.1.1
ioredis: 5.2.4
ioredis: 5.3.2
lodash: 4.17.21
msgpackr: 1.8.1
p-timeout: 3.2.0
@ -6187,16 +6071,11 @@ packages:
/csstype@2.6.21:
resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
dev: true
/csstype@3.1.1:
resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
dev: true
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
dev: false
/custom-event-polyfill@1.0.7:
resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==}
dev: true
@ -7549,14 +7428,14 @@ packages:
readable-stream: 2.3.7
dev: true
/focus-trap-vue@4.0.1(focus-trap@7.2.0)(vue@3.3.4):
/focus-trap-vue@4.0.1(focus-trap@7.2.0)(vue@3.2.45):
resolution: {integrity: sha512-2iqOeoSvgq7Um6aL+255a/wXPskj6waLq2oKCa4gOnMORPo15JX7wN6J5bl1SMhMlTlkHXGSrQ9uJPJLPZDl5w==}
peerDependencies:
focus-trap: ^7.0.0
vue: ^3.0.0
dependencies:
focus-trap: 7.2.0
vue: 3.3.4
vue: 3.2.45
dev: false
/focus-trap@7.2.0:
@ -7716,7 +7595,7 @@ packages:
resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==}
engines: {node: '>= 0.10'}
dependencies:
graceful-fs: 4.2.10
graceful-fs: 4.2.11
through2: 2.0.5
dev: true
@ -8621,8 +8500,8 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/ioredis@5.2.4:
resolution: {integrity: sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==}
/ioredis@5.3.2:
resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==}
engines: {node: '>=12.22.0'}
dependencies:
'@ioredis/commands': 1.2.0
@ -9795,7 +9674,7 @@ packages:
/jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
optionalDependencies:
graceful-fs: 4.2.10
graceful-fs: 4.2.11
/jsonfile@5.0.0:
resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==}
@ -9809,7 +9688,7 @@ packages:
dependencies:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.10
graceful-fs: 4.2.11
dev: true
/jsonld@6.0.0:
@ -10435,14 +10314,6 @@ packages:
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
dependencies:
sourcemap-codec: 1.4.8
dev: true
/magic-string@0.30.0:
resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==}
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: false
/mailcheck@1.1.1:
resolution: {integrity: sha512-3WjL8+ZDouZwKlyJBMp/4LeziLFXgleOdsYu87piGcMLqhBzCsy2QFdbtAwv757TFC/rtqd738fgJw1tFQCSgA==}
@ -12056,6 +11927,7 @@ packages:
nanoid: 3.3.6
picocolors: 1.0.0
source-map-js: 1.0.2
dev: true
/postgres-array@2.0.0:
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
@ -13381,7 +13253,6 @@ packages:
/sourcemap-codec@1.4.8:
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
deprecated: Please use @jridgewell/sourcemap-codec instead
dev: true
/sparkles@1.0.1:
resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==}
@ -14375,7 +14246,7 @@ packages:
/typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
/typeorm@0.3.11(ioredis@5.2.4)(pg@8.8.0)(ts-node@10.9.1):
/typeorm@0.3.11(ioredis@5.3.2)(pg@8.8.0)(ts-node@10.9.1):
resolution: {integrity: sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==}
engines: {node: '>= 12.9.0'}
hasBin: true
@ -14442,7 +14313,7 @@ packages:
debug: 4.3.4(supports-color@8.1.1)
dotenv: 16.0.3
glob: 7.2.3
ioredis: 5.2.4
ioredis: 5.3.2
js-yaml: 4.1.0
mkdirp: 1.0.4
pg: 8.8.0
@ -14760,7 +14631,7 @@ packages:
dependencies:
append-buffer: 1.0.2
convert-source-map: 1.9.0
graceful-fs: 4.2.10
graceful-fs: 4.2.11
normalize-path: 2.1.1
now-and-later: 2.0.1
remove-bom-buffer: 3.0.0
@ -14872,17 +14743,6 @@ packages:
'@vue/runtime-dom': 3.2.45
'@vue/server-renderer': 3.2.45(vue@3.2.45)
'@vue/shared': 3.2.45
dev: true
/vue@3.3.4:
resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
dependencies:
'@vue/compiler-dom': 3.3.4
'@vue/compiler-sfc': 3.3.4
'@vue/runtime-dom': 3.3.4
'@vue/server-renderer': 3.3.4(vue@3.3.4)
'@vue/shared': 3.3.4
dev: false
/vuedraggable@4.1.0(vue@3.2.45):
resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}

28
pull_request_template.yml Normal file
View file

@ -0,0 +1,28 @@
name: Pull Request
about: Create a pull request
title: "[PR]: "
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to make Calckey better!
- type: textarea
id: about
attributes:
label: What does this PR do?
description: Please give us a brief description of what this PR does.
placeholder: Makes Calckey so amazing by...
validations:
required: true
- type: checkboxes
id: terms
attributes:
label: Contribution Guidelines
description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
options:
- label: I agree to follow this project's Contribution Guidelines
required: true
- label: I have made sure to test this pull request
required: true
- label: I have made sure to run `pnpm run format` before submitting this pull request
required: true