diff --git a/.eslintrc.js b/.eslintrc.js index 9f18230..47199bc 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,7 +11,8 @@ module.exports = { ], rules: { "vue/multi-word-component-names": "off", - indent: ["error", 4], + indent: ["off", 4, { ignoredNodes: ["ConditionalExpression"] }], + "@typescript-eslint/no-inferrable-types": "off", }, plugins: ["jsdoc", "@typescript-eslint"], parser: "vue-eslint-parser", diff --git a/.github/workflows/laravel.yml b/.github/workflows/laravel.yml index f566358..8b710ea 100644 --- a/.github/workflows/laravel.yml +++ b/.github/workflows/laravel.yml @@ -58,5 +58,6 @@ jobs: php artisan migrate --force npm install npm run build + npm run prepare php artisan optimize php artisan up diff --git a/.gitignore b/.gitignore index ba18049..37360a5 100644 --- a/.gitignore +++ b/.gitignore @@ -237,4 +237,11 @@ dist/ ### This Project ### /public/uploads /public/build -*.key \ No newline at end of file +/public/tinymce +*.key + +### Synk ### +.dccache + +### TempCodeRunner ### +tempCodeRunnerFile.* \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 37c63e9..3128a3c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,8 @@ "editor.formatOnType": true, "editor.formatOnSave": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": true, + "source.organizeImports": true }, "editor.defaultFormatter": "esbenp.prettier-vscode", "[vue]": { diff --git a/app/Filters/FilterAbstract.php b/app/Filters/FilterAbstract.php index ee93886..13d9e62 100644 --- a/app/Filters/FilterAbstract.php +++ b/app/Filters/FilterAbstract.php @@ -165,9 +165,10 @@ abstract class FilterAbstract * * @param array $attributes Attributes currently visible. * @param User|null $user Current logged in user or null. + * @param object $modelData Model data if a single object is requested. * @return mixed */ - protected function seeAttributes(array $attributes, mixed $user) + protected function seeAttributes(array $attributes, mixed $user, ?object $modelData = null) { return $attributes; } @@ -224,7 +225,7 @@ abstract class FilterAbstract } /* Run attribute modifiers*/ - $modifiedAttribs = $this->seeAttributes($attributes, $this->request->user()); + $modifiedAttribs = $this->seeAttributes($attributes, $this->request->user(), $model); if (is_array($modifiedAttribs) === true) { $attributes = $modifiedAttribs; } diff --git a/app/Filters/UserFilter.php b/app/Filters/UserFilter.php index 1aa5849..398969d 100644 --- a/app/Filters/UserFilter.php +++ b/app/Filters/UserFilter.php @@ -19,11 +19,12 @@ class UserFilter extends FilterAbstract * * @param array $attributes Attributes currently visible. * @param User|null $user Current logged in user or null. + * @param object $userData User model if single object is requested. * @return mixed */ - protected function seeAttributes(array $attributes, mixed $user) + protected function seeAttributes(array $attributes, mixed $user, ?object $userData = null) { - if ($user?->hasPermission('admin/users') !== true) { + if ($user?->hasPermission('admin/users') !== true && ($user === null || $userData === null || $user?->id !== $userData?->id)) { return ['id', 'username']; } } diff --git a/app/Http/Controllers/Api/AttachmentController.php b/app/Http/Controllers/Api/AttachmentController.php new file mode 100644 index 0000000..36a5acc --- /dev/null +++ b/app/Http/Controllers/Api/AttachmentController.php @@ -0,0 +1,84 @@ +middleware('auth:sanctum') + ->except(['store', 'destroyByEmail']); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + // + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + * + * @param \App\Models\Attachment $attachment + * @return \Illuminate\Http\Response + */ + public function show(Attachment $attachment) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\Attachment $attachment + * @return \Illuminate\Http\Response + */ + public function edit(Attachment $attachment) + { + // + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Models\Attachment $attachment + * @return \Illuminate\Http\Response + */ + public function update(Request $request, Attachment $attachment) + { + // + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Attachment $attachment + * @return \Illuminate\Http\Response + */ + public function destroy(Attachment $attachment) + { + // + } +} diff --git a/app/Http/Controllers/Api/MediaController.php b/app/Http/Controllers/Api/MediaController.php index f223bc7..9fdf11fa 100644 --- a/app/Http/Controllers/Api/MediaController.php +++ b/app/Http/Controllers/Api/MediaController.php @@ -59,7 +59,7 @@ class MediaController extends ApiController { $file = $request->file('file'); if ($file === null) { - return $this->respondError(['file' => 'An error occurred uploading the file to the server.']); + return $this->respondWithErrors(['file' => 'The browser did not upload the file correctly to the server.']); } if ($file->isValid() !== true) { @@ -68,9 +68,9 @@ class MediaController extends ApiController case UPLOAD_ERR_FORM_SIZE: return $this->respondTooLarge(); case UPLOAD_ERR_PARTIAL: - return $this->respondError(['file' => 'The file upload was interrupted.']); + return $this->respondWithErrors(['file' => 'The file upload was interrupted.']); default: - return $this->respondError(['file' => 'An error occurred uploading the file to the server.']); + return $this->respondWithErrors(['file' => 'An error occurred uploading the file to the server.']); } } @@ -82,7 +82,7 @@ class MediaController extends ApiController $mime = $file->getMimeType(); $fileInfo = Media::store($file, empty($request->input('permission'))); if ($fileInfo === null) { - return $this->respondError( + return $this->respondWithErrors( ['file' => 'The file could not be stored on the server'], HttpResponseCodes::HTTP_INTERNAL_SERVER_ERROR ); @@ -121,7 +121,7 @@ class MediaController extends ApiController $oldPath = $medium->path(); $fileInfo = Media::store($file, empty($request->input('permission'))); if ($fileInfo === null) { - return $this->respondError( + return $this->respondWithErrors( ['file' => 'The file could not be stored on the server'], HttpResponseCodes::HTTP_INTERNAL_SERVER_ERROR ); @@ -218,6 +218,7 @@ class MediaController extends ApiController $headerExpires = $updated_at->addMonth()->toRfc2822String(); }//end if + // deepcode ignore InsecureHash: Browsers expect Etag to be a md5 hash $headerEtag = md5($updated_at->format('U')); $headerLastModified = $updated_at->toRfc2822String(); diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index e92130d..3e1382b 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -240,7 +240,7 @@ class UserController extends ApiController } return $this->respondError([ - 'code' => 'The code was not found or has expired' + 'code' => 'The code was not found or has expired.' ]); } @@ -278,7 +278,7 @@ class UserController extends ApiController }//end if return $this->respondWithErrors([ - 'code' => 'The code was not found or has expired' + 'code' => 'The code was not found or has expired.' ]); } diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php new file mode 100644 index 0000000..b1bc6f2 --- /dev/null +++ b/app/Models/Attachment.php @@ -0,0 +1,28 @@ + + */ + protected $fillable = [ + 'media_id', + ]; + + + /** + * Get attachments attachable + */ + public function attachable() + { + return $this->morphTo(); + }} diff --git a/app/Models/Event.php b/app/Models/Event.php index 1e87ebe..eac9a9b 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -29,4 +29,12 @@ class Event extends Model 'hero', 'content' ]; + + /** + * Get all of the post's attachments. + */ + public function attachments() + { + return $this->morphMany('App\Attachment', 'attachable'); + } } diff --git a/app/Models/Post.php b/app/Models/Post.php index 9584def..2fb5b69 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -27,7 +27,7 @@ class Post extends Model /** - * Get the file user + * Get the post user * * @return BelongsTo */ @@ -35,4 +35,12 @@ class Post extends Model { return $this->belongsTo(User::class); } + + /** + * Get all of the post's attachments. + */ + public function attachments() + { + return $this->morphMany('App\Attachment', 'attachable'); + } } diff --git a/app/Services/AnimatedGifService.php b/app/Services/AnimatedGifService.php new file mode 100644 index 0000000..e446e15 --- /dev/null +++ b/app/Services/AnimatedGifService.php @@ -0,0 +1,698 @@ + 0. + * @param integer $dataSize GIF blob size. + * @return boolean GIF file/blob is animated. + */ + public static function isAnimatedGif(string $filenameOrBlob, int $dataSize = 0) + { + $regex = '#\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)#s'; + $count = 0; + + if ($dataSize > 0) { + if (($fh = @fopen($filenameOrBlob, 'rb')) === false) { + return false; + } + + $chunk = false; + while (feof($fh) === false && $count < 2) { + $chunk = ($chunk !== '' ? substr($chunk, -20) : "") . fread($fh, (1024 * 100)); //read 100kb at a time + $count += preg_match_all($regex, $chunk, $matches); + } + + fclose($fh); + } else { + $count = preg_match_all($regex, $filenameOrBlob, $matches); + } + + return $count > 1; + } + + /** + * Extract frames of a GIF + * + * @param string $filenameOrBlob GIF filename path + * @param integer $dataSize GIF blob size. + * @param boolean $originalFrames Get original frames (with transparent background) + * + * @return array + */ + public function extract(string $filenameOrBlob, int $dataSize = 0, $originalFrames = false) + { + if (self::isAnimatedGif($filenameOrBlob) === false) { + return []; + } + + $this->reset(); + $this->parseFramesInfo($filename); + $prevImg = null; + + for ($i = 0; $i < count($this->frameSources); $i++) { + $this->frames[$i] = []; + $this->frameDurations[$i] = $this->frames[$i]['duration'] = $this->frameSources[$i]['delay_time']; + + $img = imagecreatefromstring($this->fileHeader["gifheader"] . $this->frameSources[$i]["graphicsextension"] . $this->frameSources[$i]["imagedata"] . chr(0x3b)); + + if (!$originalFrames) { + if ($i > 0) { + $prevImg = $this->frames[($i - 1)]['image']; + } else { + $prevImg = $img; + } + + $sprite = imagecreate($this->gifMaxWidth, $this->gifMaxHeight); + imagesavealpha($sprite, true); + + $transparent = imagecolortransparent($prevImg); + + if ($transparent > -1 && imagecolorstotal($prevImg) > $transparent) { + $actualTrans = imagecolorsforindex($prevImg, $transparent); + imagecolortransparent($sprite, imagecolorallocate($sprite, $actualTrans['red'], $actualTrans['green'], $actualTrans['blue'])); + } + + if ((int) $this->frameSources[$i]['disposal_method'] == 1 && $i > 0) { + imagecopy($sprite, $prevImg, 0, 0, 0, 0, $this->gifMaxWidth, $this->gifMaxHeight); + } + + imagecopyresampled($sprite, $img, $this->frameSources[$i]["offset_left"], $this->frameSources[$i]["offset_top"], 0, 0, $this->gifMaxWidth, $this->gifMaxHeight, $this->gifMaxWidth, $this->gifMaxHeight); + $img = $sprite; + }//end if + + $this->frameImages[$i] = $this->frames[$i]['image'] = $img; + }//end for + + return $this->frames; + } +} + +class GifFrameExtractor +{ + // Properties + // =================================================================================== + + /** + * @var resource + */ + private $gif; + + /** + * @var array + */ + private $frames; + + /** + * @var array + */ + private $frameDurations; + + /** + * @var array + */ + private $frameImages; + + /** + * @var array + */ + private $framePositions; + + /** + * @var array + */ + private $frameDimensions; + + /** + * @var integer + * + * (old: $this->index) + */ + private $frameNumber; + + /** + * @var array + * + * (old: $this->imagedata) + */ + private $frameSources; + + /** + * @var array + * + * (old: $this->fileHeader) + */ + private $fileHeader; + + /** + * @var integer The reader pointer in the file source + * + * (old: $this->pointer) + */ + private $pointer; + + /** + * @var integer + */ + private $gifMaxWidth; + + /** + * @var integer + */ + private $gifMaxHeight; + + /** + * @var integer + */ + private $totalDuration; + + /** + * @var integer + */ + private $handle; + + /** + * @var array + * + * (old: globaldata) + */ + private $globaldata; + + /** + * @var array + * + * (old: orgvars) + */ + private $orgvars; + + // Methods + // =================================================================================== + + + /** + * Parse the frame informations contained in the GIF file + * + * @param string $filename GIF filename path + */ + private function parseFramesInfo($filename) + { + $this->openFile($filename); + $this->parseGifHeader(); + $this->parseGraphicsExtension(0); + $this->getApplicationData(); + $this->getApplicationData(); + $this->getFrameString(0); + $this->parseGraphicsExtension(1); + $this->getCommentData(); + $this->getApplicationData(); + $this->getFrameString(1); + + while (!$this->checkByte(0x3b) && !$this->checkEOF()) { + $this->getCommentData(1); + $this->parseGraphicsExtension(2); + $this->getFrameString(2); + $this->getApplicationData(); + } + } + + /** + * Parse the gif header (old: get_gif_header) + */ + private function parseGifHeader() + { + $this->pointerForward(10); + + if ($this->readBits(($mybyte = $this->readByteInt()), 0, 1) == 1) { + $this->pointerForward(2); + $this->pointerForward(pow(2, ($this->readBits($mybyte, 5, 3) + 1)) * 3); + } else { + $this->pointerForward(2); + } + + $this->fileHeader["gifheader"] = $this->dataPart(0, $this->pointer); + + // Decoding + $this->orgvars["gifheader"] = $this->fileHeader["gifheader"]; + $this->orgvars["background_color"] = $this->orgvars["gifheader"][11]; + } + + /** + * Parse the application data of the frames (old: get_application_data) + */ + private function getApplicationData() + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xff)) { + $start = ($this->pointer - 2); + $this->pointerForward($this->readByteInt()); + $this->readDataStream($this->readByteInt()); + $this->fileHeader["applicationdata"] = $this->dataPart($start, ($this->pointer - $start)); + } else { + $this->pointerRewind(2); + } + } + + /** + * Parse the comment data of the frames (old: get_comment_data) + */ + private function getCommentData() + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xfe)) { + $start = ($this->pointer - 2); + $this->readDataStream($this->readByteInt()); + $this->fileHeader["commentdata"] = $this->dataPart($start, ($this->pointer - $start)); + } else { + $this->pointerRewind(2); + } + } + + /** + * Parse the graphic extension of the frames (old: get_graphics_extension) + * + * @param integer $type + */ + private function parseGraphicsExtension($type) + { + $startdata = $this->readByte(2); + + if ($startdata == chr(0x21) . chr(0xf9)) { + $start = ($this->pointer - 2); + $this->pointerForward($this->readByteInt()); + $this->pointerForward(1); + + if ($type == 2) { + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->dataPart($start, ($this->pointer - $start)); + } elseif ($type == 1) { + $this->orgvars["hasgx_type_1"] = 1; + $this->globaldata["graphicsextension"] = $this->dataPart($start, ($this->pointer - $start)); + } elseif ($type == 0) { + $this->orgvars["hasgx_type_0"] = 1; + $this->globaldata["graphicsextension_0"] = $this->dataPart($start, ($this->pointer - $start)); + } + } else { + $this->pointerRewind(2); + }//end if + } + + /** + * Get the full frame string block (old: get_image_block) + * + * @param integer $type + */ + private function getFrameString($type) + { + if ($this->checkByte(0x2c)) { + $start = $this->pointer; + $this->pointerForward(9); + + if ($this->readBits(($mybyte = $this->readByteInt()), 0, 1) == 1) { + $this->pointerForward(pow(2, ($this->readBits($mybyte, 5, 3) + 1)) * 3); + } + + $this->pointerForward(1); + $this->readDataStream($this->readByteInt()); + $this->frameSources[$this->frameNumber]["imagedata"] = $this->dataPart($start, ($this->pointer - $start)); + + if ($type == 0) { + $this->orgvars["hasgx_type_0"] = 0; + + if (isset($this->globaldata["graphicsextension_0"])) { + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension_0"]; + } else { + $this->frameSources[$this->frameNumber]["graphicsextension"] = null; + } + + unset($this->globaldata["graphicsextension_0"]); + } elseif ($type == 1) { + if (isset($this->orgvars["hasgx_type_1"]) && $this->orgvars["hasgx_type_1"] == 1) { + $this->orgvars["hasgx_type_1"] = 0; + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension"]; + unset($this->globaldata["graphicsextension"]); + } else { + $this->orgvars["hasgx_type_0"] = 0; + $this->frameSources[$this->frameNumber]["graphicsextension"] = $this->globaldata["graphicsextension_0"]; + unset($this->globaldata["graphicsextension_0"]); + } + }//end if + + $this->parseFrameData(); + $this->frameNumber++; + }//end if + } + + /** + * Parse frame data string into an array (old: parse_image_data) + */ + private function parseFrameData() + { + $this->frameSources[$this->frameNumber]["disposal_method"] = $this->getImageDataBit("ext", 3, 3, 3); + $this->frameSources[$this->frameNumber]["user_input_flag"] = $this->getImageDataBit("ext", 3, 6, 1); + $this->frameSources[$this->frameNumber]["transparent_color_flag"] = $this->getImageDataBit("ext", 3, 7, 1); + $this->frameSources[$this->frameNumber]["delay_time"] = $this->dualByteVal($this->getImageDataByte("ext", 4, 2)); + $this->totalDuration += (int) $this->frameSources[$this->frameNumber]["delay_time"]; + $this->frameSources[$this->frameNumber]["transparent_color_index"] = ord($this->getImageDataByte("ext", 6, 1)); + $this->frameSources[$this->frameNumber]["offset_left"] = $this->dualByteVal($this->getImageDataByte("dat", 1, 2)); + $this->frameSources[$this->frameNumber]["offset_top"] = $this->dualByteVal($this->getImageDataByte("dat", 3, 2)); + $this->frameSources[$this->frameNumber]["width"] = $this->dualByteVal($this->getImageDataByte("dat", 5, 2)); + $this->frameSources[$this->frameNumber]["height"] = $this->dualByteVal($this->getImageDataByte("dat", 7, 2)); + $this->frameSources[$this->frameNumber]["local_color_table_flag"] = $this->getImageDataBit("dat", 9, 0, 1); + $this->frameSources[$this->frameNumber]["interlace_flag"] = $this->getImageDataBit("dat", 9, 1, 1); + $this->frameSources[$this->frameNumber]["sort_flag"] = $this->getImageDataBit("dat", 9, 2, 1); + $this->frameSources[$this->frameNumber]["color_table_size"] = (pow(2, ($this->getImageDataBit("dat", 9, 5, 3) + 1)) * 3); + $this->frameSources[$this->frameNumber]["color_table"] = substr($this->frameSources[$this->frameNumber]["imagedata"], 10, $this->frameSources[$this->frameNumber]["color_table_size"]); + $this->frameSources[$this->frameNumber]["lzw_code_size"] = ord($this->getImageDataByte("dat", 10, 1)); + + $this->framePositions[$this->frameNumber] = [ + 'x' => $this->frameSources[$this->frameNumber]["offset_left"], + 'y' => $this->frameSources[$this->frameNumber]["offset_top"], + ]; + + $this->frameDimensions[$this->frameNumber] = [ + 'width' => $this->frameSources[$this->frameNumber]["width"], + 'height' => $this->frameSources[$this->frameNumber]["height"], + ]; + + // Decoding + $this->orgvars[$this->frameNumber]["transparent_color_flag"] = $this->frameSources[$this->frameNumber]["transparent_color_flag"]; + $this->orgvars[$this->frameNumber]["transparent_color_index"] = $this->frameSources[$this->frameNumber]["transparent_color_index"]; + $this->orgvars[$this->frameNumber]["delay_time"] = $this->frameSources[$this->frameNumber]["delay_time"]; + $this->orgvars[$this->frameNumber]["disposal_method"] = $this->frameSources[$this->frameNumber]["disposal_method"]; + $this->orgvars[$this->frameNumber]["offset_left"] = $this->frameSources[$this->frameNumber]["offset_left"]; + $this->orgvars[$this->frameNumber]["offset_top"] = $this->frameSources[$this->frameNumber]["offset_top"]; + + // Updating the max width + if ($this->gifMaxWidth < $this->frameSources[$this->frameNumber]["width"]) { + $this->gifMaxWidth = $this->frameSources[$this->frameNumber]["width"]; + } + + // Updating the max height + if ($this->gifMaxHeight < $this->frameSources[$this->frameNumber]["height"]) { + $this->gifMaxHeight = $this->frameSources[$this->frameNumber]["height"]; + } + } + + /** + * Get the image data byte (old: get_imagedata_byte) + * + * @param string $type + * @param integer $start + * @param integer $length + * + * @return string + */ + private function getImageDataByte($type, $start, $length) + { + if ($type == "ext") { + return substr($this->frameSources[$this->frameNumber]["graphicsextension"], $start, $length); + } + + // "dat" + return substr($this->frameSources[$this->frameNumber]["imagedata"], $start, $length); + } + + /** + * Get the image data bit (old: get_imagedata_bit) + * + * @param string $type + * @param integer $byteIndex + * @param integer $bitStart + * @param integer $bitLength + * + * @return number + */ + private function getImageDataBit($type, $byteIndex, $bitStart, $bitLength) + { + if ($type == "ext") { + return $this->readBits(ord(substr($this->frameSources[$this->frameNumber]["graphicsextension"], $byteIndex, 1)), $bitStart, $bitLength); + } + + // "dat" + return $this->readBits(ord(substr($this->frameSources[$this->frameNumber]["imagedata"], $byteIndex, 1)), $bitStart, $bitLength); + } + + /** + * Return the value of 2 ASCII chars (old: dualbyteval) + * + * @param string $s + * + * @return integer + */ + private function dualByteVal($s) + { + $i = (ord($s[1]) * 256 + ord($s[0])); + + return $i; + } + + /** + * Read the data stream (old: read_data_stream) + * + * @param integer $firstLength + */ + private function readDataStream($firstLength) + { + $this->pointerForward($firstLength); + $length = $this->readByteInt(); + + if ($length != 0) { + while ($length != 0) { + $this->pointerForward($length); + $length = $this->readByteInt(); + } + } + } + + /** + * Open the gif file (old: loadfile) + * + * @param string $filename + */ + private function openFile($filename) + { + $this->handle = fopen($filename, "rb"); + $this->pointer = 0; + + $imageSize = getimagesize($filename); + $this->gifWidth = $imageSize[0]; + $this->gifHeight = $imageSize[1]; + } + + /** + * Close the read gif file (old: closefile) + */ + private function closeFile() + { + fclose($this->handle); + $this->handle = 0; + } + + /** + * Read the file from the beginning to $byteCount in binary (old: readbyte) + * + * @param integer $byteCount + * + * @return string + */ + private function readByte($byteCount) + { + $data = fread($this->handle, $byteCount); + $this->pointer += $byteCount; + + return $data; + } + + /** + * Read a byte and return ASCII value (old: readbyte_int) + * + * @return integer + */ + private function readByteInt() + { + $data = fread($this->handle, 1); + $this->pointer++; + + return ord($data); + } + + /** + * Convert a $byte to decimal (old: readbits) + * + * @param string $byte + * @param integer $start + * @param integer $length + * + * @return number + */ + private function readBits($byte, $start, $length) + { + $bin = str_pad(decbin($byte), 8, "0", STR_PAD_LEFT); + $data = substr($bin, $start, $length); + + return bindec($data); + } + + /** + * Rewind the file pointer reader (old: p_rewind) + * + * @param integer $length + */ + private function pointerRewind($length) + { + $this->pointer -= $length; + fseek($this->handle, $this->pointer); + } + + /** + * Forward the file pointer reader (old: p_forward) + * + * @param integer $length + */ + private function pointerForward($length) + { + $this->pointer += $length; + fseek($this->handle, $this->pointer); + } + + /** + * Get a section of the data from $start to $start + $length (old: datapart) + * + * @param integer $start + * @param integer $length + * + * @return string + */ + private function dataPart($start, $length) + { + fseek($this->handle, $start); + $data = fread($this->handle, $length); + fseek($this->handle, $this->pointer); + + return $data; + } + + /** + * Check if a character if a byte (old: checkbyte) + * + * @param integer $byte + * + * @return boolean + */ + private function checkByte($byte) + { + if (fgetc($this->handle) == chr($byte)) { + fseek($this->handle, $this->pointer); + return true; + } + + fseek($this->handle, $this->pointer); + + return false; + } + + /** + * Check the end of the file (old: checkEOF) + * + * @return boolean + */ + private function checkEOF() + { + if (fgetc($this->handle) === false) { + return true; + } + + fseek($this->handle, $this->pointer); + + return false; + } + + /** + * Reset and clear this current object + */ + private function reset() + { + $this->gif = null; + $this->totalDuration = $this->gifMaxHeight = $this->gifMaxWidth = $this->handle = $this->pointer = $this->frameNumber = 0; + $this->frameDimensions = $this->framePositions = $this->frameImages = $this->frameDurations = $this->globaldata = $this->orgvars = $this->frames = $this->fileHeader = $this->frameSources = []; + } + + // Getter / Setter + // =================================================================================== + + + /** + * Get the total of all added frame duration + * + * @return integer + */ + public function getTotalDuration() + { + return $this->totalDuration; + } + + /** + * Get the number of extracted frames + * + * @return integer + */ + public function getFrameNumber() + { + return $this->frameNumber; + } + + /** + * Get the extracted frames (images and durations) + * + * @return array + */ + public function getFrames() + { + return $this->frames; + } + + /** + * Get the extracted frame positions + * + * @return array + */ + public function getFramePositions() + { + return $this->framePositions; + } + + /** + * Get the extracted frame dimensions + * + * @return array + */ + public function getFrameDimensions() + { + return $this->frameDimensions; + } + + /** + * Get the extracted frame images + * + * @return array + */ + public function getFrameImages() + { + return $this->frameImages; + } + + /** + * Get the extracted frame durations + * + * @return array + */ + public function getFrameDurations() + { + return $this->frameDurations; + } +} diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php deleted file mode 100644 index be65efd..0000000 --- a/app/Services/ImageService.php +++ /dev/null @@ -1,9 +0,0 @@ -id(); + $table->uuid('media_id'); + $table->uuidMorphs('attachable'); + $table->timestamps(); + + $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('media_attachments'); + } +}; diff --git a/import-meta.ts b/import-meta.ts new file mode 100644 index 0000000..e7708dd --- /dev/null +++ b/import-meta.ts @@ -0,0 +1,6 @@ +export interface ImportMetaExtras extends ImportMeta { + env: { + APP_URL: string; + [key: string]: string; + }; +} diff --git a/package-lock.json b/package-lock.json index 8906a72..388a0e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,20 @@ { - "name": "Website", + "name": "website", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/free-brands-svg-icons": "^6.2.1", - "@fortawesome/free-regular-svg-icons": "^6.2.1", - "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@fortawesome/vue-fontawesome": "^3.0.2", + "@tinymce/tinymce-vue": "^4.0.7", "@vitejs/plugin-vue": "^4.0.0", "@vuepic/vue-datepicker": "^3.6.4", - "date-fns": "^2.29.3", + "dompurify": "^3.0.0", "dotenv": "^16.0.3", - "element-plus": "^2.2.27", "normalize.css": "^8.0.1", "pinia": "^2.0.28", "pinia-plugin-persistedstate": "^3.0.1", "sass": "^1.57.1", - "trix": "^2.0.4", + "tinymce": "^6.3.1", "vue": "^3.2.36", "vue-dompurify-html": "^3.1.2", "vue-final-modal": "^3.4.11", @@ -32,7 +27,6 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", - "axios": "^1.1.2", "eslint": "^8.31.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-jsdoc": "^39.6.4", @@ -41,14 +35,17 @@ "lodash": "^4.17.19", "postcss": "^8.1.14", "prettier": "2.8.2", - "typescript": "^4.9.4", - "vite": "^4.0.0" + "rollup-plugin-analyzer": "^4.0.0", + "ts-node": "^10.9.1", + "typescript": "^4.9.5", + "vite": "^4.0.0", + "vitest": "^0.28.5" } }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -56,20 +53,16 @@ "node": ">=6.0.0" } }, - "node_modules/@ctrl/tinycolor": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz", - "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, "engines": { - "node": ">=10" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.0.10.tgz", - "integrity": "sha512-ygEZ1mwPjcPo/OulhzLE7mtDrQBWI8vZzEWSNB2W/RNCRjoQGwbaK4N8lV4rid7Ts4qvySU3njMN7YCiSlSaTQ==", - "peerDependencies": { - "vue": "^3.2.0" + "node": ">=12" } }, "node_modules/@es-joy/jsdoccomment": { @@ -439,85 +432,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@floating-ui/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.1.tgz", - "integrity": "sha512-PL7g3dhA4dHgZfujkuD8Q+tfJJynEtnNQSPzmucCnxMvkxf4cLBJw/ZYqZUn4HCh33U3WHrAfv2R2tbi9UCSmw==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", - "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", - "dependencies": { - "@floating-ui/core": "^1.1.0" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz", - "integrity": "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz", - "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.2.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/vue-fontawesome": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz", - "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==", - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "vue": ">= 3.0.0 < 4" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -569,7 +483,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "peer": true, "engines": { "node": ">=6.0.0" } @@ -596,17 +509,15 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "peer": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "peer": true, + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@nodelib/fs.scandir": { @@ -644,20 +555,65 @@ "node": ">= 8" } }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node_modules/@tinymce/tinymce-vue": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-4.0.7.tgz", + "integrity": "sha512-1esB8wGWrjPCY+rK8vy3QB1cxwXo7HLJWuNrcyPl6LOVR+QJjub0OiV/C+TUEsLN6OpCtRv+QnIqMC5vXz783Q==", + "dependencies": { + "tinymce": "^5.5.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@tinymce/tinymce-vue/node_modules/tinymce": { + "version": "5.10.7", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.7.tgz", + "integrity": "sha512-9UUjaO0R7FxcFo0oxnd1lMs7H+D0Eh+dDVo5hKbVe1a+VB0nit97vOqlinj+YwgoBDt6/DSCUoWqAYlLI8BLYA==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" } }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", + "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", "peer": true, "dependencies": { "@types/estree": "*", @@ -685,24 +641,10 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "peer": true + "version": "18.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz", + "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -710,20 +652,15 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", - "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", + "integrity": "sha512-alFpFWNucPLdUOySmXCJpzr6HKC3bu7XooShWM+3w/EL6J2HIoB2PFxpLnq4JauWVk6DiVeNKzQlFEaE+X9sGw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/type-utils": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/type-utils": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -750,14 +687,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", - "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.53.0.tgz", + "integrity": "sha512-MKBw9i0DLYlmdOb3Oq/526+al20AJZpANdT6Ct9ffxcV8nKCHz63t/S0IhlTFNsBIHJv+GY5SFJ0XfqVeydQrQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "debug": "^4.3.4" }, "engines": { @@ -777,13 +714,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", - "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.53.0.tgz", + "integrity": "sha512-Opy3dqNsp/9kBBeCPhkCNR7fmdSQqA+47r21hr9a14Bx0xnkElEQmhoHga+VoaoQ6uDHjDKmQPIYcUcKJifS7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0" + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -794,13 +731,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", - "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.53.0.tgz", + "integrity": "sha512-HO2hh0fmtqNLzTAme/KnND5uFNwbsdYhCZghK2SoxGp3Ifn2emv+hi0PBUjzzSh0dstUIFqOj3bp0AwQlK4OWw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.50.0", - "@typescript-eslint/utils": "5.50.0", + "@typescript-eslint/typescript-estree": "5.53.0", + "@typescript-eslint/utils": "5.53.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -821,9 +758,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", - "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.53.0.tgz", + "integrity": "sha512-5kcDL9ZUIP756K6+QOAfPkigJmCPHcLN7Zjdz76lQWWDdzfOhZDTj1irs6gPBKiXx5/6O3L0+AvupAut3z7D2A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -834,13 +771,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", - "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz", + "integrity": "sha512-eKmipH7QyScpHSkhbptBBYh9v8FxtngLquq292YTEQ1pxVs39yFBlLC1xeIZcPPz1RWGqb7YgERJRGkjw8ZV7w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/visitor-keys": "5.50.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/visitor-keys": "5.53.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -861,16 +798,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", - "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.53.0.tgz", + "integrity": "sha512-VUOOtPv27UNWLxFwQK/8+7kvxVC+hPHNsJjzlJyotlaHjLSIgOCKj9I0DBUjwOOA64qjBwx5afAPjksqOxMO0g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.50.0", - "@typescript-eslint/types": "5.50.0", - "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/scope-manager": "5.53.0", + "@typescript-eslint/types": "5.53.0", + "@typescript-eslint/typescript-estree": "5.53.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -887,12 +824,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", - "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz", + "integrity": "sha512-JqNLnX3leaHFZEN0gCh81sIvgrp/2GOACZNgO4+Tkf64u51kTpAyWFOY8XHx8XuXr3N2C9zgPPHtcpMg6z1g0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/types": "5.53.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -915,6 +852,86 @@ "vue": "^3.2.25" } }, + "node_modules/@vitest/expect": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.28.5.tgz", + "integrity": "sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.28.5", + "@vitest/utils": "0.28.5", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.28.5.tgz", + "integrity": "sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.28.5", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/spy": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.28.5.tgz", + "integrity": "sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.28.5.tgz", + "integrity": "sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "picocolors": "^1.0.0", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/@vue/compiler-core": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", @@ -1023,9 +1040,9 @@ "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, "node_modules/@vuepic/vue-datepicker": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.6.7.tgz", - "integrity": "sha512-+THZAo+9KlPZGEE9MiCSkGVf8RW3rFFCrq060Kv7GCfWfSrxFSQIUhsTYc3P8hjtOkuaj31S5SdjmBa0tqH8Pg==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-3.6.8.tgz", + "integrity": "sha512-9c6gfy2SYHunyH36m12NzLy+6fccTFf58zG/VAVo5inVedVisz3M0grw7fw77uMP1531MtIibmeq9C5SNUXxkw==", "dependencies": { "date-fns": "^2.29.3", "date-fns-tz": "^1.3.7" @@ -1037,39 +1054,6 @@ "vue": ">=3.2.0" } }, - "node_modules/@vueuse/core": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.12.0.tgz", - "integrity": "sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.12.0", - "@vueuse/shared": "9.12.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.12.0.tgz", - "integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.12.0.tgz", - "integrity": "sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -1257,6 +1241,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1316,6 +1309,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1331,26 +1330,13 @@ "node": ">=8" } }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.1.tgz", - "integrity": "sha512-78pWJsQTceInlyaeBQeYZ/QgZeWS8hGeKiIJiDKQe3hEyBb7sEMq0K4gjx+Va6WHTYO4zI/RRl8qGRzn0YMadA==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "engines": { + "node": "*" } }, "node_modules/balanced-match": { @@ -1433,8 +1419,16 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/callsites": { "version": "3.1.0", @@ -1446,9 +1440,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==", "funding": [ { "type": "opencollective", @@ -1461,6 +1455,24 @@ ], "peer": true }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1476,6 +1488,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1522,6 +1543,22 @@ "node": ">=6.0" } }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1538,18 +1575,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1571,6 +1596,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1622,11 +1653,6 @@ "date-fns": ">=2.0.0" } }, - "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1644,19 +1670,31 @@ } } }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=0.3.1" } }, "node_modules/dir-glob": { @@ -1684,9 +1722,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.0.tgz", + "integrity": "sha512-0g/yr2IJn4nTbxwL785YxS7/AvvgGFJw6LLWP+BzWzB1+BYOqPUT9Hy0rXrZh5HLdHnxH72aDdzvC9SdTjsuaA==" }, "node_modules/dotenv": { "version": "16.0.3", @@ -1696,36 +1734,23 @@ "node": ">=12" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { - "version": "1.4.285", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.285.tgz", - "integrity": "sha512-47o4PPgxfU1KMNejz+Dgaodf7YTcg48uOfV1oM6cs3adrl2+7R+dHkt3Jpxqo0LRCbGJEzTKMUt0RdvByb/leg==", + "version": "1.4.310", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.310.tgz", + "integrity": "sha512-/xlATgfwkm5uDDwLw5nt/MNEf7c1oazLURMZLy39vOioGYyYzLWIDT8fZMJak6qTiAJ7udFTy7JG7ziyjNutiA==", "peer": true }, - "node_modules/element-plus": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.2.29.tgz", - "integrity": "sha512-g4dcrURrKkR5uUX8n5RVnnqGnimoki9HfqS4yHHG6XwCHBkZGozdq4x+478BzeWUe31h++BO+7dakSx4VnM8RQ==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.0.6", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.3", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/emojis-list": { "version": "3.0.0", @@ -1799,11 +1824,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1817,9 +1837,9 @@ } }, "node_modules/eslint": { - "version": "8.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", - "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.4.1", @@ -1885,9 +1905,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.7.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.7.5.tgz", - "integrity": "sha512-6L90P0AnZcE4ra7nocolp9vTjgVr2wEZ7jPnEA/X30XAoQPk+wvnaq61n164Tf7Fg4QPpJtRSCPpApOsfWDdNA==", + "version": "39.9.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.9.1.tgz", + "integrity": "sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.36.1", @@ -2014,9 +2034,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2195,40 +2215,6 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2253,6 +2239,15 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2372,9 +2367,9 @@ } }, "node_modules/immutable": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.3.tgz", - "integrity": "sha512-IHpmvaOIX4VLJwPOuQr1NpeBr2ZG6vpIj3blsLVxXRWJscLioaJRStqC+NcBsLeCDsnGlPpXd5/WZmnE7MbsKA==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -2447,6 +2442,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2569,10 +2576,16 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/laravel-vite-plugin": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.3.tgz", - "integrity": "sha512-N6hH/JFA98oW1I0OZ2Gx1HF3/QzkBpUIkxqfKqxENQNLWLFx4+CWB7cxP+i4sGXp9LQUlLbH5Lq/eZoXtLAq8w==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.4.tgz", + "integrity": "sha512-NlIuXbeuI+4NZzRpWNpGHRVTwuFWessvD7QoD+o2MlyAi7qyUS4J8r4/yTlu1dl9lxcR7iKoYUmHQqZDcrw2KA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -2620,6 +2633,18 @@ "node": ">=8.9.0" } }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2638,22 +2663,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -2661,6 +2672,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2681,10 +2701,11 @@ "sourcemap-codec": "^1.4.8" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", @@ -2718,6 +2739,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "peer": true, "engines": { "node": ">= 0.6" } @@ -2726,6 +2748,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -2745,6 +2768,18 @@ "node": "*" } }, + "node_modules/mlly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.1.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2781,9 +2816,9 @@ "peer": true }, "node_modules/node-releases": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", - "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "peer": true }, "node_modules/normalize-path": { @@ -2794,11 +2829,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, "node_modules/normalize.css": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", @@ -2925,6 +2955,21 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -2942,11 +2987,11 @@ } }, "node_modules/pinia": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz", - "integrity": "sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==", + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.32.tgz", + "integrity": "sha512-8Tw4OrpCSJ028UUyp0gYPP/wyjigLoEceuO/x1G+FlHVf73337e5vLm4uDmrRIoBG1hvaed/eSHnrCFjOc4nkA==", "dependencies": { - "@vue/devtools-api": "^6.4.5", + "@vue/devtools-api": "^6.5.0", "vue-demi": "*" }, "funding": { @@ -2967,13 +3012,24 @@ } }, "node_modules/pinia-plugin-persistedstate": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.0.2.tgz", - "integrity": "sha512-84vPyUhPA/8Pr+1mT1ioNb2d8z4tvdgYRqMQf8xyauOVBKjo0ZcRBwPQBV7ZAJG43Kwar43nXG2jU+ZMvAFFRQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.1.0.tgz", + "integrity": "sha512-8UN+vYMEPBdgNLwceY08mi5olI0wkYaEb8b6hD6xW7SnBRuPydWHlEhZvUWgNb/ibuf4PvufpvtS+dmhYjJQOw==", "peerDependencies": { "pinia": "^2.0.0" } }, + "node_modules/pkg-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -3034,11 +3090,31 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, "node_modules/punycode": { "version": "2.3.0", @@ -3077,6 +3153,12 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3156,9 +3238,9 @@ } }, "node_modules/rollup": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.1.tgz", - "integrity": "sha512-t9elERrz2i4UU9z7AwISj3CQcXP39cWxgRWLdf4Tm6aKm1eYrqHIgjzXBgb67GNY1sZckTFFi0oMozh3/S++Ig==", + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.17.2.tgz", + "integrity": "sha512-qMNZdlQPCkWodrAZ3qnJtvCAl4vpQ8q77uEujVCCbC/6CLB7Lcmvjq7HyiOSnf4fxTT9XgsE36oLHJBH49xjqA==", "bin": { "rollup": "dist/bin/rollup" }, @@ -3170,6 +3252,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup-plugin-analyzer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-analyzer/-/rollup-plugin-analyzer-4.0.0.tgz", + "integrity": "sha512-LL9GEt3bkXp6Wa19SNR5MWcvHNMvuTFYg+eYBZN2OIFhSWN+pEJUQXEKu5BsOeABob3x9PDaLKW7w5iOJnsESQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3214,9 +3305,9 @@ "peer": true }, "node_modules/sass": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", - "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -3292,6 +3383,12 @@ "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3301,6 +3398,34 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3321,7 +3446,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3355,6 +3479,62 @@ "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3379,6 +3559,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3411,9 +3603,9 @@ } }, "node_modules/terser": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.2.tgz", - "integrity": "sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg==", + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", + "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -3462,12 +3654,51 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/tinybench": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", + "dev": true + }, + "node_modules/tinymce": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.3.2.tgz", + "integrity": "sha512-nOVHk4FhHKQj48hi7fEptS1Se6CNzPtfIcDzTO70KoTcSiQIFzhhZjS5bPotSzFnQ4dIQJ4QPOd7sqNs6fXUrA==" + }, + "node_modules/tinypool": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", + "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3479,10 +3710,48 @@ "node": ">=8.0" } }, - "node_modules/trix": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/trix/-/trix-2.0.4.tgz", - "integrity": "sha512-WOMKqwCVti0i3RVaDrMnrEZWs6XMpFoCfUvFCZNd15KndAy6MsYQscizxEpFiCLUlo+rXMkueK0ldRDo5xpVJA==" + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } }, "node_modules/tslib": { "version": "1.14.1", @@ -3517,6 +3786,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -3542,6 +3820,12 @@ "node": ">=4.2.0" } }, + "node_modules/ufo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", + "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", + "dev": true + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -3582,10 +3866,16 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/vite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.1.tgz", - "integrity": "sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.1.4.tgz", + "integrity": "sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==", "dependencies": { "esbuild": "^0.16.14", "postcss": "^8.4.21", @@ -3630,6 +3920,31 @@ } } }, + "node_modules/vite-node": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz", + "integrity": "sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "source-map-support": "^0.5.21", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/vite-plugin-full-reload": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", @@ -3643,6 +3958,71 @@ "vite": "^2 || ^3 || ^4" } }, + "node_modules/vitest": { + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.28.5.tgz", + "integrity": "sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.28.5", + "@vitest/runner": "0.28.5", + "@vitest/spy": "0.28.5", + "@vitest/utils": "0.28.5", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.1", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.28.5", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, "node_modules/vue": { "version": "3.2.47", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", @@ -3692,6 +4072,11 @@ "vue": "^2.7.0 || ^3.0.0" } }, + "node_modules/vue-dompurify-html/node_modules/dompurify": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.4.tgz", + "integrity": "sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ==" + }, "node_modules/vue-eslint-parser": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", @@ -3790,9 +4175,9 @@ } }, "node_modules/vue3-easy-data-table": { - "version": "1.5.30", - "resolved": "https://registry.npmjs.org/vue3-easy-data-table/-/vue3-easy-data-table-1.5.30.tgz", - "integrity": "sha512-/jHmruqEeFKs2StlfPhjJRsTN7temql6HijTtS9G35remez5fWHmyIbUa+vPeDsD1HhenGj5EKMlfKktU11dYw==", + "version": "1.5.34", + "resolved": "https://registry.npmjs.org/vue3-easy-data-table/-/vue3-easy-data-table-1.5.34.tgz", + "integrity": "sha512-hLe0Jp+xyhB5uprkzWxTiq6K0+nZhcxwADLC48YK1Rf3wxNA5UuZsgs6uXNmOQ2xGQyAjymp5v7NrzEBcGNqTg==", "dependencies": { "vue": "^3.2.45" } @@ -3889,6 +4274,22 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -3919,6 +4320,15 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 19ba6f6..c647b57 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "dev": "vite", "build": "vite build", "lint": "eslint \"**/*.{js,jsx,.vue}\" --ignore-path .gitignore", - "format": "prettier . --write" + "format": "prettier . --write", + "test": "vitest", + "prepare": "mkdir -p public/tinymce/skins && cp -r node_modules/tinymce/skins public/tinymce && mkdir -p public/tinymce/plugins/emoticons/js && cp node_modules/tinymce/plugins/emoticons/js/emojis.min.js public/tinymce/plugins/emoticons/js/" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.48.1", "@typescript-eslint/parser": "^5.48.1", - "axios": "^1.1.2", "eslint": "^8.31.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-jsdoc": "^39.6.4", @@ -18,25 +19,23 @@ "lodash": "^4.17.19", "postcss": "^8.1.14", "prettier": "2.8.2", - "typescript": "^4.9.4", - "vite": "^4.0.0" + "rollup-plugin-analyzer": "^4.0.0", + "ts-node": "^10.9.1", + "typescript": "^4.9.5", + "vite": "^4.0.0", + "vitest": "^0.28.5" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/free-brands-svg-icons": "^6.2.1", - "@fortawesome/free-regular-svg-icons": "^6.2.1", - "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@fortawesome/vue-fontawesome": "^3.0.2", + "@tinymce/tinymce-vue": "^4.0.7", "@vitejs/plugin-vue": "^4.0.0", "@vuepic/vue-datepicker": "^3.6.4", - "date-fns": "^2.29.3", + "dompurify": "^3.0.0", "dotenv": "^16.0.3", - "element-plus": "^2.2.27", "normalize.css": "^8.0.1", "pinia": "^2.0.28", "pinia-plugin-persistedstate": "^3.0.1", "sass": "^1.57.1", - "trix": "^2.0.4", + "tinymce": "^6.3.1", "vue": "^3.2.36", "vue-dompurify-html": "^3.1.2", "vue-final-modal": "^3.4.11", diff --git a/public/.htaccess b/public/.htaccess index 2522f5c..083e7d0 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -3,6 +3,14 @@ Options -MultiViews -Indexes + + + + Header set Content-Disposition "attachment" + + + + RewriteEngine On # Add www subdomain if missing @@ -18,6 +26,11 @@ RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] + # Pass to media handler if the media request has query + RewriteCond %{REQUEST_FILENAME} -f + RewriteCond %{QUERY_STRING} . + RewriteRule ^uploads/(.+)\.(jpe?g|png)$ media.php?url=uploads/$1.$2 [NC,QSA,L] + # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f diff --git a/public/img/background.jpg b/public/img/background.jpg new file mode 100644 index 0000000..e243968 Binary files /dev/null and b/public/img/background.jpg differ diff --git a/public/img/dashboard-bg.jpg b/public/img/dashboard-bg.jpg new file mode 100644 index 0000000..858bbb8 Binary files /dev/null and b/public/img/dashboard-bg.jpg differ diff --git a/public/img/fileicons/.htaccess b/public/img/fileicons/.htaccess new file mode 100644 index 0000000..05d0416 --- /dev/null +++ b/public/img/fileicons/.htaccess @@ -0,0 +1,3 @@ +RewriteEngine on +RewriteCond %{REQUEST_FILENAME} !-f +RewriteRule \.png$ unknown.png [L] \ No newline at end of file diff --git a/public/img/fileicons/doc.png b/public/img/fileicons/doc.png new file mode 100644 index 0000000..d302d9c Binary files /dev/null and b/public/img/fileicons/doc.png differ diff --git a/public/img/fileicons/docx.png b/public/img/fileicons/docx.png new file mode 100644 index 0000000..7ed6d75 Binary files /dev/null and b/public/img/fileicons/docx.png differ diff --git a/public/img/fileicons/file-icons.png b/public/img/fileicons/file-icons.png new file mode 100644 index 0000000..efbcbbc Binary files /dev/null and b/public/img/fileicons/file-icons.png differ diff --git a/public/img/fileicons/jpeg.png b/public/img/fileicons/jpeg.png new file mode 100644 index 0000000..16f1580 Binary files /dev/null and b/public/img/fileicons/jpeg.png differ diff --git a/public/img/fileicons/jpg.png b/public/img/fileicons/jpg.png new file mode 100644 index 0000000..0ed77b3 Binary files /dev/null and b/public/img/fileicons/jpg.png differ diff --git a/public/img/fileicons/pdf.png b/public/img/fileicons/pdf.png new file mode 100644 index 0000000..250c2e1 Binary files /dev/null and b/public/img/fileicons/pdf.png differ diff --git a/public/img/fileicons/png.png b/public/img/fileicons/png.png new file mode 100644 index 0000000..3370a9d Binary files /dev/null and b/public/img/fileicons/png.png differ diff --git a/public/img/fileicons/svg.png b/public/img/fileicons/svg.png new file mode 100644 index 0000000..da2d5ae Binary files /dev/null and b/public/img/fileicons/svg.png differ diff --git a/public/img/fileicons/unknown.png b/public/img/fileicons/unknown.png new file mode 100644 index 0000000..f5feb75 Binary files /dev/null and b/public/img/fileicons/unknown.png differ diff --git a/public/img/fileicons/xls.png b/public/img/fileicons/xls.png new file mode 100644 index 0000000..2951d01 Binary files /dev/null and b/public/img/fileicons/xls.png differ diff --git a/public/img/fileicons/xml.png b/public/img/fileicons/xml.png new file mode 100644 index 0000000..3201fd6 Binary files /dev/null and b/public/img/fileicons/xml.png differ diff --git a/public/img/fileicons/zip.png b/public/img/fileicons/zip.png new file mode 100644 index 0000000..5ef0e3a Binary files /dev/null and b/public/img/fileicons/zip.png differ diff --git a/public/media.php b/public/media.php new file mode 100644 index 0000000..6a5cbc0 --- /dev/null +++ b/public/media.php @@ -0,0 +1,60 @@ + 0 && strpos($filepath, 'uploads/') === 0 && is_file($filepath)) { + $image = imagecreatefromstring(file_get_contents($filepath)); + + $newWidth = (isset($_GET['w']) ? intval($_GET['w']) : -1); + $newHeight = (isset($_GET['h']) ? intval($_GET['h']) : -1); + + if($newWidth != -1 || $newHeight != -1) { + $width = imagesx($image); + $height = imagesy($image); + + $aspectRatio = $width / $height; + + if($newWidth == -1) { + $newWidth = intval($newHeight * $aspectRatio); + } + + if($newHeight == -1) { + $newHeight = intval($newWidth / $aspectRatio); + } + + $newImage = imagecreatetruecolor($newWidth, $newHeight); + imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); + + // Output the resized image to the browser + $mime_type = mime_content_type($_GET['url']); + header('Content-Type: ' . $mime_type); + switch($mime_type) { + case "image/jpeg": + imagejpeg($newImage); + break; + case "image/gif": + imagegif($newImage); + break; + case "image/png": + imagepng($newImage); + break; + } + imagedestroy($newImage); + } else { + // Output the original image to the browser + header('Content-Type: '. mime_content_type($filepath)); + readfile($filepath); + } + + // Clean up the image resources + imagedestroy($image); +} else { + // Return a 404 error + header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found"); + exit; +} diff --git a/resources/css/app.scss b/resources/css/app.scss index 6aebd87..6098d19 100644 --- a/resources/css/app.scss +++ b/resources/css/app.scss @@ -1,7 +1,8 @@ @import "variables.scss"; @import "utils.scss"; @import "data-table.scss"; -@import "datepicker.scss"; +@import "tinymce.scss"; +@import "prism.css"; * { box-sizing: border-box; @@ -20,6 +21,11 @@ body { min-height: 100vh; } +// Who knows why ion-icon randomally sets this to hidden..... +ion-icon { + visibility: visible; +} + #app { display: flex; flex-direction: column; @@ -43,50 +49,31 @@ h1 { font-weight: 800; } -label { - display: block; - margin-bottom: map-get($spacer, 1); - - &.required:after { - content: " *"; - color: $danger-color; - } - - &.inline { - display: inline-block; - margin-right: map-get($spacer, 3); - - &:after { - content: ":"; - } - } -} - p { line-height: 1.5rem; margin-top: 0; } -input, -select, -textarea { - box-sizing: border-box; - display: block; - width: 100%; - border: 1px solid $border-color; - border-radius: 12px; - padding: map-get($spacer, 2) map-get($spacer, 3); - color: $font-color; - margin-bottom: map-get($spacer, 4); +// input, +// select, +// textarea { +// box-sizing: border-box; +// display: block; +// width: 100%; +// border: 1px solid $border-color; +// border-radius: 12px; +// padding: map-get($spacer, 2) map-get($spacer, 3); +// color: $font-color; +// margin-bottom: map-get($spacer, 4); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} +// -webkit-appearance: none; +// -moz-appearance: none; +// appearance: none; +// } -textarea { - resize: none; -} +// textarea { +// resize: none; +// } select { padding-right: 2.5rem; @@ -137,11 +124,6 @@ select { } } -svg, -button { - @extend .prevent-select; -} - code { display: block; font-size: 0.8rem; @@ -178,182 +160,13 @@ code { } } -/* Loader */ -.loader-cover { - position: fixed; - display: flex; - justify-content: center; - align-items: center; - top: 0; - left: 0; - bottom: 0; - right: 0; - backdrop-filter: blur(14px); - -webkit-backdrop-filter: blur(4px); - background-color: rgba(255, 255, 255, 0.5); - - .loader { - display: flex; - flex-direction: column; - padding: map-get($spacer, 5) calc(map-get($spacer, 5) * 2); - - border: 1px solid transparent; - border-radius: 24px; - - svg { - font-size: calc(map-get($spacer, 5) * 1.5); - } - - span { - font-size: map-get($spacer, 4); - padding-top: map-get($spacer, 3); - } - } -} - -/* Button */ -button.button, -a.button, -label.button { - padding: map-get($spacer, 2) map-get($spacer, 4); - color: white; - font-weight: 800; - border-width: 2px; - border-style: solid; - border-radius: 24px; - transition: background-color 0.1s, color 0.1s; - cursor: pointer; - background-color: $secondary-color; - border-color: $secondary-color; - min-width: 7rem; - text-align: center; - - &:disabled { - cursor: not-allowed; - background-color: $secondary-color !important; - border-color: $secondary-color !important; - opacity: 0.5; - } - - &:hover:not(:disabled) { - text-decoration: none; - color: $secondary-color; - } - - &.primary { - background-color: $primary-color; - border-color: $primary-color; - - &:hover:not(:disabled) { - color: $primary-color; - } - } - - &.secondary { - background-color: $secondary-color; - border-color: $secondary-color; - - &:hover:not(:disabled) { - color: $secondary-color; - } - } - - &.danger { - background-color: $danger-color; - border-color: $danger-color; - - &:hover:not(:disabled) { - color: $danger-color; - } - } - - &.outline { - background-color: transparent; - border-color: $outline-color; - color: $outline-color; - - &:hover:not(:disabled) { - background-color: $outline-color; - border-color: $outline-color; - color: $outline-hover-color; - } - } - - &:hover:not(:disabled) { - background-color: #fff; - } - - svg { - padding-left: 0.5rem; - vertical-align: middle !important; - } -} - -.button + .button { - margin: 0 map-get($spacer, 2); - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } -} - -/* Form Group */ -.form-group { - margin-bottom: map-get($spacer, 3); - padding: 0 4px; - flex: 1; - - input, - textarea { - margin-bottom: map-get($spacer, 1); - } - - .form-group-info { - font-size: 85%; - margin-bottom: map-get($spacer, 1); - } - - .form-group-error { - // display: none; - font-size: 85%; - margin-bottom: map-get($spacer, 1); - color: $danger-color; - } - - .form-group-help { - font-size: 85%; - margin-bottom: map-get($spacer, 1); - color: $secondary-color; - - svg { - vertical-align: middle !important; - } - } - - &.has-error { - input, - textarea, - .input-file-group, - .input-media-group .input-media-display { - border: 2px solid $danger-color; - } - - .form-group-error { - display: block; - } - } -} - /* Page Errors */ .page-error { display: flex; flex-direction: row; flex: 1; margin-top: map-get($spacer, 5); + min-height: 50vh; .image { flex: 1; diff --git a/resources/css/prism.css b/resources/css/prism.css new file mode 100644 index 0000000..0051c7e --- /dev/null +++ b/resources/css/prism.css @@ -0,0 +1,3 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism&languages=markup+clike+javascript+bash+c+javadoclike+js-extras+json+json5+log+markup-templating+objectivec+perl+php+phpdoc+php-extras+python+regex+sql+swift+typoscript+yaml */ +code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} diff --git a/resources/css/tinymce.scss b/resources/css/tinymce.scss new file mode 100644 index 0000000..9e06f4e --- /dev/null +++ b/resources/css/tinymce.scss @@ -0,0 +1,3 @@ +// @import "../../public/skins/ui/oxide/skin.min.css"; +// @import "../../public/skins/ui/oxide/content.min.css"; +// @import "../../public/skins/content/default/content.min.css"; diff --git a/resources/css/utils.scss b/resources/css/utils.scss index 7fd4104..395110d 100644 --- a/resources/css/utils.scss +++ b/resources/css/utils.scss @@ -125,33 +125,33 @@ /* Margin */ @each $index, $size in $spacer { .m-#{$index} { - margin: #{$size}; + margin: #{$size} !important; } .mt-#{$index} { - margin-top: #{$size}; + margin-top: #{$size} !important; } .mb-#{$index} { - margin-bottom: #{$size}; + margin-bottom: #{$size} !important; } .ml-#{$index} { - margin-left: #{$size}; + margin-left: #{$size} !important; } .mr-#{$index} { - margin-right: #{$size}; + margin-right: #{$size} !important; } .mx-#{$index} { - margin-left: #{$size}; - margin-right: #{$size}; + margin-left: #{$size} !important; + margin-right: #{$size} !important; } .my-#{$index} { - margin-top: #{$size}; - margin-bottom: #{$size}; + margin-top: #{$size} !important; + margin-bottom: #{$size} !important; } } @@ -193,6 +193,7 @@ /* Utility */ .prevent-select { -webkit-user-select: none; + -moz-user-select: none; -ms-user-select: none; user-select: none; } diff --git a/resources/css/variables.scss b/resources/css/variables.scss index c28d529..a3624e3 100644 --- a/resources/css/variables.scss +++ b/resources/css/variables.scss @@ -27,6 +27,12 @@ $success-color: #198754; $success-color-dark: #12653e; $success-color-darker: #0c4329; +$warning-color-lighter: #fff8e2; +$warning-color-light: #fff6d9; +$warning-color: #fff3cd; +$warning-color-dark: #ffd75a; +$warning-color-darker: #ffc203; + $border-color: #dddddd; $secondary-background-color: #efefef; diff --git a/resources/js/axios.js b/resources/js/axios.js deleted file mode 100644 index 795f0fb..0000000 --- a/resources/js/axios.js +++ /dev/null @@ -1,44 +0,0 @@ -import axios from "axios"; -import { useUserStore } from "./store/UserStore"; -import { useRouter } from "vue-router"; - -axios.defaults.baseURL = import.meta.env.APP_URL_API; -axios.defaults.withCredentials = true; -axios.defaults.headers.common["Accept"] = "application/json"; - -axios.interceptors.request.use((request) => { - const userStore = useUserStore(); - if (userStore.id) { - request.headers["Authorization"] = `Bearer ${userStore.token}`; - } - - return request; -}); - -axios.interceptors.response.use( - (response) => { - return response; - }, - (error) => { - if (error.config.redirect !== false && error.response.status === 401) { - const userStore = useUserStore(); - const router = useRouter(); - userStore.clearUser(); - - const url = new URL(error.request.responseURL); - router.push({ name: "login", query: { redirect: url.pathname } }); - } - - // if(error.config.redirect === true) { - // if(error.response.status === 403) { - // router.push({ name: 'error-forbidden' }) - // } else if(error.response.status === 404) { - // router.push({ name: 'error-notfound' }) - // } else if(error.response.status >= 500) { - // router.push({name: 'error-internal'}) - // } - // } - - return Promise.reject(error); - } -); diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 366c49d..e69de29 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -1,34 +0,0 @@ -import _ from 'lodash'; -window._ = _; - -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ - -import axios from 'axios'; -window.axios = axios; - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; - -/** - * Echo exposes an expressive API for subscribing to channels and listening - * for events that are broadcast by Laravel. Echo and event broadcasting - * allows your team to easily build robust real-time web applications. - */ - -// import Echo from 'laravel-echo'; - -// import Pusher from 'pusher-js'; -// window.Pusher = Pusher; - -// window.Echo = new Echo({ -// broadcaster: 'pusher', -// key: import.meta.env.VITE_PUSHER_APP_KEY, -// wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, -// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, -// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, -// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', -// enabledTransports: ['ws', 'wss'], -// }); diff --git a/resources/js/components/DFileLink.vue b/resources/js/components/DFileLink.vue deleted file mode 100644 index 79f1ae2..0000000 --- a/resources/js/components/DFileLink.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - diff --git a/resources/js/components/SMAttachments.vue b/resources/js/components/SMAttachments.vue new file mode 100644 index 0000000..05b12dc --- /dev/null +++ b/resources/js/components/SMAttachments.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/resources/js/components/SMBreadcrumbs.vue b/resources/js/components/SMBreadcrumbs.vue index 40d2fe6..4d6edf7 100644 --- a/resources/js/components/SMBreadcrumbs.vue +++ b/resources/js/components/SMBreadcrumbs.vue @@ -1,51 +1,56 @@ diff --git a/resources/js/components/SMCaptchaNotice.vue b/resources/js/components/SMCaptchaNotice.vue index c60152d..8707c5e 100644 --- a/resources/js/components/SMCaptchaNotice.vue +++ b/resources/js/components/SMCaptchaNotice.vue @@ -1,5 +1,5 @@ diff --git a/resources/js/components/SMFileLink.vue b/resources/js/components/SMFileLink.vue new file mode 100644 index 0000000..b450d6b --- /dev/null +++ b/resources/js/components/SMFileLink.vue @@ -0,0 +1,42 @@ + + + diff --git a/resources/js/components/SMFooter.vue b/resources/js/components/SMFooter.vue index 1111c2e..a153c43 100644 --- a/resources/js/components/SMFooter.vue +++ b/resources/js/components/SMFooter.vue @@ -1,37 +1,37 @@