cleanup: wip 4

This commit is contained in:
Zephyr Lykos 2024-03-05 10:38:01 +08:00
parent 643f73c752
commit e7b4111d2b
No known key found for this signature in database
GPG Key ID: D3E9D31E2F77F04D
16 changed files with 89 additions and 528 deletions

View File

@ -41,7 +41,6 @@ class UserMenuComposer
['label' => trans('general.admin-panel'), 'link' => route('admin.view')],
['label' => trans('general.user-manage'), 'link' => route('admin.users.view')],
['label' => trans('general.report-manage'), 'link' => route('admin.reports.view')],
['label' => 'Web CLI', 'link' => '#launch-cli'],
);
}
$menuItems = $this->filter->apply('user_menu', $menuItems, [$user]);

View File

@ -69,18 +69,14 @@
"kleur": "^4.1.3"
},
"dependencies": {
"@emotion/react": "^11.0.0",
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.0.0",
"@fortawesome/fontawesome-free": "^6.3.0",
"@tweenjs/tween.js": "^23.1.1",
"admin-lte": "^3.2.0",
"blessing-skin-shell": "^0.3.4",
"bootstrap": "^5.3.3",
"cac": "6.7.14",
"cli-spinners": "^2.5.0",
"clsx": "^2.1.0",
"echarts": "^5.5.0",
"events": "^3.2.0",
"immer": "^10.0.3",
"jquery": "^3.6.0",
"lodash-es": "^4.0.8",
@ -97,9 +93,7 @@
"skinview-utils": "^0.7.1",
"skinview3d": "^3.0.0-alpha.1",
"spectre.css": "^0.5.8",
"use-immer": "^0.9.0",
"xterm": "^5.3.0",
"xterm-addon-fit": "^0.8.0"
"use-immer": "^0.9.0"
},
"devDependencies": {
"@testing-library/jest-dom": "^6.4.2",
@ -110,22 +104,22 @@
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.0.6",
"@types/prompts": "^2.0.9",
"@types/react": "^18.2.57",
"@types/react": "^18.2.62",
"@types/react-autosuggest": "^10.1.11",
"@types/react-dom": "^18.2.19",
"@types/tween.js": "^18.5.0",
"@vitejs/plugin-react-swc": "^3.6.0",
"autoprefixer": "^10.4.17",
"autoprefixer": "^10.4.18",
"browserslist": "^4.23.0",
"browserslist-to-esbuild": "^2.1.1",
"eslint-config-xo-react": "^0.27.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react": "^7.34.0",
"eslint-plugin-react-hooks": "^4.6.0",
"js-yaml": "^4.1.0",
"laravel-vite-plugin": "^1.0.1",
"laravel-vite-plugin": "^1.0.2",
"postcss": "^8.4.35",
"typescript": "^5.3.3",
"vite": "^5.1.4",
"vite": "^5.1.5",
"vite-plugin-top-level-await": "^1.4.1",
"vite-plugin-wasm": "^3.3.0",
"vitest": "^1.3.1",

View File

@ -9,12 +9,6 @@ import routes from './scripts/route';
// eslint-disable-next-line @typescript-eslint/naming-convention
Object.assign(window, {React, ReactDOM, $});
const entry = document.querySelector('[href="#launch-cli"]');
entry?.addEventListener('click', async () => {
const {launch} = await import('./scripts/cli');
launch();
});
const route = routes.find(route =>
new RegExp(`^${route.path}$`, 'i').test(blessing.route),
);

View File

@ -1,141 +0,0 @@
import {useEffect, useRef} from 'react';
import ReactDOM from 'react-dom';
import styled from '@emotion/styled';
import {Terminal} from 'xterm';
import {FitAddon} from 'xterm-addon-fit';
import {Shell, type Stdio} from 'blessing-skin-shell';
import 'xterm/css/xterm.css';
import Draggable from 'react-draggable';
import * as event from './event';
import AptCommand from './cli/AptCommand';
import ClosetCommand from './cli/ClosetCommand';
import DnfCommand from './cli/DnfCommand';
import PacmanCommand from './cli/PacmanCommand';
import RmCommand from './cli/RmCommand';
import * as breakpoints from '@/styles/breakpoints';
let launched = false;
const TerminalContainer = styled.div`
z-index: 1040;
position: fixed;
bottom: 7vh;
user-select: none;
.card-body {
background-color: #000;
}
${breakpoints.greaterThan(breakpoints.Breakpoint.xl)} {
left: 25vw;
width: 50vw;
height: 50vh;
}
${breakpoints.between(breakpoints.Breakpoint.md, breakpoints.Breakpoint.xl)} {
left: 5vw;
width: 90vw;
height: 40vh;
}
${breakpoints.lessThan(breakpoints.Breakpoint.md)} {
left: 1vw;
width: 98vw;
height: 35vh;
}
`;
const TerminalWindow: React.FC<{onClose(): void}> = properties => {
const mount = useRef<HTMLDivElement>(null);
useEffect(() => {
const element = mount.current;
if (!element) {
return;
}
const terminal = new Terminal();
const fitAddon = new FitAddon();
terminal.loadAddon(fitAddon);
terminal.options.fontFamily = 'Monaco, Consolas, "Roboto Mono", "Noto Sans", "Droid Sans Mono"';
terminal.open(element);
fitAddon.fit();
const programs = new Map<string, (stdio: Stdio, arguments_: string[]) => void>();
programs.set('apt', AptCommand);
programs.set('closet', ClosetCommand);
programs.set('dnf', DnfCommand);
programs.set('pacman', PacmanCommand);
programs.set('rm', RmCommand);
event.emit('registerCLIPrograms', programs);
const shell = new Shell(terminal);
for (const [name, program] of programs.entries()) {
shell.addExternal(name, program);
}
const originalLogger = console.log;
console.log = (data: string, ...arguments_: any[]) => {
const {stack} = new Error();
if (stack?.includes('outputHelp')) {
terminal.writeln(data.replaceAll('\n', '\r\n'));
} else {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
originalLogger(data, ...arguments_);
}
};
const unbindData = terminal.onData(e => {
shell.input(e);
});
const unbindKey = terminal.onKey(e => {
event.emit('terminalKeyPress', e.key);
},
);
launched = true;
return () => {
unbindData.dispose();
unbindKey.dispose();
shell.free();
fitAddon.dispose();
terminal.dispose();
console.log = originalLogger;
launched = false;
};
}, []);
return (
<Draggable handle='.card-header'>
<TerminalContainer className='card'>
<div className='card-header'>
<div className='d-flex justify-content-between'>
<h4 className='card-title d-flex align-items-center'>
Blessing Skin Shell
</h4>
<button className='btn btn-default' onClick={properties.onClose}>
&times;
</button>
</div>
</div>
<div ref={mount} className='card-body p-2'/>
</TerminalContainer>
</Draggable>
);
};
export function launch() {
if (launched) {
return;
}
const container = document.createElement('div');
document.body.append(container);
const handleClose = () => {
ReactDOM.unmountComponentAtNode(container);
container.remove();
};
ReactDOM.render(<TerminalWindow onClose={handleClose}/>, container);
}

View File

@ -1,2 +0,0 @@
rules:
'@typescript-eslint/no-empty-function': off

View File

@ -1,23 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import cac from 'cac';
import {install, remove} from './pluginManager';
export default async function apt(stdio: Stdio, arguments_: string[]) {
const program = cac('apt');
program.help();
program
.command('install <plugin>', 'install a new plugin')
.action(async (plugin: string) => install(plugin, stdio));
program
.command('upgrade <plugin>', 'upgrade an existed plugin')
.action(async (plugin: string) => install(plugin, stdio));
program
.command('remove <plugin>', 'remove a plugin')
.action(async (plugin: string) => remove(plugin, stdio));
program.parse(['', ''].concat(arguments_), {run: false});
await program.runMatchedCommand();
}

View File

@ -1,46 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import cac from 'cac';
import * as fetch from '../net';
import type {User, Texture} from '../types';
type Response = fetch.ResponseBody<{user: User; texture: Texture}>;
export default async function closet(stdio: Stdio, arguments_: string[]) {
const program = cac('closet');
program.help();
program
.command('add <uid> <tid>', 'add texture to someone\'s closet')
.action(async (uid: string, tid: string) => {
const {code, data} = await fetch.post<Response>(
`/admin/closet/${uid}`,
{tid},
);
if (code === 0) {
const {texture, user} = data;
stdio.println(
`Texture "${texture.name}" was added to user ${user.nickname}'s closet.`,
);
} else {
stdio.println('Error occurred.');
}
});
program
.command('remove <uid> <tid>', 'remove texture from someone\'s closet')
.action(async (uid: string, tid: string) => {
const {code, data} = await fetch.del<Response>(`/admin/closet/${uid}`, {
tid,
});
if (code === 0) {
const {texture, user} = data;
stdio.println(
`Texture "${texture.name}" was removed from user ${user.nickname}'s closet.`,
);
} else {
stdio.println('Error occurred.');
}
});
program.parse(['', ''].concat(arguments_), {run: false});
await program.runMatchedCommand();
}

View File

@ -1,23 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import cac from 'cac';
import {install, remove} from './pluginManager';
export default async function dnf(stdio: Stdio, arguments_: string[]) {
const program = cac('dnf');
program.help();
program
.command('install <plugin>', 'install a new plugin')
.action(async (plugin: string) => install(plugin, stdio));
program
.command('upgrade <plugin>', 'upgrade an existed plugin')
.action(async (plugin: string) => install(plugin, stdio));
program
.command('remove <plugin>', 'remove a plugin')
.action(async (plugin: string) => remove(plugin, stdio));
program.parse(['', ''].concat(arguments_), {run: false});
await program.runMatchedCommand();
}

View File

@ -1,31 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import cac from 'cac';
import {install, remove} from './pluginManager';
type Options = {
sync?: string;
remove?: string;
};
export default async function pacman(stdio: Stdio, arguments_: string[]) {
if (arguments_.length === 0) {
stdio.println('error: no operation specified (use -h for help)');
return;
}
const program = cac('pacman');
program.help();
program.option('-S, --sync <plugin>', 'install or upgrade a plugin');
program.option('-R, --remove <plugin>', 'remove a plugin');
const {options} = program.parse(['', ''].concat(arguments_), {run: false});
const options_: Options = options;
/* istanbul ignore else */
if (options_.sync) {
await install(options_.sync, stdio);
} else if (options_.remove) {
await remove(options_.remove, stdio);
}
}

View File

@ -1,40 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import cac from 'cac';
import * as fetch from '../net';
type Options = {
force?: boolean;
recursive?: boolean;
help?: boolean;
};
export default async function rm(stdio: Stdio, arguments_: string[]) {
const program = cac('rm');
program.help();
program
.command('<file>')
.option(
'-f, --force',
'ignore nonexistent files and arguments, never prompt',
)
.option(
'-r, --recursive',
'remove directories and their contents recursively',
)
.option('--no-preserve-root', 'do not treat \'/\' specially');
const {options} = program.parse(['', ''].concat(arguments_), {
run: false,
});
const path = program.args[0];
if (!path && !options.help) {
stdio.println('rm: missing operand');
stdio.println('Try \'rm --help\' for more information.');
}
if (options.force && options.recursive && path?.startsWith('/')) {
await fetch.post('/admin/resource?clear-cache');
}
}

View File

@ -1,28 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import spinners from 'cli-spinners/spinners.json';
const {dots} = spinners;
export class Spinner {
private timerId = 0;
private index = 0;
constructor(private readonly stdio: Stdio) {}
start(message = '') {
this.timerId = window.setInterval(() => {
this.index += 1;
this.index %= dots.frames.length;
this.stdio.reset();
this.stdio.print(`${dots.frames[this.index]} ${message}`);
}, dots.interval);
}
stop(message = '') {
clearInterval(this.timerId);
this.stdio.reset();
this.stdio.println(message);
this.stdio.print('\u001B[?25h');
}
}

View File

@ -1,33 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import * as event from '../event';
export function hackStdin() {
if (process.env.NODE_ENV === 'test') {
return process.stdin;
}
// @ts-expect-error
return {
on(eventName: string, handler: (string_: string, key: string) => void) {
if (eventName === 'keypress') {
this._off = event.on('terminalKeyPress', (key: string) => {
handler(key, key);
});
}
},
isTTY: true,
setRawMode() {},
removeListener() {
this._off();
},
} as NodeJS.ReadStream & {_off(): void};
}
export function hackStdout(stdio: Stdio) {
return {
write(message: string) {
stdio.print(message.replaceAll('\n', '\r\n'));
return true;
},
} as NodeJS.WriteStream;
}

View File

@ -1,43 +0,0 @@
import type {Stdio} from 'blessing-skin-shell';
import prompts from 'prompts';
import * as fetch from '../net';
import {hackStdout, hackStdin} from './configureStdio';
import {Spinner} from './Spinner';
export async function install(plugin: string, stdio: Stdio) {
const spinner = new Spinner(stdio);
spinner.start('Installing plugin...');
const {message, data} = await fetch.post<
fetch.ResponseBody<{reason?: string[]} | undefined>
>('/admin/plugins/market/download', {name: plugin});
spinner.stop(` ${message}`);
const reasons = data?.reason;
if (reasons) {
stdio.println(reasons.map(reason => `- ${reason}`).join('\r\n'));
}
}
export async function remove(plugin: string, stdio: Stdio) {
const {confirm}: {confirm: boolean} = await prompts({
name: 'confirm',
type: 'confirm',
message: `Are you sure to remove plugin "${plugin}"?`,
stdin: hackStdin(),
stdout: hackStdout(stdio),
});
if (!confirm) {
return;
}
const spinner = new Spinner(stdio);
spinner.start('Uninstalling plugin...');
const {message} = await fetch.post<fetch.ResponseBody>(
'/admin/plugins/manage',
{action: 'delete', name: plugin},
);
spinner.stop(` ${message}`);
}

View File

@ -1,9 +0,0 @@
export function emitKeypressEvents() {}
export function createInterface() {
return {
pause() {},
resume() {},
close() {},
};
}

View File

@ -25,7 +25,6 @@ export default defineConfig({
alias: {
'@/': root.pathname,
readline: new URL('scripts/cli/readline.ts', root).pathname,
prompts: 'prompts/lib/index.js',
},
},
publicDir: false,

170
yarn.lock
View File

@ -107,10 +107,10 @@
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
"@emotion/react@^11.0.0":
version "11.11.3"
resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25"
integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==
"@emotion/react@^11.11.4":
version "11.11.4"
resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d"
integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==
dependencies:
"@babel/runtime" "^7.18.3"
"@emotion/babel-plugin" "^11.11.0"
@ -786,10 +786,10 @@
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@^18.2.57":
version "18.2.57"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.57.tgz#147b516d8bdb2900219acbfc6f939bdeecca7691"
integrity sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==
"@types/react@^18.2.62":
version "18.2.62"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.62.tgz#2527a7a54749b1a99c87a4aa8b83e26846face38"
integrity sha512-l3f57BbaEKP0xcFzf+5qRG8/PXykZiuVM6eEoPtqBPCp6dxO3HhDkLIgIyXPhPKNAeXn3KO2pEaNgzaEo/asaw==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
@ -1205,6 +1205,17 @@ array.prototype.find@^2.2.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.findlast@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz#eeb9e45fc894055c82e5675c463e8077b827ad36"
integrity sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==
dependencies:
call-bind "^1.0.5"
define-properties "^1.2.1"
es-abstract "^1.22.3"
es-errors "^1.3.0"
es-shim-unscopables "^1.0.2"
array.prototype.findlastindex@^1.2.3:
version "1.2.4"
resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz#d1c50f0b3a9da191981ff8942a0aedd82794404f"
@ -1226,7 +1237,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
array.prototype.flatmap@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
@ -1236,7 +1247,17 @@ array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.tosorted@^1.1.1:
array.prototype.toreversed@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba"
integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==
dependencies:
call-bind "^1.0.2"
define-properties "^1.2.0"
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
array.prototype.tosorted@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8"
integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
@ -1292,13 +1313,13 @@ asynciterator.prototype@^1.0.0:
dependencies:
has-symbols "^1.0.3"
autoprefixer@^10.4.17:
version "10.4.17"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be"
integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==
autoprefixer@^10.4.18:
version "10.4.18"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163"
integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==
dependencies:
browserslist "^4.22.2"
caniuse-lite "^1.0.30001578"
browserslist "^4.23.0"
caniuse-lite "^1.0.30001591"
fraction.js "^4.3.7"
normalize-range "^0.1.2"
picocolors "^1.0.0"
@ -1335,11 +1356,6 @@ base64-js@^1.1.2, base64-js@^1.3.0:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
blessing-skin-shell@^0.3.4:
version "0.3.4"
resolved "https://registry.yarnpkg.com/blessing-skin-shell/-/blessing-skin-shell-0.3.4.tgz#d6c76f85cd5021971e7e44307989f258ea69fc97"
integrity sha512-Rpfz9BskFOaVKoLnSHWFDCtECihWrxFFongbHzMfOTQ/wQJh9wADHPq+bGf1CnPAqktU2as1Rhn2cjMof/1DZg==
bootstrap-colorpicker@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/bootstrap-colorpicker/-/bootstrap-colorpicker-3.4.0.tgz#3d1873071542755a9b31cf5b314f771e2fcc7727"
@ -1441,16 +1457,6 @@ browserslist-to-esbuild@^2.1.1:
dependencies:
meow "^13.0.0"
browserslist@^4.22.2:
version "4.22.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b"
integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
dependencies:
caniuse-lite "^1.0.30001565"
electron-to-chromium "^1.4.601"
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
browserslist@^4.22.3, browserslist@^4.23.0:
version "4.23.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
@ -1493,7 +1499,7 @@ builtins@^5.0.1:
dependencies:
semver "^7.0.0"
cac@6.7.14, cac@^6.7.14:
cac@^6.7.14:
version "6.7.14"
resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959"
integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
@ -1523,16 +1529,16 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
caniuse-lite@^1.0.30001565:
version "1.0.30001576"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz#893be772cf8ee6056d6c1e2d07df365b9ec0a5c4"
integrity sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==
caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001587:
caniuse-lite@^1.0.30001587:
version "1.0.30001589"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb"
integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==
caniuse-lite@^1.0.30001591:
version "1.0.30001593"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz#7cda1d9e5b0cad6ebab4133b1f239d4ea44fe659"
integrity sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==
chai@^4.3.10:
version "4.4.1"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1"
@ -1618,11 +1624,6 @@ clean-regexp@^1.0.0:
dependencies:
escape-string-regexp "^1.0.5"
cli-spinners@^2.5.0:
version "2.9.2"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
clone@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@ -2203,11 +2204,6 @@ ekko-lightbox@^5.3.0:
resolved "https://registry.yarnpkg.com/ekko-lightbox/-/ekko-lightbox-5.3.0.tgz#fbfcd9df93a8d1cdbf8770adc8c05aaac4d24f56"
integrity sha512-mbacwySuVD3Ad6F2hTkjSTvJt59bcVv2l/TmBerp4xZnLak8tPtA4AScUn4DL42c1ksTiAO6sGhJZ52P/1Qgew==
electron-to-chromium@^1.4.601:
version "1.4.629"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.629.tgz#9cbffe1b08a5627b6a25118360f7fd3965416caf"
integrity sha512-5UUkr3k3CZ/k+9Sw7vaaIMyOzMC0XbPyprKI3n0tbKDqkzTDOjK4izm7DxlkueRMim6ZZQ1ja9F7hoFVplHihA==
electron-to-chromium@^1.4.668:
version "1.4.679"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.679.tgz#480f497874ce2be162c0ac271eec91918bf96247"
@ -2332,7 +2328,7 @@ es-get-iterator@^1.1.3:
isarray "^2.0.5"
stop-iteration-iterator "^1.0.0"
es-iterator-helpers@^1.0.12:
es-iterator-helpers@^1.0.17:
version "1.0.17"
resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8"
integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==
@ -2679,27 +2675,29 @@ eslint-plugin-react-hooks@^4.6.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
eslint-plugin-react@^7.33.2:
version "7.33.2"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608"
integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
eslint-plugin-react@^7.34.0:
version "7.34.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz#ab71484d54fc409c37025c5eca00eb4177a5e88c"
integrity sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==
dependencies:
array-includes "^3.1.6"
array.prototype.flatmap "^1.3.1"
array.prototype.tosorted "^1.1.1"
array-includes "^3.1.7"
array.prototype.findlast "^1.2.4"
array.prototype.flatmap "^1.3.2"
array.prototype.toreversed "^1.1.2"
array.prototype.tosorted "^1.1.3"
doctrine "^2.1.0"
es-iterator-helpers "^1.0.12"
es-iterator-helpers "^1.0.17"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
object.entries "^1.1.6"
object.fromentries "^2.0.6"
object.hasown "^1.1.2"
object.values "^1.1.6"
object.entries "^1.1.7"
object.fromentries "^2.0.7"
object.hasown "^1.1.3"
object.values "^1.1.7"
prop-types "^15.8.1"
resolve "^2.0.0-next.4"
resolve "^2.0.0-next.5"
semver "^6.3.1"
string.prototype.matchall "^4.0.8"
string.prototype.matchall "^4.0.10"
eslint-plugin-unicorn@^51.0.0:
version "51.0.1"
@ -2912,11 +2910,6 @@ event-emitter@^0.3.5, event-emitter@~0.3.5:
d "1"
es5-ext "~0.10.14"
events@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
execa@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
@ -3993,10 +3986,10 @@ kleur@^3.0.3, kleur@^4.1.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780"
integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==
laravel-vite-plugin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/laravel-vite-plugin/-/laravel-vite-plugin-1.0.1.tgz#b92d0c939ccd60879746b23282100131f753cec7"
integrity sha512-laLEZUnSskIDZtLb2FNRdcjsRUhh1VOVvapbVGVTeaBPJTCF/b6gbPiX2dZdcH1RKoOE0an7L+2gnInk6K33Zw==
laravel-vite-plugin@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/laravel-vite-plugin/-/laravel-vite-plugin-1.0.2.tgz#97575181a1f870532b39ab3b423b53f01385feba"
integrity sha512-Mcclml10khYzBVxDwJro8wnVDwD4i7XOSEMACQNnarvTnHjrjXLLL+B/Snif2wYAyElsOqagJZ7VAinb/2vF5g==
dependencies:
picocolors "^1.0.0"
vite-plugin-full-reload "^1.1.0"
@ -4360,7 +4353,7 @@ object.assign@^4.1.4, object.assign@^4.1.5:
has-symbols "^1.0.3"
object-keys "^1.1.1"
object.entries@^1.1.6:
object.entries@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
@ -4369,7 +4362,7 @@ object.entries@^1.1.6:
define-properties "^1.2.0"
es-abstract "^1.22.1"
object.fromentries@^2.0.6, object.fromentries@^2.0.7:
object.fromentries@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
@ -4389,7 +4382,7 @@ object.groupby@^1.0.1:
es-abstract "^1.22.3"
es-errors "^1.0.0"
object.hasown@^1.1.2:
object.hasown@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae"
integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==
@ -4997,7 +4990,7 @@ resolve@^1.1.5, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.22
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^2.0.0-next.4, resolve@^2.0.0-next.5:
resolve@^2.0.0-next.5:
version "2.0.0-next.5"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
@ -5423,7 +5416,7 @@ string-width@^7.0.0:
get-east-asian-width "^1.0.0"
strip-ansi "^7.1.0"
string.prototype.matchall@^4.0.8:
string.prototype.matchall@^4.0.10:
version "4.0.10"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100"
integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==
@ -5941,7 +5934,7 @@ vite-plugin-wasm@^3.3.0:
resolved "https://registry.yarnpkg.com/vite-plugin-wasm/-/vite-plugin-wasm-3.3.0.tgz#2908ef2529bf8f33f4e549c8c6fda26ad273ca15"
integrity sha512-tVhz6w+W9MVsOCHzxo6SSMSswCeIw4HTrXEi6qL3IRzATl83jl09JVO1djBqPSwfjgnpVHNLYcaMbaDX5WB/pg==
vite@^5.0.0, vite@^5.1.4:
vite@^5.0.0:
version "5.1.4"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.4.tgz#14e9d3e7a6e488f36284ef13cebe149f060bcfb6"
integrity sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==
@ -5952,6 +5945,17 @@ vite@^5.0.0, vite@^5.1.4:
optionalDependencies:
fsevents "~2.3.3"
vite@^5.1.5:
version "5.1.5"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.5.tgz#bdbc2b15e8000d9cc5172f059201178f9c9de5fb"
integrity sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==
dependencies:
esbuild "^0.19.3"
postcss "^8.4.35"
rollup "^4.2.0"
optionalDependencies:
fsevents "~2.3.3"
vitest@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.3.1.tgz#2d7e9861f030d88a4669392a4aecb40569d90937"
@ -6107,16 +6111,6 @@ xtend@^4.0.2, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
xterm-addon-fit@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz#48ca99015385141918f955ca7819e85f3691d35f"
integrity sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==
xterm@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.3.0.tgz#867daf9cc826f3d45b5377320aabd996cb0fce46"
integrity sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==
yallist@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"