Compare commits

...
18 Commits
Author SHA1 Message Date
fccview 711fed00b3 Merge branch 'main' of github-fccview:fccview/cronmaster 2026-05-12 14:28:50 +01:00
fccview 68de9c7692 bump that fucker 2026-05-12 14:28:29 +01:00
fccview aa392fed50 Merge pull request #103 from fccview/develop
Develop
2026-05-12 14:27:56 +01:00
fccview b81ecb099f add health endpoint 2026-05-12 14:15:59 +01:00
fccview d260f2d5db allow resizing of command textarea 2026-05-12 14:06:19 +01:00
fccview 9154835a24 fix shell operators bug 2026-05-12 14:00:29 +01:00
fccview 14f395fc08 Merge pull request #101 from fccview/main
get develop up to speed with main
2026-04-24 15:49:19 +01:00
fccview 79b011c32e Merge pull request #98 from yws112358/main
add zh-cn translation
2026-04-21 18:58:30 +01:00
fccview 9184c85cd7 Merge pull request #97 from anyblabla/anyblabla-patch-1
feat: add French translation
2026-04-21 18:58:07 +01:00
yws112358 d05e76c582 add zh-cn translation
add zh-cn translation
2026-04-15 11:42:55 +08:00
yws112358 35a983ba9d Translate cn.json content to Simplified-Chinese
need a SC language i think
2026-04-15 11:33:40 +08:00
Blabla Linux 1f18f743b1 feat: add French translation
Ajout du fichier fr.json pour supporter la langue française dans l'interface.
2026-04-14 19:20:34 +02:00
fccview c81586a9b7 Merge pull request #93 from pavel-miniutka/feature/add-locale-be
feat: add Belarusian (be) translation
2026-03-27 07:00:09 +00:00
pavel-miniutka 23c09e9342 feat: add Belarusian (be) translation
- Complete Belarusian translation for all UI strings
- Tested with LOCALE=be environment variable
- Follows translation guidelines and structure
2026-03-27 09:05:18 +03:00
fccview 70dd52805c Merge pull request #90 from fccview/develop
2.2.0
2026-03-25 20:54:15 +00:00
Fernando Campione 1d845b5f0e fix paused @ syntax jobs 2026-03-25 09:13:03 +00:00
Fernando Campione f455e886e4 bump package version 2026-03-25 08:47:11 +00:00
Fernando Campione 5ca5d62cb7 security update 2026-03-25 08:46:21 +00:00
13 changed files with 813 additions and 145 deletions

No files matched your search

