feat(Update to 2): Adds dev + replace with poe 2

Adds my dev files and replaces instances of "POE" with "POE2"

maybe a lot
This commit is contained in:
kvan7
2024-12-09 16:42:22 -06:00
parent 73788f07bb
commit 17955b452e
14 changed files with 1290 additions and 1038 deletions

View File

@@ -1,28 +1,32 @@
{
"folders": [
{
"name": "renderer",
"path": "renderer"
},
{
"name": "main",
"path": "main"
},
{
"name": "docs",
"path": "docs"
},
{
"name": "root",
"path": "."
}
],
"settings": {
"files.exclude": {
"main/": true,
"renderer/": true,
"docs/": true,
"dist/": true
}
}
"folders": [
{
"name": "renderer",
"path": "renderer"
},
{
"name": "main",
"path": "main"
},
{
"name": "docs",
"path": "docs"
},
{
"name": "root",
"path": "."
}
],
"settings": {
"files.exclude": {
"main/": true,
"renderer/": true,
"docs/": true,
"dist/": true
},
"editor.tabSize": 2,
"conventionalCommits.scopes": [
"Update to 2"
]
}
}

View File

@@ -4,7 +4,7 @@ const BASE = '/awakened-poe-trade/'
export default defineConfig({
title: 'Awakened PoE Trade',
description: 'App for price-checking items in Path of Exile',
description: 'App for price-checking items in Path of Exile 2',
base: BASE,
mpa: true,
head: [

View File

@@ -4,7 +4,7 @@ title: FAQ
- **Where can I change settings, league?**
Open Path of Exile and press overlay key `Shift + Space`. Click on the button with cog icon there.
Open Path of Exile 2 and press overlay key `Shift + Space`. Click on the button with cog icon there.
![](https://i.imgur.com/81L9Cp0.png)
- **Where can I find the logs?**

View File

@@ -4,7 +4,7 @@ title: Quick Start
#### First of all, how does it work? {:style="margin-top: 0;"}
When you press `Ctrl + C` Path of Exile copies the item's text (under cursor, if any) to the clipboard.
When you press `Ctrl + C` Path of Exile 2 copies the item's text (under cursor, if any) to the clipboard.
All that remains is to parse text in Awakened PoE Trade and show to you in a fancy way.
### Usage

View File

@@ -1,70 +1,70 @@
import path from 'path'
import { app, Tray, Menu, shell, nativeImage, dialog } from 'electron'
import type { ServerEvents } from './server'
import path from "path";
import { app, Tray, Menu, shell, nativeImage, dialog } from "electron";
import type { ServerEvents } from "./server";
export class AppTray {
public overlayKey = 'Shift + Space'
private tray: Tray
serverPort = 0
public overlayKey = "Shift + Space";
private tray: Tray;
serverPort = 0;
constructor (server: ServerEvents) {
constructor(server: ServerEvents) {
let trayImage = nativeImage.createFromPath(
path.join(
__dirname,
process.env.STATIC!,
process.platform === "win32" ? "icon.ico" : "icon.png"
)
)
);
if (process.platform === 'darwin') {
if (process.platform === "darwin") {
// Mac image size needs to be smaller, or else it looks huge. Size
// guideline is from https://iconhandbook.co.uk/reference/chart/osx/
trayImage = trayImage.resize({ width: 22, height: 22 })
trayImage = trayImage.resize({ width: 22, height: 22 });
}
this.tray = new Tray(trayImage)
this.tray.setToolTip(`Awakened PoE Trade v${app.getVersion()}`)
this.rebuildMenu()
this.tray = new Tray(trayImage);
this.tray.setToolTip(`Awakened PoE Trade v${app.getVersion()}`);
this.rebuildMenu();
server.onEventAnyClient('CLIENT->MAIN::user-action', ({ action }) => {
if (action === 'quit') {
app.quit()
server.onEventAnyClient("CLIENT->MAIN::user-action", ({ action }) => {
if (action === "quit") {
app.quit();
}
})
});
}
rebuildMenu () {
rebuildMenu() {
const contextMenu = Menu.buildFromTemplate([
{
label: 'Settings/League',
label: "Settings/League",
click: () => {
dialog.showMessageBox({
title: 'Settings',
message: `Open Path of Exile and press "${this.overlayKey}". Click on the button with cog icon there.`
})
}
title: "Settings",
message: `Open Path of Exile 2 and press "${this.overlayKey}". Click on the button with cog icon there.`,
});
},
},
{
label: 'Open in Browser',
label: "Open in Browser",
click: () => {
shell.openExternal(`http://localhost:${this.serverPort}`)
}
shell.openExternal(`http://localhost:${this.serverPort}`);
},
},
{ type: 'separator' },
{ type: "separator" },
{
label: 'Open config folder',
label: "Open config folder",
click: () => {
shell.openPath(path.join(app.getPath('userData'), 'apt-data'))
}
shell.openPath(path.join(app.getPath("userData"), "apt-data"));
},
},
{
label: 'Quit',
label: "Quit",
click: () => {
app.quit()
}
}
])
app.quit();
},
},
]);
this.tray.setContextMenu(contextMenu)
this.tray.setContextMenu(contextMenu);
}
}

