Compare commits

...

39 commits
v2.5.4 ... 2.x

Author SHA1 Message Date
KodeStar
2e96b7bd09
Update app.php version 2023-11-11 15:04:44 +00:00
KodeStar
768e7a6576
Merge pull request #1222 from fyutins/2.x
Fix and add SVG support
2023-11-11 14:58:41 +00:00
Fyutins
431eafb2b6 Fix and add SVG support 2023-09-26 18:51:12 +02:00
Ian Jones
d2184eef0a
Update readme.md (#1186)
Spelling and Grammar, included a few apostrophes for correct plural form or possessive. 

Added Capitalization to proper nouns

Included a single colon for consistency to match the styling of  it's predecessor paragraph
2023-08-09 11:21:57 +02:00
Attila Kerekes
fbd050d4e4
fix: validate icons to be images (#1173) 2023-06-06 12:08:47 +02:00
Attila Kerekes
5d67f570a9
fix: validate icons to be images (#1167) 2023-06-05 18:27:30 +02:00
Attila Kerekes
7d016cdaa6
fix: Remove mix from trianglify.js (#1166) 2023-05-26 13:36:07 +02:00
ullbergm
6e954a355d
Add Trianglify (#1158) 2023-05-26 10:23:06 +02:00
KodeStar
60faccad27
Remove register route (#1163) 2023-05-20 21:56:34 +02:00
jatdung
1f5493ac98
fix sortable tooltip (#1130) 2023-05-16 16:42:17 +02:00
aptalca
9c117b7946
Merge pull request #1150 from linuxserver/2.x-project
handle issue-pr close and review submitted actions
2023-04-19 09:22:36 -04:00
aptalca
c72fee9644
handle issue-pr close and review submitted actions 2023-04-14 15:31:46 -04:00
aptalca
0999bebcb4
Merge pull request #1147 from linuxserver/2.x-issues
add issue-pr workflows
2023-04-08 19:00:40 -04:00
aptalca
1c41e3d1ef
add issue-pr workflows 2023-04-06 15:25:53 -04:00
Chris Hunt
ed3cd79c92
Change minor version ready for next release 2023-03-09 16:17:32 +00:00
Chris Hunt
192002f898
Update minor version 2023-03-09 16:10:51 +00:00
jatdung
18f7306b2c
Update Chinese language. (#1124) 2023-03-07 17:51:19 +01:00
jatdung
e9754519be
fix Request class error (#1126) 2023-03-07 12:32:58 +01:00
ShiftHackZ
1c276fbfc2
feat: Added Ukrainian translation (#1125) 2023-03-07 12:32:01 +01:00
jatdung
cefe07d218
fix language setting only available in view (#1117) 2023-02-23 18:24:11 +01:00
jatdung
cd4b522935
use sortablejs instead of jquery-ui (#1115) 2023-02-10 21:32:58 +01:00
angrystar170
1ad5603c3e
Update Korean language. (#1116) 2023-02-10 21:30:38 +01:00
Attila Kerekes
302e04bb12
fix: Update jquery, jquery-ui (#1113) 2023-02-04 20:34:49 +01:00
Attila Kerekes
49dab6e72b
fix: Add more error handling for app test (#1111) 2023-02-01 11:43:26 +01:00
Filipe F Moreira
c5d0769afb
Add BR translations (#1080) 2023-01-16 20:14:33 +01:00
KodeStar
4005894c16
Update app.php 2023-01-09 19:28:56 +00:00
Attila Kerekes
a4022ce517
fix: Escape app title and tag title on list pages CVE-2022-47968 (#1088) 2023-01-05 20:31:15 +01:00
Attila Kerekes
cd07d47445
fix: Add more verbose error when uploading background image (#1082) 2022-12-24 10:56:00 +01:00
Attila Kerekes
df70dcc521
feat: Add tags as classes to items (#1079) 2022-12-19 14:40:38 +01:00
Attila Kerekes
9e6321e500
fix: Enable tag slug creation from CN characters (#1077) 2022-12-16 10:26:00 +01:00
KodeStar
0d9850c1c7
Merge pull request #1073 from linuxserver/fix/395
fix: Autologin forces logout
2022-12-15 23:38:36 +00:00
Attila Kerekes
4d3083886e fix: Autologin forces logout 2022-12-15 22:21:16 +01:00
KodeStar
52f59afe63
Merge pull request #1072 from linuxserver/fix/895
fix: Public access to front also applies to tags
2022-12-15 19:48:54 +00:00
Attila Kerekes
aa886e4f77 fix: Public access to front also applies to tags 2022-12-15 20:17:08 +01:00
Attila Kerekes
3c9f361f5f
chore: Add eslint github check (#1067) 2022-12-11 18:44:37 +01:00
Attila Kerekes
5eb1f55b82
chore: Add php code sniffer github check (#1066) 2022-12-11 11:58:58 +01:00
KodeStar
d910f8e4f7
Merge pull request #1065 from linuxserver/feat/health
feat: Add health endpoint
2022-12-11 09:46:20 +00:00
Attila Kerekes
751b23a5e4 feat: Add health endpoint 2022-12-11 01:39:39 +01:00
Yusuke Arakawa
a4fa490fb4
feat: Add Japanese language (#1064)
Co-authored-by: Yusuke Arakawa <nekolaboratory@users.noreply.github.com>
2022-12-09 23:43:23 +01:00
90 changed files with 1250 additions and 391 deletions

View file

@ -0,0 +1,16 @@
name: Issue & PR Tracker
on:
issues:
types: [opened,reopened,labeled,unlabeled,closed]
pull_request_target:
types: [opened,reopened,review_requested,review_request_removed,labeled,unlabeled,closed]
pull_request_review:
types: [submitted,edited,dismissed]
jobs:
manage-project:
permissions:
issues: write
uses: linuxserver/github-workflows/.github/workflows/issue-pr-tracker.yml@v1
secrets: inherit

13
.github/workflows/call_issues_cron.yml vendored Normal file
View file

@ -0,0 +1,13 @@
name: Mark stale issues and pull requests
on:
schedule:
- cron: '35 15 * * *'
workflow_dispatch:
jobs:
stale:
permissions:
issues: write
pull-requests: write
uses: linuxserver/github-workflows/.github/workflows/issues-cron.yml@v1
secrets: inherit

View file

@ -40,11 +40,17 @@ jobs:
- name: Run yarn
run: yarn && yarn dev
- name: Run ESLint
run: yarn lint
- name: Run tests
run: php artisan test
env:
APP_ENV: testing
- name: Php code sniffer
run: ./vendor/bin/phpcs
- name: Upload artifacts
uses: actions/upload-artifact@master
if: failure()

View file

@ -13,15 +13,16 @@ function format_bytes($bytes, bool $is_drive_size = true, string $beforeunit = '
{
$btype = ($is_drive_size === true) ? 1000 : 1024;
$labels = ['B', 'KB', 'MB', 'GB', 'TB'];
for ($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++); // use 1000 rather than 1024 to simulate HD size not real size
// use 1000 rather than 1024 to simulate HD size not real size
for ($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++) ;
if ($labels[$x] == 'TB') {
return round($bytes, 3).$beforeunit.$labels[$x].$afterunit;
return round($bytes, 3) . $beforeunit . $labels[$x] . $afterunit;
} elseif ($labels[$x] == 'GB') {
return round($bytes, 2).$beforeunit.$labels[$x].$afterunit;
return round($bytes, 2) . $beforeunit . $labels[$x] . $afterunit;
} elseif ($labels[$x] == 'MB') {
return round($bytes, 2).$beforeunit.$labels[$x].$afterunit;
return round($bytes, 2) . $beforeunit . $labels[$x] . $afterunit;
} else {
return round($bytes, 0).$beforeunit.$labels[$x].$afterunit;
return round($bytes, 0) . $beforeunit . $labels[$x] . $afterunit;
}
}
@ -36,11 +37,11 @@ function str_slug($title, string $separator = '-', string $language = 'en'): str
return Str::slug($title, $separator, $language);
}
if (! function_exists('str_is')) {
if (!function_exists('str_is')) {
/**
* Determine if a given string matches a given pattern.
*
* @param string|array $pattern
* @param string|array $pattern
* @param string $value
* @return bool
*
@ -63,7 +64,7 @@ function get_brightness($hex)
// $hex = str_replace('#', '', $hex);
$hex = preg_replace("/[^0-9A-Fa-f]/", '', $hex);
if (strlen($hex) == 3) {
$hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
$hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2];
}
$c_r = hexdec(substr($hex, 0, 2));
@ -96,7 +97,7 @@ function getLinkTargetAttribute(): string
if ($target === 'current') {
return '';
} else {
return ' target="'.$target.'"';
return ' target="' . $target . '"';
}
}
@ -108,3 +109,30 @@ function className($name)
{
return preg_replace('/[^\p{L}\p{N}]/u', '', $name);
}
/**
* @param string $file
* @param string $extension
* @return bool
*/
function isImage(string $file, string $extension): bool
{
$allowedExtensions = ['jpg', 'jpeg', 'png', 'bmp', 'gif', 'svg', 'webp'];
if (!in_array($extension, $allowedExtensions)) {
return false;
}
$tempFileName = @tempnam("/tmp", "image-check-");
$handle = fopen($tempFileName, "w");
fwrite($handle, $file);
fclose($handle);
if ($extension == 'svg') {
return 'image/svg+xml' === mime_content_type($tempFileName);
}
$size = @getimagesize($tempFileName);
return is_array($size) && str_starts_with($size['mime'], 'image');
}

View file

@ -46,7 +46,7 @@ class LoginController extends Controller
public function __construct()
{
Session::put('backUrl', URL::previous());
$this->middleware('guest')->except('logout');
$this->middleware('guest')->except(['logout','autologin']);
}
/**
@ -115,8 +115,16 @@ class LoginController extends Controller
*/
public function autologin($uuid): RedirectResponse
{
Auth::logout();
$user = User::where('autologin', $uuid)->first();
if (!$user) {
return redirect()->route('dash');
}
Auth::login($user, true);
session(['current_user' => $user]);
return redirect()->route('dash');

View file

@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers;
use App\Item;
use App\User;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\RateLimiter;
class HealthController extends Controller
{
/**
* @return int
*/
private static function getUsers(): int
{
return User::count();
}
/**
* @return int
*/
private static function getItems(): int
{
return Item::select('id')
->where('deleted_at', null)
->where('type', '0')
->count();
}
/**
* Handle the incoming request.
*
* @param Request $request
* @return JsonResponse|Response
* @throws BindingResolutionException
*/
public function __invoke(Request $request)
{
$REQUESTS_MAX_PER_MIN = 30;
$STATUS_TOO_MANY_REQUESTS = 429;
if (RateLimiter::remaining('health', $REQUESTS_MAX_PER_MIN) < 1) {
return response()->make('Too many attempts.', $STATUS_TOO_MANY_REQUESTS);
}
RateLimiter::hit('health');
return response()->json([
'status' => 'ok',
'items' => self::getItems(),
'users' => self::getUsers(),
]);
}
}

View file

@ -18,6 +18,7 @@ use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Validation\ValidationException;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
@ -140,7 +141,7 @@ class ItemController extends Controller
*/
public function index(Request $request): View
{
$trash = (bool) $request->input('trash');
$trash = (bool)$request->input('trash');
$data['apps'] = Item::ofType('item')->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('item')->onlyTrashed()->get();
@ -196,6 +197,7 @@ class ItemController extends Controller
* @param Request $request
* @param null $id
* @return Item
* @throws ValidationException
*/
public static function storelogic(Request $request, $id = null): Item
{
@ -203,6 +205,7 @@ class ItemController extends Controller
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
'file' => 'image'
]);
if ($request->hasFile('file')) {
@ -217,17 +220,18 @@ class ItemController extends Controller
"verify_peer_name" => false,
),
);
$file = $request->input('icon');
$path_parts = pathinfo($file);
$extension = $path_parts['extension'];
$contents = file_get_contents($request->input('icon'), false, stream_context_create($options));
if ($application) {
$icon = $application->icon;
} else {
$file = $request->input('icon');
$path_parts = pathinfo($file);
$icon = md5($contents);
$icon .= '.' . $path_parts['extension'];
if (!isImage($contents, $extension)) {
throw ValidationException::withMessages(['file' => 'Icon must be an image.']);
}
$path = 'icons/' . $icon;
$path = 'icons/' . ($application ? $application->icon : md5($contents) . '.' . $extension);
// Private apps could have here duplicated icons folder
if (strpos($path, 'icons/icons/') !== false) {
@ -334,7 +338,7 @@ class ItemController extends Controller
public function destroy(Request $request, int $id): RedirectResponse
{
//
$force = (bool) $request->input('force');
$force = (bool)$request->input('force');
if ($force) {
Item::withTrashed()
->where('id', $id)
@ -388,11 +392,11 @@ class ItemController extends Controller
$output['custom'] = null;
$app = Application::single($appid);
$output = (array) $app;
$output = (array)$app;
$appdetails = Application::getApp($appid);
if ((bool) $app->enhanced === true) {
if ((bool)$app->enhanced === true) {
// if(!isset($app->config)) { // class based config
$output['custom'] = className($appdetails->name) . '.config';
// }
@ -438,7 +442,7 @@ class ItemController extends Controller
}
$app_details = new $app();
$app_details->config = (object) $data;
$app_details->config = (object)$data;
$app_details->test();
}

View file

@ -41,11 +41,10 @@ class ItemRestController extends Controller
/**
* Show the form for creating a new resource.
*
* @return Response
* @return void
*/
public function create()
{
}
/**

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Setting;
use App\SettingGroup;
use Exception;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
@ -53,7 +54,7 @@ class SettingsController extends Controller
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
'errors' => collect([__('app.alert.error.not_exist')]),
]);
}
}
@ -68,37 +69,48 @@ class SettingsController extends Controller
{
$setting = Setting::find($id);
$user = $this->user();
$route = route('settings.index', []);
if (! is_null($setting)) {
$data = Setting::getInput($request);
try {
if (is_null($setting)) {
throw new Exception('not_exists');
}
$setting_value = null;
if ($setting->type === 'image') {
$validatedData = $request->validate([
'value' => 'image'
]);
if ($setting->type == 'image') {
if ($request->hasFile('value')) {
$path = $request->file('value')->store('backgrounds');
$setting_value = $path;
if (!$request->hasFile('value')) {
throw new \Exception(
'file_too_big'
);
}
$path = $request->file('value')->store('backgrounds');
if ($path === null) {
throw new \Exception('file_not_stored');
}
$setting_value = $path;
} else {
$data = Setting::getInput($request);
$setting_value = $data->value;
}
$user->settings()->detach($setting->id);
$user->settings()->save($setting, ['uservalue' => $setting_value]);
$route = route('settings.index', []);
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
} else {
$route = route('settings.index', []);
->with([
'success' => __('app.alert.success.setting_updated'),
]);
} catch (Exception $e) {
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
]);
->with([
'errors' => collect([__('app.alert.error.'.$e->getMessage())]),
]);
}
}

View file

@ -4,13 +4,11 @@ namespace App\Http\Controllers;
use App\Item;
use App\User;
use DB;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\View\Factory;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class TagController extends Controller
{
@ -59,6 +57,7 @@ class TagController extends Controller
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'file' => 'image'
]);
if ($request->hasFile('file')) {
@ -68,7 +67,7 @@ class TagController extends Controller
]);
}
$slug = str_slug($request->title, '-');
$slug = str_slug($request->title, '-', 'en_US');
$current_user = User::currentUser();
@ -131,6 +130,7 @@ class TagController extends Controller
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'file' => 'image'
]);
if ($request->hasFile('file')) {
@ -140,7 +140,7 @@ class TagController extends Controller
]);
}
$slug = str_slug($request->title, '-');
$slug = str_slug($request->title, '-', 'en_US');
// set item type to tag
$request->merge([
'url' => $slug,

View file

@ -62,7 +62,7 @@ class UserController extends Controller
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable',
'file' => 'image'
]);
$user = new User;
$user->username = $request->input('username');
@ -129,6 +129,7 @@ class UserController extends Controller
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable',
'file' => 'image'
]);
//die(print_r($request->all()));

View file

@ -33,9 +33,7 @@ class CheckAllowed
}
// Public access to frontpage
if ($route == 'dash') {
//print_r(User::all());
//die("here".var_dump($current_user->password));
if ($route === 'dash' || $route === 'tags.show') {
if ((bool)$current_user->public_front === true) {
return $next($request);
}

View file

@ -18,5 +18,4 @@ class VerifyCsrfToken extends Middleware
'test_config',
//'get_stats'
];
}

View file

@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
use stdClass;
use Symfony\Component\ClassLoader\ClassMapGenerator;
// @codingStandardsIgnoreStart
/**
* App\Item
*
@ -68,6 +69,7 @@ use Symfony\Component\ClassLoader\ClassMapGenerator;
* @method static \Illuminate\Database\Query\Builder|Item withoutTrashed()
* @mixin \Eloquent
*/
// @codingStandardsIgnoreEnd
class Item extends Model
{
use SoftDeletes;
@ -151,6 +153,23 @@ class Item extends Model
return $tagdetails;
}
/**
* @return string
*/
public function getTagClass(): string
{
$tags = $this->tags();
$slugs = [];
foreach ($tags as $tag) {
if ($tag->url) {
$slugs[] = 'tag-'.$tag->url;
}
}
return implode(' ', $slugs);
}
/**
* @return BelongsToMany
*/

View file

@ -43,6 +43,9 @@ class AppServiceProvider extends ServiceProvider
ProcessApps::dispatch();
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
// User specific settings need to go here as session isn't available at this point in the app
view()->composer('*', function ($view) {
if (isset($_SERVER['HTTP_AUTHORIZATION']) && ! empty($_SERVER['HTTP_AUTHORIZATION'])) {
@ -70,17 +73,21 @@ class AppServiceProvider extends ServiceProvider
}
$alt_bg = '';
if ($bg_image = Setting::fetch('background_image')) {
$trianglify = 'false';
$trianglify_seed = null;
if (Setting::fetch('trianglify')) {
$trianglify = 'true';
$trianglify_seed = Setting::fetch('trianglify_seed');
} elseif ($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
}
$allusers = User::all();
$current_user = User::currentUser();
$lang = Setting::fetch('language');
\App::setLocale($lang);
$view->with('alt_bg', $alt_bg);
$view->with('trianglify', $trianglify);
$view->with('trianglify_seed', $trianglify_seed);
$view->with('allusers', $allusers);
$view->with('current_user', $current_user);
});

View file

@ -218,6 +218,7 @@ class Setting extends Model
return self::_fetch($key, $user);
}
// @codingStandardsIgnoreStart
/**
* @param string $key
*
@ -225,6 +226,7 @@ class Setting extends Model
*/
public static function _fetch($key, $user = null)
{
// @codingStandardsIgnoreEnd
//$cachekey = ($user === null) ? $key : $key.'-'.$user->id;
//if (Setting::cached($cachekey)) {
// return Setting::$cache[$cachekey];

View file

@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
// @codingStandardsIgnoreStart
/**
* App\User
*
@ -42,6 +43,7 @@ use Illuminate\Notifications\Notifiable;
* @method static \Illuminate\Database\Eloquent\Builder|User whereUsername($value)
* @mixin \Eloquent
*/
// @codingStandardsIgnoreEnd
class User extends Authenticatable
{
use Notifiable;

View file

@ -14,7 +14,7 @@ return [
*/
'name' => env('APP_NAME', 'Heimdall'),
'version' => '2.5.4',
'version' => '2.5.8',
/*
|--------------------------------------------------------------------------

View file

@ -49,4 +49,4 @@ return [
'time' => 2,
],
];
];

View file

@ -33,4 +33,4 @@ return [
realpath(storage_path('framework/views'))
),
];
];

View file

@ -44,4 +44,4 @@ class UserFactory extends Factory
];
});
}
}
}

View file

@ -27,7 +27,11 @@ class SettingsSeeder extends Seeder
foreach ($languageDirectories as $languageDirectory) {
$language = self::getLanguageFromDirectory($languageDirectory);
$resultNative = mb_convert_case(Locale::getDisplayLanguage($language.'-', $language), MB_CASE_TITLE, 'UTF-8');
$resultNative = mb_convert_case(
Locale::getDisplayLanguage($language.'-', $language),
MB_CASE_TITLE,
'UTF-8'
);
$resultEn = ucfirst(Locale::getDisplayLanguage($language, 'en'));
$result[$language] = "$resultNative ($resultEn)";
}
@ -176,6 +180,33 @@ class SettingsSeeder extends Seeder
$setting->value = 'en';
$setting->save();
}
if (! $setting = Setting::find(12)) {
$setting = new Setting;
$setting->id = 12;
$setting->group_id = 2;
$setting->key = 'trianglify';
$setting->type = 'boolean';
$setting->label = 'app.settings.trianglify';
$setting->save();
} else {
$setting->label = 'app.settings.trianglify';
$setting->save();
}
if (! $setting = Setting::find(13)) {
$setting = new Setting;
$setting->id = 13;
$setting->group_id = 2;
$setting->key = 'trianglify_seed';
$setting->type = 'text';
$setting->value = 'heimdall';
$setting->label = 'app.settings.trianglify_seed';
$setting->save();
} else {
$setting->label = 'app.settings.trianglify_seed';
$setting->save();
}
$window_target_options = json_encode([
'current' => 'app.settings.window_target.current',
@ -201,7 +232,12 @@ class SettingsSeeder extends Seeder
if ($support = Setting::find(8)) {
$support->label = 'app.settings.support';
$support->value = '<a rel="noopener" target="_blank" href="https://discord.gg/CCjHKn4">Discord</a> | <a rel="noopener" target="_blank" href="https://github.com/linuxserver/Heimdall">Github</a> | <a rel="noopener" target="_blank" href="https://blog.heimdall.site/">Blog</a>';
$support->value =
'<a rel="noopener" target="_blank" href="https://discord.gg/CCjHKn4">Discord</a>'.
' | '.
'<a rel="noopener" target="_blank" href="https://github.com/linuxserver/Heimdall">Github</a>'.
' | '.
'<a rel="noopener" target="_blank" href="https://blog.heimdall.site/">Blog</a>';
$support->save();
} else {
$setting = new Setting;
@ -210,7 +246,11 @@ class SettingsSeeder extends Seeder
$setting->key = 'support';
$setting->type = 'text';
$setting->label = 'app.settings.support';
$setting->value = '<a rel="noopener" target="_blank" href="https://discord.gg/CCjHKn4">Discord</a> | <a rel="noopener" target="_blank" href="https://github.com/linuxserver/Heimdall">Github</a> | <a rel="noopener" target="_blank" href="https://blog.heimdall.site/">Blog</a>';
$setting->value = '<a rel="noopener" target="_blank" href="https://discord.gg/CCjHKn4">Discord</a>'.
' | '.
'<a rel="noopener" target="_blank" href="https://github.com/linuxserver/Heimdall">Github</a>'.
' | '.
'<a rel="noopener" target="_blank" href="https://blog.heimdall.site/">Blog</a>';
$setting->system = true;
$setting->save();
}
@ -275,7 +315,7 @@ class SettingsSeeder extends Seeder
$home_tag->save();
$home_tag_id = $home_tag->id;
if($home_tag_id != 0) {
if ($home_tag_id != 0) {
Log::info("Home Tag returned with id $home_tag_id from db! Changing to 0.");
DB::update('update items set id = 0 where id = ?', [$home_tag_id]);

View file

@ -15,7 +15,7 @@ class UsersSeeder extends Seeder
public function run()
{
// Groups
if (! $user = User::find(1)) {
if (!User::find(1)) {
$user = new User;
$user->username = 'admin';
$user->email = 'admin@test.com';
@ -24,13 +24,11 @@ class UsersSeeder extends Seeder
$user_id = $user->id;
if($user_id != 1) {
if ($user_id != 1) {
Log::info("First User returned with id $user_id from db! Changing to 1.");
DB::update('update users set id = 1 where id = ?', [$user_id]);
}
} else {
//$user->save();
}
}
}

16
package-lock.json generated
View file

@ -14,8 +14,9 @@
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"jquery": "^3.6.1",
"jquery": "^3.6.3",
"laravel-mix": "^6.0.49",
"prettier": "^2.8.1",
"sass": "^1.56.1",
"sass-loader": "13.*"
}
@ -6299,9 +6300,9 @@
}
},
"node_modules/jquery": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz",
"integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==",
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz",
"integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==",
"dev": true
},
"node_modules/js-sdsl": {
@ -8001,11 +8002,10 @@
}
},
"node_modules/prettier": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz",
"integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==",
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz",
"integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==",
"dev": true,
"peer": true,
"bin": {
"prettier": "bin-prettier.js"
},

View file

@ -17,12 +17,14 @@
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"jquery": "^3.6.1",
"jquery": "^3.6.3",
"laravel-mix": "^6.0.49",
"prettier": "^2.8.1",
"sass": "^1.56.1",
"sass-loader": "13.*"
},
"dependencies": {
"select2": "^4.0.13"
"select2": "^4.0.13",
"sortablejs": "^1.15.0"
}
}

View file

@ -9,9 +9,10 @@
<file>database</file>
<file>resources</file>
<file>routes</file>
<file>tests</file>
<exclude-pattern>bootstrap/cache/*</exclude-pattern>
<exclude-pattern>app/SupportedApps/*</exclude-pattern>
<exclude-pattern>resources/lang/*</exclude-pattern>
<exclude-pattern>bootstrap/autoload.php</exclude-pattern>
<exclude-pattern>*/migrations/*</exclude-pattern>
<exclude-pattern>*/seeds/*</exclude-pattern>

2
public/css/app.css vendored

File diff suppressed because one or more lines are too long

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/js/trianglify.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,4 @@
{
"/css/app.css": "/css/app.css?id=910562b0b11f9731ff1cdded5e57f7b5",
"/js/app.js": "/js/app.js?id=86f896ef6c2066036a4e2b946e07750d"
"/css/app.css": "/css/app.css?id=55e02812d34a73b4386802d27fbcd6e8",
"/js/app.js": "/js/app.js?id=3377b9b80073713e4dc54937c94aa6ad"
}

View file

@ -22,10 +22,10 @@ Why not use it as your browser start page? It even has the ability to include a
![Heimdall demo animation](https://i.imgur.com/MrC4QpN.gif)
## Video
If you want to see a quick video of it in use, go to https://youtu.be/GXnnMAxPzMc
If you want to see a quick video of Heimdall in use, go to https://youtu.be/GXnnMAxPzMc
## Supported applications
You can use the app to link to any site or application, but Foundation apps will auto fill in the icon for the app and supply a default color for the tile. In addition Enhanced apps allow you provide details to an apps API, allowing you to view live stats directly on the dashboad. For example, the NZBGet and Sabnzbd Enhanced apps will display the queue size and download speed while something is downloading.
You can use the app to link to any site or application, but Foundation apps will auto fill in the icon for the app and supply a default color for the tile. In addition, Enhanced apps allow you provide details to an apps API, allowing you to view live stats directly on the dashboad. For example, the NZBGet and Sabnzbd Enhanced apps will display the queue size, and download speed while something is downloading.
Supported applications are recognized by the title of the application as entered in the title field when adding an application. For example, to add a link to pfSense, begin by typing "p" in the title field and then select "pfSense" from the list of supported applications.
@ -36,7 +36,7 @@ Supported applications are recognized by the title of the application as entered
## Installing
Apart from the Laravel 8 dependencies, namely PHP >= 7.4.32, BCMath PHP Extension, INTL PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe `php_fileinfo` should be enabled by default, but one user came across the issue on a windows system.
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
@ -62,10 +62,10 @@ Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchpr
Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, this can be helpful when you have lots of icons.
## New background image not being set
If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
If you are using the docker image or a default php install you may find images over 2MB won't get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
If you are using the linuxserver.io docker image simply edit `/path/to/config/php/php-local.ini` and add `upload_max_filesize = 30M` to the end.
@ -75,7 +75,7 @@ If you are running the docker and the EnhancedApps you are using are also in doc
You can do this by using `http(s)://docker_name:port` in the config section. Instead of the name you can use the internal docker ip, this usually starts with `172.`
## Languages
The app has been translated into several languages; however, the quality of the translations could do with work. If you would like to improve them, or help with other translations, they are stored in `/resources/lang/`.
The app has been translated into several languages; however, the quality of the translations could benefit from some work. If you would like to improve them, or help with other translations, they are stored in `/resources/lang/`.
To create a new language translation, make a new folder with the ISO 3166-1 alpha-2 code as the name, copy `app.php` from `/resources/lang/en/app.php` into your new folder and replace the English strings.
@ -94,6 +94,7 @@ Currently added languages are
- Greek
- Hungarian
- Italian
- Japanese
- Korean
- Lombard
- Norwegian
@ -144,15 +145,15 @@ location / {
try_files $uri $uri/ /index.php?$query_string;
}
```
Someone was using the same nginx setup to both run this and reverse proxy Plex, Plex is served from `/web` so their location was interfering with the `/webfonts`.
Someone was using the same Nginx setup to both run this and reverse proxy Plex. Plex is served from `/web` so their location was interfering with the `/webfonts`.
Therefore, if your fonts aren't showing because you have a location for `/web`, add the following
Therefore, if your fonts aren't showing because you have a location for `/web`, add the following:
```
location /webfonts {
try_files $uri $uri/;
}
```
If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
If there are any other locations that might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, however it's a super fringe case.
### Reverse proxy
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
@ -180,12 +181,12 @@ Per default Heimdall uses the standard certificate bundle file (`ca-certificates
openssl.cafile = /config/heimdall.pem
```
Restart the container and the enhanced apps should now be able to access your local HTTP websites. This configuration will survive updating or recreating the Heimdall container.
Restart the container and the Enhanced apps should now be able to access your local HTTP websites. This configuration will survive updating or recreating the Heimdall container.
## Running offline
The apps list is hosted on github, you have a couple of options if you want to run without a connection to the outside world:
1) Clone the repository and host it yourself, look at the .github actions file to see how to generate the apps list.
2) Download the apps list and store it as a json accessible to heimdall named `list.json`
2) Download the apps list and store it as a JSON accessible to Heimdall named `list.json`
With both options all you need to do is add the following to your `.env`
`APP_SOURCE=http://localhost/` Where `http://localhost/` is the path to the apps list without the name of the file, so if your file is stored at `https://heimdall.local/list.json` you would put `APP_SOURCE=https://heimdall.local/`
@ -204,12 +205,13 @@ If you would like to show your appreciation, feel free to use the link below.
- JavaScript - [jQuery](https://jquery.com/)
- Colour picker - [Huebee](http://huebee.buzz/)
- Background image - [pexels](https://www.pexels.com)
- Trianglify library - [Trianglify](https://github.com/qrohlf/trianglify)
- Everyone at Linuxserver.io that has helped with the app and let's not forget IronicBadger for the following question that started it all:
```
you know, i would love something like this landing page for all my servers apps
You know, I would love something like this landing page for all my servers' apps
that gives me the ability to pin favourites
and / or search
@Stark @Kode do either of you think you'd be able to rustle something like this up ?
@Stark @Kode do either of you think you'd be able to rustle something like this up?
```
## License

View file

@ -1,3 +1,4 @@
/* eslint-disable func-names */
$.when($.ready).then(() => {
const base = (document.querySelector("base") || {}).href;
@ -51,18 +52,41 @@ $.when($.ready).then(() => {
}
}); */
$("#sortable").sortable({
stop() {
const idsInOrder = $("#sortable").sortable("toArray", {
attribute: "data-id",
const sortableEl = document.getElementById("sortable");
let sortable;
if (sortableEl !== null) {
// eslint-disable-next-line no-undef
sortable = Sortable.create(sortableEl, {
disabled: true,
animation: 150,
forceFallback: !(
navigator.userAgent.toLowerCase().indexOf("firefox") > -1
),
draggable: ".item-container",
onEnd() {
const idsInOrder = sortable.toArray();
$.post(`${base}order`, { order: idsInOrder });
},
});
// prevent Firefox drag behavior
if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
sortable.option("setData", (dataTransfer) => {
dataTransfer.setData("Text", "");
});
$.post(`${base}order`, { order: idsInOrder });
},
});
$("#sortable").sortable("disable");
sortableEl.addEventListener("dragstart", (event) => {
const { target } = event;
if (target.nodeName.toLowerCase() === "a") {
event.preventDefault();
event.stopPropagation();
event.dataTransfer.setData("Text", "");
}
});
}
}
$("#main")
.on("mouseenter", "#sortable.ui-sortable-disabled .item", function () {
.on("mouseenter", "#sortable .item", function () {
$(this).siblings(".tooltip").addClass("active");
$(".refresh", this).addClass("active");
})
@ -137,10 +161,10 @@ $.when($.ready).then(() => {
$(".item-edit").hide();
$("#app").removeClass("sidebar");
$("#sortable .tooltip").css("display", "");
$("#sortable").sortable("disable");
if (sortable !== undefined) sortable.option("disabled", true);
} else {
$("#sortable .tooltip").css("display", "none");
$("#sortable").sortable("enable");
if (sortable !== undefined) sortable.option("disabled", false);
setTimeout(() => {
$(".add-item").fadeIn();
$(".item-edit").fadeIn();
@ -165,7 +189,8 @@ $.when($.ready).then(() => {
const overrideUrl = $(
'#sapconfig input[name="config[override_url]"]'
).val();
if (overrideUrl.length && overrideUrl !== "") {
if (typeof overrideUrl === "string" && overrideUrl !== "") {
apiurl = overrideUrl;
}
@ -182,9 +207,20 @@ $.when($.ready).then(() => {
data.password = "";
}
$.post(`${base}test_config`, { data }, (responseData) => {
alert(responseData);
});
$.post(`${base}test_config`, { data })
.done((responseData) => {
// eslint-disable-next-line no-alert
alert(responseData);
})
.fail((responseData) => {
// eslint-disable-next-line no-alert
alert(
`Something went wrong: ${responseData.responseText.substring(
0,
100
)}`
);
});
});
$("#pinlist").on("click", "a", function (e) {
e.preventDefault();

View file

@ -29,6 +29,7 @@ const exportItems = (event) => {
fetch(EXPORT_API_URL)
.then((response) => {
if (response.status !== 200) {
// eslint-disable-next-line no-alert
window.alert("An error occurred while exporting...");
}

View file

@ -7,6 +7,7 @@ const APP_LOAD_URL = "appload";
* @param {array} errors
*/
const updateStatus = ({ item, errors }) => {
// eslint-disable-next-line no-console
console.log(item, errors);
let statusLine;
if (errors.length === 0) {
@ -147,23 +148,24 @@ const readJSON = (file) =>
/**
*
* @param {Event} event
* @param {Blob} file
*/
const openFileForImport = (file) => {
clearStatus();
return readJSON(file)
.catch((error) => {
// eslint-disable-next-line no-console
console.error(error);
})
.then(importItems);
};
const fileInput = document.querySelector("input[name='import']");
const importButton = document.querySelectorAll(".import-button");
const importButtons = document.querySelectorAll(".import-button");
if (fileInput && importButton) {
importButton.forEach((importButton) => {
if (fileInput && importButtons) {
importButtons.forEach((importButton) => {
importButton.addEventListener("click", () => {
const file = fileInput.files[0];
if (!file) {

File diff suppressed because one or more lines are too long

View file

@ -85,6 +85,7 @@ function createUpdateJob(container, queue) {
}
})
.catch((error) => {
// eslint-disable-next-line no-console
console.error(error);
});
}

View file

@ -1125,6 +1125,16 @@ select:-webkit-autofill:focus {
color: $app-text!important;
}
.sortable-drag {
opacity: 1!important;
}
#sortable {
.sortable-ghost:not(.sortable-drag) {
opacity: 0;
}
}
#sortable:focus-within {
.item:focus-within {
outline: 1px solid #ffffff91;

View file

@ -17,6 +17,8 @@ return [
'settings.version' => 'Versão',
'settings.background_image' => 'Imagem de fundo',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link é aberto em',
'settings.window_target.current' => 'Abra nesta aba',
'settings.window_target.one' => 'Abra na mesma aba',
@ -28,6 +30,9 @@ return [
'settings.remove' => 'Remover',
'settings.search' => 'busca',
'settings.no_items' => 'Nenhum item encontrado',
'settings.advanced' => 'Avançado',
'settings.custom_css' => 'CSS Customizado',
'settings.custom_js' => 'JavaScript Customizado',
'settings.label' => 'Rótulo',
'settings.value' => 'Valor',
@ -42,11 +47,18 @@ return [
'options.startpage' => 'Página inicial',
'options.yes' => 'Sim',
'options.no' => 'Não',
'options.nzbhydra' => 'NZBHydra',
'options.jackett' => 'Jackett',
'buttons.save' => 'Salvar',
'buttons.cancel' => 'Cancelar',
'buttons.add' => 'Adicionar',
'buttons.upload' => 'Carregar um arquivo',
'buttons.downloadapps' => 'Atualizar lista de Apps',
'dashboard' => 'Página Inicial do dashboard',
'dashboard.reorder' => 'Reordenar e fixar itens',
'dashboard.settings' => 'Configurações',
'dash.pin_item' => 'Fixar o item na dashboard',
'dash.no_apps' => 'Atualmente não há aplicativos fixados, :link1 ou :link2',
@ -60,6 +72,7 @@ return [
'apps.application_name' => 'Nome do aplicativo',
'apps.colour' => 'Cor',
'apps.icon' => 'Ícone',
'app.import' => 'Importar',
'apps.pinned' => 'Fixado',
'apps.title' => 'Título',
'apps.hex' => 'Cor hexadecimal',
@ -73,6 +86,13 @@ return [
'apps.tag_name' => 'Nome da tag',
'apps.tags' => 'Tags',
'apps.override' => 'Se diferente do URL principal',
'apps.preview' => 'Vizualizar',
'apps.apptype' => 'Tipo de Aplicativo',
'apps.website' => 'Website',
'apps.description' => 'Descrição',
'apps.only_admin_account' => 'Somente se tiver conta admin!',
'apps.autologin_url' => 'URL de login automático',
'apps.show_deleted' => 'Mostrando Aplicativos Apagados',
'user.user_list' => 'Comercial',
'user.add_user' => 'Adicionar usuários',
@ -88,6 +108,8 @@ return [
'delete' => 'Apagar',
'optional' => 'Opcional',
'restore' => 'Restaurar',
'export' => 'Exportar',
'import' => 'Importar',
'alert.success.item_created' => 'Item criado com sucesso',
'alert.success.item_updated' => 'Item atualizado com sucesso',
@ -98,9 +120,10 @@ return [
'alert.success.tag_updated' => 'Tag atualizada com sucesso',
'alert.success.tag_deleted' => 'Tag apagada com sucesso',
'alert.success.tag_restored' => 'Tag restaurada com sucesso',
'alert.success.updating'=> 'Atualizando lista de apps',
'alert.success.setting_updated' => 'Você editou com sucesso essa configuração',
'alert.error.not_exist' => 'Essa configuração não existe.',
'alert.success.updating' => 'Atualizando lista de Apps',
'alert.success.user_created' => 'Usuário criado com sucesso',
'alert.success.user_updated' => 'Usuário atualizado com sucesso',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Podpořte nás',
'settings.version' => 'Verze',
'settings.background_image' => 'Obrázek pozadí',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Odkazy otevírat v',
'settings.window_target.current' => 'Otevřít v této záložce',
'settings.window_target.one' => 'Otevřít ve stejné záložce',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Doner',
'settings.version' => 'Version',
'settings.background_image' => 'Baggrundsbillede',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link opens in',
'settings.window_target.current' => 'Åbn i denne fane',
'settings.window_target.one' => 'Åbn i den samme fane',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Spende',
'settings.version' => 'Version',
'settings.background_image' => 'Hintergrundbild',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link öffnen in',
'settings.window_target.current' => 'In diesem Tab öffnen',
'settings.window_target.one' => 'Im selben Tab öffnen',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Δωρεά',
'settings.version' => 'Έκδοση',
'settings.background_image' => 'Εικόνα Παρασκηνίου',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Ο Σύνδεσμος ανοίγει σε',
'settings.window_target.current' => 'Άνοιγμα σε αυτή την καρτέλα',
'settings.window_target.one' => 'Άνοιγμα στην ίδια καρτέλα',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Donate',
'settings.version' => 'Version',
'settings.background_image' => 'Background Image',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link opens in',
'settings.window_target.current' => 'Open in this tab',
'settings.window_target.one' => 'Open in the same tab',
@ -100,6 +102,8 @@ return array (
'alert.success.tag_restored' => 'Tag restored successfully',
'alert.success.setting_updated' => 'You have successfully edited this setting',
'alert.error.not_exist' => 'This setting does not exist.',
'alert.error.file_too_big' => 'File is too big.',
'alert.error.file_not_stored' => 'File could not be stored.',
'alert.success.user_created' => 'User created successfully',
'alert.success.user_updated' => 'User updated successfully',
'alert.success.user_deleted' => 'User deleted successfully',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Donar',
'settings.version' => 'Versión',
'settings.background_image' => 'Imagen de Fondo',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Vínculo abre en',
'settings.window_target.current' => 'Abrir en ésta pestaña',
'settings.window_target.one' => 'Abrir en la misma pestaña',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Lahjoita',
'settings.version' => 'Versio',
'settings.background_image' => 'Taustakuva',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Linkit aukeaa',
'settings.window_target.current' => 'Avaa tässä välilehdessä',
'settings.window_target.one' => 'Avaa samassa välilehdessä',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Contribuer',
'settings.version' => 'Version',
'settings.background_image' => 'Image d\'arrière-plan',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Ouverture des liens',
'settings.window_target.current' => 'Dans l\'onglet courant',
'settings.window_target.one' => 'Dans le même nouvel onglet',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Adomány',
'settings.version' => 'Verzió',
'settings.background_image' => 'Háttérkép',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link megnyitása',
'settings.window_target.current' => 'Ezen a lapon',
'settings.window_target.one' => 'Azonos lapon',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Dona',
'settings.version' => 'Versione',
'settings.background_image' => 'Immagine di sfondo',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Apri link in',
'settings.window_target.current' => 'Apri in questa scheda',
'settings.window_target.one' => 'Apri nella stessa scheda',

111
resources/lang/jp/app.php Normal file
View file

@ -0,0 +1,111 @@
<?php
return array (
'settings.system' => 'システム',
'settings.appearance' => '外観',
'settings.miscellaneous' => 'その他',
'settings.advanced' => '高度な設定',
'settings.support' => 'サポート',
'settings.donate' => '寄付',
'settings.version' => 'バージョン',
'settings.background_image' => '背景画像',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'リンクを開く',
'settings.window_target.current' => 'このタブで開く',
'settings.window_target.one' => '同じタブで開く',
'settings.window_target.new' => '新しいタブで開く',
'settings.homepage_search' => 'ホームページ検索',
'settings.search_provider' => 'デフォルトの検索プロバイダー',
'settings.language' => '言語',
'settings.reset' => 'デフォルトにリセット',
'settings.remove' => '削除する',
'settings.search' => '検索する',
'settings.no_items' => '項目は見つかりませんでした',
'settings.label' => 'ラベル',
'settings.value' => '値',
'settings.edit' => '編集',
'settings.view' => '観る',
'settings.custom_css' => 'カスタム CSS',
'settings.custom_js' => 'カスタム JavaScript',
'options.none' => '- 設定されていません -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'スタートページ',
'options.yes' => 'はい',
'options.no' => 'いいえ',
'options.nzbhydra' => 'NZBHydra',
'options.jackett' => 'Jackett',
'buttons.save' => '保存',
'buttons.cancel' => 'キャンセル',
'buttons.add' => '追加',
'buttons.upload' => 'アイコンをアップロード',
'buttons.downloadapps' => 'アプリ一覧の更新',
'dash.pin_item' => 'アイテムをダッシュ​​ボードにピン留め',
'dash.no_apps' => '現在、ピン留めされたアプリケーション (:link1 または :link2) はありません',
'dash.link1' => 'ここにアプリケーションを追加',
'dash.link2' => 'アイテムをダッシュ​​に固定する',
'dash.pinned_items' => 'ピン留めされたアイテム',
'apps.app_list' => 'アプリケーション一覧',
'apps.view_trash' => 'ゴミ箱を表示',
'apps.add_application' => 'アプリケーションを追加',
'apps.application_name' => 'アプリケーション名',
'apps.colour' => '色',
'apps.icon' => 'アイコン',
'apps.pinned' => 'ピン留め',
'apps.title' => 'タイトル',
'apps.hex' => '16 進数の色',
'apps.username' => 'ユーザー名',
'apps.password' => 'パスワード',
'apps.config' => '設定',
'apps.apikey' => 'APIキー',
'apps.enable' => '有効',
'apps.tag_list' => 'タグ一覧',
'apps.add_tag' => 'タグ付けする',
'apps.tag_name' => 'タグ名',
'apps.tags' => 'タグ',
'apps.override' => 'メインURLと異なる場合',
'apps.preview' => 'プレビュー',
'apps.apptype' => 'アプリケーションタイプ',
'apps.website' => 'Webサイト',
'apps.description' => '説明',
'apps.only_admin_account' => 'あなたが管理者アカウントを持っている場合のみ!',
'apps.autologin_url' => '自動ログイン URL',
'apps.show_deleted' => '削除されたアプリケーションの表示',
'app.import' => '読み込む',
'dashboard' => 'ホームダッシュボード',
'user.user_list' => 'ユーザー一覧',
'user.add_user' => 'ユーザーを追加',
'user.username' => 'ユーザー名',
'user.avatar' => 'アバター',
'user.email' => 'メールアドレス',
'user.password_confirm' => 'パスワードを確認',
'user.secure_front' => 'フロントへのパブリック アクセスを許可する - パスワードが設定されている場合にのみ適用されます。',
'user.autologin' => '特定の URL からのログインを許可します。リンクを知っている人は誰でもログインできます。',
'url' => 'URL',
'title' => 'タイトル',
'delete' => '消去',
'optional' => 'オプション',
'restore' => '復元',
'export' => '書き出す',
'import' => '読み込む',
'alert.success.item_created' => 'アイテムが正常に作成されました',
'alert.success.item_updated' => 'アイテムは正常に更新されました',
'alert.success.item_deleted' => 'アイテムは正常に削除されました',
'alert.success.item_restored' => 'アイテムは正常に復元されました',
'alert.success.updating' => 'アプリ リストを更新中',
'alert.success.tag_created' => 'タグが正常に作成されました',
'alert.success.tag_updated' => 'タグが正常に更新されました',
'alert.success.tag_deleted' => 'タグが正常に削除されました',
'alert.success.tag_restored' => 'タグが正常に復元されました',
'alert.success.setting_updated' => 'この設定の編集に成功しました',
'alert.error.not_exist' => 'この設定は存在しません',
'alert.success.user_created' => 'ユーザーが正常に作成されました',
'alert.success.user_updated' => 'ユーザーが正常に更新されました',
'alert.success.user_deleted' => 'ユーザーは正常に削除されました',
'alert.success.user_restored' => 'ユーザーは正常に復元されました',
'dashboard.reorder' => '項目の並べ替えと固定',
'dashboard.settings' => '設定',
);

View file

@ -0,0 +1,6 @@
<?php
return array (
'failed' => 'これらの認証情報は弊社の記録と一致しません。',
'throttle' => 'ログイン試行回数が多すぎます。 :seconds 秒後にもう一度お試しください。',
);

View file

@ -0,0 +1,6 @@
<?php
return array (
'previous' => '&laquo; 前',
'next' => '次 &raquo;',
);

View file

@ -0,0 +1,9 @@
<?php
return array (
'password' => 'パスワードは 6 文字以上で、確認と一致する必要があります。',
'reset' => 'パスワードがリセットされました!',
'sent' => 'パスワードのリセット リンクをメールで送信しました。',
'token' => 'このパスワード リセット トークンは無効です。',
'user' => 'その電子メール アドレスを持つユーザーが見つかりません。',
);

View file

@ -0,0 +1,128 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => ':attribute を受け入れる必要があります。',
'active_url' => ':attribute は有効な URL ではありません。',
'after' => ':attribute は :date より後の日付でなければなりません。',
'after_or_equal' => ':attribute は :date 以降の日付でなければなりません。',
'alpha' => ':attribute には文字のみを含めることができます。',
'accepted' => ':attribute を受け入れる必要があります。',
'active_url' => ':attribute は有効な URL ではありません。',
'after' => ':attribute は :date より後の日付でなければなりません。',
'after_or_equal' => ':attribute は :date 以降の日付でなければなりません。',
'alpha' => ':attribute には文字のみを含めることができます。',
'alpha_dash' => ':attribute には、文字、数字、およびダッシュのみを含めることができます。',
'alpha_num' => ':attribute には、文字と数字のみを含めることができます。',
'array' => ':attribute は配列でなければなりません。',
'before' => ':attribute は :date より前の日付でなければなりません。',
'before_or_equal' => ':attribute は :date より前または等しい日付でなければなりません。',
'between' => [
'numeric' => ':attribute は :min と :max の間でなければなりません。',
'file' => ':attribute は :min から :max キロバイトの間でなければなりません。',
'string' => ':attribute は :min から :max 文字の間でなければなりません.',
'array' => ':attribute には :min と :max の項目が必要です。',
],
'boolean' => ':attribute フィールドは true または false でなければなりません。',
'confirmed' => ':attribute の確認が一致しません。',
'date' => ':attribute は有効な日付ではありません。',
'date_format' => ':attribute がフォーマット :format と一致しません。',
'different' => ':attribute と :other は異なる必要があります。',
'digits' => ':attribute は :digits 桁でなければなりません。',
'digits_between' => ':attribute は :min から :max 桁の間でなければなりません.',
'dimensions' => ':attribute の画像サイズが無効です。',
'distinct' => ':attribute フィールドの値が重複しています。',
'email' => ':attribute は有効な電子メール アドレスでなければなりません。',
'exists' => '選択された :attribute は無効です。',
'file' => ':attribute はファイルでなければなりません。',
'filled' => ':attribute フィールドには値が必要です。',
'image' => ':attribute は画像でなければなりません。',
'in' => '選択された :attribute は無効です。',
'in_array' => ':attribute フィールドが :other に存在しません。',
'integer' => ':attribute は整数でなければなりません。',
'ip' => ':attribute は有効な IP アドレスでなければなりません。',
'ipv4' => ':attribute は有効な IPv4 アドレスでなければなりません。',
'ipv6' => ':attribute は有効な IPv6 アドレスでなければなりません。',
'json' => ':attribute は有効な JSON 文字列でなければなりません。',
'max' => [
'numeric' => ':attribute は :max を超えることはできません。',
'file' => ':attribute は :max キロバイトを超えることはできません。',
'string' => ':attribute は :max 文字を超えることはできません.',
'array' => ':attribute には :max 個を超えるアイテムを含めることはできません。',
],
'mimes' => ':attribute は、タイプ: :values のファイルでなければなりません。',
'mimetypes' => ':attribute はタイプ: :values のファイルでなければなりません。',
'min' => [
'numeric' => ':attribute は少なくとも :min である必要があります。',
'file' => ':attribute は、少なくとも :min キロバイトでなければなりません。',
'string' => ':attribute は少なくとも :min 文字でなければなりません。',
'array' => ':attribute には少なくとも :min 個のアイテムが必要です。',
],
'not_in' => '選択された :attribute は無効です。',
'numeric' => ':attribute は数値でなければなりません。',
'present' => ':attribute フィールドが存在する必要があります。',
'regex' => ':attribute 形式が無効です。',
'required' => ':attribute フィールドは必須です。',
'required_if' => ':other が :value の場合、:attribute フィールドは必須です。',
'required_unless' => ':values に :other がない限り、:attribute フィールドは必須です。',
'required_with' => ':values が存在する場合、:attribute フィールドは必須です。',
'required_with_all' => ':values が存在する場合、:attribute フィールドは必須です。',
'required_without' => ':values が存在しない場合、:attribute フィールドは必須です。',
'regex' => ':attribute 形式が無効です。',
'required_without_all' => ':values が存在しない場合、:attribute フィールドは必須です。',
'regex' => ':attribute 形式が無効です。',
'same' => ':attribute と :other は一致する必要があります。',
'size' => [
'numeric' => ':attribute は :size でなければなりません。',
'file' => ':attribute は :size キロバイトでなければなりません。',
'string' => ':attribute は :size 文字でなければなりません。',
'array' => ':attribute には :size 項目が含まれている必要があります。',
],
'string' => ':attribute は文字列でなければなりません。',
'timezone' => ':attribute は有効なゾーンでなければなりません。',
'unique' => ':attribute は既に取得されています。',
'uploaded' => ':attribute のアップロードに失敗しました。',
'url' => ':attribute 形式が無効です。'
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View file

@ -4,11 +4,13 @@ return array (
'settings.system' => '시스템',
'settings.appearance' => '외관',
'settings.miscellaneous' => '잡동사니',
'settings.advanced' => '고급',
'settings.advanced' => '고급',
'settings.support' => '지원',
'settings.donate' => '기부',
'settings.version' => '버전',
'settings.background_image' => '배경 이미지',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => '다음에서 링크 열기',
'settings.window_target.current' => '현재 탭에서 열기',
'settings.window_target.one' => '같은 탭에서 열기',
@ -42,9 +44,9 @@ return array (
'buttons.upload' => '아이콘 업로드',
'buttons.downloadapps' => '앱 목록 업데이트',
'dash.pin_item' => '대시보드에 항목 고정',
'dash.no_apps' => '현재 고정된 응용 프로그램 없음, :link1 혹은 :link2',
'dash.link1' => '여기에 앱 추가',
'dash.link2' => '대시에 항목 고정',
'dash.no_apps' => '현재 고정된 앱이 없습니다. :link1하거나 :link2해야 합니다.',
'dash.link1' => '여기에 앱 추가',
'dash.link2' => '대시보드에 항목 고정',
'dash.pinned_items' => '고정된 항목',
'apps.app_list' => '앱 목록',
'apps.view_trash' => '휴지통 보기',
@ -69,9 +71,10 @@ return array (
'apps.apptype' => '앱 형식',
'apps.website' => '웹사이트',
'apps.description' => '설명',
'apps.only_admin_account' => '관리자 계정이 있는 경우에만!',
'apps.only_admin_account' => '관리자 계정이 있는 경우에만 가능합니다!',
'apps.autologin_url' => '자동 로그인 URL',
'apps.show_deleted' => '삭제된 애플리케이션 표시',
'app.import' => '가져오기',
'dashboard' => '홈 대시보드',
'user.user_list' => '사용자',
'user.add_user' => '사용자 추가',
@ -79,13 +82,15 @@ return array (
'user.avatar' => '아바타',
'user.email' => '전자 메일',
'user.password_confirm' => '암호 확인',
'user.secure_front' => 'Allow public access to front - Only enforced if a password is set.',
'user.autologin' => 'Allow logging in from a specific URL. Anyone with the link can login.',
'user.secure_front' => '전방에 대한 공개 액세스 허용 - 암호가 설정된 경우에만 적용됩니다.',
'user.autologin' => '지정된 URL에서 로그인을 허용합니다. 해당 링크을 소유한 사람이라면 누구나 로그인할 수 있습니다.',
'url' => 'URL',
'title' => '제목',
'delete' => '제거',
'optional' => '선택적',
'restore' => '복원',
'export' => '내보내기',
'import' => '가져오기',
'alert.success.item_created' => '항목을 성공적으로 만들었습니다',
'alert.success.item_updated' => '항목을 성공적으로 업데이트했습니다',
'alert.success.item_deleted' => '항목을 성공적으로 제거했습니다',
@ -97,10 +102,12 @@ return array (
'alert.success.tag_restored' => '태그를 성공적으로 복원했습니다',
'alert.success.setting_updated' => '설정을 성공적으로 수정했습니다',
'alert.error.not_exist' => '이 설정은 존재하지 않습니다.',
'alert.error.file_too_big' => '파일이 너무 큽니다.',
'alert.error.file_not_stored' => '파일을 저장할 수 없습니다.',
'alert.success.user_created' => '사용자를 성공적으로 만들었습니다',
'alert.success.user_updated' => '사용자를 성공적으로 업데이트했습니다',
'alert.success.user_deleted' => '사용자를 성공적으로 제거했습니다',
'alert.success.user_restored' => '사용자를 성공적으로 복원했습니다',
'dashboard.reorder' => '항목 재정렬 및 고정',
'dashboard.settings' => '설정',
);
);

View file

@ -1,6 +1,6 @@
<?php
return array (
'failed' => 'These credentials do not match our records.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
);
'failed' => '이 자격 증명은 우리 기록과 일치하지 않습니다.',
'throttle' => '로그인 시도 횟수가 너무 많습니다. :seconds 초 후에 다시 시도하십시오.',
);

View file

@ -30,6 +30,10 @@ return [
'settings.background_image' => 'Imagin dedree',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'I link se derven...',
'settings.window_target.current' => 'In quella scheda chi',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Doneren',
'settings.version' => 'Versie',
'settings.background_image' => 'Achtergrondafbeelding',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link opent in',
'settings.window_target.current' => 'In de huidige tab openen',
'settings.window_target.one' => 'In dezelfde tab openen',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Donere',
'settings.version' => 'Versjon',
'settings.background_image' => 'Bakgrunnsbilde',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link åpnes inn',
'settings.window_target.current' => 'Åpne i denne fanen',
'settings.window_target.one' => 'Åpne i samme fane',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Podarować',
'settings.version' => 'Wersja',
'settings.background_image' => 'Tapeta Pulpitu',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Link otwiera się w',
'settings.window_target.current' => 'Otwórz w tej zakładce',
'settings.window_target.one' => 'Otwórz w tej samej zakładce',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Doar',
'settings.version' => 'Versão',
'settings.background_image' => 'Imagem de fundo',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'O link abre em',
'settings.window_target.current' => 'Abrir neste separador',
'settings.window_target.one' => 'Abrir no mesmo separador',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Пожертвования',
'settings.version' => 'Версия',
'settings.background_image' => 'Фоновое изображение',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Открывать ссылки в',
'settings.window_target.current' => 'Открывать в этой же закладке',
'settings.window_target.one' => 'Открывать в той же закладке',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Doniraj',
'settings.version' => 'Verzija',
'settings.background_image' => 'Slika za ozadje',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Povezava se odpre v',
'settings.window_target.current' => 'Odpri v tem zavihku',
'settings.window_target.one' => 'Odpri v istem zavihku',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Donera',
'settings.version' => 'Version',
'settings.background_image' => 'Bakgrundsbild',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Länken öppnas i',
'settings.window_target.current' => 'Öppna i denna flik',
'settings.window_target.one' => 'Öppna i samma flik',

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => 'Bağış yapmak',
'settings.version' => 'Versiyon',
'settings.background_image' => 'Arkaplan Resmi',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Bağlantıılır',
'settings.window_target.current' => 'Bu sekmede aç',
'settings.window_target.one' => 'Aynı sekmede aç',

113
resources/lang/uk/app.php Normal file
View file

@ -0,0 +1,113 @@
<?php
return array (
'settings.system' => 'Система',
'settings.appearance' => 'Зовнішній вигляд',
'settings.miscellaneous' => 'Різне',
'settings.advanced' => 'Просунуті',
'settings.support' => 'Підтримка',
'settings.donate' => 'Пожертви',
'settings.version' => 'Версія',
'settings.background_image' => 'Фонове зображення',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => 'Відкривати посилання в',
'settings.window_target.current' => 'Відкривати в цій вкладці',
'settings.window_target.one' => 'Відкривати у тій самій вкладці',
'settings.window_target.new' => 'Відкривати у новій вкладці',
'settings.homepage_search' => 'Сторінка пошуку',
'settings.search_provider' => 'Пошукова система',
'settings.language' => 'Мова',
'settings.reset' => 'Повернутися до початкових значень',
'settings.remove' => 'Видалити',
'settings.search' => 'знайти',
'settings.no_items' => 'Нічого не знайдено',
'settings.label' => 'Мітка',
'settings.value' => 'Значення',
'settings.edit' => 'Редагувати',
'settings.view' => 'Перегляд',
'settings.custom_css' => 'Кастомний CSS',
'settings.custom_js' => 'Кастомний JavaScript',
'options.none' => '- не задано -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'Початкова сторінка',
'options.yes' => 'Так',
'options.no' => 'Ні',
'options.nzbhydra' => 'NZBHydra',
'options.jackett' => 'Jackett',
'buttons.save' => 'Зберегти',
'buttons.cancel' => 'Скасувати',
'buttons.add' => 'Додати',
'buttons.upload' => 'Завантажити картинку',
'buttons.downloadapps' => 'Оновити список додатків',
'dash.pin_item' => 'Прикріпити до панелі',
'dash.no_apps' => 'Немає прикріплених додатків, :link1 або :link2',
'dash.link1' => 'Дотайте додаток',
'dash.link2' => 'Прикріпіть на дошку',
'dash.pinned_items' => 'Прикріплені елементи',
'apps.app_list' => 'Список додатків',
'apps.view_trash' => 'Показати кошик',
'apps.add_application' => 'Дотати додаток',
'apps.application_name' => 'Ім\'я додатку',
'apps.colour' => 'Колір',
'apps.icon' => 'Зображення',
'apps.pinned' => 'Прикріплено',
'apps.title' => 'Заголовок',
'apps.hex' => 'Колір в Hex',
'apps.username' => 'Ім\'я користувача',
'apps.password' => 'Пароль',
'apps.config' => 'Налаштування',
'apps.apikey' => 'Ключ API',
'apps.enable' => 'Увімкнено',
'apps.tag_list' => 'Список тегів',
'apps.add_tag' => 'Додати тег',
'apps.tag_name' => 'Назва тега',
'apps.tags' => 'Теги',
'apps.override' => 'Якщо відрізняється від основного url',
'apps.preview' => 'Попередній перегляд',
'apps.apptype' => 'Тип додатку',
'apps.website' => 'Вебсайт',
'apps.description' => 'Опис',
'apps.only_admin_account' => 'Тільки з адмін аккаунтом!',
'apps.autologin_url' => 'Автоматичний логін',
'apps.show_deleted' => 'Показати видалені додатки',
'app.import' => 'Імпорт',
'dashboard' => 'Основна панель',
'user.user_list' => 'Користувачі',
'user.add_user' => 'Додати користувача',
'user.username' => 'Ім\'я користувача',
'user.avatar' => 'Аватар',
'user.email' => 'Email',
'user.password_confirm' => 'Підтвердження пароля',
'user.secure_front' => 'Дозволити публічний доступ - Можливо тільки якщо встановлено пароль.',
'user.autologin' => 'Автоматичний вхід з визначеного URL. Хто завгодно зможе увійти за даним посиланням.',
'url' => 'URL',
'title' => 'Заголовок',
'delete' => 'Видалити',
'optional' => 'Опціонально',
'restore' => 'Відновити',
'export' => 'Експорт',
'import' => 'Імпорт',
'alert.success.item_created' => 'Елемент створено успішно',
'alert.success.item_updated' => 'Елемент оновлено успішно',
'alert.success.item_deleted' => 'Елемент видалено успішно',
'alert.success.item_restored' => 'Елемент відновлено успішно',
'alert.success.updating' => 'Обовлено список додатків',
'alert.success.tag_created' => 'Тег створено успішно',
'alert.success.tag_updated' => 'Тег оновлено успішно',
'alert.success.tag_deleted' => 'Тег видалено успішно',
'alert.success.tag_restored' => 'Тег відновлено успішно',
'alert.success.setting_updated' => 'Ви успішно відредагували налаштування',
'alert.error.not_exist' => 'Ваших налаштувань не існує.',
'alert.error.file_too_big' => 'Файл занадто великий.',
'alert.error.file_not_stored' => 'Не вдалося зберегти файл.',
'alert.success.user_created' => 'Користувача створено успішно',
'alert.success.user_updated' => 'Користувача оновлено успішно',
'alert.success.user_deleted' => 'Користувача видалено успішно',
'alert.success.user_restored' => 'Користувача відновлено успішно',
'dashboard.reorder' => 'Змінити порядок та закріпити елементи',
'dashboard.settings' => 'Налаштування',
);

View file

@ -0,0 +1,6 @@
<?php
return array (
'failed' => 'Введені реквізити не співпадають з існуючими.',
'throttle' => 'Забагато спроб авторизації. Спробуйте знову через :seconds секунд.',
);

View file

@ -0,0 +1,6 @@
<?php
return array (
'previous' => '&laquo; Попередній',
'next' => 'Наступний &raquo;',
);

View file

@ -0,0 +1,9 @@
<?php
return array (
'password' => 'Довжина пароля мінімум 6 символів та він має співпадати з підтвердженням.',
'reset' => 'Ваш пароль відновлено!',
'sent' => 'Мы відправили вам посилання для відновлення пароля!',
'token' => 'Некоректний токен для відновлення пароля.',
'user' => 'Користувача з такою e-mail адресою не існує.',
);

View file

@ -0,0 +1,121 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => ':attribute має бути підтверджено.',
'active_url' => ':attribute містить некоректний URL.',
'after' => ':attribute має бути дата більше ніж :date.',
'after_or_equal' => ':attribute має бути дата більше або рівна :date.',
'alpha' => ':attribute має містити лише літери.',
'alpha_dash' => ':attribute має містити лише літери, цифри та тире.',
'alpha_num' => ':attribute має містити лише літери і цифри.',
'array' => ':attribute має бути масивом.',
'before' => ':attribute має бути дата менше :date.',
'before_or_equal' => ':attribute має бути дата менне або рівна :date.',
'between' => [
'numeric' => ':attribute має буте в інтервалі від :min до :max.',
'file' => ':attribute має буте в інтервалі від :min до :max кілобайт.',
'string' => ':attribute має буте в інтервалі від :min до :max символів.',
'array' => ':attribute має містити :min і :max елементів.',
],
'boolean' => ':attribute поле поле має бути True або False.',
'confirmed' => ':attribute підтвердження не відповідає дійсності.',
'date' => ':attribute некоректна дата.',
'date_format' => ':attribute не співпадає з форматом :format.',
'different' => ':attribute і :other мають відрізнятися.',
'digits' => ':attribute має містити :digits розрядів.',
'digits_between' => ':attribute має містити від :min до :max розрядів.',
'dimensions' => ':attribute має некоректну роздільну здатність.',
'distinct' => ':attribute поле має значення що дублюється.',
'email' => ':attribute має бути дійсною адресою email.',
'exists' => 'Обраний :attribute недійсний.',
'file' => ':attribute має бути файлом.',
'filled' => ':attribute поле має бути завповнено.',
'image' => ':attribute має бути зображенням.',
'in' => 'Обране :attribute невірно.',
'in_array' => ':attribute поле не має існувати в :other.',
'integer' => ':attribute має бути цілим.',
'ip' => ':attribute має містити правильну адресу IP.',
'ipv4' => ':attribute має містити правильну адресу IPv4.',
'ipv6' => ':attribute має містити правильну адресу IPv6.',
'json' => ':attribute має містити правильну строку JSON.',
'max' => [
'numeric' => ':attribute не може бути більше :max.',
'file' => ':attribute не може бути більше :max кілобайт.',
'string' => ':attribute не може бути більше :max символів.',
'array' => ':attribute не може бути більше :max елементів.',
],
'mimes' => ':attribute має бути файлом вида: :values.',
'mimetypes' => ':attribute має бути файлом вида: :values.',
'min' => [
'numeric' => 'The :attribute має бути як мінімум :min.',
'file' => 'The :attribute має бути :min кілобайт.',
'string' => 'The :attribute має бути :min символів.',
'array' => 'The :attribute має містити мінімум :min елементів.',
],
'not_in' => 'Обраний :attribute недійсний.',
'numeric' => ':attribute має бути числом.',
'present' => ':attribute поле має існувати.',
'regex' => ':attribute формат недійсний.',
'required' => ':attribute поле обов\'язкове.',
'required_if' => ':attribute поле потрібно у випадку коли :other є :value.',
'required_unless' => ':attribute поле потрібно у випадку за виключенням коли :other є :values.',
'required_with' => ':attribute поле потрібно у випадку :values існує.',
'required_with_all' => ':attribute поле потрібно у випадку :values існують.',
'required_without' => ':attribute поле потрібно у випадку :values не існує.',
'required_without_all' => ':attribute поле потрібно у випадку коли жодне з :values не існує.',
'same' => ':attribute і :other повинні співпадати.',
'size' => [
'numeric' => ':attribute має бути :size.',
'file' => ':attribute має бути кілобайт.',
'string' => ':attribute має бути символів.',
'array' => ':attribute має містити :size елементів.',
],
'string' => ':attribute має бути строкою.',
'timezone' => ':attribute має бути правильною часовою зоною.',
'unique' => ':attribute вже існує.',
'uploaded' => ':attribute помилка завантаження.',
'url' => ':attribute недійсний формат.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'Довільне повідомлення',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View file

@ -19,6 +19,8 @@ return [
'settings.version' => '版本',
'settings.background_image' => '背景图片',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => '链接打开方式',
'settings.window_target.current' => '在当前选项卡中打开',
'settings.window_target.one' => '在同一个选项卡中打开',
@ -89,6 +91,7 @@ return [
'apps.only_admin_account' => '您必须拥有管理员账户!',
'apps.autologin_url' => '自动登录网址',
'apps.show_deleted' => '显示已移除的应用',
'app.import' => '导入',
'dashboard' => '仪表盘',
@ -106,6 +109,8 @@ return [
'delete' => '移除',
'optional' => '可选',
'restore' => '恢复',
'export' => '导出',
'import' => '导入',
'alert.success.item_created' => '应用创建成功',
'alert.success.item_updated' => '应用修改成功',
@ -120,10 +125,14 @@ return [
'alert.success.setting_updated' => '您成功编辑了此设置',
'alert.error.not_exist' => '此设置项不存在',
'alert.error.file_too_big' => '文件过大',
'alert.error.file_not_stored' => '文件无法保存',
'alert.success.user_created' => '用户创建成功',
'alert.success.user_updated' => '用户修改成功',
'alert.success.user_deleted' => '用户移除成功',
'alert.success.user_restored' => '用户恢复成功',
'dashboard.reorder' => '重新排序和固定应用',
'dashboard.settings' => '设置',
];

View file

@ -9,6 +9,8 @@ return array (
'settings.donate' => '捐赠',
'settings.version' => '版本',
'settings.background_image' => '背景图片',
'settings.trianglify' => 'Trianglify',
'settings.trianglify_seed' => 'Trianglify Random Seed',
'settings.window_target' => '链接打开方式',
'settings.window_target.current' => '在当前选项卡中打开',
'settings.window_target.one' => '在同一个选项卡中打开',

View file

@ -1,4 +1,4 @@
<section class="item-container{{ $app->droppable }}" data-name="{{ $app->title }}" data-id="{{ $app->id }}">
<section class="item-container{{ $app->droppable . ' ' . $app->getTagClass()}}" data-name="{{ $app->title }}" data-id="{{ $app->id }}">
<div class="item" style="background-color: {{ $app->colour }}">
<div class="app-icon-container">
@if($app->icon)

View file

@ -32,7 +32,7 @@
<tr>
<td>{{ $app->title }}</td>
<td><a href="{{ $app->url }}">{{ $app->link }}</a></td>
<td class="text-center"><a{{ $app->target }} href="{!! route('items.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
<td class="text-center"><a{{ $app->target }} href="{!! route('items.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {{ $app->title }}"><i class="fas fa-edit"></i></a></td>
<td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['items.destroy', $app->id],'style'=>'display:inline']) !!}
<button class="link" type="submit"><i class="fa fa-trash-alt"></i></button>

View file

@ -31,13 +31,13 @@
}
});
// initial load
$('#tile-preview .title').html($('#appname').val());
$('#tile-preview .title').text($('#appname').val());
$('#tile-preview .item').css('backgroundColor', $('#appcolour').val());
$('#tile-preview .app-icon').attr('src', $('#appimage img').attr('src'));
// Updates
$('#appname').on('keyup change', function(e) {
$('#tile-preview .title').html($(this).val());
$('#tile-preview .title').text($(this).val());
})
$('#apptype').on('change', function(e) {
appload($(this).find('option:selected').val());
@ -178,7 +178,7 @@
if($('#appname').val() === '') {
$('#appname').val(data.name)
}
$('#tile-preview .title').html($('#appname').val());
$('#tile-preview .title').text($('#appname').val());
if(data.custom != null) {
$.get(base+'view/'+data.custom, function(getdata) {
$('#sapconfig').html(getdata).show();

View file

@ -114,9 +114,36 @@
</div>
</div>
<script src="{{ asset('js/jquery-3.6.0.min.js') }}"></script>
<script src="{{ asset('js/jquery-ui.min.js') }}"></script>
<script src="{{ asset('js/jquery.min.js') }}"></script>
<script src="{{ asset(mix('js/app.js')) }}"></script>
@if($trianglify == 'true')
<script src="{{ asset('js/trianglify.js') }}"></script>
<script>
function addTriangleTo(target) {
var dimensions = target.getClientRects()[0];
var pattern = Trianglify({
width: dimensions.width,
height: dimensions.height
@if($trianglify_seed <> '')
, seed: '{!! $trianglify_seed !!}'
@endif
});
target.style['background-image'] = 'url(' + pattern.png() + ')';
target.style['background-size'] = 'cover';
target.style['-webkit-background-size'] = 'cover';
target.style['-moz-background-size'] = 'cover';
target.style['-o-background-size'] = 'cover';
}
var resizeTimer;
$(window).on('resize', function(e) {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
addTriangleTo(app);
}, 400);
});
</script>
<script>addTriangleTo(app);</script>
@endif
@yield('scripts')
<script id="custom_js">

View file

@ -55,10 +55,8 @@
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="/js/jquery-3.3.1.min.js"><\/script>')</script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="{{ asset('js/app.js?v=2') }}"></script>
<script src="{{ asset('js/jquery.min.js') }}"></script>
<script src="{{ asset(mix('js/app.js')) }}"></script>
@yield('scripts')
</body>

View file

@ -31,7 +31,7 @@
<tr>
<td>{{ $app->title }}</td>
<td><a{{ $app->target }} href="{{ url($app->link) }}">{{ $app->link }}</a></td>
<td class="text-center"><a href="{!! route('tags.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
<td class="text-center"><a href="{!! route('tags.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {{ $app->title }}"><i class="fas fa-edit"></i></a></td>
<td class="text-center">
{!! Form::open(['method' => 'DELETE','route' => ['tags.destroy', $app->id],'style'=>'display:inline']) !!}
<button class="link" type="submit"><i class="fa fa-trash-alt"></i></button>

View file

@ -2,6 +2,7 @@
use App\Application;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\HealthController;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\ImportController;
use App\Http\Controllers\ItemController;
@ -11,7 +12,7 @@ use App\Http\Controllers\SettingsController;
use App\Http\Controllers\TagController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Request;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*
@ -105,9 +106,11 @@ Route::group([
Route::patch('edit/{id}', [SettingsController::class,'update']);
});
Auth::routes();
Auth::routes(['register' => false]);
Route::get('/home', [HomeController::class,'index'])->name('home');
Route::resource('api/item', ItemRestController::class);
Route::get('import', ImportController::class)->name('items.import');
Route::get('/health', HealthController::class)->name('health');

File diff suppressed because one or more lines are too long

View file

@ -31,4 +31,15 @@ class ItemListTest extends TestCase
$response->assertSee('Item 2');
$response->assertSee('Item 3');
}
public function test_escapes_xss_on_the_item_list_page()
{
$this->addItemWithTitleToDB('<script>alert("XSS")</script>');
$response = $this->get('/items');
$response->assertStatus(200);
$response->assertDontSee('<script>alert("XSS")</script>', false);
$response->assertSee('<script>alert("XSS")</script>');
}
}

View file

@ -22,6 +22,8 @@ class SettingsTest extends TestCase
'Support',
'Donate',
'Background Image',
'Trianglify',
'Trianglify Random Seed',
'Homepage Search',
'Default Search Provider',
'Link opens in',

View file

@ -32,4 +32,15 @@ class TagListTest extends TestCase
$response->assertSee('Tag 2');
$response->assertSee('Tag 3');
}
public function test_escapes_xss_on_the_tag_list_page()
{
$this->addTagWithTitleToDB('<script>alert("XSS")</script>');
$response = $this->get('/tags');
$response->assertStatus(200);
$response->assertDontSee('<script>alert("XSS")</script>', false);
$response->assertSee('<script>alert("XSS")</script>');
}
}

View file

@ -0,0 +1,42 @@
<?php
namespace Tests\Unit\helpers;
use Tests\TestCase;
class IsImageTest extends TestCase
{
/**
* @return void
*/
public function test_returns_true_when_file_is_image()
{
$file = file_get_contents(__DIR__ . '/fixtures/heimdall-icon-small.png');
$actual = isImage($file, 'png');
$this->assertTrue($actual);
}
/**
* @return void
*/
public function test_returns_false_when_file_extension_is_image_but_content_is_not()
{
$actual = isImage("<?php ?>", "png");
$this->assertFalse($actual);
}
/**
* @return void
*/
public function test_returns_false_when_file_extension_is_not_image_but_content_is()
{
$file = file_get_contents(__DIR__ . '/fixtures/heimdall-icon-small.png');
$actual = isImage($file, 'php');
$this->assertFalse($actual);
}
}

View file

@ -0,0 +1,18 @@
<?php
namespace Tests\Unit\helpers;
use Tests\TestCase;
class SlugTest extends TestCase
{
/**
* @return void
*/
public function test_slug_returns_valid_tag_for_cn_characters_when_language_is_set_to_en_US()
{
$tag = str_slug('中文測試', '-', 'en_US');
$this->assertEquals('zhong-wen-ce-shi', $tag);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

3
webpack.mix.js vendored
View file

@ -14,7 +14,8 @@ const mix = require("laravel-mix");
mix
.babel(
[
// 'resources/assets/js/jquery-ui.min.js',
"node_modules/sortablejs/Sortable.min.js",
"resources/assets/js/jquery-ui.min.js",
"resources/assets/js/huebee.js",
"resources/assets/js/app.js",
"resources/assets/js/keyBindings.js",

352
yarn.lock
View file

@ -22,7 +22,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz"
integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.15.8", "@babel/core@^7.4.0-0":
"@babel/core@^7.15.8":
version "7.20.2"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz"
integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==
@ -964,16 +964,7 @@
"@jridgewell/set-array" "^1.0.0"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/gen-mapping@^0.3.0":
version "0.3.2"
resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
dependencies:
"@jridgewell/set-array" "^1.0.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/gen-mapping@^0.3.2":
"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
version "0.3.2"
resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
@ -1000,7 +991,7 @@
"@jridgewell/gen-mapping" "^0.3.0"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14":
"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
version "1.4.14"
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
@ -1026,7 +1017,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@ -1451,7 +1442,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0:
acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0:
version "8.8.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz"
integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==
@ -1475,7 +1466,7 @@ ajv-keywords@^5.0.0:
dependencies:
fast-deep-equal "^3.1.3"
ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@ -1485,17 +1476,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@^8.0.0:
version "8.11.2"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz"
integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
uri-js "^4.2.2"
ajv@^8.8.0, ajv@^8.8.2:
ajv@^8.0.0, ajv@^8.8.0:
version "8.11.2"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz"
integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==
@ -1542,16 +1523,16 @@ argparse@^2.0.1:
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
array-flatten@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
array-flatten@^2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
array-includes@^3.1.4:
version "3.1.6"
resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz"
@ -1667,17 +1648,7 @@ binary-extensions@^2.0.0:
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
bn.js@^4.0.0:
version "4.12.0"
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^4.1.0:
version "4.12.0"
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^4.11.9:
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
@ -1806,7 +1777,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.21.3, browserslist@^4.21.4, "browserslist@>= 4.21.0":
browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.21.3, browserslist@^4.21.4:
version "4.21.4"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz"
integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
@ -1908,7 +1879,7 @@ charenc@0.0.2:
resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz"
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
chokidar@^3.5.2, chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0":
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.2, chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@ -1996,16 +1967,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colord@^2.9.1:
version "2.9.3"
resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz"
@ -2016,12 +1987,7 @@ colorette@^2.0.10, colorette@^2.0.14:
resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^2.9.0:
commander@^2.20.0, commander@^2.9.0:
version "2.20.3"
resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@ -2316,7 +2282,7 @@ csso@^4.2.0:
dependencies:
css-tree "^1.1.2"
debug@^2.6.9:
debug@2.6.9, debug@^2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@ -2337,13 +2303,6 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
dependencies:
ms "2.1.2"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
@ -2369,16 +2328,16 @@ define-properties@^1.1.3, define-properties@^1.1.4:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
depd@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
des.js@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
@ -2465,14 +2424,7 @@ domhandler@^3.0.0:
dependencies:
domelementtype "^2.0.1"
domhandler@^4.2.0:
version "4.3.1"
resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"
integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
dependencies:
domelementtype "^2.2.0"
domhandler@^4.3.1:
domhandler@^4.2.0, domhandler@^4.3.1:
version "4.3.1"
resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"
integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
@ -2670,7 +2622,7 @@ eslint-module-utils@^2.7.3:
dependencies:
debug "^3.2.7"
eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.26.0:
eslint-plugin-import@^2.26.0:
version "2.26.0"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz"
integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==
@ -2696,14 +2648,6 @@ eslint-plugin-prettier@^4.2.1:
dependencies:
prettier-linter-helpers "^1.0.0"
eslint-scope@^7.1.1:
version "7.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz"
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
@ -2712,6 +2656,14 @@ eslint-scope@5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
eslint-scope@^7.1.1:
version "7.1.1"
resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz"
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz"
@ -2729,7 +2681,7 @@ eslint-visitor-keys@^3.3.0:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^7.32.0 || ^8.2.0", eslint@^8.28.0, eslint@>=5, eslint@>=7.0.0, eslint@>=7.28.0:
eslint@^8.28.0:
version "8.28.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz"
integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==
@ -2802,12 +2754,7 @@ estraverse@^4.1.1:
resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0:
version "5.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
estraverse@^5.2.0:
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
@ -3323,16 +3270,6 @@ http-deceiver@^1.2.7:
resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
http-errors@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
@ -3344,6 +3281,16 @@ http-errors@2.0.0:
statuses "2.0.1"
toidentifier "1.0.1"
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
http-parser-js@>=0.5.1:
version "0.5.8"
resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz"
@ -3401,7 +3348,7 @@ ignore@^5.1.1, ignore@^5.2.0:
resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
"imagemin@^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", imagemin@^7.0.1:
imagemin@^7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz"
integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
@ -3455,7 +3402,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@2, inherits@2.0.4:
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@ -3484,16 +3431,16 @@ interpret@^2.2.0:
resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
ipaddr.js@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz"
integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
ipaddr.js@1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
ipaddr.js@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz"
integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
@ -3673,10 +3620,10 @@ jest-worker@^27.4.5:
merge-stream "^2.0.0"
supports-color "^8.0.0"
jquery@^3.6.1:
version "3.6.1"
resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz"
integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==
jquery@^3.6.3:
version "3.6.3"
resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz"
integrity sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==
js-sdsl@^4.1.4:
version "4.2.0"
@ -3840,16 +3787,7 @@ loader-runner@^4.2.0:
resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz"
integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
loader-utils@^1.0.2:
version "1.4.2"
resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz"
integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
dependencies:
big.js "^5.2.2"
emojis-list "^3.0.0"
json5 "^1.0.1"
loader-utils@^1.1.0:
loader-utils@^1.0.2, loader-utils@^1.1.0:
version "1.4.2"
resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz"
integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
@ -3998,7 +3936,7 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
"mime-db@>= 1.43.0 < 2", mime-db@1.52.0:
mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
@ -4051,16 +3989,16 @@ minimist@^1.2.0, minimist@^1.2.6:
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
ms@^2.1.1, ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@2.1.2, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
ms@2.1.3:
version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
@ -4700,7 +4638,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3.11, postcss@>=8.0.9:
postcss@^8.2.15:
version "8.4.19"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz"
integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
@ -4721,10 +4659,10 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
prettier@>=2.0.0:
version "2.8.0"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz"
integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==
prettier@^2.8.1:
version "2.8.1"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz"
integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==
pretty-time@^1.1.0:
version "1.1.0"
@ -4761,6 +4699,11 @@ public-encrypt@^4.0.0:
randombytes "^2.0.1"
safe-buffer "^5.1.2"
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==
punycode@^1.2.4:
version "1.4.1"
resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
@ -4771,11 +4714,6 @@ punycode@^2.1.0:
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==
qs@6.11.0:
version "6.11.0"
resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz"
@ -4841,16 +4779,7 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.3.3, readable
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.0.6:
version "3.6.0"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@^3.6.0:
readable-stream@^3.0.6, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@ -5018,21 +4947,16 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-regex-test@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
@ -5042,7 +4966,7 @@ safe-regex-test@^1.0.0:
get-intrinsic "^1.1.3"
is-regex "^1.1.4"
safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3":
"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
version "2.1.2"
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@ -5055,7 +4979,7 @@ sass-loader@13.*:
klona "^2.0.4"
neo-async "^2.6.2"
sass@^1.3.0, sass@^1.56.1:
sass@^1.56.1:
version "1.56.1"
resolved "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz"
integrity sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==
@ -5073,25 +4997,7 @@ schema-utils@^2.6.5:
ajv "^6.12.4"
ajv-keywords "^3.5.2"
schema-utils@^3.0.0:
version "3.1.1"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
dependencies:
"@types/json-schema" "^7.0.8"
ajv "^6.12.5"
ajv-keywords "^3.5.2"
schema-utils@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
dependencies:
"@types/json-schema" "^7.0.8"
ajv "^6.12.5"
ajv-keywords "^3.5.2"
schema-utils@^3.1.1:
schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz"
integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
@ -5127,22 +5033,7 @@ selfsigned@^2.1.1:
dependencies:
node-forge "^1"
semver@^6.0.0:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^6.1.1:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^6.1.2:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^6.3.0:
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -5278,12 +5169,17 @@ sockjs@^0.3.24:
uuid "^8.3.2"
websocket-driver "^0.7.4"
sortablejs@^1.15.0:
version "1.15.0"
resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a"
integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==
source-list-map@^2.0.0:
version "2.0.1"
resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0":
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@ -5329,16 +5225,16 @@ stable@^0.1.8:
resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
"statuses@>= 1.4.0 < 2":
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
"statuses@>= 1.4.0 < 2":
version "1.5.0"
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
std-env@^3.0.1:
version "3.3.1"
resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz"
@ -5363,20 +5259,6 @@ stream-http@^2.7.2:
to-arraybuffer "^1.0.0"
xtend "^4.0.0"
string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
@ -5404,6 +5286,20 @@ string.prototype.trimstart@^1.0.5:
define-properties "^1.1.4"
es-abstract "^1.20.4"
string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
@ -5633,7 +5529,7 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
unpipe@~1.0.0, unpipe@1.0.0:
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
@ -5666,13 +5562,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
util@^0.11.0:
version "0.11.1"
resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz"
integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
dependencies:
inherits "2.0.3"
util@0.10.3:
version "0.10.3"
resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz"
@ -5680,6 +5569,13 @@ util@0.10.3:
dependencies:
inherits "2.0.1"
util@^0.11.0:
version "0.11.1"
resolved "https://registry.npmjs.org/util/-/util-0.11.1.tgz"
integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
dependencies:
inherits "2.0.3"
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
@ -5723,7 +5619,7 @@ wbuf@^1.1.0, wbuf@^1.7.3:
dependencies:
minimalistic-assert "^1.0.0"
webpack-cli@^4.9.1, webpack-cli@4.x.x:
webpack-cli@^4.9.1:
version "4.10.0"
resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz"
integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
@ -5816,7 +5712,7 @@ webpack-sources@^3.2.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
"webpack@^4.0.0 || ^5.0.0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.60.0, webpack@>=2, "webpack@3 || 4 || 5", "webpack@4.x.x || 5.x.x":
webpack@^5.60.0:
version "5.75.0"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz"
integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==
@ -5856,7 +5752,7 @@ webpackbar@^5.0.0-3:
pretty-time "^1.1.0"
std-env "^3.0.1"
websocket-driver@^0.7.4, websocket-driver@>=0.5.1:
websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
version "0.7.4"
resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==