+3
View File
@@ -48,6 +48,9 @@ EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
CMD curl -f http://localhost:3000/api/health || exit 1
USER nextjs
CMD ["node", "server.js"]
@@ -8,7 +8,13 @@ import { Switch } from "@/app/_components/GlobalComponents/UIElements/Switch";
import { CronExpressionHelper } from "@/app/_components/FeatureComponents/Scripts/CronExpressionHelper";
import { SelectScriptModal } from "@/app/_components/FeatureComponents/Modals/SelectScriptModal";
import { UserSwitcher } from "@/app/_components/FeatureComponents/User/UserSwitcher";
import { PlusIcon, TerminalIcon, FileTextIcon, XIcon, FileArrowDownIcon } from "@phosphor-icons/react";
import {
PlusIcon,
TerminalIcon,
FileTextIcon,
XIcon,
FileArrowDownIcon,
} from "@phosphor-icons/react";
import { getScriptContent } from "@/app/_server/actions/scripts";
import { getHostScriptPath } from "@/app/_server/actions/scripts";
import { useTranslations } from "next-intl";
@@ -45,8 +51,6 @@ export const CreateTaskModal = ({
form,
onFormChange,
}: CreateTaskModalProps) => {
const [selectedScriptContent, setSelectedScriptContent] =
useState<string>("");
const [isSelectScriptModalOpen, setIsSelectScriptModalOpen] = useState(false);
const selectedScript = scripts.find((s) => s.id === form.selectedScriptId);
const t = useTranslations();
@@ -54,10 +58,7 @@ export const CreateTaskModal = ({
useEffect(() => {
const loadScriptContent = async () => {
if (selectedScript) {
const content = await getScriptContent(selectedScript.filename);
setSelectedScriptContent(content);
} else {
setSelectedScriptContent("");
await getScriptContent(selectedScript.filename);
}
};
@@ -125,10 +126,11 @@ export const CreateTaskModal = ({
<button
type="button"
onClick={handleCustomCommand}
className={`p-4 rounded-lg transition-all ${!form.selectedScriptId
? "border-border border-2"
: "border-border border"
}`}
className={`p-4 rounded-lg transition-all ${
!form.selectedScriptId
? "border-border border-2"
: "border-border border"
}`}
>
<div className="flex items-center gap-3">
<TerminalIcon className="h-5 w-5" />
@@ -146,10 +148,11 @@ export const CreateTaskModal = ({
<button
type="button"
onClick={() => setIsSelectScriptModalOpen(true)}
className={`p-4 rounded-lg transition-all ${form.selectedScriptId
? "border-border border-2"
: "border-border border"
}`}
className={`p-4 rounded-lg transition-all ${
form.selectedScriptId
? "border-border border-2"
: "border-border border"
}`}
>
<div className="flex items-center gap-3">
<FileTextIcon className="h-5 w-5" />
@@ -223,7 +226,7 @@ export const CreateTaskModal = ({
? "/app/scripts/script_name.sh"
: "/usr/bin/command"
}
className="w-full h-24 p-2 border border-border rounded bg-background0 text-foreground font-mono text-sm resize-none focus:outline-none focus:ring-1 focus:ring-primary/20"
className="w-full h-24 p-2 border border-border rounded bg-background0 text-foreground font-mono text-sm resize-y focus:outline-none focus:ring-1 focus:ring-primary/20"
required
readOnly={!!form.selectedScriptId}
/>
@@ -254,7 +257,6 @@ export const CreateTaskModal = ({
/>
</div>
<div className="border border-border bg-muted/10 rounded-lg p-4">
<div
className="flex items-start gap-3 cursor-pointer"
@@ -279,7 +281,6 @@ export const CreateTaskModal = ({
</div>
</div>
<div className="flex justify-end gap-2 pt-3 border-t border-border">
<Button
type="button"
+209
View File
@@ -0,0 +1,209 @@
{
"common": {
"cronManagementMadeEasy": "Спрошчанае кіраванне Cron",
"allUsers": "Усе карыстальнікі",
"userWithUsername": "Карыстальнік: {user}",
"user": "Карыстальнік",
"change": "Змяніць",
"description": "Апісанне",
"optional": "Неабавязкова",
"cancel": "Скасаваць",
"close": "Закрыць",
"refresh": "Абнавіць",
"loading": "Загрузка",
"version": "Версія {version}"
},
"cronjobs": {
"cronJobs": "Заданні Cron",
"cronJob": "Заданне Cron",
"scheduledTasks": "Запланаваныя заданні",
"nOfNJObs": "Заданняў: {filtered} з {total}",
"forUser": "для карыстальніка {user}",
"newTask": "Новае заданне",
"runCronManually": "Запусціць уручную",
"editCronJob": "Рэдагаваць",
"cloneCronJob": "Кланіраваць",
"deleteCronJob": "Выдаліць",
"pauseCronJob": "Прыпыніць",
"resumeCronJob": "Узнавіць",
"runCronJob": "Запусціць заданне cron",
"runCronJobSuccess": "Заданне cron паспяхова выканана",
"runCronJobFailed": "Не ўдалося выканаць заданне cron",
"paused": "Прыпынена",
"createNewScheduledTask": "Стварэнне новага запланаванага задання",
"schedule": "Расклад",
"taskType": "Тып задання",
"customCommand": "Уласная каманда",
"singleCommand": "Адзіночная каманда",
"command": "Каманда",
"whatDoesThisTaskDo": "Што робіць гэта заданне?",
"createTask": "Стварыць заданне",
"editScheduledTask": "Рэдагаванне запланаванага задання",
"enableLogging": "Уключыць вядзенне журнала",
"disableLogging": "Адключыць вядзенне журнала",
"loggingDescription": "Запісваць stdout, stderr, коды выхаду і пазнакі часу для выканання заданняў. Журналы захоўваюцца ў ./data/logs і аўтаматычна выдаляюцца (прадвызначана захоўваецца 50 журналаў на заданне і 30 дзён, вы можаце змяніць гэтыя значэнні ў пераменных асяроддзя).",
"logged": "У журнале",
"viewLogs": "Праглядзець журналы",
"logs": "журналы",
"logFiles": "Файлы журналаў",
"logContent": "Змесціва журнала",
"downloadLog": "Спампаваць",
"selectLogToView": "Выберыце файл журнала для прагляду яго зместу",
"noLogsFound": "Не знойдзена журналаў для гэтага задання",
"confirmDeleteLog": "Вы ўпэўнены, што хочаце выдаліць гэты файл журнала?",
"confirmDeleteAllLogs": "Вы ўпэўнены, што хочаце выдаліць усе файлы журналаў для гэтага задання? Гэта дзеянне немагчыма адрабіць.",
"deleteAll": "Выдаліць усе",
"refresh": "Абнавіць",
"loading": "Загрузка",
"close": "Закрыць",
"healthy": "Спраўнае",
"failed": "Памылка (Код: {exitCode})",
"backupJob": "Стварыць рэзервовую копію",
"restoreJob": "Аднавіць заданне",
"backupAll": "Зрабіць рэзервовую копію ўсіх",
"backups": "Рэзервовыя копіі",
"restoreAll": "Аднавіць усе",
"confirmRestoreAll": "Вы ўпэўнены, што хочаце аднавіць усе захаваныя заданні? Гэта дадасць іх у crontab.",
"backupJobSuccess": "Рэзервовая копія задання паспяхова створана",
"backupJobFailed": "Не ўдалося стварыць рэзервовую копію задання",
"backupAllSuccess": "Рэзервовыя копіі ўсіх заданняў паспяхова створаны",
"backupAllFailed": "Не ўдалося стварыць рэзервовыя копіі ўсіх заданняў",
"restoreJobSuccess": "Заданне паспяхова адноўлена",
"restoreJobFailed": "Не ўдалося аднавіць заданне",
"moreActions": "Больш дзеянняў",
"restoreBackups": "Аднавіць з рэзервовых копій",
"availableBackups": "Даступныя рэзервовыя копіі",
"noBackupsFound": "Файлы рэзервовых копій не знойдзены",
"backedUpAt": "Рэзервовая копія створана ў",
"restoreThisBackup": "Аднавіць гэту рэзервовую копію",
"deleteBackup": "Выдаліць рэзервовую копію",
"confirmDeleteBackup": "Вы ўпэўнены, што хочаце выдаліць гэту рэзервовую копію? Гэта дзеянне немагчыма адрабіць.",
"backupDeleted": "Рэзервовая копія паспяхова выдалена",
"filters": "Фільтры",
"filtersAndDisplay": "Фільтры і параметры адлюстравання",
"filterByUser": "Фільтраваць па карыстальніку",
"scheduleDisplay": "Адлюстраванне раскладу",
"cronSyntax": "Сінтаксіс Cron",
"humanReadable": "Зразумелае чалавеку",
"both": "Абодва",
"minimalMode": "Кампактны рэжым",
"minimalModeDescription": "Паказваць кампактны выгляд са значкамі замест усяго тэксту",
"applyFilters": "Прымяніць фільтры",
"nLines": "{count} радкоў",
"liveJobExecution": "Выкананне задання ў рэальным часе",
"running": "Выконваецца...",
"completed": "Завершана (Код: {exitCode})",
"jobFailed": "Збой (Код: {exitCode})",
"showLast": "Паказваць апошнія:",
"viewFullLog": "Праглядзець увесь журнал (радкоў: {totalLines})",
"viewFullLogNoCount": "Праглядзець поўны лог",
"viewingFullLog": "Прагляд усяго журнала (радкоў: {totalLines})",
"viewingFullLogNoCount": "Прагляд усяго журнала",
"backToWindowedView": "Вярнуцца да аконнага выгляду",
"showingLastOf": "Паказваюцца апошнія {lineCount} з {totalLines} радкоў",
"showingLastLines": "Паказваюцца апошнія {lineCount} радкоў",
"largeLogFileDetected": "Выяўлены вялікі файл журнала",
"tailModeEnabled": "Уключаны рэжым tail, паказваюцца апошнія {tailLines} радкоў",
"showAllLines": "Паказаць усе радкі",
"enableTailMode": "Уключыць рэжым tail",
"waitingForJobToStart": "Чаканне запуску задання...\n\nЗапісы журналы будуць з'яўляцца тут у рэальным часе.",
"runIdJobId": "ID запуску: {runId} | ID задання: {jobId}"
},
"scripts": {
"scripts": "Скрыпты",
"scriptsLibrary": "Бібліятэка скрыптоў",
"file": "Файл",
"newScript": "Новы скрыпт",
"noScriptsYet": "Скрыптоў пакуль няма",
"createReusableBashScripts": "Стварайце шматразовыя bash-скрыпты для выкарыстання ў запланаваных заданнях.",
"createYourFirstScript": "Стварыць першы скрыпт",
"nOfNSavedScripts": "Захаваных скрыптоў: {count}",
"savedScript": "Захаваны скрыпт",
"selectFromLibrary": "Выбраць з бібліятэкі",
"scriptPathReadOnly": "Шлях да скрыпта даступны толькі для чытання. Адрэдагуйце скрыпт у бібліятэцы скрыптоў",
"selectScript": "Выбраць скрыпт",
"availableScripts": "Даступна скрыптоў: {count}",
"noScriptsFound": "Скрыпты не знойдзены",
"noScriptsAvailable": "Няма даступных скрыптоў",
"scriptPreview": "Перадпрагляд скрыпта",
"commandPreview": "Перадпрагляд каманды",
"scriptContent": "Змест скрыпта",
"selectScriptToPreview": "Выберыце скрыпт для перадпрагляду",
"searchScripts": "Пошук скрыптоў...",
"draft": "Чарнавік",
"clearDraft": "Ачысціць чарнавік",
"close": "Закрыць",
"draftCleared": "Чарнавік ачышчаны"
},
"sidebar": {
"systemOverview": "Агляд сістэмы",
"uptime": "Час працы",
"memory": "Памяць",
"cpu": "ЦП",
"gpu": "ГП",
"network": "Сетка",
"networkLatency": "Сеткавая затрымка",
"memoryUsage": "Выкарыстанне памяці",
"cpuUsage": "Выкарыстанне ЦП",
"systemInformation": "Сістэмная інфармацыя",
"performanceMetrics": "Паказчыкі прадукцыйнасці",
"statsUpdateEvery": "Статыстыка абнаўляецца кожныя",
"updating": "Абнаўленне",
"networkSpeedEstimatedFromLatency": "Хуткасць сеткі разлічана на аснове затрымкі"
},
"system": {
"optimal": "Аптымальны",
"critical": "Крытычны",
"high": "Высокі",
"moderate": "Умераны",
"warning": "Папярэджанне",
"unknown": "Невядомы",
"connected": "Падключана",
"allSystemsRunningNormally": "Усе сістэмы працуюць нармальна",
"highResourceUsageDetectedImmediateAttentionRequired": "Выяўлена высокае выкарыстанне рэсурсаў - патрабуецца неадкладная ўвага",
"moderateResourceUsageMonitoringRecommended": "Умеранае выкарыстанне рэсурсаў - рэкамендуецца маніторынг",
"unknownGPU": "Невядомы ГП",
"noGPUDetected": "ГП не выяўлены",
"gpuDetectionFailed": "Не ўдалося выявіць ГП",
"available": "Даступны",
"systemStatus": "Стан загрузкі сістэмы",
"lastUpdated": "Апошняе абнаўленне"
},
"login": {
"welcomeTitle": "Вітаем у Cr*nMaster",
"signInWithPasswordOrSSO": "Увайсці з дапамогай пароля або SSO",
"signInWithSSO": "Увайсці праз SSO",
"enterPasswordToContinue": "Увядзіце пароль, каб працягнуць",
"authenticationNotConfigured": "Аўтэнтыфікацыя не наладжана",
"noAuthMethodsEnabled": "Ні аўтэнтыфікацыя па паролі, ні OIDC SSO не ўключаны. Наладзьце хаця б адзін метад аўтэнтыфікацыі ў пераменных асяроддзя, каб мець магчымасць увайсці.",
"enterPassword": "Увядзіце пароль",
"signingIn": "Уваход...",
"signIn": "Увайсці",
"redirecting": "Перанакіраванне...",
"redirectingToOIDC": "Перанакіраванне да правайдара OIDC",
"pleaseWait": "Пачакайце...",
"orContinueWith": "Або працягніце з дапамогай",
"loginFailed": "Памылка ўваходу",
"genericError": "Адбылася памылка. Паспрабуйце яшчэ раз."
},
"warnings": {
"wrapperScriptModified": "Скрыпт-абгортка зменены",
"wrapperScriptModifiedDescription": "Скрыпт cron-log-wrapper.sh не адпавядае афіцыйнай версіі. Гэта можа паўплываць на функцыянальнасць вядзення журнала. Паспрабуйце вярнуцца да афіцыйнай версіі або пераканайцеся, што вашы змены не парушаюць патрэбны фармат для аналізу журнала."
},
"notFound": {
"title": "404 - Старонка не знойдзена",
"subtitle": "ПАМЫЛКА: Запытаны рэсурс не знойдзены",
"message": "Старонка, якую вы шукаеце, не існуе. Хочаце замест гэтага пагуляць у змейку?",
"gameOver": "ГУЛЬНЯ СКОНЧАНА",
"score": "Балы",
"highScore": "Найлепшы вынік",
"pressToStart": "Націсніце ПРАБЕЛ або дакраніцеся, каб пачаць",
"pressToRestart": "Націсніце ПРАБЕЛ або дакраніцеся, каб перазапусціць",
"controls": "Кіраванне",
"useArrowKeys": "Выкарыстоўвайце стрэлкі для перамяшчэння",
"tapToMove": "Дакранайцеся да краёў экрана для перамяшчэння",
"goHome": "Вярнуцца на панэль кіравання",
"pauseGame": "Націсніце P, каб прыпыніць гульню",
"paused": "ПРЫПЫНЕНА"
}
}
+209
View File
@@ -0,0 +1,209 @@
{
"common": {
"cronManagementMadeEasy": "La gestion de vos tâches cron simplifiée",
"allUsers": "Tous les utilisateurs",
"userWithUsername": "Utilisateur : {user}",
"user": "Utilisateur",
"change": "Modifier",
"description": "Description",
"optional": "Optionnel",
"cancel": "Annuler",
"close": "Fermer",
"refresh": "Actualiser",
"loading": "Chargement",
"version": "Version {version}"
},
"cronjobs": {
"cronJobs": "Tâches Cron",
"cronJob": "Tâche Cron",
"scheduledTasks": "Tâches planifiées",
"nOfNJObs": "{filtered} sur {total} tâches planifiées",
"forUser": "pour l'utilisateur {user}",
"newTask": "Nouvelle tâche",
"runCronManually": "Exécuter manuellement",
"editCronJob": "Modifier la tâche",
"cloneCronJob": "Cloner la tâche",
"deleteCronJob": "Supprimer la tâche",
"pauseCronJob": "Mettre en pause",
"resumeCronJob": "Reprendre la tâche",
"runCronJob": "Exécuter la tâche",
"runCronJobSuccess": "Tâche exécutée avec succès",
"runCronJobFailed": "Échec lors de l'exécution",
"paused": "En pause",
"createNewScheduledTask": "Créer une nouvelle tâche planifiée",
"schedule": "Planification",
"taskType": "Type de tâche",
"customCommand": "Commande personnalisée",
"singleCommand": "Commande simple",
"command": "Commande",
"whatDoesThisTaskDo": "Que fait cette tâche ?",
"createTask": "Créer la tâche",
"editScheduledTask": "Modifier la tâche planifiée",
"enableLogging": "Activer les logs",
"disableLogging": "Désactiver les logs",
"loggingDescription": "Capture les sorties (stdout, stderr), les codes de sortie et les timestamps. Les logs sont stockés dans ./data/logs et nettoyés automatiquement (par défaut : 50 logs par tâche et 30 jours de rétention, modifiable via les variables d'environnement).",
"logged": "Journalisé",
"viewLogs": "Voir les logs",
"logs": "logs",
"logFiles": "Fichiers de log",
"logContent": "Contenu du log",
"downloadLog": "Télécharger",
"selectLogToView": "Sélectionnez un fichier pour voir son contenu",
"noLogsFound": "Aucun log trouvé pour cette tâche",
"confirmDeleteLog": "Voulez-vous vraiment supprimer ce fichier de log ?",
"confirmDeleteAllLogs": "Voulez-vous vraiment supprimer tous les logs de cette tâche ? Cette action est irréversible.",
"deleteAll": "Tout supprimer",
"refresh": "Actualiser",
"loading": "Chargement",
"close": "Fermer",
"healthy": "Opérationnel",
"failed": "Échoué (Code : {exitCode})",
"backupJob": "Sauvegarder la tâche",
"restoreJob": "Restaurer la tâche",
"backupAll": "Tout sauvegarder",
"backups": "Sauvegardes",
"restoreAll": "Tout restaurer",
"confirmRestoreAll": "Voulez-vous vraiment restaurer toutes les tâches sauvegardées ? Elles seront ajoutées à votre crontab.",
"backupJobSuccess": "Tâche sauvegardée avec succès",
"backupJobFailed": "Échec de la sauvegarde",
"backupAllSuccess": "Toutes les tâches sauvegardées avec succès",
"backupAllFailed": "Échec de la sauvegarde globale",
"restoreJobSuccess": "Tâche restaurée avec succès",
"restoreJobFailed": "Échec de la restauration",
"moreActions": "Plus d'actions",
"restoreBackups": "Restaurer les sauvegardes",
"availableBackups": "Sauvegardes disponibles",
"noBackupsFound": "Aucune sauvegarde trouvée",
"backedUpAt": "Sauvegardé le",
"restoreThisBackup": "Restaurer cette sauvegarde",
"deleteBackup": "Supprimer la sauvegarde",
"confirmDeleteBackup": "Voulez-vous vraiment supprimer cette sauvegarde ? Cette action est irréversible.",
"backupDeleted": "Sauvegarde supprimée avec succès",
"filters": "Filtres",
"filtersAndDisplay": "Filtres et affichage",
"filterByUser": "Filtrer par utilisateur",
"scheduleDisplay": "Affichage de la planification",
"cronSyntax": "Syntaxe Cron",
"humanReadable": "Lisible par un humain",
"both": "Les deux",
"minimalMode": "Mode minimal",
"minimalModeDescription": "Affichage compact avec des icônes",
"applyFilters": "Appliquer les filtres",
"nLines": "{count} lignes",
"liveJobExecution": "Exécution en temps réel",
"running": "En cours...",
"completed": "Terminé (Code : {exitCode})",
"jobFailed": "Échoué (Code : {exitCode})",
"showLast": "Voir les dernières :",
"viewFullLog": "Voir tout le log ({totalLines} lignes)",
"viewFullLogNoCount": "Voir tout le log",
"viewingFullLog": "Affichage complet ({totalLines} lignes)",
"viewingFullLogNoCount": "Affichage complet",
"backToWindowedView": "Retour à la vue fenêtrée",
"showingLastOf": "Affichage des {lineCount} dernières lignes sur {totalLines}",
"showingLastLines": "Affichage des {lineCount} dernières lignes",
"largeLogFileDetected": "Fichier de log volumineux détecté",
"tailModeEnabled": "Mode suivi activé, affichage des {tailLines} dernières lignes",
"showAllLines": "Tout afficher",
"enableTailMode": "Activer le mode suivi",
"waitingForJobToStart": "En attente du démarrage de la tâche...\n\nLes logs apparaîtront ici en temps réel.",
"runIdJobId": "ID exécution : {runId} | ID tâche : {jobId}"
},
"scripts": {
"scripts": "Scripts",
"scriptsLibrary": "Bibliothèque de scripts",
"file": "Fichier",
"newScript": "Nouveau script",
"noScriptsYet": "Aucun script pour le moment",
"createReusableBashScripts": "Créez des scripts Bash réutilisables pour vos tâches.",
"createYourFirstScript": "Créer votre premier script",
"nOfNSavedScripts": "{count} scripts enregistrés",
"savedScript": "Script enregistré",
"selectFromLibrary": "Sélectionner dans la bibliothèque",
"scriptPathReadOnly": "Le chemin du script est en lecture seule. Modifiez-le dans la bibliothèque.",
"selectScript": "Sélectionner un script",
"availableScripts": "{count} scripts disponibles",
"noScriptsFound": "Aucun script trouvé",
"noScriptsAvailable": "Aucun script disponible",
"scriptPreview": "Aperçu du script",
"commandPreview": "Aperçu de la commande",
"scriptContent": "Contenu du script",
"selectScriptToPreview": "Sélectionnez un script pour l'aperçu",
"searchScripts": "Rechercher...",
"draft": "Brouillon",
"clearDraft": "Effacer le brouillon",
"close": "Fermer",
"draftCleared": "Brouillon effacé"
},
"sidebar": {
"systemOverview": "Vue d'ensemble système",
"uptime": "Temps de fonctionnement",
"memory": "Mémoire",
"cpu": "Processeur",
"gpu": "Carte graphique",
"network": "Réseau",
"networkLatency": "Latence réseau",
"memoryUsage": "Utilisation mémoire",
"cpuUsage": "Utilisation CPU",
"systemInformation": "Informations système",
"performanceMetrics": "Performances",
"statsUpdateEvery": "Mise à jour des stats toutes les",
"updating": "Mise à jour",
"networkSpeedEstimatedFromLatency": "Vitesse réseau estimée via la latence"
},
"system": {
"optimal": "Optimal",
"critical": "Critique",
"high": "Élevé",
"moderate": "Modéré",
"warning": "Avertissement",
"unknown": "Inconnu",
"connected": "Connecté",
"allSystemsRunningNormally": "Tout fonctionne normalement",
"highResourceUsageDetectedImmediateAttentionRequired": "Usage élevé des ressources - attention requise",
"moderateResourceUsageMonitoringRecommended": "Usage modéré - surveillance recommandée",
"unknownGPU": "GPU inconnu",
"noGPUDetected": "Aucun GPU détecté",
"gpuDetectionFailed": "Échec détection GPU",
"available": "Disponible",
"systemStatus": "État du système",
"lastUpdated": "Dernière mise à jour"
},
"login": {
"welcomeTitle": "Bienvenue sur Cr*nMaster",
"signInWithPasswordOrSSO": "Connexion par mot de passe ou SSO",
"signInWithSSO": "Connexion via SSO",
"enterPasswordToContinue": "Entrez votre mot de passe pour continuer",
"authenticationNotConfigured": "Authentification non configurée",
"noAuthMethodsEnabled": "Ni le mot de passe, ni l'OIDC SSO ne sont activés. Veuillez configurer au moins une méthode dans vos variables d'environnement.",
"enterPassword": "Entrez le mot de passe",
"signingIn": "Connexion en cours...",
"signIn": "Se connecter",
"redirecting": "Redirection...",
"redirectingToOIDC": "Redirection vers le fournisseur OIDC",
"pleaseWait": "Veuillez patienter...",
"orContinueWith": "Ou continuer avec",
"loginFailed": "Échec de connexion",
"genericError": "Une erreur est survenue. Veuillez réessayer."
},
"warnings": {
"wrapperScriptModified": "Script wrapper modifié",
"wrapperScriptModifiedDescription": "Votre script 'cron-log-wrapper.sh' est différent de la version officielle. Cela peut affecter les logs. Revenez à la version officielle ou vérifiez que vos changements respectent le format attendu."
},
"notFound": {
"title": "404 - Page non trouvée",
"subtitle": "ERREUR : La ressource demandée est introuvable",
"message": "La page que vous cherchez n'existe pas. Vous voulez faire une partie de Snake ?",
"gameOver": "PARTIE TERMINÉE",
"score": "Score",
"highScore": "Meilleur score",
"pressToStart": "Appuyez sur ESPACE ou touchez l'écran pour commencer",
"pressToRestart": "Appuyez sur ESPACE ou touchez l'écran pour recommencer",
"controls": "Contrôles",
"useArrowKeys": "Utilisez les flèches pour bouger",
"tapToMove": "Touchez les bords de l'écran pour bouger",
"goHome": "Retour au tableau de bord",
"pauseGame": "Appuyez sur P pour mettre en pause",
"paused": "EN PAUSE"
}
}
+209
View File
@@ -0,0 +1,209 @@
{
"common": {
"cronManagementMadeEasy": "让计划任务管理变得简单",
"allUsers": "所有用户",
"userWithUsername": "用户: {user}",
"user": "用户",
"change": "修改",
"description": "描述",
"optional": "可选",
"cancel": "取消",
"close": "关闭",
"refresh": "刷新",
"loading": "加载中",
"version": "版本: {version}"
},
"cronjobs": {
"cronJobs": "定时任务",
"cronJob": "定时任务",
"scheduledTasks": "计划任务",
"nOfNJObs": "{filtered} / {total} 计划任务",
"forUser": "所属用户 {user}",
"newTask": "新建任务",
"runCronManually": "手动运行定时任务",
"editCronJob": "编辑定时任务",
"cloneCronJob": "复制定时任务",
"deleteCronJob": "删除定时任务",
"pauseCronJob": "暂停定时任务",
"resumeCronJob": "继续定时任务",
"runCronJob": "运行定时任务",
"runCronJobSuccess": "定时任务执行成功",
"runCronJobFailed": "定时任务执行失败",
"paused": "已暂停",
"createNewScheduledTask": "新建计划任务",
"schedule": "计划",
"taskType": "任务类型",
"customCommand": "自定义命令",
"singleCommand": "单个命令",
"command": "命令",
"whatDoesThisTaskDo": "这个任务的作用?",
"createTask": "创建任务",
"editScheduledTask": "编辑计划任务",
"enableLogging": "开启日志",
"disableLogging": "禁用日志",
"loggingDescription": "采集标准(及错误)输出, 退出码, 以及任务执行的时间戳.日志存于./data/logs,有自动清理机制(默认每个任务保留50条日志或30天, 可以在环境变量中修改).",
"logged": "已记录",
"viewLogs": "查看日志",
"logs": "日志",
"logFiles": "日志文件",
"logContent": "日志内容",
"downloadLog": "下载",
"selectLogToView": "选择一个日志以查看内容",
"noLogsFound": "这个任务还没有日志",
"confirmDeleteLog": "确定删除这个日志文件?",
"confirmDeleteAllLogs": "确定删除这个任务的所有日志?此操作不可撤销!",
"deleteAll": "清空",
"refresh": "刷新",
"loading": "加载中",
"close": "关闭",
"healthy": "健康",
"failed": "失败 (退出码: {exitCode})",
"backupJob": "备份任务",
"restoreJob": "恢复任务",
"backupAll": "备份所有",
"backups": "备份",
"restoreAll": "恢复所有",
"confirmRestoreAll": "确定恢复所有备份的任务吗?这将添加到你现有的定时任务表中.",
"backupJobSuccess": "任务备份成功",
"backupJobFailed": "任务备份失败",
"backupAllSuccess": "所有任务备份成功",
"backupAllFailed": "所有任务备份失败",
"restoreJobSuccess": "任务恢复成功",
"restoreJobFailed": "任务恢复失败",
"moreActions": "更多操作",
"restoreBackups": "恢复备份",
"availableBackups": "可用的备份",
"noBackupsFound": "没找到备份文件",
"backedUpAt": "备份于",
"restoreThisBackup": "恢复这个备份",
"deleteBackup": "删除备份",
"confirmDeleteBackup": "确定删除此备份?此操作不可撤销!",
"backupDeleted": "备份删除成功",
"filters": "筛选",
"filtersAndDisplay": "筛选 & 显示选项",
"filterByUser": "筛选用户",
"scheduleDisplay": "计划显示",
"cronSyntax": "定时语法",
"humanReadable": "人类可读",
"both": "都有",
"minimalMode": "最小模式",
"minimalModeDescription": "使用简洁图标代替文字",
"applyFilters": "应用筛选",
"nLines": "{count} 行",
"liveJobExecution": "实时任务执行",
"running": "运行中...",
"completed": "完成 (退出码: {exitCode})",
"jobFailed": "失败 (退出码: {exitCode})",
"showLast": "显示最后:",
"viewFullLog": "查看整个日志共 ({totalLines} 行)",
"viewFullLogNoCount": "查看整个日志",
"viewingFullLog": "正在查看共 ({totalLines} 行)",
"viewingFullLogNoCount": "正在查看整个日志",
"backToWindowedView": "返回窗口模式",
"showingLastOf": "正在显示 {lineCount} / {totalLines} 行",
"showingLastLines": "正在显示最后 {lineCount} 行",
"largeLogFileDetected": "检测到大型日志文件",
"tailModeEnabled": "已启用尾部(tail)模式, 正在显示最后 {tailLines} 行",
"showAllLines": "显示所有行",
"enableTailMode": "启用尾部(tail)模式",
"waitingForJobToStart": "等待任务开始...\n\n日志将实时展示。",
"runIdJobId": "运行 ID: {runId} | 任务 ID: {jobId}"
},
"scripts": {
"scripts": "脚本",
"scriptsLibrary": "脚本库",
"file": "文件",
"newScript": "新建脚本",
"noScriptsYet": "还没有脚本",
"createReusableBashScripts": "创建可重复使用的bash脚本,用于你的计划任务。",
"createYourFirstScript": "创建你的第一个脚本",
"nOfNSavedScripts": "{count} 份已保存的脚本",
"savedScript": "已保存的脚本",
"selectFromLibrary": "从库中选择",
"scriptPathReadOnly": "脚本路径是只读的。在脚本库中编辑脚本",
"selectScript": "选择脚本",
"availableScripts": "{count} 份可用脚本",
"noScriptsFound": "未找到适合的脚本",
"noScriptsAvailable": "没有可用的脚本",
"scriptPreview": "脚本预览",
"commandPreview": "命令预览",
"scriptContent": "脚本内容",
"selectScriptToPreview": "选择脚本以预览",
"searchScripts": "搜索脚本中...",
"draft": "草稿",
"clearDraft": "清空草稿",
"close": "关闭",
"draftCleared": "草稿已清空"
},
"sidebar": {
"systemOverview": "系统概述",
"uptime": "运行时间",
"memory": "内存",
"cpu": "CPU",
"gpu": "GPU",
"network": "网络",
"networkLatency": "网络延迟",
"memoryUsage": "内存使用率",
"cpuUsage": "CPU使用率",
"systemInformation": "系统信息",
"performanceMetrics": "性能指标",
"statsUpdateEvery": "状态更新于每",
"updating": "更新中",
"networkSpeedEstimatedFromLatency": "网速由延迟估算(所以不准)"
},
"system": {
"optimal": "非常好",
"critical": "危急",
"high": "高效",
"moderate": "适中",
"warning": "警告",
"unknown": "未知",
"connected": "已连接",
"allSystemsRunningNormally": "系统正常运行",
"highResourceUsageDetectedImmediateAttentionRequired": "检测到高资源使用 - 需要立即注意",
"moderateResourceUsageMonitoringRecommended": "处于适度的资源使用 - 持续监测即可",
"unknownGPU": "未知GPU",
"noGPUDetected": "未检测到GPU",
"gpuDetectionFailed": "GPU检测失败",
"available": "可用的",
"systemStatus": "系统状态",
"lastUpdated": "上次更新于"
},
"login": {
"welcomeTitle": "欢迎来到定时管家",
"signInWithPasswordOrSSO": "使用密码或SSO登录",
"signInWithSSO": "使用SSO登录",
"enterPasswordToContinue": "输入密码以继续",
"authenticationNotConfigured": "未配置认证信息",
"noAuthMethodsEnabled": "密码认证或OIDC SSO都未启用.请在环境变量中至少配置一种用于登录。",
"enterPassword": "输入密码",
"signingIn": "登录中...",
"signIn": "登录",
"redirecting": "重定向中...",
"redirectingToOIDC": "正在定向到OIDC提供商",
"pleaseWait": "请稍等...",
"orContinueWith": "或者继续使用",
"loginFailed": "登录失败",
"genericError": "发生错误,请重试。"
},
"warnings": {
"wrapperScriptModified": "封装脚本已被修改",
"wrapperScriptModifiedDescription": "你的cron-log-wrapper.sh已经被修改为非官方版本。这可能会影响日志功能。可以考虑切换回官方版本或者确认不会影响日志解析功能"
},
"notFound": {
"title": "404 - 页面未找到",
"subtitle": "错误: 找不到要找的资源。",
"message": "你要找的页面不存在,是否玩几句贪吃蛇?",
"gameOver": "游戏结束",
"score": "分数",
"highScore": "最高分",
"pressToStart": "敲空格键或点击来开始",
"pressToRestart": "敲空格键或点击来重新开始",
"controls": "控制方法",
"useArrowKeys": "使用方向键来移动",
"tapToMove": "点击屏幕边缘来移动",
"goHome": "返回仪表盘",
"pauseGame": "按 P 暂停",
"paused": "已暂停"
}
}
+12 -4
View File
@@ -316,11 +316,19 @@ export const parseJobsFromLines = (
const nextLine = lines[i + 1].trim();
if (nextLine.startsWith("# ")) {
const commentedCron = nextLine.substring(2);
const parts = commentedCron.split(/\s+/);
if (parts.length >= 6) {
const schedule = parts.slice(0, 5).join(" ");
const command = parts.slice(5).join(" ");
const parts = commentedCron.split(/(?:\s|\t)+/);
let schedule: string | undefined;
let command: string | undefined;
if (parts[0].startsWith("@") && parts.length >= 2) {
schedule = parts[0];
command = commentedCron.slice(commentedCron.indexOf(parts[1]));
} else if (parts.length >= 6) {
schedule = parts.slice(0, 5).join(" ");
command = commentedCron.slice(commentedCron.indexOf(parts[5]));
}
if (schedule && command) {
const jobId =
uuid || generateStableJobId(schedule, command, user, comment, i);
+12 -1
View File
@@ -1,10 +1,21 @@
const SH_C_PREFIX = /^sh -c '/;
export const toShellArg = (cmd: string): string =>
SH_C_PREFIX.test(cmd) ? cmd : `sh -c '${cmd.replace(/'/g, "'\\''")}'`;
export const fromShellArg = (cmd: string): string => {
const match = cmd.match(/^sh -c '(.*)'$/);
if (!match) return cmd;
return match[1].replace(/'\\''/g, "'");
};
export const unwrapCommand = (command: string): string => {
const wrapperPattern = /^(.+\/cron-log-wrapper\.sh)\s+"([^"]+)"\s+(.+)$/;
const match = command.match(wrapperPattern);
if (match && match[3]) {
return match[3];
return fromShellArg(match[3]);
}
return command;
+6 -3
View File
@@ -2,6 +2,7 @@ import { existsSync, copyFileSync } from "fs";
import path from "path";
import { DATA_DIR } from "../_consts/file";
import { getHostDataPath } from "../_server/actions/global";
import { toShellArg, fromShellArg } from "./wrapper-utils-client";
const sanitizeForFilesystem = (input: string): string => {
return input
@@ -53,11 +54,13 @@ export const wrapCommandWithLogger = async (
const logFolderName = generateLogFolderName(jobId, comment);
const safeCmd = toShellArg(command);
if (isDocker) {
const hostDataPath = await getHostDataPath();
if (hostDataPath) {
const hostWrapperPath = path.join(hostDataPath, "cron-log-wrapper.sh");
return `${hostWrapperPath} "${logFolderName}" ${command}`;
return `${hostWrapperPath} "${logFolderName}" ${safeCmd}`;
}
console.warn("Could not determine host data path, using container path");
}
@@ -67,7 +70,7 @@ export const wrapCommandWithLogger = async (
DATA_DIR,
"cron-log-wrapper.sh"
);
return `${localWrapperPath} "${logFolderName}" ${command}`;
return `${localWrapperPath} "${logFolderName}" ${safeCmd}`;
};
export const unwrapCommand = (command: string): string => {
@@ -76,7 +79,7 @@ export const unwrapCommand = (command: string): string => {
const match = command.match(wrapperPattern);
if (match && match[3]) {
return match[3];
return fromShellArg(match[3]);
}
return command;
+3
View File
@@ -0,0 +1,3 @@
import { NextResponse } from "next/server";
export const GET = () => NextResponse.json({ status: "healthy" });
+6
View File
@@ -22,3 +22,9 @@ services:
privileged: true
restart: always
init: true
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
start_period: 30s
retries: 3
+13 -6
View File
@@ -1,6 +1,6 @@
{
"name": "cronjob-manager",
"version": "2.1.0",
"version": "2.3.0",
"private": true,
"scripts": {
"dev": "next dev",
@@ -36,8 +36,8 @@
"cronstrue": "^3.2.0",
"fflate": "^0.8.2",
"jose": "^6.1.1",
"minimatch": "^10.0.3",
"next": "16.1.6",
"minimatch": "^10.2.3",
"next": "16.2.1",
"next-intl": "^4.4.0",
"next-themes": "^0.2.1",
"postcss": "^8",
@@ -46,7 +46,7 @@
"react-dom": "19.2.4",
"react-syntax-highlighter": "^15.6.1",
"serwist": "^9.5.5",
"systeminformation": "^5.27.14",
"systeminformation": "^5.31.0",
"tailwind-merge": "^2.0.0",
"tailwindcss": "^3.3.0",
"typescript": "^5"
@@ -56,15 +56,22 @@
"@types/bcryptjs": "^2.4.6",
"@types/minimatch": "^6.0.0",
"eslint": "^9",
"eslint-config-next": "16.1.6",
"eslint-config-next": "16.2.1",
"postcss-import": "^16.1.1"
},
"resolutions": {
"@isaacs/brace-expansion": "^5.0.1",
"eslint/minimatch": "^3.1.3",
"@eslint/config-array/minimatch": "^3.1.3",
"@eslint/eslintrc/minimatch": "^3.1.3",
"eslint-plugin-import/minimatch": "^3.1.3",
"eslint-plugin-jsx-a11y/minimatch": "^3.1.3",
"@types/react": "19.2.14",
"@types/react-dom": "19.2.3",
"lodash": "^4.17.23",
"prismjs": "^1.30.0",
"systeminformation": "^5.27.14"
"systeminformation": "^5.31.0",
"ajv": "^6.14.0",
"flatted": "^3.4.2"
}
}
+1
View File
@@ -99,6 +99,7 @@ export const proxy = async (request: NextRequest) => {
}
} catch (error) {
console.error("Session check error:", error);
return NextResponse.redirect(loginUrl);
}
const response = NextResponse.next();
+111 -113
View File
@@ -578,7 +578,7 @@
resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29"
integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==
"@isaacs/brace-expansion@^5.0.0", "@isaacs/brace-expansion@^5.0.1":
"@isaacs/brace-expansion@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff"
integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==
@@ -673,57 +673,57 @@
"@emnapi/runtime" "^1.4.3"
"@tybys/wasm-util" "^0.10.0"
"@next/env@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/env/-/env-16.1.6.tgz#0f85979498249a94ef606ef535042a831f905e89"
integrity sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==
"@next/env@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/env/-/env-16.2.1.tgz#3896715e28c850355b7b1c9c687beb9d7e9cdc40"
integrity sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==
"@next/eslint-plugin-next@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.6.tgz#73b56b01c9db506998bd1e2d303c2605b0a1b7b0"
integrity sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==
"@next/eslint-plugin-next@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.1.tgz#994717439ae3259268ed5f7d6830966f0fbb3c9d"
integrity sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA==
dependencies:
fast-glob "3.3.1"
"@next/swc-darwin-arm64@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz#fbe1e360efdcc9ebd0a10301518275bc59e12a91"
integrity sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==
"@next/swc-darwin-arm64@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz#8bd5c16ee04eb5f07d4f3ca71a3d5270093a9de6"
integrity sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==
"@next/swc-darwin-x64@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz#0e3781ef3abc8251c2a21addc733d9a87f44829b"
integrity sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==
"@next/swc-darwin-x64@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz#4c1a9134cd442e7fcd74bbe85ab283616ece06cb"
integrity sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==
"@next/swc-linux-arm64-gnu@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz#b24511af2c6129f2deaf5c8c04d297fe09cd40d7"
integrity sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==
"@next/swc-linux-arm64-gnu@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz#ec08722d22551ea649872df907a8fee027ab1828"
integrity sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==
"@next/swc-linux-arm64-musl@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz#9d4ed0565689fc6a867250f994736a5b8c542ccb"
integrity sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==
"@next/swc-linux-arm64-musl@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz#4d6270f5be7905c1a3e4f1c4f9cf4b8c62331561"
integrity sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==
"@next/swc-linux-x64-gnu@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz#cc757f4384e7eab7d3dba704a97f737518bae0d2"
integrity sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==
"@next/swc-linux-x64-gnu@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz#2d55519ba822cd27d9d65ed45a0ace3562df1dcc"
integrity sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==
"@next/swc-linux-x64-musl@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz#ef1341740f29717deea7c6ec27ae6269386e20d1"
integrity sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==
"@next/swc-linux-x64-musl@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz#607b03c3a5bade2368beb4f5b4cac9c243333638"
integrity sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==
"@next/swc-win32-arm64-msvc@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz#fee8719242aecf9c39c3a66f1f73821f7884dd16"
integrity sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==
"@next/swc-win32-arm64-msvc@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz#a96e776f37287b39e309e0850a8d8e2c6c749070"
integrity sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==
"@next/swc-win32-x64-msvc@16.1.6":
version "16.1.6"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz#60c27323c30f35722b20fd6d62449fbb768e46d9"
integrity sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==
"@next/swc-win32-x64-msvc@16.2.1":
version "16.2.1"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz#a299bf2b5688029429061d13492c57ccf947c9c5"
integrity sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -1347,10 +1347,10 @@ acorn@^8.15.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
ajv@^6.12.4, ajv@^6.14.0:
version "6.14.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a"
integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
@@ -1542,16 +1542,21 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
baseline-browser-mapping@^2.8.3:
version "2.9.19"
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488"
integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==
balanced-match@^4.0.2:
version "4.0.4"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a"
integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==
baseline-browser-mapping@^2.9.0:
version "2.9.7"
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz#d36ce64f2a2c468f6f743c8db495d319120007db"
integrity sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==
baseline-browser-mapping@^2.9.19:
version "2.10.10"
resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz#e74bd066724c1d8d7d8ea75fc3be25389a7a5c56"
integrity sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==
bcryptjs@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
@@ -1570,13 +1575,20 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
brace-expansion@^2.0.1:
brace-expansion@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7"
integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==
dependencies:
balanced-match "^1.0.0"
brace-expansion@^5.0.2:
version "5.0.5"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb"
integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==
dependencies:
balanced-match "^4.0.2"
braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
@@ -2035,12 +2047,12 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-next@16.1.6:
version "16.1.6"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-16.1.6.tgz#75dd33bf32eb34b1e5be59f546e3c808429bab41"
integrity sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==
eslint-config-next@16.2.1:
version "16.2.1"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-16.2.1.tgz#d3b6fe5076979285a2b607c70e469dc167b43237"
integrity sha512-qhabwjQZ1Mk53XzXvmogf8KQ0tG0CQXF0CZ56+2/lVhmObgmaqj7x5A1DSrWdZd3kwI7GTPGUjFne+krRxYmFg==
dependencies:
"@next/eslint-plugin-next" "16.1.6"
"@next/eslint-plugin-next" "16.2.1"
eslint-import-resolver-node "^0.3.6"
eslint-import-resolver-typescript "^3.5.2"
eslint-plugin-import "^2.32.0"
@@ -2342,10 +2354,10 @@ flat-cache@^4.0.0:
flatted "^3.2.9"
keyv "^4.5.4"
flatted@^3.2.9:
version "3.3.3"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358"
integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==
flatted@^3.2.9, flatted@^3.4.2:
version "3.4.2"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726"
integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==
for-each@^0.3.3, for-each@^0.3.5:
version "0.3.5"
@@ -3065,26 +3077,26 @@ micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
minimatch@*, minimatch@^10.0.3:
version "10.1.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55"
integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==
dependencies:
"@isaacs/brace-expansion" "^5.0.0"
minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
minimatch@*, minimatch@^3.1.2, minimatch@^3.1.3:
version "3.1.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e"
integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==
dependencies:
brace-expansion "^1.1.7"
minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
minimatch@^10.2.3:
version "10.2.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde"
integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==
dependencies:
brace-expansion "^2.0.1"
brace-expansion "^5.0.2"
minimatch@^9.0.4, minimatch@^9.0.5:
version "9.0.9"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e"
integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==
dependencies:
brace-expansion "^2.0.2"
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.8"
@@ -3153,27 +3165,27 @@ next-themes@^0.2.1:
resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45"
integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==
next@16.1.6:
version "16.1.6"
resolved "https://registry.yarnpkg.com/next/-/next-16.1.6.tgz#24a861371cbe211be7760d9a89ddf2415e3824de"
integrity sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==
next@16.2.1:
version "16.2.1"
resolved "https://registry.yarnpkg.com/next/-/next-16.2.1.tgz#8e3ee1051f900e2a52e5978fc1cc3bbd7fe76cad"
integrity sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==
dependencies:
"@next/env" "16.1.6"
"@next/env" "16.2.1"
"@swc/helpers" "0.5.15"
baseline-browser-mapping "^2.8.3"
baseline-browser-mapping "^2.9.19"
caniuse-lite "^1.0.30001579"
postcss "8.4.31"
styled-jsx "5.1.6"
optionalDependencies:
"@next/swc-darwin-arm64" "16.1.6"
"@next/swc-darwin-x64" "16.1.6"
"@next/swc-linux-arm64-gnu" "16.1.6"
"@next/swc-linux-arm64-musl" "16.1.6"
"@next/swc-linux-x64-gnu" "16.1.6"
"@next/swc-linux-x64-musl" "16.1.6"
"@next/swc-win32-arm64-msvc" "16.1.6"
"@next/swc-win32-x64-msvc" "16.1.6"
sharp "^0.34.4"
"@next/swc-darwin-arm64" "16.2.1"
"@next/swc-darwin-x64" "16.2.1"
"@next/swc-linux-arm64-gnu" "16.2.1"
"@next/swc-linux-arm64-musl" "16.2.1"
"@next/swc-linux-x64-gnu" "16.2.1"
"@next/swc-linux-x64-musl" "16.2.1"
"@next/swc-win32-arm64-msvc" "16.2.1"
"@next/swc-win32-x64-msvc" "16.2.1"
sharp "^0.34.5"
node-addon-api@^7.0.0:
version "7.1.1"
@@ -3713,7 +3725,7 @@ set-proto@^1.0.0:
es-errors "^1.3.0"
es-object-atoms "^1.0.0"
sharp@^0.34.4:
sharp@^0.34.5:
version "0.34.5"
resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0"
integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==
@@ -3839,16 +3851,8 @@ stop-iteration-iterator@^1.1.0:
es-errors "^1.3.0"
internal-slot "^1.1.0"
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0:
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
name string-width-cjs
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -3934,14 +3938,8 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
name strip-ansi-cjs
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -4002,10 +4000,10 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
systeminformation@^5.27.14:
version "5.30.7"
resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.30.7.tgz#7708ac4680a90c183dfb7342d1577045a1d6cc08"
integrity sha512-33B/cftpaWdpvH+Ho9U1b08ss8GQuLxrWHelbJT1yw4M48Taj8W3ezcPuaLoIHZz5V6tVHuQPr5BprEfnBLBMw==
systeminformation@^5.31.0:
version "5.31.5"
resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.31.5.tgz#e839fa6b40620a8bee010eb9d9d55c2d5f7042c8"
integrity sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==
tailwind-merge@^2.0.0:
version "2.6.0"