View File

@@ -1,100 +1,131 @@
import fs from 'fs/promises'
import path from 'path'
import ini from 'ini'
import { app } from 'electron'
import { hotkeyToString, CodeToKey } from '../../../ipc/KeyToCode'
import { guessFileLocation } from './utils'
import type { Logger } from '../RemoteLogger'
import type { ServerEvents } from '../server'
import fs from "fs/promises";
import path from "path";
import ini from "ini";
import { app } from "electron";
import { hotkeyToString, CodeToKey } from "../../../ipc/KeyToCode";
import { guessFileLocation } from "./utils";
import type { Logger } from "../RemoteLogger";
import type { ServerEvents } from "../server";
const POSSIBLE_PATH =
(process.platform === 'win32') ? [
path.join(app.getPath('documents'), 'My Games\\Path of Exile\\production_Config.ini')
] : (process.platform === 'linux') ? [
path.join(app.getPath('documents'), 'My Games/Path of Exile/production_Config.ini'),
path.join(app.getPath('home'), '.local/share/Steam/steamapps/compatdata/238960/pfx/drive_c/users/steamuser/Documents/My Games/Path of Exile/production_Config.ini')
] : (process.platform === 'darwin') ? [
path.join(app.getPath('appData'), 'Path of Exile/Preferences/production_Config.ini')
] : []
process.platform === "win32"
? [
path.join(
app.getPath("documents"),
"My Games\\Path of Exile 2\\production_Config.ini"
),
]
: process.platform === "linux"
? [
path.join(
app.getPath("documents"),
"My Games/Path of Exile 2/production_Config.ini"
),
path.join(
app.getPath("home"),
".local/share/Steam/steamapps/compatdata/238960/pfx/drive_c/users/steamuser/Documents/My Games/Path of Exile 2/production_Config.ini"
),
]
: process.platform === "darwin"
? [
path.join(
app.getPath("appData"),
"Path of Exile 2/Preferences/production_Config.ini"
),
]
: [];
export class GameConfig {
private _wantedPath: string | null = null
private _actualPath: string | null = null
get actualPath () { return this._actualPath }
private _wantedPath: string | null = null;
private _actualPath: string | null = null;
get actualPath() {
return this._actualPath;
}
private _showModsKey: string | null = null
get showModsKeyNullable () { return this._showModsKey }
get showModsKey () { return this._showModsKey ?? 'Alt' }
private _showModsKey: string | null = null;
get showModsKeyNullable() {
return this._showModsKey;
}
get showModsKey() {
return this._showModsKey ?? "Alt";
}
constructor (
private server: ServerEvents,
private logger: Logger
) {}
constructor(private server: ServerEvents, private logger: Logger) {}
async readConfig (filePath: string) {
async readConfig(filePath: string) {
if (this._wantedPath !== filePath) {
this._wantedPath = filePath
this._actualPath = null
this._wantedPath = filePath;
this._actualPath = null;
} else {
return
return;
}
if (!filePath.length) {
const guessedPath = await guessFileLocation(POSSIBLE_PATH)
const guessedPath = await guessFileLocation(POSSIBLE_PATH);
if (guessedPath != null) {
filePath = guessedPath
filePath = guessedPath;
} else {
this.logger.write('error [GameConfig] Failed to find game configuration file in the default location.')
return
this.logger.write(
"error [GameConfig] Failed to find game configuration file in the default location."
);
return;
}
}
try {
let contents = await fs.readFile(filePath, { encoding: 'utf-8', flag: 'r' })
contents = contents.trimStart() // remove BOM
const parsed = ini.parse(contents)
let contents = await fs.readFile(filePath, {
encoding: "utf-8",
flag: "r",
});
contents = contents.trimStart(); // remove BOM
const parsed = ini.parse(contents);
this._showModsKey = this.parseConfigHotkey(
parsed['ACTION_KEYS']?.['show_advanced_item_descriptions'])
parsed["ACTION_KEYS"]?.["show_advanced_item_descriptions"]
);
this._actualPath = filePath
this._actualPath = filePath;
} catch {
this.logger.write('error [GameConfig] Failed to read game configuration file.')
this.logger.write(
"error [GameConfig] Failed to read game configuration file."
);
}
}
private parseConfigHotkey (cfgKey?: string): string | null {
if (!cfgKey) return null
private parseConfigHotkey(cfgKey?: string): string | null {
if (!cfgKey) return null;
const [keyMain, keyMod] = cfgKey.split(' ')
const [keyMain, keyMod] = cfgKey.split(" ");
let key1: string
let key1: string;
if (CodeToKey[keyMain]) {
key1 = CodeToKey[keyMain]
key1 = CodeToKey[keyMain];
} else {
this.logger.write(`error [GameConfig] Failed to read key: ${cfgKey}.`)
return null
this.logger.write(`error [GameConfig] Failed to read key: ${cfgKey}.`);
return null;
}
let key2: string | undefined
let key2: string | undefined;
if (keyMod) {
if (keyMod === '1') {
key2 = 'Shift'
} else if (keyMod === '2') {
key2 = 'Ctrl'
} else if (keyMod === '3') {
key2 = 'Alt'
if (keyMod === "1") {
key2 = "Shift";
} else if (keyMod === "2") {
key2 = "Ctrl";
} else if (keyMod === "3") {
key2 = "Alt";
} else {
this.logger.write(`error [GameConfig] Failed to read modifier key: ${cfgKey}.`)
return null
this.logger.write(
`error [GameConfig] Failed to read modifier key: ${cfgKey}.`
);
return null;
}
}
return hotkeyToString(
[key1],
key2 === 'Ctrl',
key2 === 'Shift',
key2 === 'Alt'
)
key2 === "Ctrl",
key2 === "Shift",
key2 === "Alt"
);
}
}

View File

@@ -1,101 +1,118 @@
import { promises as fs, watchFile, unwatchFile } from 'fs'
import path from 'path'
import { app } from 'electron'
import { guessFileLocation } from './utils'
import { ServerEvents } from '../server'
import { Logger } from '../RemoteLogger'
import { promises as fs, watchFile, unwatchFile } from "fs";
import path from "path";
import { app } from "electron";
import { guessFileLocation } from "./utils";
import { ServerEvents } from "../server";
import { Logger } from "../RemoteLogger";
const POSSIBLE_PATH =
(process.platform === 'win32') ? [
'C:\\Program Files (x86)\\Grinding Gear Games\\Path of Exile\\logs\\Client.txt',
'C:\\Program Files (x86)\\Steam\\steamapps\\common\\Path of Exile\\logs\\Client.txt'
] : (process.platform === 'linux') ? [
path.join(app.getPath('home'), '.wine/drive_c/Program Files (x86)/Grinding Gear Games/Path of Exile/logs/Client.txt'),
path.join(app.getPath('home'), '.local/share/Steam/steamapps/common/Path of Exile/logs/Client.txt')
] : (process.platform === 'darwin') ? [
path.join(app.getPath('home'), 'Library/Caches/com.GGG.PathOfExile/Logs/Client.txt')
] : []
process.platform === "win32"
? [
"C:\\Program Files (x86)\\Grinding Gear Games\\Path of Exile 2\\logs\\Client.txt",
"C:\\Program Files (x86)\\Steam\\steamapps\\common\\Path of Exile 2\\logs\\Client.txt",
]
: process.platform === "linux"
? [
path.join(
app.getPath("home"),
".wine/drive_c/Program Files (x86)/Grinding Gear Games/Path of Exile 2/logs/Client.txt"
),
path.join(
app.getPath("home"),
".local/share/Steam/steamapps/common/Path of Exile 2/logs/Client.txt"
),
]
: process.platform === "darwin"
? [
path.join(
app.getPath("home"),
"Library/Caches/com.GGG.PathOfExile/Logs/Client.txt"
),
]
: [];
export class GameLogWatcher {
private _wantedPath: string | null = null
get actualPath () { return this._state?.path ?? null }
private _wantedPath: string | null = null;
get actualPath() {
return this._state?.path ?? null;
}
private _state: {
offset: number
path: string
file: fs.FileHandle
isReading: boolean
readBuff: Buffer
} | null = null
offset: number;
path: string;
file: fs.FileHandle;
isReading: boolean;
readBuff: Buffer;
} | null = null;
constructor (
private server: ServerEvents,
private logger: Logger,
) {}
constructor(private server: ServerEvents, private logger: Logger) {}
async restart (logFile: string) {
async restart(logFile: string) {
if (this._wantedPath !== logFile) {
this._wantedPath = logFile
this._wantedPath = logFile;
if (this._state) {
unwatchFile(this._state.path)
await this._state.file.close()
this._state = null
unwatchFile(this._state.path);
await this._state.file.close();
this._state = null;
}
} else {
return
return;
}
if (!logFile.length) {
const guessedPath = await guessFileLocation(POSSIBLE_PATH)
const guessedPath = await guessFileLocation(POSSIBLE_PATH);
if (guessedPath != null) {
logFile = guessedPath
logFile = guessedPath;
} else {
return
return;
}
}
try {
const file = await fs.open(logFile, 'r')
const stats = await file.stat()
watchFile(logFile, { interval: 450 }, this.handleFileChange.bind(this))
const file = await fs.open(logFile, "r");
const stats = await file.stat();
watchFile(logFile, { interval: 450 }, this.handleFileChange.bind(this));
this._state = {
path: logFile,
file: file,
offset: stats.size,
isReading: false,
readBuff: Buffer.allocUnsafe(64 * 1024),
}
};
} catch {
this.logger.write('error [GameLogWatcher] Failed to watch file.')
this.logger.write("error [GameLogWatcher] Failed to watch file.");
}
}
private handleFileChange () {
private handleFileChange() {
if (this._state && !this._state.isReading) {
this._state.isReading = true
this.readToEOF()
this._state.isReading = true;
this.readToEOF();
}
}
private async readToEOF () {
if (!this._state) return
private async readToEOF() {
if (!this._state) return;
const { file, readBuff, offset } = this._state
const { bytesRead } = await file.read(readBuff, 0, readBuff.length, offset)
const { file, readBuff, offset } = this._state;
const { bytesRead } = await file.read(readBuff, 0, readBuff.length, offset);
if (bytesRead) {
const str = readBuff.toString('utf8', 0, bytesRead)
const lines = str.split('\n').map(line => line.trim()).filter(line => line.length)
this.server.sendEventTo('broadcast', {
name: 'MAIN->CLIENT::game-log',
payload: { lines }
})
const str = readBuff.toString("utf8", 0, bytesRead);
const lines = str
.split("\n")
.map((line) => line.trim())
.filter((line) => line.length);
this.server.sendEventTo("broadcast", {
name: "MAIN->CLIENT::game-log",
payload: { lines },
});
}
if (bytesRead) {
this._state.offset += bytesRead
this.readToEOF()
this._state.offset += bytesRead;
this.readToEOF();
} else {
this._state.isReading = false
this._state.isReading = false;
}
}
}

View File

@@ -1,172 +1,188 @@
import path from 'path'
import { BrowserWindow, dialog, shell, Menu, WebContents } from 'electron'
import { OverlayController, OVERLAY_WINDOW_OPTS } from 'electron-overlay-window'
import type { ServerEvents } from '../server'
import type { Logger } from '../RemoteLogger'
import type { GameWindow } from './GameWindow'
import path from "path";
import { BrowserWindow, dialog, shell, Menu, WebContents } from "electron";
import {
OverlayController,
OVERLAY_WINDOW_OPTS,
} from "electron-overlay-window";
import type { ServerEvents } from "../server";
import type { Logger } from "../RemoteLogger";
import type { GameWindow } from "./GameWindow";
export class OverlayWindow {
public isInteractable = false
public wasUsedRecently = true
private window?: BrowserWindow
private overlayKey: string = 'Shift + Space'
private isOverlayKeyUsed = false
public isInteractable = false;
public wasUsedRecently = true;
private window?: BrowserWindow;
private overlayKey: string = "Shift + Space";
private isOverlayKeyUsed = false;
constructor (
constructor(
private server: ServerEvents,
private logger: Logger,
private poeWindow: GameWindow,
private poeWindow: GameWindow
) {
this.server.onEventAnyClient('OVERLAY->MAIN::focus-game', this.assertGameActive)
this.poeWindow.on('active-change', this.handlePoeWindowActiveChange)
this.poeWindow.onAttach(this.handleOverlayAttached)
this.server.onEventAnyClient(
"OVERLAY->MAIN::focus-game",
this.assertGameActive
);
this.poeWindow.on("active-change", this.handlePoeWindowActiveChange);
this.poeWindow.onAttach(this.handleOverlayAttached);
this.server.onEventAnyClient('CLIENT->MAIN::used-recently', (e) => {
this.wasUsedRecently = e.isOverlay
})
this.server.onEventAnyClient("CLIENT->MAIN::used-recently", (e) => {
this.wasUsedRecently = e.isOverlay;
});
if (process.argv.includes('--no-overlay')) return
if (process.argv.includes("--no-overlay")) return;
this.window = new BrowserWindow({
icon: path.join(__dirname, process.env.STATIC!, 'icon.png'),
icon: path.join(__dirname, process.env.STATIC!, "icon.png"),
...OVERLAY_WINDOW_OPTS,
width: 800,
height: 600,
webPreferences: {
allowRunningInsecureContent: false,
webviewTag: true,
spellcheck: false
spellcheck: false,
},
});
this.window.setMenu(
Menu.buildFromTemplate([
{ role: "editMenu" },
{ role: "reload" },
{ role: "toggleDevTools" },
])
);
this.window.webContents.on("before-input-event", this.handleExtraCommands);
this.window.webContents.on(
"did-attach-webview",
(_, webviewWebContents) => {
webviewWebContents.on("before-input-event", this.handleExtraCommands);
}
})
this.window.setMenu(Menu.buildFromTemplate([
{ role: 'editMenu' },
{ role: 'reload' },
{ role: 'toggleDevTools' }
]))
this.window.webContents.on('before-input-event', this.handleExtraCommands)
this.window.webContents.on('did-attach-webview', (_, webviewWebContents) => {
webviewWebContents.on('before-input-event', this.handleExtraCommands)
})
);
this.window.webContents.setWindowOpenHandler((details) => {
shell.openExternal(details.url)
return { action: 'deny' }
})
shell.openExternal(details.url);
return { action: "deny" };
});
}
loadAppPage (port: number) {
const url = process.env.VITE_DEV_SERVER_URL ||
`http://localhost:${port}/index.html`
loadAppPage(port: number) {
const url =
process.env.VITE_DEV_SERVER_URL || `http://localhost:${port}/index.html`;
if (!this.window) {
shell.openExternal(url)
return
shell.openExternal(url);
return;
}
if (process.env.VITE_DEV_SERVER_URL) {
this.window.loadURL(url)
this.window.webContents.openDevTools({ mode: 'detach', activate: false })
this.window.loadURL(url);
this.window.webContents.openDevTools({ mode: "detach", activate: false });
} else {
this.window.loadURL(url)
this.window.loadURL(url);
}
}
assertOverlayActive = () => {
if (!this.isInteractable) {
this.isInteractable = true
OverlayController.activateOverlay()
this.poeWindow.isActive = false
this.isInteractable = true;
OverlayController.activateOverlay();
this.poeWindow.isActive = false;
}
}
};
assertGameActive = () => {
if (this.isInteractable) {
this.isInteractable = false
OverlayController.focusTarget()
this.poeWindow.isActive = true
this.isInteractable = false;
OverlayController.focusTarget();
this.poeWindow.isActive = true;
}
}
};
toggleActiveState = () => {
this.isOverlayKeyUsed = true
this.isOverlayKeyUsed = true;
if (this.isInteractable) {
this.assertGameActive()
this.assertGameActive();
} else {
this.assertOverlayActive()
this.assertOverlayActive();
}
};
updateOpts(overlayKey: string, windowTitle: string) {
this.overlayKey = overlayKey;
this.poeWindow.attach(this.window, windowTitle);
}
updateOpts (overlayKey: string, windowTitle: string) {
this.overlayKey = overlayKey
this.poeWindow.attach(this.window, windowTitle)
}
private handleExtraCommands = (
event: Electron.Event,
input: Electron.Input
) => {
if (input.type !== "keyDown") return;
private handleExtraCommands = (event: Electron.Event, input: Electron.Input) => {
if (input.type !== 'keyDown') return
let { code, control: ctrlKey, shift: shiftKey, alt: altKey } = input;
let { code, control: ctrlKey, shift: shiftKey, alt: altKey } = input
if (code.startsWith('Key')) {
code = code.slice('Key'.length)
} else if (code.startsWith('Digit')) {
code = code.slice('Digit'.length)
if (code.startsWith("Key")) {
code = code.slice("Key".length);
} else if (code.startsWith("Digit")) {
code = code.slice("Digit".length);
}
if (shiftKey && altKey) code = `Shift + Alt + ${code}`
else if (ctrlKey && shiftKey) code = `Ctrl + Shift + ${code}`
else if (ctrlKey && altKey) code = `Ctrl + Alt + ${code}`
else if (altKey) code = `Alt + ${code}`
else if (ctrlKey) code = `Ctrl + ${code}`
else if (shiftKey) code = `Shift + ${code}`
if (shiftKey && altKey) code = `Shift + Alt + ${code}`;
else if (ctrlKey && shiftKey) code = `Ctrl + Shift + ${code}`;
else if (ctrlKey && altKey) code = `Ctrl + Alt + ${code}`;
else if (altKey) code = `Alt + ${code}`;
else if (ctrlKey) code = `Ctrl + ${code}`;
else if (shiftKey) code = `Shift + ${code}`;
switch (code) {
case 'Escape':
case 'Ctrl + W': {
event.preventDefault()
process.nextTick(this.assertGameActive)
break
case "Escape":
case "Ctrl + W": {
event.preventDefault();
process.nextTick(this.assertGameActive);
break;
}
case this.overlayKey: {
event.preventDefault()
process.nextTick(this.toggleActiveState)
break
event.preventDefault();
process.nextTick(this.toggleActiveState);
break;
}
}
}
};
private handleOverlayAttached = (hasAccess?: boolean) => {
if (hasAccess === false) {
this.logger.write('error [Overlay] PoE is running with administrator rights')
this.logger.write(
"error [Overlay] PoE is running with administrator rights"
);
dialog.showErrorBox(
'PoE window - No access',
"PoE window - No access",
// ----------------------
'Path of Exile is running with administrator rights.\n' +
'\n' +
'You need to restart Awakened PoE Trade with administrator rights.'
)
"Path of Exile 2 is running with administrator rights.\n" +
"\n" +
"You need to restart Awakened PoE Trade with administrator rights."
);
} else {
this.server.sendEventTo('broadcast', {
name: 'MAIN->OVERLAY::overlay-attached',
payload: undefined
})
this.server.sendEventTo("broadcast", {
name: "MAIN->OVERLAY::overlay-attached",
payload: undefined,
});
}
}
};
private handlePoeWindowActiveChange = (isActive: boolean) => {
if (isActive && this.isInteractable) {
this.isInteractable = false
this.isInteractable = false;
}
this.server.sendEventTo('broadcast', {
name: 'MAIN->OVERLAY::focus-change',
this.server.sendEventTo("broadcast", {
name: "MAIN->OVERLAY::focus-change",
payload: {
game: isActive,
overlay: this.isInteractable,
usingHotkey: this.isOverlayKeyUsed
}
})
this.isOverlayKeyUsed = false
}
usingHotkey: this.isOverlayKeyUsed,
},
});
this.isOverlayKeyUsed = false;
};
}

