Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3737543766 | ||
|
|
85547277d1 | ||
|
|
31a7559b86 | ||
|
|
b59921b843 | ||
|
|
95c126f2c6 | ||
|
|
7ea9c00c18 | ||
|
|
3651585271 | ||
|
|
22732e33e5 | ||
|
|
9caf72aae7 | ||
|
|
5b23f7d13a | ||
|
|
59e5c0306f | ||
|
|
baedc001d9 | ||
|
|
6469aa2350 | ||
|
|
d4765c1e7f | ||
|
|
4bba516fdf | ||
|
|
ddde9992c5 | ||
|
|
c81612e39b | ||
|
|
993739ab8e |
@@ -4,8 +4,7 @@ DATABASE_URL="file:./database/db.sqlite"
|
||||
# You can generate a new secret on the command line with:
|
||||
# openssl rand -base64 32
|
||||
# https://next-auth.js.org/configuration/options#secret
|
||||
NEXTAUTH_URL="http://localhost:3000"
|
||||
|
||||
AUTH_TRUST_HOST="true"
|
||||
NEXTAUTH_SECRET="anything"
|
||||
|
||||
# Disable analytics
|
||||
|
||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -11,7 +11,7 @@
|
||||
"layout.manage.navigation.**",
|
||||
],
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.organizeImports": true
|
||||
"source.organizeImports": "explicit"
|
||||
},
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"explorer.fileNesting.patterns": {
|
||||
|
||||
@@ -52,7 +52,7 @@ EXPOSE $PORT
|
||||
ENV PORT=${PORT}
|
||||
|
||||
ENV DATABASE_URL "file:/data/db.sqlite"
|
||||
ENV NEXTAUTH_URL "http://localhost:7575"
|
||||
ENV AUTH_TRUST_HOST="true"
|
||||
ENV PORT 7575
|
||||
ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
|
||||
|
||||
|
||||
@@ -432,7 +432,7 @@
|
||||
"type": "notebook",
|
||||
"properties": {
|
||||
"showToolbar": true,
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/introduction/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/getting-started/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
|
||||
},
|
||||
"area": {
|
||||
"type": "wrapper",
|
||||
@@ -510,4 +510,4 @@
|
||||
"allowGuests": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
// This file is used to migrate the database to the current version
|
||||
// It is run when the docker container starts
|
||||
import Database from 'better-sqlite3';
|
||||
import dotenv from 'dotenv';
|
||||
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
||||
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
|
||||
const Database = require('better-sqlite3');
|
||||
const path = require('path');
|
||||
const dotenv = require('dotenv');
|
||||
const { drizzle } = require('drizzle-orm/better-sqlite3');
|
||||
const { migrate } = require('drizzle-orm/better-sqlite3/migrator');
|
||||
|
||||
const migrationsFolder = process.argv[2] ?? '../drizzle';
|
||||
|
||||
dotenv.config({ path: __dirname + '/../.env' });
|
||||
|
||||
dotenv.config({ path: path.join(__dirname, '/../.env') });
|
||||
const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
|
||||
|
||||
const db = drizzle(sqlite);
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
"license": "MIT",
|
||||
"description": "This package.json is used for the migration script the dependencies are only installed within the Dockerfile.",
|
||||
"scripts": {
|
||||
"db:migrate": "ts-node ./migrate.ts"
|
||||
"db:migrate": "tsx ./migrate.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/better-sqlite3": "^7.6.7",
|
||||
"better-sqlite3": "8.6.0",
|
||||
"drizzle-orm": "^0.28.6",
|
||||
"dotenv": "^16.3.1",
|
||||
"ts-node": "^10.9.1",
|
||||
"tsx": "4.19.1",
|
||||
"typescript": "^5.2.2"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "homarr",
|
||||
"version": "0.15.4",
|
||||
"version": "0.15.9",
|
||||
"description": "Homarr - A homepage for your server.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -11,7 +11,7 @@
|
||||
"dev": "next dev",
|
||||
"build": "NEXTAUTH_SECRET=WILL_BE_OVERWRITTEN next build",
|
||||
"analyze": "ANALYZE=true next build",
|
||||
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite NEXTAUTH_URL=http://WILL_BE_OVERWRITTEN turbo build",
|
||||
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite turbo build",
|
||||
"start": "next start",
|
||||
"typecheck": "tsc --noEmit",
|
||||
"export": "next build && next export",
|
||||
@@ -25,7 +25,7 @@
|
||||
"test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage",
|
||||
"docker:build": "turbo build && docker build . -t homarr:local-dev",
|
||||
"docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev",
|
||||
"db:migrate": "dotenv ts-node drizzle/migrate/migrate.ts ./drizzle"
|
||||
"db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ctrl/deluge": "^4.1.0",
|
||||
@@ -151,7 +151,7 @@
|
||||
"node-mocks-http": "^1.12.2",
|
||||
"prettier": "^3.0.0",
|
||||
"sass": "^1.56.1",
|
||||
"ts-node": "latest",
|
||||
"tsx": "4.19.1",
|
||||
"turbo": "^1.10.12",
|
||||
"typescript": "5.1.6",
|
||||
"video.js": "^8.0.3",
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
},
|
||||
"info": {
|
||||
"uptime": "Χρόνος Λειτουργίας",
|
||||
"uptimeFormat": "",
|
||||
"uptimeFormat": "{{days}} ημέρες, {{hours}} ώρες, {{minutes}} λεπτά",
|
||||
"updates": "Διαθέσιμες ενημερώσεις",
|
||||
"reboot": "Επανεκκίνηση"
|
||||
},
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
}
|
||||
},
|
||||
"modal": {
|
||||
"text": "",
|
||||
"label": "Your error",
|
||||
"reportButton": "Report this error"
|
||||
"text": "The widet crashed unexpectitly. Please read the documentation and fix any typos.",
|
||||
"label": "Occurred error",
|
||||
"reportButton": "Report this error on GitHub"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
},
|
||||
"afterLoginRedirection": "Après la connexion, vous serez redirigé vers {{url}}",
|
||||
"providersEmpty": {
|
||||
"title": "Erreur de fournisseur d'authentification",
|
||||
"title": "Erreur du fournisseur d'authentification",
|
||||
"message": "Le(s) fournisseur(s) n'est (ne sont) pas défini(s), veuillez vérifier les journaux pour plus d'informations."
|
||||
}
|
||||
},
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"backToBoard": "Retour au tableau de bord",
|
||||
"settings": {
|
||||
"appearance": {
|
||||
"primaryColor": "Couleur primaire",
|
||||
"primaryColor": "Couleur principale",
|
||||
"secondaryColor": "Couleur secondaire"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
},
|
||||
"afterLoginRedirection": "Після входу ви будете перенаправлені на сайт {{url}}",
|
||||
"providersEmpty": {
|
||||
"title": "",
|
||||
"message": ""
|
||||
"title": "Помилка постачальника авторизації",
|
||||
"message": "Постачальник(и) не налаштовано, перевірте свої журнали для отримання додаткової інформації."
|
||||
}
|
||||
},
|
||||
"alert": "Ваші облікові дані невірні або такого облікового запису не існує. Будь ласка, спробуйте ще раз."
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"save": "Зберегти",
|
||||
"apply": "",
|
||||
"insert": "",
|
||||
"apply": "Застосувати",
|
||||
"insert": "Вставити",
|
||||
"about": "Про програму",
|
||||
"cancel": "Скасувати",
|
||||
"close": "Закрити",
|
||||
@@ -13,11 +13,11 @@
|
||||
"previous": "Попередній",
|
||||
"confirm": "Підтвердити",
|
||||
"enabled": "Увімкнено",
|
||||
"duplicate": "",
|
||||
"duplicate": "Дублікат",
|
||||
"disabled": "Вимкнено",
|
||||
"enableAll": "Увімкнути все",
|
||||
"disableAll": "Вимкнути усе",
|
||||
"setTimer": "",
|
||||
"setTimer": "Встановити таймер",
|
||||
"version": "Версія",
|
||||
"changePosition": "Змінити положення",
|
||||
"remove": "Видалити",
|
||||
@@ -47,7 +47,7 @@
|
||||
"seeMore": "Побачити більше...",
|
||||
"position": {
|
||||
"left": "Ліворуч.",
|
||||
"center": "",
|
||||
"center": "Центр",
|
||||
"right": "Так."
|
||||
},
|
||||
"attributes": {
|
||||
@@ -55,5 +55,5 @@
|
||||
"height": "Висота"
|
||||
},
|
||||
"public": "Публічний",
|
||||
"restricted": ""
|
||||
"restricted": "Обмежено"
|
||||
}
|
||||
@@ -22,5 +22,5 @@
|
||||
"message": "Створено категорію \"{{name}}\""
|
||||
}
|
||||
},
|
||||
"importFromDocker": ""
|
||||
"importFromDocker": "Імпортувати з docker"
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"title": "Інструменти",
|
||||
"items": {
|
||||
"docker": "Docker",
|
||||
"api": ""
|
||||
"api": "API"
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
"key": "Гарячі клавіши",
|
||||
"action": "Дії",
|
||||
"keybinds": "Сполучення клавіш",
|
||||
"translators": "",
|
||||
"translatorsDescription": "",
|
||||
"contributors": "",
|
||||
"contributorsDescription": "",
|
||||
"translators": "Перекладачі ({{count}})",
|
||||
"translatorsDescription": "Завдяки цим людям Homarr доступний {{languages}} мовами! Хочете допомогти перекласти Homarr своєю мовою? Прочитайте, як це зробити <a>тут</a>.",
|
||||
"contributors": "Учасники ({{count}})",
|
||||
"contributorsDescription": "Ці люди створили код, завдяки якому homarr працює! Хочете допомогти побудувати Homarr? Прочитайте, як це зробити <a>тут</a>",
|
||||
"actions": {
|
||||
"toggleTheme": "Перемикання світлого/темного режиму",
|
||||
"focusSearchBar": "Зосередьтеся на рядку пошуку",
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
"externalAddress": {
|
||||
"label": "Зовнішня адреса",
|
||||
"description": "URL-адреса відкриється в браузері при натисканні на додаток.",
|
||||
"tooltip": ""
|
||||
"tooltip": "Ви можете використовувати декілька змінних для створення динамічних адрес:<br><br><b>[homarr_base]</b>: повна адреса, за винятком порту і шляху. <i>(Приклад: 'https://subdomain.homarr.dev')</i><br><b>[homarr_hostname]</b>: повна базова адреса, включаючи поточний субдомен. <i>(Приклад: 'subdomain.homarr.dev')</i><br><b>[homarr_domain]</b>: домен з відфільтрованим субдоменом. <i>(Приклад: `homarr.dev')</i><br><b>[homarr_protocol]</b>: <i>http/https</i><br><br>Всі ці змінні залежать від поточного url."
|
||||
}
|
||||
},
|
||||
"behaviour": {
|
||||
|
||||
@@ -16,15 +16,15 @@
|
||||
"label": "Видалити назавжди",
|
||||
"disabled": "Видалення вимкнено, оскільки старіші компоненти Homarr не дозволяють видаляти конфігурацію за замовчуванням. Видалення буде можливим у майбутньому."
|
||||
},
|
||||
"duplicate": "",
|
||||
"duplicate": "Дублікат",
|
||||
"rename": {
|
||||
"label": "",
|
||||
"label": "Перейменувати",
|
||||
"modal": {
|
||||
"title": "",
|
||||
"title": "Перейменувати дошку {{name}}",
|
||||
"fields": {
|
||||
"name": {
|
||||
"label": "",
|
||||
"placeholder": ""
|
||||
"label": "Нова назва",
|
||||
"placeholder": "Нова назва дошки"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
},
|
||||
"filter": {
|
||||
"roles": {
|
||||
"all": "",
|
||||
"normal": "",
|
||||
"admin": "",
|
||||
"owner": ""
|
||||
"all": "Усе",
|
||||
"normal": "Нормально",
|
||||
"admin": "Адміністратор",
|
||||
"owner": "Власник"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"metaTitle": "",
|
||||
"back": "",
|
||||
"metaTitle": "Користувач {{username}}",
|
||||
"back": "Повернутися до керування користувачами",
|
||||
"sections": {
|
||||
"general": {
|
||||
"title": "Загальне",
|
||||
@@ -14,40 +14,40 @@
|
||||
}
|
||||
},
|
||||
"security": {
|
||||
"title": "",
|
||||
"title": "Безпека",
|
||||
"inputs": {
|
||||
"password": {
|
||||
"label": ""
|
||||
"label": "Новий пароль"
|
||||
},
|
||||
"terminateExistingSessions": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
"label": "Завершити поточні сесії",
|
||||
"description": "Змушує користувача повторно входити в систему на своїх пристроях"
|
||||
},
|
||||
"confirm": {
|
||||
"label": "Підтвердити",
|
||||
"description": ""
|
||||
"description": "Пароль буде оновлено. Дію не можна скасувати."
|
||||
}
|
||||
}
|
||||
},
|
||||
"roles": {
|
||||
"title": "",
|
||||
"currentRole": "",
|
||||
"title": "Ролі",
|
||||
"currentRole": "Поточна роль: ",
|
||||
"badges": {
|
||||
"owner": "",
|
||||
"admin": "",
|
||||
"normal": ""
|
||||
"owner": "Власник",
|
||||
"admin": "Адміністратор",
|
||||
"normal": "Нормально"
|
||||
}
|
||||
},
|
||||
"deletion": {
|
||||
"title": "",
|
||||
"title": "Видалення облікового запису",
|
||||
"inputs": {
|
||||
"confirmUsername": {
|
||||
"label": "",
|
||||
"description": ""
|
||||
"label": "Підтвердіть ім'я користувача",
|
||||
"description": "Введіть ім'я користувача для підтвердження видалення"
|
||||
},
|
||||
"confirm": {
|
||||
"label": "Видалити назавжди",
|
||||
"description": ""
|
||||
"description": "Я усвідомлюю, що ця дія є безстроковою і всі дані облікового запису будуть втрачені."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
"settings": {
|
||||
"title": "Налаштування віджету дати й часу",
|
||||
"timezone": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Часовий пояс",
|
||||
"info": "Виберіть назву свого часового поясу, знайдіть свій тут: "
|
||||
},
|
||||
"customTitle": {
|
||||
"label": ""
|
||||
"label": "Назва міста або власна назва"
|
||||
},
|
||||
"display24HourFormat": {
|
||||
"label": "Показувати повний час (24 години)"
|
||||
@@ -21,11 +21,11 @@
|
||||
}
|
||||
},
|
||||
"titleState": {
|
||||
"label": "",
|
||||
"info": "",
|
||||
"label": "Назва годинника",
|
||||
"info": "У віджеті можна показувати власну назву та код часового поясу.<br/>Ви також можете показувати лише місто, не показувати жодного,<br/>або навіть показувати лише часовий пояс, якщо вибрано обидва, але не вказано назву.",
|
||||
"data": {
|
||||
"both": "",
|
||||
"city": "",
|
||||
"both": "Назва та часовий пояс",
|
||||
"city": "Тільки назва",
|
||||
"none": "Нема"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,11 +131,11 @@
|
||||
"diskSize": "",
|
||||
"diskRatio": "",
|
||||
"uptime": "",
|
||||
"plugin": "",
|
||||
"ha": "",
|
||||
"sharedStorage": "",
|
||||
"localStorage": "",
|
||||
"na": ""
|
||||
"plugin": "Плагін",
|
||||
"ha": "Стан HA - {{haState}}",
|
||||
"sharedStorage": "Спільне сховище",
|
||||
"localStorage": "Локальне сховище",
|
||||
"na": "Н/Д"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Статус менеджера індексування",
|
||||
"description": "Статус про ваші індексування",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Статус менеджера індексування",
|
||||
"openIndexerSiteInNewTab": {
|
||||
"label": ""
|
||||
"label": "Відкрити Сайт індексування у новій вкладці"
|
||||
}
|
||||
}
|
||||
},
|
||||
"indexersStatus": {
|
||||
"title": "",
|
||||
"testAllButton": ""
|
||||
"title": "Менеджер індексації",
|
||||
"testAllButton": "Перевірте все"
|
||||
},
|
||||
"errors": {
|
||||
"general": {
|
||||
"title": "",
|
||||
"text": ""
|
||||
"title": "Не вдається знайти менеджера індексації",
|
||||
"text": "Виникла проблема підключення до вашого менеджера індексаторів. Будь ласка, перевірте вашу конфігурацію/інтеграцію(ї)."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,96 +1,96 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Перекодування медіа",
|
||||
"description": "Відображає інформацію про перекодування медіа",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Налаштування перекодування мультимедіа",
|
||||
"appId": {
|
||||
"label": ""
|
||||
"label": "Виберіть програму"
|
||||
},
|
||||
"defaultView": {
|
||||
"label": "",
|
||||
"label": "Вигляд за замовчуванням",
|
||||
"data": {
|
||||
"workers": "",
|
||||
"workers": "Робітники",
|
||||
"queue": "Черга",
|
||||
"statistics": ""
|
||||
"statistics": "Статистика"
|
||||
}
|
||||
},
|
||||
"showHealthCheck": {
|
||||
"label": ""
|
||||
"label": "Показувати індикатор перевірки працездатності"
|
||||
},
|
||||
"showHealthChecksInQueue": {
|
||||
"label": ""
|
||||
"label": "Показувати перевірки працездатності в черзі"
|
||||
},
|
||||
"queuePageSize": {
|
||||
"label": ""
|
||||
"label": "Черга: Елементи на сторінку"
|
||||
},
|
||||
"showAppIcon": {
|
||||
"label": ""
|
||||
"label": "Показати іконку програми в правому нижньому куті"
|
||||
}
|
||||
}
|
||||
},
|
||||
"noAppSelected": "",
|
||||
"noAppSelected": "Будь ласка, оберіть додаток у налаштуваннях віджету",
|
||||
"views": {
|
||||
"workers": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "",
|
||||
"name": "Файл",
|
||||
"eta": "Залишилося",
|
||||
"progress": "Прогрес"
|
||||
},
|
||||
"empty": "Пусто",
|
||||
"tooltip": {
|
||||
"transcode": "",
|
||||
"healthCheck": ""
|
||||
"transcode": "Перекодувати",
|
||||
"healthCheck": "Перевірка працездатності"
|
||||
}
|
||||
}
|
||||
},
|
||||
"queue": {
|
||||
"table": {
|
||||
"header": {
|
||||
"name": "",
|
||||
"name": "Файл",
|
||||
"size": "Розмір"
|
||||
},
|
||||
"footer": {
|
||||
"currentIndex": ""
|
||||
"currentIndex": "{{start}}-{{end}} від {{total}}"
|
||||
},
|
||||
"empty": "Пусто",
|
||||
"tooltip": {
|
||||
"transcode": "",
|
||||
"healthCheck": ""
|
||||
"transcode": "Перекодувати",
|
||||
"healthCheck": "Перевірка працездатності"
|
||||
}
|
||||
}
|
||||
},
|
||||
"statistics": {
|
||||
"empty": "Пусто",
|
||||
"box": {
|
||||
"transcodes": "",
|
||||
"healthChecks": "",
|
||||
"files": "",
|
||||
"spaceSaved": ""
|
||||
"transcodes": "Перекодує: {{value}}",
|
||||
"healthChecks": "Перевірки працездатності: {{value}}",
|
||||
"files": "Файли: {{value}}",
|
||||
"spaceSaved": "Збережено: {{value}}"
|
||||
},
|
||||
"pies": {
|
||||
"transcodes": "",
|
||||
"healthChecks": "",
|
||||
"videoCodecs": "",
|
||||
"videoContainers": "",
|
||||
"videoResolutions": ""
|
||||
"transcodes": "Перекодує",
|
||||
"healthChecks": "Перевірка працездатності",
|
||||
"videoCodecs": "Кодеки",
|
||||
"videoContainers": "Контейнери",
|
||||
"videoResolutions": "Роздільна здатність"
|
||||
}
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Помилка",
|
||||
"message": ""
|
||||
"message": "Виникла помилка при отриманні даних з Tdarr."
|
||||
},
|
||||
"tabs": {
|
||||
"workers": "",
|
||||
"workers": "Робітники",
|
||||
"queue": "Черга",
|
||||
"statistics": ""
|
||||
"statistics": "Статистика"
|
||||
},
|
||||
"healthCheckStatus": {
|
||||
"title": "",
|
||||
"queued": "",
|
||||
"healthy": "",
|
||||
"unhealthy": ""
|
||||
"title": "Перевірка працездатності",
|
||||
"queued": "У черзі",
|
||||
"healthy": "Здоровий",
|
||||
"unhealthy": "Нездоровий"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +1,32 @@
|
||||
{
|
||||
"entityNotFound": "",
|
||||
"entityNotFound": "Об'єкт не знайдено",
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Home Assistant об'єкт",
|
||||
"description": "Поточний стан об'єкта в Home Assistant",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Стан об'єкта",
|
||||
"entityId": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Ідентифікатор об'єкта",
|
||||
"info": "Унікальний ідентифікатор сутності в Home Assistant. Скопіюйте, натиснувши на об'єкт > Натисніть на значок гвинтика > Натисніть на кнопку копіювання в \"Ідентифікаторі об'єкта\". Деякі користувацькі об'єкти можуть не підтримуватися."
|
||||
},
|
||||
"appendUnit": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Додайте одиницю виміру",
|
||||
"info": "Додайте атрибут одиниці виміру до стану об'єкта."
|
||||
},
|
||||
"automationId": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Додатковий ідентифікатор автоматизації",
|
||||
"info": "Ваш унікальний ідентифікатор автоматизації. Завжди починається з automation.XXXXX. Якщо не встановлено, віджет не буде клікабельним, а лише показуватиме стан. Після натискання стан об'єкта буде оновлено."
|
||||
},
|
||||
"displayName": {
|
||||
"label": ""
|
||||
"label": "Відображати ім'я"
|
||||
},
|
||||
"displayFriendlyName": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Відображати зрозуміле ім'я",
|
||||
"info": "Замість відображуваного імені відображати зрозуміле ім’я від Home Assistant."
|
||||
},
|
||||
"genericToggle": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Перемикач об'єкту",
|
||||
"info": "Виконайте загальну дію перемикання Home Assistant над об’єктом після натискання."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"descriptor": {
|
||||
"name": "",
|
||||
"description": "",
|
||||
"name": "Автоматизація Home Assistant",
|
||||
"description": "Виконати автоматизацію",
|
||||
"settings": {
|
||||
"title": "",
|
||||
"title": "Виконати автоматизацію",
|
||||
"automationId": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Ідентифікатор автоматизації",
|
||||
"info": "Ваш унікальний ідентифікатор автоматизації. Завжди починається з automation.XXXXX."
|
||||
},
|
||||
"displayName": {
|
||||
"label": ""
|
||||
"label": "Відображати ім'я"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"label": "Відображати завершені торренти"
|
||||
},
|
||||
"displayActiveTorrents": {
|
||||
"label": ""
|
||||
"label": "Відображати активні торренти"
|
||||
},
|
||||
"speedLimitOfActiveTorrents": {
|
||||
"label": ""
|
||||
"label": "Швидкість завантаження, щоб вважати торрент активним (кБ/с)"
|
||||
},
|
||||
"displayStaleTorrents": {
|
||||
"label": "Відображати застарілі торренти"
|
||||
@@ -27,19 +27,19 @@
|
||||
"description": "Якщо позначено опцію \"білий список\", він буде діяти як білий список. Якщо не позначено, це чорний список. Нічого не робитиме, якщо порожній"
|
||||
},
|
||||
"displayRatioWithFilter": {
|
||||
"label": "",
|
||||
"info": ""
|
||||
"label": "Відображати співвідношення відфільтрованих списків торрентів",
|
||||
"info": "Якщо цю опцію вимкнено, буде показано лише глобальне співвідношення. Глобальне співвідношення все одно використовуватиме мітки, якщо встановлено"
|
||||
},
|
||||
"columnOrdering": {
|
||||
"label": ""
|
||||
"label": "Увімкнути переупорядкування стовпців"
|
||||
},
|
||||
"rowSorting": {
|
||||
"label": ""
|
||||
"label": "Увімкнути сортування рядків"
|
||||
},
|
||||
"columns": {
|
||||
"label": "",
|
||||
"label": "Виберіть стовпці для відображення",
|
||||
"data": {
|
||||
"date": "",
|
||||
"date": "Дата додавання",
|
||||
"down": "Завантаження",
|
||||
"up": "Віддача",
|
||||
"eta": "Залишилося",
|
||||
@@ -47,7 +47,7 @@
|
||||
}
|
||||
},
|
||||
"nameColumnSize": {
|
||||
"label": ""
|
||||
"label": "Змінити розмір стовпчика назви"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -55,24 +55,24 @@
|
||||
"footer": {
|
||||
"error": "Помилка",
|
||||
"lastUpdated": "Востаннє оновлено {{time}} тому",
|
||||
"ratioGlobal": "",
|
||||
"ratioWithFilter": ""
|
||||
"ratioGlobal": "Глобальне співвідношення",
|
||||
"ratioWithFilter": "Співвідношення з фільтром"
|
||||
},
|
||||
"table": {
|
||||
"header": {
|
||||
"isCompleted": "",
|
||||
"isCompleted": "Завантаження",
|
||||
"name": "Ім’я",
|
||||
"dateAdded": "",
|
||||
"dateAdded": "Додано на",
|
||||
"size": "Розмір",
|
||||
"download": "Завантаження",
|
||||
"upload": "Віддача",
|
||||
"estimatedTimeOfArrival": "Залишилося",
|
||||
"progress": "Прогрес",
|
||||
"totalUploaded": "",
|
||||
"totalDownloaded": "",
|
||||
"ratio": "",
|
||||
"seeds": "",
|
||||
"peers": "",
|
||||
"totalUploaded": "Загальне завантаження",
|
||||
"totalDownloaded": "Загальне завантаження",
|
||||
"ratio": "Співвідношення",
|
||||
"seeds": "Сідери (підключено)",
|
||||
"peers": "Піри (підключено)",
|
||||
"label": "",
|
||||
"state": "Стан",
|
||||
"stateMessage": ""
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"label": "Показувати назву міста"
|
||||
},
|
||||
"displayWeekly": {
|
||||
"label": ""
|
||||
"label": "Показати тижневий прогноз"
|
||||
},
|
||||
"forecastDays": {
|
||||
"label": ""
|
||||
"label": "Дні для відображення"
|
||||
},
|
||||
"location": {
|
||||
"label": "Погодна локація"
|
||||
|
||||
@@ -19,26 +19,26 @@
|
||||
"label": "Фон"
|
||||
},
|
||||
"backgroundImageAttachment": {
|
||||
"label": "",
|
||||
"label": "Прикріплене фонове зображення",
|
||||
"options": {
|
||||
"fixed": "",
|
||||
"scroll": ""
|
||||
"fixed": "Фіксований - фон залишається в тому самому положенні (рекомендовано)",
|
||||
"scroll": "Прокручування – фонове прокручування за допомогою миші"
|
||||
}
|
||||
},
|
||||
"backgroundImageSize": {
|
||||
"label": "",
|
||||
"label": "Розмір фонового зображення",
|
||||
"options": {
|
||||
"cover": "",
|
||||
"contain": ""
|
||||
"cover": "Обкладинка – Масштабує зображення до найменшого розміру, щоб охопити все вікно, обрізаючи зайвий простір. (рекомендовано)",
|
||||
"contain": "Вмістити - Масштабує зображення до максимально можливого розміру в межах контейнера без обрізання або розтягування зображення."
|
||||
}
|
||||
},
|
||||
"backgroundImageRepeat": {
|
||||
"label": "",
|
||||
"label": "Прикріплене фонове зображення",
|
||||
"options": {
|
||||
"repeat": "",
|
||||
"no-repeat": "",
|
||||
"repeat-x": "",
|
||||
"repeat-y": ""
|
||||
"repeat": "Повторювати - Зображення повторюється стільки разів, скільки потрібно, щоб покрити всю область зафарбовування фонового зображення.",
|
||||
"no-repeat": "Без повтору - Зображення не повторюється і може не заповнювати весь простір (рекомендовано)",
|
||||
"repeat-x": "Повторити X - Те саме, що й \"Повторити\", але тільки на горизонтальній осі.",
|
||||
"repeat-y": "Повторити Y - Те саме, що й \"Повторити\", але тільки по вертикальній осі."
|
||||
}
|
||||
},
|
||||
"customCSS": {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"title": "Docker",
|
||||
"alerts": {
|
||||
"notConfigured": {
|
||||
"text": ""
|
||||
"text": "У вашому екземплярі Homarr не налаштовано Docker або не вдалося отримати контейнери. Будь ласка, зверніться до документації, щоб дізнатися, як налаштувати інтеграцію."
|
||||
}
|
||||
},
|
||||
"modals": {
|
||||
|
||||
@@ -108,18 +108,11 @@ const usePing = (app: AppType) => {
|
||||
configName: name ?? '',
|
||||
},
|
||||
{
|
||||
retry: true,
|
||||
retry: false,
|
||||
enabled: isActive,
|
||||
refetchOnWindowFocus: false,
|
||||
refetchInterval: 1000 * 60,
|
||||
retryDelay(failureCount, error) {
|
||||
console.error(`Unable to retry app ping for app '${app.name}' (${app.id})`, error);
|
||||
if (failureCount > 3) {
|
||||
return 60 * 1000;
|
||||
}
|
||||
return 3 * 1000;
|
||||
},
|
||||
cacheTime: 1000 * 60,
|
||||
cacheTime: 1000 * 30,
|
||||
retryOnMount: true,
|
||||
select: (data) => {
|
||||
const isOk = isStatusOk(app, data.status);
|
||||
|
||||
@@ -89,6 +89,7 @@ export const AppTile = ({ className, app }: AppTileProps) => {
|
||||
<UnstyledButton
|
||||
style={{ pointerEvents: isEditMode ? 'none' : 'auto' }}
|
||||
component="a"
|
||||
rel="noreferrer"
|
||||
href={href}
|
||||
target={app.behaviour.isOpeningNewTab ? '_blank' : '_self'}
|
||||
className={`${classes.button} ${classes.base}`}
|
||||
|
||||
@@ -13,6 +13,7 @@ import { useTranslation } from 'next-i18next';
|
||||
import { useRouter } from 'next/router';
|
||||
import { ReactNode, forwardRef, useMemo, useRef, useState } from 'react';
|
||||
import { useConfigContext } from '~/config/provider';
|
||||
import { useGetExternalUrl } from '~/hooks/useExternalUrl';
|
||||
import { api } from '~/utils/api';
|
||||
|
||||
import { MovieModal } from './Search/MovieModal';
|
||||
@@ -141,6 +142,7 @@ const getItemComponent = (icon: SearchAutoCompleteItem['icon']) => {
|
||||
|
||||
const useConfigApps = (search: string) => {
|
||||
const { config } = useConfigContext();
|
||||
const getHref = useGetExternalUrl();
|
||||
return useMemo(() => {
|
||||
if (search.trim().length === 0) return [];
|
||||
const apps = config?.apps.filter((app) =>
|
||||
@@ -153,7 +155,7 @@ const useConfigApps = (search: string) => {
|
||||
value: app.name,
|
||||
sort: 'app',
|
||||
metaData: {
|
||||
url: app.behaviour.externalUrl,
|
||||
url: getHref(app),
|
||||
},
|
||||
})) ?? []
|
||||
);
|
||||
|
||||
@@ -37,13 +37,6 @@ const env = createEnv({
|
||||
DATABASE_URL: z.string().url().default('file:../database/db.sqlite'),
|
||||
NEXTAUTH_SECRET:
|
||||
process.env.NODE_ENV === 'production' ? z.string().min(1) : z.string().min(1).optional(),
|
||||
NEXTAUTH_URL: z.preprocess(
|
||||
// This makes Vercel deployments not fail if you don't set NEXTAUTH_URL
|
||||
// Since NextAuth.js automatically uses the VERCEL_URL if present.
|
||||
(str) => process.env.VERCEL_URL ?? str,
|
||||
// VERCEL_URL doesn't include `https` so it cant be validated as a URL
|
||||
process.env.VERCEL ? z.string().min(1) : z.string().url()
|
||||
),
|
||||
DOCKER_HOST: z.string().optional(),
|
||||
DOCKER_PORT: portSchema,
|
||||
DEMO_MODE: z.string().optional(),
|
||||
@@ -136,7 +129,6 @@ const env = createEnv({
|
||||
runtimeEnv: {
|
||||
DATABASE_URL: process.env.DATABASE_URL,
|
||||
NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET,
|
||||
NEXTAUTH_URL: process.env.NEXTAUTH_URL,
|
||||
NEXT_PUBLIC_DISABLE_ANALYTICS: process.env.DISABLE_ANALYTICS,
|
||||
DOCKER_HOST: process.env.DOCKER_HOST,
|
||||
DOCKER_PORT: process.env.DOCKER_PORT,
|
||||
|
||||
@@ -3,6 +3,10 @@ import * as tldts from 'tldts';
|
||||
import { AppType } from '~/types/app';
|
||||
|
||||
export const useGetExternalUrl = () => {
|
||||
if (typeof window === 'undefined') {
|
||||
return (appType: AppType) => appType.behaviour.externalUrl || appType.url;
|
||||
}
|
||||
|
||||
const parsedUrl = useMemo(() => {
|
||||
try {
|
||||
return tldts.parse(window.location.toString());
|
||||
|
||||
@@ -1,29 +1,33 @@
|
||||
import { TRPCError } from '@trpc/server';
|
||||
import Consola from 'consola';
|
||||
import fs from 'fs';
|
||||
import { z } from 'zod';
|
||||
import Consola from 'consola';
|
||||
import { getDefaultBoardAsync } from '~/server/db/queries/userSettings';
|
||||
import { configExists } from '~/tools/config/configExists';
|
||||
import { getConfig } from '~/tools/config/getConfig';
|
||||
import { getFrontendConfig } from '~/tools/config/getFrontendConfig';
|
||||
import { writeConfig } from '~/tools/config/writeConfig';
|
||||
import { generateDefaultApp } from '~/tools/shared/app';
|
||||
import { configNameSchema } from '~/validations/boards';
|
||||
|
||||
import { adminProcedure, createTRPCRouter, protectedProcedure } from '../trpc';
|
||||
import { writeConfig } from '~/tools/config/writeConfig';
|
||||
import { configNameSchema } from '~/validations/boards';
|
||||
|
||||
export const boardRouter = createTRPCRouter({
|
||||
all: protectedProcedure
|
||||
.meta({ openapi: { method: 'GET', path: '/boards/all', tags: ['board'] } })
|
||||
.input(z.void())
|
||||
.output(z.array(z.object({
|
||||
name: z.string(),
|
||||
allowGuests: z.boolean(),
|
||||
countApps: z.number().min(0),
|
||||
countWidgets: z.number().min(0),
|
||||
countCategories: z.number().min(0),
|
||||
isDefaultForUser: z.boolean(),
|
||||
})))
|
||||
.output(
|
||||
z.array(
|
||||
z.object({
|
||||
name: z.string(),
|
||||
allowGuests: z.boolean(),
|
||||
countApps: z.number().min(0),
|
||||
countWidgets: z.number().min(0),
|
||||
countCategories: z.number().min(0),
|
||||
isDefaultForUser: z.boolean(),
|
||||
})
|
||||
)
|
||||
)
|
||||
.query(async ({ ctx }) => {
|
||||
const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));
|
||||
|
||||
@@ -44,7 +48,7 @@ export const boardRouter = createTRPCRouter({
|
||||
countCategories: config.categories.length,
|
||||
isDefaultForUser: name === defaultBoard,
|
||||
};
|
||||
}),
|
||||
})
|
||||
);
|
||||
}),
|
||||
addAppsForContainers: adminProcedure
|
||||
@@ -58,9 +62,9 @@ export const boardRouter = createTRPCRouter({
|
||||
name: z.string(),
|
||||
icon: z.string().optional(),
|
||||
port: z.number().optional(),
|
||||
}),
|
||||
})
|
||||
),
|
||||
}),
|
||||
})
|
||||
)
|
||||
.mutation(async ({ input }) => {
|
||||
if (!configExists(input.boardName)) {
|
||||
@@ -101,12 +105,14 @@ export const boardRouter = createTRPCRouter({
|
||||
const targetPath = `data/configs/${input.boardName}.json`;
|
||||
fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');
|
||||
}),
|
||||
renameBoard: protectedProcedure
|
||||
renameBoard: adminProcedure
|
||||
.meta({ openapi: { method: 'PUT', path: '/boards/rename', tags: ['board'] } })
|
||||
.input(z.object({
|
||||
oldName: z.string(),
|
||||
newName: z.string().min(1),
|
||||
}))
|
||||
.input(
|
||||
z.object({
|
||||
oldName: configNameSchema,
|
||||
newName: configNameSchema,
|
||||
})
|
||||
)
|
||||
.output(z.void())
|
||||
.mutation(async ({ input }) => {
|
||||
if (input.oldName === 'default') {
|
||||
@@ -141,15 +147,19 @@ export const boardRouter = createTRPCRouter({
|
||||
fs.unlinkSync(targetPath);
|
||||
Consola.info(`Deleted ${input.oldName} from file system`);
|
||||
}),
|
||||
duplicateBoard: protectedProcedure
|
||||
duplicateBoard: adminProcedure
|
||||
.meta({ openapi: { method: 'POST', path: '/boards/duplicate', tags: ['board'] } })
|
||||
.input(z.object({
|
||||
boardName: z.string(),
|
||||
}))
|
||||
.input(
|
||||
z.object({
|
||||
boardName: z.string(),
|
||||
})
|
||||
)
|
||||
.output(z.void())
|
||||
.mutation(async ({ input }) => {
|
||||
if (!configExists(input.boardName)) {
|
||||
Consola.error(`Tried to duplicate ${input.boardName} but this configuration does not exist.`);
|
||||
Consola.error(
|
||||
`Tried to duplicate ${input.boardName} but this configuration does not exist.`
|
||||
);
|
||||
throw new TRPCError({
|
||||
code: 'NOT_FOUND',
|
||||
message: 'Board not found',
|
||||
@@ -164,7 +174,7 @@ export const boardRouter = createTRPCRouter({
|
||||
config.configProperties.name = targetName;
|
||||
writeConfig(config);
|
||||
|
||||
Consola.info(`Wrote config to name '${targetName}'`)
|
||||
Consola.info(`Wrote config to name '${targetName}'`);
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -185,7 +195,7 @@ const attemptGenerateDuplicateName = (baseName: string, maxAttempts: number) =>
|
||||
code: 'CONFLICT',
|
||||
message: 'Board conflicts with an existing board',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const generateDuplicateName = (baseName: string, increment: number) => {
|
||||
const result = duplicationName.exec(baseName);
|
||||
@@ -197,4 +207,4 @@ const generateDuplicateName = (baseName: string, increment: number) => {
|
||||
}
|
||||
|
||||
return `${baseName} (2)`;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -58,6 +58,7 @@ export const mediaRequestsRouter = createTRPCRouter({
|
||||
name: genericItem.name,
|
||||
userName: item.requestedBy.displayName,
|
||||
userProfilePicture: constructAvatarUrl(appUrl, item.requestedBy.avatar),
|
||||
fallbackUserProfilePicture: constructAvatarUrl(appUrl, item.requestedBy.avatar,'avatarproxy'),
|
||||
userLink: `${appUrl}/users/${item.requestedBy.id}`,
|
||||
userRequestCount: item.requestedBy.requestCount,
|
||||
airDate: genericItem.airDate,
|
||||
@@ -119,6 +120,7 @@ export const mediaRequestsRouter = createTRPCRouter({
|
||||
id: user.id,
|
||||
userName: user.displayName,
|
||||
userProfilePicture: constructAvatarUrl(appUrl, user.avatar),
|
||||
fallbackUserProfilePicture: constructAvatarUrl(appUrl, user.avatar,'avatarproxy'),
|
||||
userLink: `${appUrl}/users/${user.id}`,
|
||||
userRequestCount: user.requestCount,
|
||||
};
|
||||
@@ -137,14 +139,14 @@ export const mediaRequestsRouter = createTRPCRouter({
|
||||
}),
|
||||
});
|
||||
|
||||
const constructAvatarUrl = (appUrl: string, avatar: string) => {
|
||||
const constructAvatarUrl = (appUrl: string, avatar: string, path?: string) => {
|
||||
const isAbsolute = avatar.startsWith('http://') || avatar.startsWith('https://');
|
||||
|
||||
if (isAbsolute) {
|
||||
return avatar;
|
||||
}
|
||||
|
||||
return `${appUrl}/${avatar}`;
|
||||
return `${appUrl}/${path?.concat("/") ?? "" }${avatar}`;
|
||||
};
|
||||
|
||||
const retrieveDetailsForItem = async (
|
||||
|
||||
@@ -7,6 +7,7 @@ import { decode, encode } from 'next-auth/jwt';
|
||||
import { env } from '~/env';
|
||||
import { secondsFromTimeString } from '~/tools/client/parseDuration';
|
||||
import { adapter, getProviders, onCreateUser } from '~/utils/auth';
|
||||
import { createCookiesWithDefaultOptions } from '~/utils/auth/cookies';
|
||||
import { createRedirectUri } from '~/utils/auth/oidc';
|
||||
import EmptyNextAuthProvider from '~/utils/empty-provider';
|
||||
import { fromDate, generateSessionToken } from '~/utils/session';
|
||||
@@ -106,6 +107,7 @@ export const constructAuthOptions = async (
|
||||
},
|
||||
adapter: adapter as Adapter,
|
||||
providers: [...(await getProviders(req.headers)), EmptyNextAuthProvider()],
|
||||
cookies: createCookiesWithDefaultOptions(req.url?.startsWith('https:') ?? false),
|
||||
jwt: {
|
||||
async encode(params) {
|
||||
if (!isCredentialsRequest(req)) {
|
||||
|
||||
66
src/utils/auth/cookies.ts
Normal file
66
src/utils/auth/cookies.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
export const createCookiesWithDefaultOptions = (useSecureCookies: boolean) => {
|
||||
const cookiePrefix = useSecureCookies ? '__Secure-' : '';
|
||||
|
||||
return {
|
||||
// default cookie options
|
||||
sessionToken: {
|
||||
// We don't use __Secure prefix as the cookie is used in the code
|
||||
name: `next-auth.session-token`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
},
|
||||
},
|
||||
callbackUrl: {
|
||||
name: `${cookiePrefix}next-auth.callback-url`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
},
|
||||
},
|
||||
csrfToken: {
|
||||
// Default to __Host- for CSRF token for additional protection if using useSecureCookies
|
||||
// NB: The `__Host-` prefix is stricter than the `__Secure-` prefix.
|
||||
name: `${useSecureCookies ? '__Host-' : ''}next-auth.csrf-token`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
},
|
||||
},
|
||||
pkceCodeVerifier: {
|
||||
name: `${cookiePrefix}next-auth.pkce.code_verifier`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
maxAge: 60 * 15, // 15 minutes in seconds
|
||||
},
|
||||
},
|
||||
state: {
|
||||
name: `${cookiePrefix}next-auth.state`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
maxAge: 60 * 15, // 15 minutes in seconds
|
||||
},
|
||||
},
|
||||
nonce: {
|
||||
name: `${cookiePrefix}next-auth.nonce`,
|
||||
options: {
|
||||
httpOnly: true,
|
||||
sameSite: 'lax',
|
||||
path: '/',
|
||||
secure: useSecureCookies,
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
};
|
||||
@@ -1,8 +1,15 @@
|
||||
import { DEFAULT_THEME, MANTINE_COLORS, MantineColor } from '@mantine/core';
|
||||
import { z } from 'zod';
|
||||
import { BackgroundImageAttachment, BackgroundImageRepeat, BackgroundImageSize } from '~/types/settings';
|
||||
import {
|
||||
BackgroundImageAttachment,
|
||||
BackgroundImageRepeat,
|
||||
BackgroundImageSize,
|
||||
} from '~/types/settings';
|
||||
|
||||
export const configNameSchema = z.string().regex(/^[a-zA-Z0-9-_\s()]+$/);
|
||||
export const configNameSchema = z
|
||||
.string()
|
||||
.regex(/^[a-zA-Z0-9-_\s()]+$/)
|
||||
.min(1);
|
||||
|
||||
export const createBoardSchemaValidation = z.object({
|
||||
name: configNameSchema,
|
||||
|
||||
@@ -279,18 +279,20 @@ function DnsHoleControlsWidgetTile({ widget }: DnsHoleControlsWidgetProps) {
|
||||
{t(dnsHole.status)}
|
||||
</Badge>
|
||||
</UnstyledButton>
|
||||
<ActionIcon
|
||||
size={20}
|
||||
radius="xl"
|
||||
top="2.67px"
|
||||
variant="default"
|
||||
onClick={() => {
|
||||
setAppId(app.id);
|
||||
open();
|
||||
}}
|
||||
>
|
||||
<IconClockPause size={20} color="red" />
|
||||
</ActionIcon>
|
||||
{enableControls && (
|
||||
<ActionIcon
|
||||
size={20}
|
||||
radius="xl"
|
||||
top="2.67px"
|
||||
variant="default"
|
||||
onClick={() => {
|
||||
setAppId(app.id);
|
||||
open();
|
||||
}}
|
||||
>
|
||||
<IconClockPause size={20} color="red" />
|
||||
</ActionIcon>
|
||||
)}
|
||||
</Flex>
|
||||
</Stack>
|
||||
</Group>
|
||||
|
||||
@@ -41,12 +41,12 @@ export function TimerModal({ toggleDns, getDnsStatus, opened, close, appId }: Ti
|
||||
setHours(0);
|
||||
setMinutes(0);
|
||||
}}
|
||||
title={t('modules/dns-hole-controls:durationModal.title')}
|
||||
title={t('durationModal.title')}
|
||||
>
|
||||
<Flex direction="column" align="center" justify="center">
|
||||
<Stack align="flex-end">
|
||||
<Group spacing={5}>
|
||||
<Text>{t('modules/dns-hole-controls:durationModal.hours')}</Text>
|
||||
<Text>{t('durationModal.hours')}</Text>
|
||||
<ActionIcon
|
||||
size={35}
|
||||
variant="default"
|
||||
@@ -73,7 +73,7 @@ export function TimerModal({ toggleDns, getDnsStatus, opened, close, appId }: Ti
|
||||
</ActionIcon>
|
||||
</Group>
|
||||
<Group spacing={5}>
|
||||
<Text>{t('modules/dns-hole-controls:durationModal.minutes')}</Text>
|
||||
<Text>{t('durationModal.minutes')}</Text>
|
||||
<ActionIcon
|
||||
size={35}
|
||||
variant="default"
|
||||
@@ -101,7 +101,7 @@ export function TimerModal({ toggleDns, getDnsStatus, opened, close, appId }: Ti
|
||||
</Group>
|
||||
</Stack>
|
||||
<Text ta="center" c="dimmed" my={5}>
|
||||
{t('modules/dns-hole-controls:durationModal.unlimited')}
|
||||
{t('durationModal.unlimited')}
|
||||
</Text>
|
||||
<Button
|
||||
variant="light"
|
||||
@@ -116,7 +116,7 @@ export function TimerModal({ toggleDns, getDnsStatus, opened, close, appId }: Ti
|
||||
close();
|
||||
}}
|
||||
>
|
||||
{t('modules/dns-hole-controls:durationModal.set')}
|
||||
{t('durationModal.set')}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Modal>
|
||||
|
||||
@@ -5,6 +5,20 @@ import { useTranslation } from 'next-i18next';
|
||||
import { defineWidget } from '../helper';
|
||||
import { IWidget } from '../widgets';
|
||||
|
||||
function sanitizeUrl(url: string) {
|
||||
let parsedUrl: URL;
|
||||
try {
|
||||
parsedUrl = new URL(url);
|
||||
} catch (e) {
|
||||
return 'about:blank';
|
||||
}
|
||||
if (['http:', 'https:'].includes(parsedUrl.protocol)) {
|
||||
return parsedUrl.href;
|
||||
} else {
|
||||
throw new Error(`Protocol '${parsedUrl.protocol}' is not supported. Use HTTP or HTTPS.`);
|
||||
}
|
||||
}
|
||||
|
||||
const definition = defineWidget({
|
||||
id: 'iframe',
|
||||
icon: IconBrowser,
|
||||
@@ -117,7 +131,7 @@ function IFrameTile({ widget }: IFrameTileProps) {
|
||||
<Container h="100%" w="100%" maw="initial" mah="initial" p={0}>
|
||||
<iframe
|
||||
className={classes.iframe}
|
||||
src={widget.properties.embedUrl}
|
||||
src={sanitizeUrl(widget.properties.embedUrl)}
|
||||
title="widget iframe"
|
||||
allow={allowedPermissions.join(' ')}
|
||||
>
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
Stack,
|
||||
Text,
|
||||
Tooltip,
|
||||
Avatar,
|
||||
useMantineTheme,
|
||||
} from '@mantine/core';
|
||||
import { notifications } from '@mantine/notifications';
|
||||
@@ -170,14 +171,17 @@ function MediaRequestListTile({ widget }: MediaRequestListWidgetProps) {
|
||||
</Flex>
|
||||
<Stack justify="center">
|
||||
<Flex gap="xs">
|
||||
<Image
|
||||
<Avatar
|
||||
src={item.userProfilePicture}
|
||||
width={25}
|
||||
height={25}
|
||||
size={25}
|
||||
alt="requester avatar"
|
||||
radius="xl"
|
||||
withPlaceholder
|
||||
/>
|
||||
>
|
||||
<Image
|
||||
src={item.fallbackUserProfilePicture}
|
||||
alt="requester avatar"
|
||||
/>
|
||||
</Avatar>
|
||||
<Anchor
|
||||
href={item.userLink}
|
||||
target={widget.properties.openInNewTab ? '_blank' : '_self'}
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
Stack,
|
||||
Text,
|
||||
Tooltip,
|
||||
Image,
|
||||
useMantineTheme,
|
||||
} from '@mantine/core';
|
||||
import { useElementSize } from '@mantine/hooks';
|
||||
@@ -163,7 +164,9 @@ function MediaRequestStatsTile({ widget }: MediaRequestStatsWidgetProps) {
|
||||
/>
|
||||
</Tooltip.Floating>
|
||||
)}
|
||||
<Avatar radius="xl" size={45} src={user.userProfilePicture} alt="user avatar" />
|
||||
<Avatar radius="xl" size={45} src={user.userProfilePicture} alt="user avatar" >
|
||||
<Image src={user.fallbackUserProfilePicture} alt="user avatar" />
|
||||
</Avatar>
|
||||
<Stack spacing={0} style={{ flex: 1 }}>
|
||||
<Text>{user.userName}</Text>
|
||||
<Text size="xs">
|
||||
|
||||
@@ -7,6 +7,7 @@ export type MediaRequest = {
|
||||
name: string;
|
||||
userName: string;
|
||||
userProfilePicture: string;
|
||||
fallbackUserProfilePicture: string;
|
||||
userLink: string;
|
||||
userRequestCount: number;
|
||||
airDate?: string;
|
||||
@@ -22,6 +23,7 @@ export type Users = {
|
||||
id: number;
|
||||
userName: string;
|
||||
userProfilePicture: string;
|
||||
fallbackUserProfilePicture: string;
|
||||
userLink: string;
|
||||
userRequestCount: number;
|
||||
};
|
||||
|
||||
410
yarn.lock
410
yarn.lock
@@ -364,15 +364,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cspotcode/source-map-support@npm:^0.8.0":
|
||||
version: 0.8.1
|
||||
resolution: "@cspotcode/source-map-support@npm:0.8.1"
|
||||
dependencies:
|
||||
"@jridgewell/trace-mapping": 0.3.9
|
||||
checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@ctrl/deluge@npm:^4.1.0":
|
||||
version: 4.3.1
|
||||
resolution: "@ctrl/deluge@npm:4.3.1"
|
||||
@@ -632,6 +623,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/aix-ppc64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/aix-ppc64@npm:0.23.1"
|
||||
conditions: os=aix & cpu=ppc64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-arm64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/android-arm64@npm:0.18.20"
|
||||
@@ -639,6 +637,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/android-arm64@npm:0.23.1"
|
||||
conditions: os=android & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-arm@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/android-arm@npm:0.18.20"
|
||||
@@ -646,6 +651,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-arm@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/android-arm@npm:0.23.1"
|
||||
conditions: os=android & cpu=arm
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/android-x64@npm:0.18.20"
|
||||
@@ -653,6 +665,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/android-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/android-x64@npm:0.23.1"
|
||||
conditions: os=android & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/darwin-arm64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/darwin-arm64@npm:0.18.20"
|
||||
@@ -660,6 +679,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/darwin-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/darwin-arm64@npm:0.23.1"
|
||||
conditions: os=darwin & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/darwin-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/darwin-x64@npm:0.18.20"
|
||||
@@ -667,6 +693,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/darwin-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/darwin-x64@npm:0.23.1"
|
||||
conditions: os=darwin & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/freebsd-arm64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/freebsd-arm64@npm:0.18.20"
|
||||
@@ -674,6 +707,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/freebsd-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/freebsd-arm64@npm:0.23.1"
|
||||
conditions: os=freebsd & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/freebsd-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/freebsd-x64@npm:0.18.20"
|
||||
@@ -681,6 +721,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/freebsd-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/freebsd-x64@npm:0.23.1"
|
||||
conditions: os=freebsd & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-arm64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-arm64@npm:0.18.20"
|
||||
@@ -688,6 +735,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-arm64@npm:0.23.1"
|
||||
conditions: os=linux & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-arm@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-arm@npm:0.18.20"
|
||||
@@ -695,6 +749,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-arm@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-arm@npm:0.23.1"
|
||||
conditions: os=linux & cpu=arm
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-ia32@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-ia32@npm:0.18.20"
|
||||
@@ -702,6 +763,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-ia32@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-ia32@npm:0.23.1"
|
||||
conditions: os=linux & cpu=ia32
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-loong64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-loong64@npm:0.18.20"
|
||||
@@ -709,6 +777,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-loong64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-loong64@npm:0.23.1"
|
||||
conditions: os=linux & cpu=loong64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-mips64el@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-mips64el@npm:0.18.20"
|
||||
@@ -716,6 +791,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-mips64el@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-mips64el@npm:0.23.1"
|
||||
conditions: os=linux & cpu=mips64el
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-ppc64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-ppc64@npm:0.18.20"
|
||||
@@ -723,6 +805,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-ppc64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-ppc64@npm:0.23.1"
|
||||
conditions: os=linux & cpu=ppc64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-riscv64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-riscv64@npm:0.18.20"
|
||||
@@ -730,6 +819,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-riscv64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-riscv64@npm:0.23.1"
|
||||
conditions: os=linux & cpu=riscv64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-s390x@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-s390x@npm:0.18.20"
|
||||
@@ -737,6 +833,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-s390x@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-s390x@npm:0.23.1"
|
||||
conditions: os=linux & cpu=s390x
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/linux-x64@npm:0.18.20"
|
||||
@@ -744,6 +847,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/linux-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/linux-x64@npm:0.23.1"
|
||||
conditions: os=linux & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/netbsd-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/netbsd-x64@npm:0.18.20"
|
||||
@@ -751,6 +861,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/netbsd-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/netbsd-x64@npm:0.23.1"
|
||||
conditions: os=netbsd & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/openbsd-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/openbsd-arm64@npm:0.23.1"
|
||||
conditions: os=openbsd & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/openbsd-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/openbsd-x64@npm:0.18.20"
|
||||
@@ -758,6 +882,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/openbsd-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/openbsd-x64@npm:0.23.1"
|
||||
conditions: os=openbsd & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/sunos-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/sunos-x64@npm:0.18.20"
|
||||
@@ -765,6 +896,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/sunos-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/sunos-x64@npm:0.23.1"
|
||||
conditions: os=sunos & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-arm64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/win32-arm64@npm:0.18.20"
|
||||
@@ -772,6 +910,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-arm64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/win32-arm64@npm:0.23.1"
|
||||
conditions: os=win32 & cpu=arm64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-ia32@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/win32-ia32@npm:0.18.20"
|
||||
@@ -779,6 +924,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-ia32@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/win32-ia32@npm:0.23.1"
|
||||
conditions: os=win32 & cpu=ia32
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-x64@npm:0.18.20":
|
||||
version: 0.18.20
|
||||
resolution: "@esbuild/win32-x64@npm:0.18.20"
|
||||
@@ -786,6 +938,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@esbuild/win32-x64@npm:0.23.1":
|
||||
version: 0.23.1
|
||||
resolution: "@esbuild/win32-x64@npm:0.23.1"
|
||||
conditions: os=win32 & cpu=x64
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0":
|
||||
version: 4.4.0
|
||||
resolution: "@eslint-community/eslint-utils@npm:4.4.0"
|
||||
@@ -964,7 +1123,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0":
|
||||
"@jridgewell/resolve-uri@npm:^3.1.0":
|
||||
version: 3.1.1
|
||||
resolution: "@jridgewell/resolve-uri@npm:3.1.1"
|
||||
checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653
|
||||
@@ -985,16 +1144,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@jridgewell/trace-mapping@npm:0.3.9":
|
||||
version: 0.3.9
|
||||
resolution: "@jridgewell/trace-mapping@npm:0.3.9"
|
||||
dependencies:
|
||||
"@jridgewell/resolve-uri": ^3.0.3
|
||||
"@jridgewell/sourcemap-codec": ^1.4.10
|
||||
checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9":
|
||||
version: 0.3.20
|
||||
resolution: "@jridgewell/trace-mapping@npm:0.3.20"
|
||||
@@ -2994,34 +3143,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsconfig/node10@npm:^1.0.7":
|
||||
version: 1.0.9
|
||||
resolution: "@tsconfig/node10@npm:1.0.9"
|
||||
checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsconfig/node12@npm:^1.0.7":
|
||||
version: 1.0.11
|
||||
resolution: "@tsconfig/node12@npm:1.0.11"
|
||||
checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsconfig/node14@npm:^1.0.0":
|
||||
version: 1.0.3
|
||||
resolution: "@tsconfig/node14@npm:1.0.3"
|
||||
checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsconfig/node16@npm:^1.0.2":
|
||||
version: 1.0.4
|
||||
resolution: "@tsconfig/node16@npm:1.0.4"
|
||||
checksum: 202319785901f942a6e1e476b872d421baec20cf09f4b266a1854060efbf78cde16a4d256e8bc949d31e6cd9a90f1e8ef8fb06af96a65e98338a2b6b0de0a0ff
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/adm-zip@npm:^0.5.5":
|
||||
version: 0.5.5
|
||||
resolution: "@types/adm-zip@npm:0.5.5"
|
||||
@@ -4024,14 +4145,14 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0":
|
||||
"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.2.0":
|
||||
version: 8.3.0
|
||||
resolution: "acorn-walk@npm:8.3.0"
|
||||
checksum: 15ea56ab6529135be05e7d018f935ca80a572355dd3f6d3cd717e36df3346e0f635a93ae781b1c7942607693e2e5f3ef81af5c6fc697bbadcc377ebda7b7f5f6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"acorn@npm:^8.0.4, acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0":
|
||||
"acorn@npm:^8.0.4, acorn@npm:^8.10.0, acorn@npm:^8.9.0":
|
||||
version: 8.11.2
|
||||
resolution: "acorn@npm:8.11.2"
|
||||
bin:
|
||||
@@ -4146,13 +4267,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"arg@npm:^4.1.0":
|
||||
version: 4.1.3
|
||||
resolution: "arg@npm:4.1.3"
|
||||
checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"argparse@npm:^1.0.10":
|
||||
version: 1.0.10
|
||||
resolution: "argparse@npm:1.0.10"
|
||||
@@ -5124,13 +5238,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"create-require@npm:^1.1.0":
|
||||
version: 1.1.1
|
||||
resolution: "create-require@npm:1.1.1"
|
||||
checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"crelt@npm:^1.0.0":
|
||||
version: 1.0.6
|
||||
resolution: "crelt@npm:1.0.6"
|
||||
@@ -5547,13 +5654,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"diff@npm:^4.0.1":
|
||||
version: 4.0.2
|
||||
resolution: "diff@npm:4.0.2"
|
||||
checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"difflib@npm:~0.2.1":
|
||||
version: 0.2.4
|
||||
resolution: "difflib@npm:0.2.4"
|
||||
@@ -6189,6 +6289,89 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"esbuild@npm:~0.23.0":
|
||||
version: 0.23.1
|
||||
resolution: "esbuild@npm:0.23.1"
|
||||
dependencies:
|
||||
"@esbuild/aix-ppc64": 0.23.1
|
||||
"@esbuild/android-arm": 0.23.1
|
||||
"@esbuild/android-arm64": 0.23.1
|
||||
"@esbuild/android-x64": 0.23.1
|
||||
"@esbuild/darwin-arm64": 0.23.1
|
||||
"@esbuild/darwin-x64": 0.23.1
|
||||
"@esbuild/freebsd-arm64": 0.23.1
|
||||
"@esbuild/freebsd-x64": 0.23.1
|
||||
"@esbuild/linux-arm": 0.23.1
|
||||
"@esbuild/linux-arm64": 0.23.1
|
||||
"@esbuild/linux-ia32": 0.23.1
|
||||
"@esbuild/linux-loong64": 0.23.1
|
||||
"@esbuild/linux-mips64el": 0.23.1
|
||||
"@esbuild/linux-ppc64": 0.23.1
|
||||
"@esbuild/linux-riscv64": 0.23.1
|
||||
"@esbuild/linux-s390x": 0.23.1
|
||||
"@esbuild/linux-x64": 0.23.1
|
||||
"@esbuild/netbsd-x64": 0.23.1
|
||||
"@esbuild/openbsd-arm64": 0.23.1
|
||||
"@esbuild/openbsd-x64": 0.23.1
|
||||
"@esbuild/sunos-x64": 0.23.1
|
||||
"@esbuild/win32-arm64": 0.23.1
|
||||
"@esbuild/win32-ia32": 0.23.1
|
||||
"@esbuild/win32-x64": 0.23.1
|
||||
dependenciesMeta:
|
||||
"@esbuild/aix-ppc64":
|
||||
optional: true
|
||||
"@esbuild/android-arm":
|
||||
optional: true
|
||||
"@esbuild/android-arm64":
|
||||
optional: true
|
||||
"@esbuild/android-x64":
|
||||
optional: true
|
||||
"@esbuild/darwin-arm64":
|
||||
optional: true
|
||||
"@esbuild/darwin-x64":
|
||||
optional: true
|
||||
"@esbuild/freebsd-arm64":
|
||||
optional: true
|
||||
"@esbuild/freebsd-x64":
|
||||
optional: true
|
||||
"@esbuild/linux-arm":
|
||||
optional: true
|
||||
"@esbuild/linux-arm64":
|
||||
optional: true
|
||||
"@esbuild/linux-ia32":
|
||||
optional: true
|
||||
"@esbuild/linux-loong64":
|
||||
optional: true
|
||||
"@esbuild/linux-mips64el":
|
||||
optional: true
|
||||
"@esbuild/linux-ppc64":
|
||||
optional: true
|
||||
"@esbuild/linux-riscv64":
|
||||
optional: true
|
||||
"@esbuild/linux-s390x":
|
||||
optional: true
|
||||
"@esbuild/linux-x64":
|
||||
optional: true
|
||||
"@esbuild/netbsd-x64":
|
||||
optional: true
|
||||
"@esbuild/openbsd-arm64":
|
||||
optional: true
|
||||
"@esbuild/openbsd-x64":
|
||||
optional: true
|
||||
"@esbuild/sunos-x64":
|
||||
optional: true
|
||||
"@esbuild/win32-arm64":
|
||||
optional: true
|
||||
"@esbuild/win32-ia32":
|
||||
optional: true
|
||||
"@esbuild/win32-x64":
|
||||
optional: true
|
||||
bin:
|
||||
esbuild: bin/esbuild
|
||||
checksum: 0413c3b9257327fb598427688b7186ea335bf1693746fe5713cc93c95854d6388b8ed4ad643fddf5b5ace093f7dcd9038dd58e087bf2da1f04dfb4c5571660af
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"escalade@npm:^3.1.1":
|
||||
version: 3.1.1
|
||||
resolution: "escalade@npm:3.1.1"
|
||||
@@ -6888,7 +7071,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fsevents@npm:~2.3.2":
|
||||
"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3":
|
||||
version: 2.3.3
|
||||
resolution: "fsevents@npm:2.3.3"
|
||||
dependencies:
|
||||
@@ -6898,7 +7081,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>":
|
||||
"fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.3#~builtin<compat/fsevents>":
|
||||
version: 2.3.3
|
||||
resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin<compat/fsevents>::version=2.3.3&hash=df0bf1"
|
||||
dependencies:
|
||||
@@ -7015,6 +7198,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-tsconfig@npm:^4.7.5":
|
||||
version: 4.8.1
|
||||
resolution: "get-tsconfig@npm:4.8.1"
|
||||
dependencies:
|
||||
resolve-pkg-maps: ^1.0.0
|
||||
checksum: 12df01672e691d2ff6db8cf7fed1ddfef90ed94a5f3d822c63c147a26742026d582acd86afcd6f65db67d809625d17dd7f9d34f4d3f38f69bc2f48e19b2bdd5b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"github-from-package@npm:0.0.0":
|
||||
version: 0.0.0
|
||||
resolution: "github-from-package@npm:0.0.0"
|
||||
@@ -7494,7 +7686,7 @@ __metadata:
|
||||
swagger-ui-react: ^5.11.0
|
||||
tldts: ^6.1.18
|
||||
trpc-openapi: ^1.2.0
|
||||
ts-node: latest
|
||||
tsx: 4.19.1
|
||||
turbo: ^1.10.12
|
||||
typescript: 5.1.6
|
||||
uuid: ^9.0.0
|
||||
@@ -8730,7 +8922,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"make-error@npm:^1.1.1, make-error@npm:^1.3.6":
|
||||
"make-error@npm:^1.3.6":
|
||||
version: 1.3.6
|
||||
resolution: "make-error@npm:1.3.6"
|
||||
checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402
|
||||
@@ -12037,44 +12229,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ts-node@npm:latest":
|
||||
version: 10.9.1
|
||||
resolution: "ts-node@npm:10.9.1"
|
||||
dependencies:
|
||||
"@cspotcode/source-map-support": ^0.8.0
|
||||
"@tsconfig/node10": ^1.0.7
|
||||
"@tsconfig/node12": ^1.0.7
|
||||
"@tsconfig/node14": ^1.0.0
|
||||
"@tsconfig/node16": ^1.0.2
|
||||
acorn: ^8.4.1
|
||||
acorn-walk: ^8.1.1
|
||||
arg: ^4.1.0
|
||||
create-require: ^1.1.0
|
||||
diff: ^4.0.1
|
||||
make-error: ^1.1.1
|
||||
v8-compile-cache-lib: ^3.0.1
|
||||
yn: 3.1.1
|
||||
peerDependencies:
|
||||
"@swc/core": ">=1.2.50"
|
||||
"@swc/wasm": ">=1.2.50"
|
||||
"@types/node": "*"
|
||||
typescript: ">=2.7"
|
||||
peerDependenciesMeta:
|
||||
"@swc/core":
|
||||
optional: true
|
||||
"@swc/wasm":
|
||||
optional: true
|
||||
bin:
|
||||
ts-node: dist/bin.js
|
||||
ts-node-cwd: dist/bin-cwd.js
|
||||
ts-node-esm: dist/bin-esm.js
|
||||
ts-node-script: dist/bin-script.js
|
||||
ts-node-transpile-only: dist/bin-transpile.js
|
||||
ts-script: dist/bin-script-deprecated.js
|
||||
checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ts-toolbelt@npm:^9.6.0":
|
||||
version: 9.6.0
|
||||
resolution: "ts-toolbelt@npm:9.6.0"
|
||||
@@ -12140,6 +12294,22 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tsx@npm:4.19.1":
|
||||
version: 4.19.1
|
||||
resolution: "tsx@npm:4.19.1"
|
||||
dependencies:
|
||||
esbuild: ~0.23.0
|
||||
fsevents: ~2.3.3
|
||||
get-tsconfig: ^4.7.5
|
||||
dependenciesMeta:
|
||||
fsevents:
|
||||
optional: true
|
||||
bin:
|
||||
tsx: dist/cli.mjs
|
||||
checksum: 31bfd2df62c1230f7c15f6e24d3790019ba7b2ad497221cb0cebcf5cf4f2c1ac971fac0d1283e3d80dc823652d2f9be946bd40ac65b640ff3f199b84a904a9c7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tunnel-agent@npm:^0.6.0":
|
||||
version: 0.6.0
|
||||
resolution: "tunnel-agent@npm:0.6.0"
|
||||
@@ -12605,13 +12775,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"v8-compile-cache-lib@npm:^3.0.1":
|
||||
version: 3.0.1
|
||||
resolution: "v8-compile-cache-lib@npm:3.0.1"
|
||||
checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"v8-to-istanbul@npm:^9.0.0, v8-to-istanbul@npm:^9.1.0":
|
||||
version: 9.1.3
|
||||
resolution: "v8-to-istanbul@npm:9.1.3"
|
||||
@@ -13229,13 +13392,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yn@npm:3.1.1":
|
||||
version: 3.1.1
|
||||
resolution: "yn@npm:3.1.1"
|
||||
checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yocto-queue@npm:^0.1.0":
|
||||
version: 0.1.0
|
||||
resolution: "yocto-queue@npm:0.1.0"
|
||||
|
||||
Reference in New Issue
Block a user