View File

@@ -1,56 +1,60 @@
module.exports = {
root: true,
env: {
node: true
},
plugins: [
'@typescript-eslint'
// 'only-warn'
],
extends: [
'plugin:vue/base',
'standard-with-typescript'
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'quote-props': ['error', 'consistent-as-needed'],
'no-labels': ['error', { allowLoop: true }],
'multiline-ternary': 'off',
'no-unused-vars': 'off',
'no-undef': 'off',
'@typescript-eslint/no-unused-vars': ['error'],
'@typescript-eslint/strict-boolean-expressions': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'off',
'@typescript-eslint/prefer-optional-chain': 'off',
'@typescript-eslint/prefer-readonly': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-misused-promises': 'off',
'@typescript-eslint/prefer-reduce-type-parameter': 'off',
'@typescript-eslint/no-invalid-void-type': 'off',
'@typescript-eslint/consistent-indexed-object-style': 'off',
'import/first': 'off',
'import/no-duplicates': 'off',
'func-call-spacing': 'off',
// TODO: refactor IPC and enable
'@typescript-eslint/consistent-type-assertions': 'off'
},
overrides: [{
files: ['src/main/**/*'],
root: true,
env: {
node: true
}
}, {
files: ['*.ts'],
node: true
},
plugins: [
'@typescript-eslint',
'prettier'
// 'only-warn'
],
extends: [
'plugin:vue/base',
'standard-with-typescript',
'plugin:prettier/recommended',
'eslint-plugin-prettier/recommended',
],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'quote-props': ['error', 'consistent-as-needed'],
'no-labels': ['error', { allowLoop: true }],
'multiline-ternary': 'off',
'no-unused-vars': 'off',
'no-undef': 'off',
'@typescript-eslint/no-unused-vars': ['error'],
'@typescript-eslint/strict-boolean-expressions': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/restrict-template-expressions': 'off',
'@typescript-eslint/prefer-nullish-coalescing': 'off',
'@typescript-eslint/prefer-optional-chain': 'off',
'@typescript-eslint/prefer-readonly': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-misused-promises': 'off',
'@typescript-eslint/prefer-reduce-type-parameter': 'off',
'@typescript-eslint/no-invalid-void-type': 'off',
'@typescript-eslint/consistent-indexed-object-style': 'off',
'import/first': 'off',
'import/no-duplicates': 'off',
'func-call-spacing': 'off',
// TODO: refactor IPC and enable
'@typescript-eslint/consistent-type-assertions': 'off',
"indent": ["error", "tab"]
},
overrides: [{
files: ['src/main/**/*'],
env: {
node: true
}
}, {
files: ['*.ts'],
parserOptions: {
project: './tsconfig.json'
}
}],
parserOptions: {
project: './tsconfig.json'
parser: '@typescript-eslint/parser',
extraFileExtensions: ['.vue']
}
}],
parserOptions: {
parser: '@typescript-eslint/parser',
extraFileExtensions: ['.vue']
}
}

7
renderer/.prettierrc Normal file
View File

@@ -0,0 +1,7 @@
{
"singleQuote": true,
"endOfLine": "lf",
"tabWidth": 2,
"useTabs": true,
"trailingComma": "es5"
}

View File

@@ -33,7 +33,10 @@
"@types/object-hash": "^3.0.0",
"@vitejs/plugin-vue": "^4.0.0",
"autoprefixer": "^10.0.2",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"postcss": "^8.2.14",
"prettier": "3.4.2",
"typescript": "5.6.x",
"vite": "^5.0.0",
"vue-tsc": "^2.0.0"
@@ -502,8 +505,8 @@
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
"integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
},
@@ -521,8 +524,8 @@
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
@@ -531,8 +534,8 @@
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
@@ -555,8 +558,8 @@
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
@@ -575,8 +578,8 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
"deprecated": "Use @eslint/config-array instead",
"devOptional": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.3",
"debug": "^4.3.1",
@@ -590,8 +593,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"devOptional": true,
"license": "Apache-2.0",
"optional": true,
"engines": {
"node": ">=12.22"
},
@@ -605,8 +608,8 @@
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
"deprecated": "Use @eslint/object-schema instead",
"license": "BSD-3-Clause",
"optional": true
"devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/@intlify/core-base": {
"version": "10.0.4",
@@ -789,6 +792,19 @@
"node": ">=14"
}
},
"node_modules/@pkgr/core": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/unts"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -1383,8 +1399,8 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"license": "ISC",
"optional": true
"devOptional": true,
"license": "ISC"
},
"node_modules/@vitejs/plugin-vue": {
"version": "4.6.2",
@@ -1739,8 +1755,8 @@
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -1752,8 +1768,8 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -1762,8 +1778,8 @@
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -1855,8 +1871,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"license": "Python-2.0",
"optional": true
"devOptional": true,
"license": "Python-2.0"
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.1",
@@ -2071,8 +2087,8 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -2157,8 +2173,8 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=6"
}
@@ -2197,8 +2213,8 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -2277,8 +2293,8 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.6",
@@ -2377,8 +2393,8 @@
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"ms": "^2.1.3"
},
@@ -2395,8 +2411,8 @@
"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==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/define-data-property": {
"version": "1.1.4",
@@ -2463,8 +2479,8 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"devOptional": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"esutils": "^2.0.2"
},
@@ -2712,8 +2728,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=10"
},
@@ -2726,8 +2742,8 @@
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@@ -2778,6 +2794,19 @@
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-config-prettier": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
"license": "MIT",
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
"peerDependencies": {
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-config-standard": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
@@ -3014,6 +3043,37 @@
"eslint": ">=7.0.0"
}
},
"node_modules/eslint-plugin-prettier": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
"integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.0",
"synckit": "^0.9.1"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint-plugin-prettier"
},
"peerDependencies": {
"@types/eslint": ">=8.0.0",
"eslint": ">=8.0.0",
"eslint-config-prettier": "*",
"prettier": ">=3.0.0"
},
"peerDependenciesMeta": {
"@types/eslint": {
"optional": true
},
"eslint-config-prettier": {
"optional": true
}
}
},
"node_modules/eslint-plugin-promise": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz",
@@ -3100,8 +3160,8 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"devOptional": true,
"license": "Apache-2.0",
"optional": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
@@ -3113,8 +3173,8 @@
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
@@ -3130,8 +3190,8 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"engines": {
"node": ">=4.0"
}
@@ -3140,8 +3200,8 @@
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"dependencies": {
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
@@ -3158,8 +3218,8 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
"devOptional": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -3171,8 +3231,8 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"engines": {
"node": ">=4.0"
}
@@ -3181,8 +3241,8 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"dependencies": {
"estraverse": "^5.2.0"
},
@@ -3194,8 +3254,8 @@
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"engines": {
"node": ">=4.0"
}
@@ -3220,8 +3280,8 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
@@ -3232,6 +3292,13 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"license": "MIT"
},
"node_modules/fast-diff": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
"integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
@@ -3264,15 +3331,15 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
@@ -3296,8 +3363,8 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"flat-cache": "^3.0.4"
},
@@ -3321,8 +3388,8 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
@@ -3338,8 +3405,8 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
@@ -3353,8 +3420,8 @@
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
"license": "ISC",
"optional": true
"devOptional": true,
"license": "ISC"
},
"node_modules/for-each": {
"version": "0.3.3",
@@ -3400,8 +3467,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"license": "ISC",
"optional": true
"devOptional": true,
"license": "ISC"
},
"node_modules/fsevents": {
"version": "2.3.3",
@@ -3498,8 +3565,8 @@
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"devOptional": true,
"license": "ISC",
"optional": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -3531,8 +3598,8 @@
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"type-fest": "^0.20.2"
},
@@ -3547,8 +3614,8 @@
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"devOptional": true,
"license": "(MIT OR CC0-1.0)",
"optional": true,
"engines": {
"node": ">=10"
},
@@ -3611,8 +3678,8 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/has-bigints": {
"version": "1.0.2",
@@ -3628,8 +3695,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=8"
}
@@ -3715,8 +3782,8 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">= 4"
}
@@ -3725,8 +3792,8 @@
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -3742,8 +3809,8 @@
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.8.19"
}
@@ -3753,8 +3820,8 @@
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"devOptional": true,
"license": "ISC",
"optional": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -3764,8 +3831,8 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC",
"optional": true
"devOptional": true,
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.0.7",
@@ -4031,8 +4098,8 @@
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=8"
}
@@ -4215,8 +4282,8 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"argparse": "^2.0.1"
},
@@ -4228,22 +4295,22 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/json5": {
"version": "1.0.2",
@@ -4262,8 +4329,8 @@
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"json-buffer": "3.0.1"
}
@@ -4272,8 +4339,8 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
@@ -4301,8 +4368,8 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"p-locate": "^5.0.0"
},
@@ -4324,8 +4391,8 @@
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/lru-cache": {
"version": "10.4.3",
@@ -4377,8 +4444,8 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"devOptional": true,
"license": "ISC",
"optional": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -4409,8 +4476,8 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/muggle-string": {
"version": "0.4.1",
@@ -4452,8 +4519,8 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/natural-compare-lite": {
"version": "1.4.0",
@@ -4629,8 +4696,8 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"devOptional": true,
"license": "ISC",
"optional": true,
"dependencies": {
"wrappy": "1"
}
@@ -4639,8 +4706,8 @@
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
@@ -4657,8 +4724,8 @@
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -4673,8 +4740,8 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -4695,8 +4762,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"callsites": "^3.0.0"
},
@@ -4715,8 +4782,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=8"
}
@@ -4725,8 +4792,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
@@ -4977,18 +5044,47 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/prettier": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
"integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/prettier-linter-helpers": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
"integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-diff": "^1.1.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=6"
}
@@ -5109,8 +5205,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=4"
}
@@ -5130,8 +5226,8 @@
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"devOptional": true,
"license": "ISC",
"optional": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -5542,8 +5638,8 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=8"
},
@@ -5621,8 +5717,8 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -5642,6 +5738,30 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/synckit": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@pkgr/core": "^0.1.0",
"tslib": "^2.6.2"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/unts"
}
},
"node_modules/synckit/node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD"
},
"node_modules/tailwindcss": {
"version": "3.4.15",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz",
@@ -5683,8 +5803,8 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"license": "MIT",
"optional": true
"devOptional": true,
"license": "MIT"
},
"node_modules/thenify": {
"version": "3.3.1",
@@ -5774,8 +5894,8 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"devOptional": true,
"license": "MIT",
"optional": true,
"dependencies": {
"prelude-ls": "^1.2.1"
},
@@ -5945,8 +6065,8 @@
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"devOptional": true,
"license": "BSD-2-Clause",
"optional": true,
"dependencies": {
"punycode": "^2.1.0"
}
@@ -6251,8 +6371,8 @@
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
@@ -6355,8 +6475,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"license": "ISC",
"optional": true
"devOptional": true,
"license": "ISC"
},
"node_modules/xml-name-validator": {
"version": "4.0.0",
@@ -6384,8 +6504,8 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=10"
},

View File

@@ -34,7 +34,10 @@
"@types/object-hash": "^3.0.0",
"@vitejs/plugin-vue": "^4.0.0",
"autoprefixer": "^10.0.2",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1",
"postcss": "^8.2.14",
"prettier": "3.4.2",
"typescript": "5.6.x",
"vite": "^5.0.0",
"vue-tsc": "^2.0.0"

File diff suppressed because it is too large Load Diff

View File

@@ -28,12 +28,12 @@
<div class="mb-2">
<div class="flex-1 mb-1">{{ t(':poe_log_file') }}</div>
<input v-model.trim="clientLog"
class="rounded bg-gray-900 px-1 block w-full font-sans" placeholder="...?/Grinding Gear Games/Path of Exile/logs/Client.txt">
class="rounded bg-gray-900 px-1 block w-full font-sans" placeholder="...?/Grinding Gear Games/Path of Exile 2/logs/Client.txt">
</div>
<div class="mb-4">
<div class="flex-1 mb-1">{{ t(':poe_cfg_file') }}</div>
<input v-model.trim="gameConfig"
class="rounded bg-gray-900 px-1 block w-full font-sans" placeholder="...?/My Games/Path of Exile/production_Config.ini">
class="rounded bg-gray-900 px-1 block w-full font-sans" placeholder="...?/My Games/Path of Exile 2/production_Config.ini">
</div>
<hr class="mb-4 mx-8 border-gray-700">
<div class="mb-2">