aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-10-24 03:41:47 +0700
committerShulhan <ms@kilabit.info>2023-10-24 22:28:25 +0700
commit85c3fc0431e7e75a41894d4669f6a46bbda5440b (patch)
tree15b73a82e9eaaa9ac9f2558578c8d7610ad392cd
parent891a860299ac76739d59f46280cbed63ff07743e (diff)
downloadpakakeh.ts-85c3fc0431e7e75a41894d4669f6a46bbda5440b.tar.xz
all: fix all linter warnings from tsc and eslint
In this changes we introduce eslint as our linter for TypeScript and update our tsconfig to be more strict. The ".eslintrc.yaml" and "tsconfig.json" is taken from golang/website repository [1]. [1]: https://cs.opensource.google/go/x/website
-rw-r--r--.eslintrc.yaml29
-rw-r--r--Makefile11
-rw-r--r--editor/editor.d.ts110
-rw-r--r--editor/editor.ts436
-rw-r--r--editor/example.ts14
-rw-r--r--input/checkboxes.d.ts48
-rw-r--r--input/checkboxes.ts42
-rw-r--r--input/example.ts132
-rw-r--r--input/number.d.ts52
-rw-r--r--input/number.ts8
-rw-r--r--input/option.d.ts4
-rw-r--r--input/select.d.ts56
-rw-r--r--input/select.ts29
-rw-r--r--input/string.d.ts46
-rw-r--r--input/string.ts4
-rw-r--r--notif/example.ts34
-rw-r--r--notif/notif.d.ts12
-rw-r--r--notif/notif.ts16
-rw-r--r--package-lock.json2116
-rw-r--r--package.json12
-rw-r--r--response.d.ts6
-rw-r--r--response.ts2
-rw-r--r--tsconfig.json21
-rw-r--r--vfs/example.ts28
-rw-r--r--vfs/vfs.d.ts40
-rw-r--r--vfs/vfs.ts77
-rw-r--r--websocket_client.d.ts64
-rw-r--r--websocket_client.ts37
28 files changed, 2842 insertions, 644 deletions
diff --git a/.eslintrc.yaml b/.eslintrc.yaml
new file mode 100644
index 0000000..9c2b441
--- /dev/null
+++ b/.eslintrc.yaml
@@ -0,0 +1,29 @@
+root: true
+extends: google
+parserOptions:
+ ecmaVersion: 2018
+rules:
+ require-jsdoc: 'off'
+ indent: 'off'
+ arrow-parens: 'off'
+ comma-dangle: ['error', {'functions': 'never'}]
+overrides:
+ - files:
+ - '*.ts'
+ parser: '@typescript-eslint/parser'
+ env:
+ browser: true
+ plugins:
+ - '@typescript-eslint'
+ extends:
+ - eslint:recommended
+ - plugin:@typescript-eslint/recommended
+ - plugin:prettier/recommended
+ rules:
+ valid-jsdoc:
+ - error
+ - requireParamType: false
+ requireReturnType: false
+ requireReturn: false
+ignorePatterns:
+ - '*.js'
diff --git a/Makefile b/Makefile
index 12b8152..1266d02 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,17 @@
## SPDX-FileCopyrightText: 2021 M. Shulhan <ms@kilabit.info>
## SPDX-License-Identifier: GPL-3.0-or-later
-.PHONY: all watch
+.PHONY: all
+all: build lint
-all:
+.PHONY: lint
+lint:
+ npx eslint --fix .
+
+.PHONY: build
+build:
tsc --outDir .
+.PHONY: watch
watch:
tsc --outDir . --watch
diff --git a/editor/editor.d.ts b/editor/editor.d.ts
index ccd669e..29ab3b6 100644
--- a/editor/editor.d.ts
+++ b/editor/editor.d.ts
@@ -1,63 +1,67 @@
import { WuiVfsNodeInterface } from "../vfs/vfs";
export interface WuiEditorOptions {
- id: string;
- is_editable: boolean;
- OnSelection(begin: number, end: number): void;
- OnSave(content: string): void;
+ id: string;
+ is_editable: boolean;
+ OnSelection(begin: number, end: number): void;
+ OnSave(content: string): void;
}
export declare class WuiEditor {
- opts: WuiEditorOptions;
- id: string;
- is_editable: boolean;
- lines: WuiEditorLine[];
- private el;
- private sel;
- private active_file;
- private active_text;
- private range_begin;
- private range_end;
- private raw_lines;
- private range;
- private is_key_control;
- private unre;
- constructor(opts: WuiEditorOptions);
- GetContent(): string;
- GetSelectionRange(): WuiEditorSelectionRangeInterface;
- OnClickText(text: HTMLElement): void;
- OnKeyup(x: number, text: HTMLElement, ev: KeyboardEvent): boolean | undefined;
- OnKeydownOnLine(x: number, el_text: HTMLElement, ev: KeyboardEvent): false | undefined;
- OnMouseDownAtLine(x: number): void;
- OnMouseUpAtLine(x: number): void;
- SetEditOff(): void;
- SetEditOn(): void;
- Open(node: WuiVfsNodeInterface): void;
- ClearSelection(): void;
- private initStyle;
- private doJoin;
- private doSplit;
- private doUpdate;
- private doRedo;
- private doUndo;
- private deleteLine;
- private insertNewline;
- private onKeyupDocument;
- private render;
- private setCaret;
+ opts: WuiEditorOptions;
+ id: string;
+ is_editable: boolean;
+ lines: WuiEditorLine[];
+ private el;
+ private sel;
+ private active_file;
+ private active_text;
+ private range_begin;
+ private range_end;
+ private raw_lines;
+ private range;
+ private is_key_control;
+ private unre;
+ constructor(opts: WuiEditorOptions);
+ GetContent(): string;
+ GetSelectionRange(): WuiEditorSelectionRangeInterface;
+ OnClickText(text: HTMLElement): void;
+ OnKeyup(x: number, text: HTMLElement, ev: KeyboardEvent): boolean | undefined;
+ OnKeydownOnLine(
+ x: number,
+ el_text: HTMLElement,
+ ev: KeyboardEvent,
+ ): false | undefined;
+ OnMouseDownAtLine(x: number): void;
+ OnMouseUpAtLine(x: number): void;
+ SetEditOff(): void;
+ SetEditOn(): void;
+ Open(node: WuiVfsNodeInterface): void;
+ ClearSelection(): void;
+ private initStyle;
+ private doJoin;
+ private doSplit;
+ private doUpdate;
+ private doRedo;
+ private doUndo;
+ private deleteLine;
+ private insertNewline;
+ private onKeyupDocument;
+ private render;
+ private setCaret;
}
declare class WuiEditorLine {
- x: number;
- text: string;
- private line_num;
- el: HTMLElement;
- el_number: HTMLElement;
- el_text: HTMLElement;
- constructor(x: number, text: string, ed: WuiEditor);
- SetNumber(x: number): void;
- SetEditOn(): void;
- SetEditOff(): void;
+ x: number;
+ text: string;
+ private line_num;
+ el: HTMLElement;
+ el_number: HTMLElement;
+ el_text: HTMLElement;
+ constructor(x: number, text: string, ed: WuiEditor);
+ SetNumber(x: number): void;
+ SetEditOn(): void;
+ SetEditOff(): void;
}
interface WuiEditorSelectionRangeInterface {
- begin_at: number;
- end_at: number;
+ begin_at: number;
+ end_at: number;
}
export {};
diff --git a/editor/editor.ts b/editor/editor.ts
index b8fd42a..0e919ab 100644
--- a/editor/editor.ts
+++ b/editor/editor.ts
@@ -13,10 +13,10 @@ export interface WuiEditorOptions {
is_editable: boolean;
// Handler that will be called when user select lines.
- OnSelection(begin: number, end: number): void;
+ onSelection(begin: number, end: number): void;
// Handler that will be called when user press CTRL+S.
- OnSave(content: string): void;
+ onSave(content: string): void;
}
export class WuiEditor {
@@ -25,8 +25,6 @@ export class WuiEditor {
lines: WuiEditorLine[] = [];
private el!: HTMLElement;
private sel!: Selection;
- private active_file: WuiVfsNodeInterface | null = null;
- private active_text: HTMLElement | null = null;
private range_begin: number = -1;
private range_end: number = -1;
private raw_lines: string[] = [];
@@ -38,7 +36,7 @@ export class WuiEditor {
this.id = opts.id;
this.is_editable = opts.is_editable;
- let el = document.getElementById(opts.id);
+ const el = document.getElementById(opts.id);
if (!el) {
console.error("WuiEditor: element ID not found:", opts.id);
return;
@@ -49,7 +47,7 @@ export class WuiEditor {
this.el.classList.add(WUI_EDITOR_CLASS);
- let sel = window.getSelection();
+ const sel = window.getSelection();
if (!sel) {
console.error("WuiEditor: cannot get window selection", opts.id);
return;
@@ -62,35 +60,37 @@ export class WuiEditor {
};
}
- // GetContent return content of file.
- GetContent(): string {
+ // getContent return content of file.
+ getContent(): string {
let content = "";
for (let x = 0; x < this.lines.length; x++) {
if (x > 0) {
content += "\n";
}
- content += this.lines[x].el_text.innerText;
+ content += this.lines[x]!.elText.innerText;
}
return content;
}
- GetSelectionRange(): WuiEditorSelectionRangeInterface {
+ getSelectionRange(): RangeInterface {
return {
begin_at: this.range_begin,
end_at: this.range_end,
- } as WuiEditorSelectionRangeInterface;
+ } as RangeInterface;
}
- OnClickText(text: HTMLElement) {
- let sel = window.getSelection();
+ onClickText() {
+ const sel = window.getSelection();
if (sel) {
this.sel = sel;
}
}
- OnKeyup(x: number, text: HTMLElement, ev: KeyboardEvent) {
- let text_before: string;
- let text_after: string;
+ onKeyup(x: number, ev: KeyboardEvent) {
+ let elTextCurr: HTMLElement;
+ let elTextPrev: HTMLElement;
+ let textBefore: string;
+ let textAfter: string;
let off: number;
switch (ev.key) {
@@ -116,32 +116,31 @@ export class WuiEditor {
case "Backspace":
ev.preventDefault();
- text_before = this.raw_lines[x];
- let el_text_curr = this.lines[x].el_text;
- text_after = el_text_curr.innerText;
+ textBefore = this.raw_lines[x]!;
+ elTextCurr = this.lines[x]!.elText;
+ textAfter = elTextCurr.innerText;
off = this.sel.focusOffset;
if (off > 0) {
- this.unre.DoUpdate(x, text_before, text_after);
+ this.unre.doUpdate(x, textBefore, textAfter);
- this.raw_lines[x] = text_after;
- this.setCaret(el_text_curr, off);
+ this.raw_lines[x] = textAfter;
+ this.setCaret(elTextCurr, off);
return false;
}
// Join current line with previous.
- let el_text_prev = this.lines[x - 1].el_text;
+ elTextPrev = this.lines[x - 1]!.elText;
- this.unre.DoJoin(x - 1, el_text_prev.innerText, el_text_curr.innerText);
+ this.unre.doJoin(x - 1, elTextPrev.innerText, elTextCurr.innerText);
- off = el_text_prev.innerText.length;
- el_text_prev.innerText =
- el_text_prev.innerText + el_text_curr.innerText;
- this.raw_lines[x - 1] = el_text_prev.innerText;
+ off = elTextPrev.innerText.length;
+ elTextPrev.innerText = elTextPrev.innerText + elTextCurr.innerText;
+ this.raw_lines[x - 1] = elTextPrev.innerText;
// Remove the current line
this.deleteLine(x);
- this.setCaret(el_text_prev, off);
+ this.setCaret(elTextPrev, off);
return false;
case "Control":
@@ -170,20 +169,24 @@ export class WuiEditor {
if (this.is_key_control) {
break;
}
- this.unre.DoUpdate(
+ this.unre.doUpdate(
x,
- this.raw_lines[x],
- this.lines[x].el_text.innerText,
+ this.raw_lines[x]!,
+ this.lines[x]!.elText.innerText,
);
- this.raw_lines[x] = this.lines[x].el_text.innerText;
+ this.raw_lines[x] = this.lines[x]!.elText.innerText;
}
return true;
}
- OnKeydownOnLine(x: number, el_text: HTMLElement, ev: KeyboardEvent) {
- let text_before: string;
- let text_after: string;
+ onKeydownOnLine(x: number, ev: KeyboardEvent) {
+ let textBefore: string;
+ let textAfter: string;
let off: number;
+ let elText: HTMLElement | undefined;
+ let elTextCurrent: HTMLElement;
+ let text: string;
+ let isJoinLineAfter: boolean;
switch (ev.key) {
case "ArrowUp":
@@ -192,12 +195,12 @@ export class WuiEditor {
}
ev.preventDefault();
- let el_text = this.lines[x - 1].el_text;
- let off = this.sel.focusOffset;
- if (off > el_text.innerText.length) {
- off = el_text.innerText.length;
+ elText = this.lines[x - 1]!.elText;
+ off = this.sel.focusOffset;
+ if (off > elText.innerText.length) {
+ off = elText.innerText.length;
}
- this.setCaret(el_text, off);
+ this.setCaret(elText, off);
if (x == 1) {
this.el.scrollTop = 0;
@@ -212,12 +215,12 @@ export class WuiEditor {
}
ev.preventDefault();
- el_text = this.lines[x + 1].el_text;
+ elText = this.lines[x + 1]!.elText;
off = this.sel.focusOffset;
- if (off > el_text.innerText.length) {
- off = el_text.innerText.length;
+ if (off > elText.innerText.length) {
+ off = elText.innerText.length;
}
- this.setCaret(el_text, off);
+ this.setCaret(elText, off);
x += 2;
if (x * 25 >= this.el.clientHeight + this.el.scrollTop) {
@@ -232,59 +235,60 @@ export class WuiEditor {
case "Delete":
ev.preventDefault();
- let is_join_line_after = false;
- let el_text_current = this.lines[x].el_text;
+ isJoinLineAfter = false;
+ elTextCurrent = this.lines[x]!.elText;
off = this.sel.focusOffset;
- text_before = el_text_current.innerText;
- text_after = "";
+ textBefore = elTextCurrent.innerText;
+ textAfter = "";
- if (text_before.length === 0 || off === text_before.length) {
+ if (textBefore.length === 0 || off === textBefore.length) {
// Current line is empty, join the next line to current
// line; or
// Current offset is at the end of text, join the next
// line to current line.
- is_join_line_after = true;
+ isJoinLineAfter = true;
}
- if (is_join_line_after) {
+ if (isJoinLineAfter) {
if (x + 1 < this.lines.length) {
- let el_text_after = this.lines[x + 1].el_text;
- text_after = el_text_after.innerText;
- el_text_after.innerText = "";
+ const elTextAfter = this.lines[x + 1]!.elText;
+ textAfter = elTextAfter.innerText;
+ elTextAfter.innerText = "";
- this.unre.DoJoin(x, text_before, text_after);
+ this.unre.doJoin(x, textBefore, textAfter);
this.deleteLine(x + 1);
- text_after = text_before + text_after;
+ textAfter = textBefore + textAfter;
}
} else {
- text_after =
- text_before.slice(0, off) +
- text_before.slice(off + 1, text_before.length);
+ textAfter =
+ textBefore.slice(0, off) +
+ textBefore.slice(off + 1, textBefore.length);
- this.unre.DoUpdate(x, text_before, text_after);
+ this.unre.doUpdate(x, textBefore, textAfter);
}
- this.lines[x].el_text.innerText = text_after;
- this.raw_lines[x] = text_after;
- this.setCaret(el_text_current, off);
+ this.lines[x]!.elText.innerText = textAfter;
+ this.raw_lines[x] = textAfter;
+ this.setCaret(elTextCurrent, off);
break;
case "Enter":
ev.preventDefault();
+ elText = this.lines[x]!.elText;
off = this.sel.focusOffset;
- let text = this.lines[x].el_text.innerText;
- text_before = text.slice(0, off);
- text_after = text.slice(off, text.length);
+ text = elText.innerText;
+ textBefore = text.slice(0, off);
+ textAfter = text.slice(off, text.length);
- this.unre.DoSplit(x, text_before, text_after);
+ this.unre.doSplit(x, textBefore, textAfter);
- this.lines[x].el_text.innerText = text_before;
- this.raw_lines[x] = text_before;
+ elText.innerText = textBefore;
+ this.raw_lines[x] = textBefore;
- this.insertNewline(x + 1, text_after);
+ this.insertNewline(x + 1, textAfter);
if (x + 3 >= this.raw_lines.length) {
this.el.scrollTop = this.el.scrollHeight;
}
@@ -293,19 +297,23 @@ export class WuiEditor {
case "Tab":
ev.preventDefault();
- el_text = this.lines[x].el_text;
+ elText = this.lines[x]?.elText;
+ if (!elText) {
+ break;
+ }
+
off = this.sel.focusOffset;
- text_before = el_text.innerText;
- text_after =
- text_before.slice(0, off) +
+ textBefore = elText.innerText;
+ textAfter =
+ textBefore.slice(0, off) +
"\t" +
- text_before.slice(off, text_before.length);
+ textBefore.slice(off, textBefore.length);
- this.unre.DoUpdate(x, text_before, text_after);
- el_text.innerText = text_after;
- this.raw_lines[x] = text_after;
+ this.unre.doUpdate(x, textBefore, textAfter);
+ elText.innerText = textAfter;
+ this.raw_lines[x] = textAfter;
- this.setCaret(el_text, off + 1);
+ this.setCaret(elText, off + 1);
break;
case "r":
@@ -320,8 +328,8 @@ export class WuiEditor {
if (this.is_key_control) {
ev.preventDefault();
ev.stopPropagation();
- if (this.opts.OnSave) {
- this.opts.OnSave(this.GetContent());
+ if (this.opts.onSave) {
+ this.opts.onSave(this.getContent());
}
return false;
}
@@ -335,82 +343,80 @@ export class WuiEditor {
}
break;
}
+ return true;
}
- OnMouseDownAtLine(x: number) {
+ onMouseDownAtLine(x: number) {
this.range_begin = x;
}
- OnMouseUpAtLine(x: number) {
+ onMouseUpAtLine(x: number) {
this.range_end = x;
if (this.range_end < this.range_begin) {
return;
}
let y = 0;
for (; y < this.range_begin; y++) {
- this.el.children[y].setAttribute("style", "");
+ this.el.children[y]?.setAttribute("style", "");
}
for (; y <= this.range_end; y++) {
- this.el.children[y].setAttribute("style", "background-color:lightsalmon");
+ this.el.children[y]?.setAttribute(
+ "style",
+ "background-color:lightsalmon",
+ );
}
for (; y < this.el.children.length; y++) {
- this.el.children[y].setAttribute("style", "");
+ this.el.children[y]?.setAttribute("style", "");
}
- if (this.opts.OnSelection) {
- this.opts.OnSelection(this.range_begin, this.range_end);
+ if (this.opts.onSelection) {
+ this.opts.onSelection(this.range_begin, this.range_end);
}
}
- //
- // SetEditOff make the content not editable.
- //
- SetEditOff() {
- for (let x = 0; x < this.lines.length; x++) {
- this.lines[x].SetEditOff();
- }
+ // setEditOff make the content not editable.
+ setEditOff() {
+ this.lines.forEach((line) => {
+ line.setEditOff();
+ });
}
- //
- // SetEditOn make the content to be editable.
- //
- SetEditOn() {
- for (let x = 0; x < this.lines.length; x++) {
- this.lines[x].SetEditOn();
- }
+ // setEditOn make the content to be editable.
+ setEditOn() {
+ this.lines.forEach((line) => {
+ line.setEditOn();
+ });
}
- // Open the node for editing.
+ // open the node for editing.
// The content MUST be encoded in base64.
- Open(node: WuiVfsNodeInterface): void {
- this.active_file = node;
-
+ open(node: WuiVfsNodeInterface): void {
let content = atob(node.content);
content = content.replace("\r\n", "\n");
this.raw_lines = content.split("\n");
this.lines = [];
- for (let x = 0; x < this.raw_lines.length; x++) {
- let line = new WuiEditorLine(x, this.raw_lines[x], this);
+ this.raw_lines.forEach((rawLine, x) => {
+ const line = new WuiEditorLine(x, rawLine, this);
this.lines.push(line);
- }
+ });
this.render();
}
- // ClearSelection clear selection range indicator.
- ClearSelection() {
+ // clearSelection clear selection range indicator.
+ clearSelection() {
if (this.range_begin < 0 || this.range_end == 0) {
return;
}
for (let x = this.range_begin; x <= this.range_end; x++) {
- this.el.children[x].setAttribute("style", "");
+ this.el.children[x]?.setAttribute("style", "");
}
this.range_begin = -1;
this.range_end = -1;
}
private initStyle() {
- let style = document.createElement("style");
+ const style = document.createElement("style");
style.type = "text/css";
style.innerText = `
[contenteditable] {
@@ -452,24 +458,36 @@ export class WuiEditor {
document.head.appendChild(style);
}
- private doJoin(changes: WuiEditorActionChangesInterface) {
- this.lines[changes.curr_line].el_text.innerText = changes.curr_text;
- this.deleteLine(changes.next_line);
- this.setCaret(this.lines[changes.curr_line].el_text, 0);
+ private doJoin(changes: ChangesInterface) {
+ const line = this.lines[changes.currLine];
+ if (!line) {
+ return;
+ }
+ line.elText.innerText = changes.currText;
+ this.deleteLine(changes.nextLine);
+ this.setCaret(line.elText, 0);
}
- private doSplit(changes: WuiEditorActionChangesInterface) {
- this.lines[changes.curr_line].el_text.innerText = changes.curr_text;
- this.insertNewline(changes.next_line, changes.next_text);
+ private doSplit(changes: ChangesInterface) {
+ const line = this.lines[changes.currLine];
+ if (!line) {
+ return;
+ }
+ line.elText.innerText = changes.currText;
+ this.insertNewline(changes.nextLine, changes.nextText);
}
- private doUpdate(changes: WuiEditorActionChangesInterface) {
- this.lines[changes.curr_line].el_text.innerText = changes.curr_text;
- this.setCaret(this.lines[changes.curr_line].el_text, 0);
+ private doUpdate(changes: ChangesInterface) {
+ const line = this.lines[changes.currLine];
+ if (!line) {
+ return;
+ }
+ line.elText.innerText = changes.currText;
+ this.setCaret(line.elText, 0);
}
private doRedo() {
- const act = this.unre.Redo();
+ const act = this.unre.redo();
if (!act) {
return;
}
@@ -487,7 +505,7 @@ export class WuiEditor {
}
private doUndo() {
- const act = this.unre.Undo();
+ const act = this.unre.undo();
if (!act) {
return;
}
@@ -510,29 +528,29 @@ export class WuiEditor {
// Reset the line numbers.
for (; x < this.lines.length; x++) {
- this.lines[x].SetNumber(x);
+ this.lines[x]?.setNumber(x);
}
this.render();
}
private insertNewline(x: number, text: string) {
- let newline = new WuiEditorLine(x, text, this);
+ const newline = new WuiEditorLine(x, text, this);
for (let y = x; y < this.lines.length; y++) {
- this.lines[y].SetNumber(y + 1);
+ this.lines[y]?.setNumber(y + 1);
}
this.lines.splice(x, 0, newline);
this.raw_lines.splice(x, 0, text);
this.render();
- this.setCaret(newline.el_text, 0);
+ this.setCaret(newline.elText, 0);
}
private onKeyupDocument(ed: WuiEditor, ev: KeyboardEvent) {
switch (ev.key) {
case "Escape":
ev.preventDefault();
- ed.ClearSelection();
+ ed.clearSelection();
break;
}
return true;
@@ -545,11 +563,11 @@ export class WuiEditor {
}
}
- private setCaret(el_text: HTMLElement, off: number) {
- if (el_text.firstChild) {
- this.range.setStart(el_text.firstChild, off);
+ private setCaret(elText: HTMLElement, off: number) {
+ if (elText.firstChild) {
+ this.range.setStart(elText.firstChild, off);
} else {
- this.range.setStart(el_text, off);
+ this.range.setStart(elText, off);
}
this.range.collapse(true);
this.sel.removeAllRanges();
@@ -558,48 +576,48 @@ export class WuiEditor {
}
class WuiEditorLine {
- private line_num: number = 0;
+ private lineNum: number = 0;
el!: HTMLElement;
el_number!: HTMLElement;
- el_text!: HTMLElement;
+ elText!: HTMLElement;
constructor(
public x: number,
public text: string,
ed: WuiEditor,
) {
- this.line_num = x;
+ this.lineNum = x;
this.el = document.createElement("div");
this.el.classList.add(WUI_EDITOR_CLASS_LINE);
this.el_number = document.createElement("span");
this.el_number.classList.add(WUI_EDITOR_CLASS_LINE_NUMBER);
- this.el_number.innerText = this.line_num + 1 + "";
+ this.el_number.innerText = this.lineNum + 1 + "";
- this.el_number.onmousedown = (ev: MouseEvent) => {
- ed.OnMouseDownAtLine(this.line_num);
+ this.el_number.onmousedown = () => {
+ ed.onMouseDownAtLine(this.lineNum);
};
- this.el_number.onmouseup = (ev: MouseEvent) => {
- ed.OnMouseUpAtLine(this.line_num);
+ this.el_number.onmouseup = () => {
+ ed.onMouseUpAtLine(this.lineNum);
};
- this.el_text = document.createElement("span");
- this.el_text.classList.add(WUI_EDITOR_CLASS_LINE_TEXT);
- this.el_text.innerText = text;
- this.el_text.contentEditable = "true";
+ this.elText = document.createElement("span");
+ this.elText.classList.add(WUI_EDITOR_CLASS_LINE_TEXT);
+ this.elText.innerText = text;
+ this.elText.contentEditable = "true";
- this.el_text.onclick = (ev: MouseEvent) => {
- ed.OnClickText(this.el_text);
+ this.elText.onclick = () => {
+ ed.onClickText();
};
- this.el_text.onkeydown = (ev: KeyboardEvent) => {
- return ed.OnKeydownOnLine(this.line_num, this.el_text, ev);
+ this.elText.onkeydown = (ev: KeyboardEvent) => {
+ return ed.onKeydownOnLine(this.lineNum, ev);
};
- this.el_text.onkeyup = (ev: KeyboardEvent) => {
- return ed.OnKeyup(this.line_num, this.el_text, ev);
+ this.elText.onkeyup = (ev: KeyboardEvent) => {
+ return ed.onKeyup(this.lineNum, ev);
};
- this.el_text.addEventListener("paste", (ev: ClipboardEvent) => {
+ this.elText.addEventListener("paste", (ev: ClipboardEvent) => {
if (!ev.clipboardData) {
return;
}
@@ -609,20 +627,20 @@ class WuiEditorLine {
});
this.el.appendChild(this.el_number);
- this.el.appendChild(this.el_text);
+ this.el.appendChild(this.elText);
}
- SetNumber(x: number) {
- this.line_num = x;
+ setNumber(x: number) {
+ this.lineNum = x;
this.el_number.innerText = x + 1 + "";
}
- SetEditOn() {
- this.el_text.contentEditable = "true";
+ setEditOn() {
+ this.elText.contentEditable = "true";
}
- SetEditOff() {
- this.el_text.contentEditable = "false";
+ setEditOff() {
+ this.elText.contentEditable = "false";
}
}
@@ -631,23 +649,22 @@ class WuiEditorLine {
//
class WuiEditorUndoRedo {
private idx: number = 0;
- private actions: WuiEditorActionInterface[] = [];
+ private actions: ActionInterface[] = [];
- DoJoin(prevLine: number, prevText: string, curr_text: string) {
- let curr_line = prevLine + 1;
- let action: WuiEditorActionInterface = {
+ doJoin(prevLine: number, prevText: string, currText: string) {
+ const action: ActionInterface = {
kind: "join",
before: {
- curr_line: prevLine,
- curr_text: prevText,
- next_line: prevLine + 1,
- next_text: curr_text,
+ currLine: prevLine,
+ currText: prevText,
+ nextLine: prevLine + 1,
+ nextText: currText,
},
after: {
- curr_line: prevLine,
- curr_text: prevText + curr_text,
- next_line: prevLine + 1,
- next_text: "",
+ currLine: prevLine,
+ currText: prevText + currText,
+ nextLine: prevLine + 1,
+ nextText: "",
},
};
if (this.actions.length > 0) {
@@ -657,20 +674,20 @@ class WuiEditorUndoRedo {
this.idx++;
}
- DoSplit(curr_line: number, curr_text: string, next_text: string) {
- let action = {
+ doSplit(currLine: number, currText: string, nextText: string) {
+ const action = {
kind: "split",
before: {
- curr_line: curr_line,
- curr_text: curr_text + next_text,
- next_line: curr_line + 1,
- next_text: "",
+ currLine: currLine,
+ currText: currText + nextText,
+ nextLine: currLine + 1,
+ nextText: "",
},
after: {
- curr_line: curr_line,
- curr_text: curr_text,
- next_line: curr_line + 1,
- next_text: next_text,
+ currLine: currLine,
+ currText: currText,
+ nextLine: currLine + 1,
+ nextText: nextText,
},
};
if (this.actions.length > 0) {
@@ -680,20 +697,20 @@ class WuiEditorUndoRedo {
this.idx++;
}
- DoUpdate(line_num: number, text_before: string, text_after: string) {
- const action: WuiEditorActionInterface = {
+ doUpdate(lineNum: number, textBefore: string, textAfter: string) {
+ const action: ActionInterface = {
kind: "update",
before: {
- curr_line: line_num,
- curr_text: text_before,
- next_line: 0,
- next_text: "",
+ currLine: lineNum,
+ currText: textBefore,
+ nextLine: 0,
+ nextText: "",
},
after: {
- curr_line: line_num,
- curr_text: text_after,
- next_line: 0,
- next_text: "",
+ currLine: lineNum,
+ currText: textAfter,
+ nextLine: 0,
+ nextText: "",
},
};
@@ -704,19 +721,26 @@ class WuiEditorUndoRedo {
this.idx++;
}
- Undo(): WuiEditorActionInterface | null {
+ undo(): ActionInterface | null {
if (this.idx == 0) {
return null;
}
this.idx--;
- return this.actions[this.idx];
+ const action = this.actions[this.idx];
+ if (!action) {
+ return null;
+ }
+ return action;
}
- Redo(): WuiEditorActionInterface | null {
+ redo(): ActionInterface | null {
if (this.idx == this.actions.length) {
return null;
}
- let action = this.actions[this.idx];
+ const action = this.actions[this.idx];
+ if (!action) {
+ return null;
+ }
this.idx++;
return action;
}
@@ -728,20 +752,20 @@ class WuiEditorUndoRedo {
// * split: split line using enter
// * join: join line using backspace.
//
-interface WuiEditorActionInterface {
+interface ActionInterface {
kind: string;
- before: WuiEditorActionChangesInterface;
- after: WuiEditorActionChangesInterface;
+ before: ChangesInterface;
+ after: ChangesInterface;
}
-interface WuiEditorActionChangesInterface {
- curr_line: number;
- curr_text: string;
- next_line: number;
- next_text: string;
+interface ChangesInterface {
+ currLine: number;
+ currText: string;
+ nextLine: number;
+ nextText: string;
}
-interface WuiEditorSelectionRangeInterface {
+interface RangeInterface {
begin_at: number;
end_at: number;
}
diff --git a/editor/example.ts b/editor/example.ts
index 19bc0b9..a967045 100644
--- a/editor/example.ts
+++ b/editor/example.ts
@@ -1,10 +1,10 @@
// SPDX-FileCopyrightText: 2019 M. Shulhan <ms@kilabit.info>
// SPDX-License-Identifier: GPL-3.0-or-later
-import { WuiEditor, WuiEditorOptions } from "./editor.js";
+import { WuiEditor } from "./editor.js";
import { WuiVfsNodeInterface } from "../vfs/vfs.js";
-let nodeFile: WuiVfsNodeInterface = {
+const nodeFile: WuiVfsNodeInterface = {
name: "Test",
path: "/test",
is_dir: false,
@@ -46,15 +46,15 @@ sudo systemctl status telegraf
`),
};
-let opts = {
+const opts = {
id: "editor",
is_editable: true,
- OnSelection: (begin: number, end: number) => {
+ onSelection: (begin: number, end: number) => {
console.log("OnSelection: ", begin, end);
},
- OnSave: (content: string) => {
+ onSave: (content: string) => {
console.log("OnSave: ", content);
},
};
-let wuiEditor = new WuiEditor(opts);
-wuiEditor.Open(nodeFile);
+const wuiEditor = new WuiEditor(opts);
+wuiEditor.open(nodeFile);
diff --git a/input/checkboxes.d.ts b/input/checkboxes.d.ts
index dde0476..e0cced0 100644
--- a/input/checkboxes.d.ts
+++ b/input/checkboxes.d.ts
@@ -1,33 +1,33 @@
import { WuiInputOption } from "./option.js";
export interface WuiKeyValue {
- [key: string]: string;
+ [key: string]: string;
}
export interface WuiKeySelectOption {
- [key: string]: WuiInputOption;
+ [key: string]: WuiInputOption;
}
export interface WuiInputCheckboxesOpts {
- label: string;
- name: string;
- options: WuiKeySelectOption;
- id?: string;
- hint?: string;
- is_disabled?: boolean;
- is_hint_toggled?: boolean;
- onChangeHandler?: (values: string[]) => void;
+ label: string;
+ name: string;
+ options: WuiKeySelectOption;
+ id?: string;
+ hint?: string;
+ is_disabled?: boolean;
+ is_hint_toggled?: boolean;
+ onChangeHandler?: (values: string[]) => void;
}
export declare class WuiInputCheckboxes {
- opts: WuiInputCheckboxesOpts;
- el: HTMLElement;
- private el_label;
- private el_fieldset;
- private el_hint;
- private el_hint_toggler;
- private values;
- constructor(opts: WuiInputCheckboxesOpts);
- private generateLabel;
- private generateInput;
- private generateHintToggler;
- private generateHint;
- private onClickHintToggler;
- private onClickCheckbox;
+ opts: WuiInputCheckboxesOpts;
+ el: HTMLElement;
+ private el_label;
+ private el_fieldset;
+ private el_hint;
+ private el_hint_toggler;
+ private values;
+ constructor(opts: WuiInputCheckboxesOpts);
+ private generateLabel;
+ private generateInput;
+ private generateHintToggler;
+ private generateHint;
+ private onClickHintToggler;
+ private onClickCheckbox;
}
diff --git a/input/checkboxes.ts b/input/checkboxes.ts
index 72d3da8..7226a7d 100644
--- a/input/checkboxes.ts
+++ b/input/checkboxes.ts
@@ -59,7 +59,7 @@ const WUI_INPUT_CHECKBOXES_CLASS_LABEL = "wui_input_checkboxes_label";
//
export class WuiInputCheckboxes {
el: HTMLElement;
- private el_label!: HTMLElement;
+ private elLabel!: HTMLElement;
private el_fieldset!: HTMLFieldSetElement;
private el_hint!: HTMLElement;
private el_hint_toggler!: HTMLElement;
@@ -85,41 +85,39 @@ export class WuiInputCheckboxes {
}
private generateLabel(wrapper: HTMLElement) {
- this.el_label = document.createElement("label");
- this.el_label.classList.add(WUI_INPUT_CHECKBOXES_CLASS_LABEL);
- this.el_label.innerHTML = `${this.opts.label} `;
- wrapper.appendChild(this.el_label);
+ this.elLabel = document.createElement("label");
+ this.elLabel.classList.add(WUI_INPUT_CHECKBOXES_CLASS_LABEL);
+ this.elLabel.innerHTML = `${this.opts.label} `;
+ wrapper.appendChild(this.elLabel);
}
private generateInput(wrapper: HTMLElement) {
this.el_fieldset = document.createElement("fieldset");
this.el_fieldset.classList.add(WUI_INPUT_CHECKBOXES_CLASS_INPUT);
- for (let key in this.opts.options) {
- let option = this.opts.options[key];
- let value = option.value;
+ Object.entries(this.opts.options).forEach(([key, option]) => {
+ const value = option.value;
+ const wrapper = document.createElement("div");
- let wrapper = document.createElement("div");
-
- let el_cb = document.createElement("input");
- el_cb.type = "checkbox";
- el_cb.name = this.opts.name;
- el_cb.value = option.value;
+ const elCb = document.createElement("input");
+ elCb.type = "checkbox";
+ elCb.name = this.opts.name;
+ elCb.value = option.value;
if (option.selected) {
- el_cb.checked = true;
+ elCb.checked = true;
this.values.push(value);
}
- el_cb.onclick = () => {
- this.onClickCheckbox(el_cb.value, el_cb.checked);
+ elCb.onclick = () => {
+ this.onClickCheckbox(elCb.value, elCb.checked);
};
- wrapper.appendChild(el_cb);
+ wrapper.appendChild(elCb);
- let el_label = document.createElement("label");
- el_label.innerHTML = key;
- wrapper.appendChild(el_label);
+ const elLabel = document.createElement("label");
+ elLabel.innerHTML = key;
+ wrapper.appendChild(elLabel);
this.el_fieldset.appendChild(wrapper);
- }
+ });
if (this.opts.is_disabled) {
this.el_fieldset.disabled = true;
diff --git a/input/example.ts b/input/example.ts
index 660ea20..2fbd5ad 100644
--- a/input/example.ts
+++ b/input/example.ts
@@ -7,13 +7,13 @@ import { WuiInputSelect, WuiInputSelectOpts } from "./select.js";
import { WuiInputCheckboxes, WuiInputCheckboxesOpts } from "./checkboxes.js";
function exampleInputString() {
- let el_example = document.createElement("div");
+ const elExample = document.createElement("div");
- let el_title = document.createElement("h3");
- el_title.innerText = "Input string";
- el_example.appendChild(el_title);
+ const elTitle = document.createElement("h3");
+ elTitle.innerText = "Input string";
+ elExample.appendChild(elTitle);
- let el_out = document.createElement("span");
+ const elOut = document.createElement("span");
let opts: WuiInputStringOpts = {
id: "my_input_string",
@@ -21,11 +21,11 @@ function exampleInputString() {
value: "Hello, input string",
hint: "The input ID is 'my_input_string'",
onChangeHandler: (v: string) => {
- el_out.innerText = v;
+ elOut.innerText = v;
},
};
- let el_input_string = new WuiInputString(opts);
- el_example.appendChild(el_input_string.el);
+ let elInputString = new WuiInputString(opts);
+ elExample.appendChild(elInputString.el);
opts = {
label: "Input string disabled",
@@ -34,48 +34,48 @@ function exampleInputString() {
hint: "The input string is disabled",
is_hint_toggled: true,
onChangeHandler: (v: string) => {
- el_out.innerText = v;
+ elOut.innerText = v;
},
};
- el_input_string = new WuiInputString(opts);
- el_example.appendChild(el_input_string.el);
+ elInputString = new WuiInputString(opts);
+ elExample.appendChild(elInputString.el);
opts = {
label: "Input string without hint",
value: "Hello, input string without hint",
onChangeHandler: (v: string) => {
- el_out.innerText = v;
+ elOut.innerText = v;
},
};
- el_input_string = new WuiInputString(opts);
- el_example.appendChild(el_input_string.el);
+ elInputString = new WuiInputString(opts);
+ elExample.appendChild(elInputString.el);
- let el_out_label = document.createElement("div");
- el_out_label.innerText = "Input string changes to ";
- el_out_label.appendChild(el_out);
- el_example.appendChild(el_out_label);
+ const elOutLabel = document.createElement("div");
+ elOutLabel.innerText = "Input string changes to ";
+ elOutLabel.appendChild(elOut);
+ elExample.appendChild(elOutLabel);
- document.body.appendChild(el_example);
+ document.body.appendChild(elExample);
}
function exampleInputNumber() {
- let el_example = document.createElement("div");
+ const elExample = document.createElement("div");
- let el_title = document.createElement("h3");
- el_title.innerText = "Input number";
- el_example.appendChild(el_title);
+ const elTitle = document.createElement("h3");
+ elTitle.innerText = "Input number";
+ elExample.appendChild(elTitle);
- let el_out = document.createElement("span");
+ const elOut = document.createElement("span");
let opts: WuiInputNumberOpts = {
label: "Input number",
value: 1,
onChangeHandler: (val: number) => {
- el_out.innerText = "" + val;
+ elOut.innerText = "" + val;
},
};
- let input_num = new WuiInputNumber(opts);
- el_example.appendChild(input_num.el);
+ let inputNum = new WuiInputNumber(opts);
+ elExample.appendChild(inputNum.el);
opts = {
id: "my_input_number",
@@ -83,11 +83,11 @@ function exampleInputNumber() {
value: 10,
hint: "The ID for this input is 'my_input_number'",
onChangeHandler: (val: number) => {
- el_out.innerText = "" + val;
+ elOut.innerText = "" + val;
},
};
- input_num = new WuiInputNumber(opts);
- el_example.appendChild(input_num.el);
+ inputNum = new WuiInputNumber(opts);
+ elExample.appendChild(inputNum.el);
opts = {
label: "Input number disabled",
@@ -96,22 +96,22 @@ function exampleInputNumber() {
is_disabled: true,
is_hint_toggled: true,
onChangeHandler: (val: number) => {
- el_out.innerText = "" + val;
+ elOut.innerText = "" + val;
},
};
- input_num = new WuiInputNumber(opts);
- el_example.appendChild(input_num.el);
+ inputNum = new WuiInputNumber(opts);
+ elExample.appendChild(inputNum.el);
opts = {
label: "Input number with hint",
value: 10000,
hint: "This is the <b>hint</b>",
onChangeHandler: (val: number) => {
- el_out.innerText = "" + val;
+ elOut.innerText = "" + val;
},
};
- input_num = new WuiInputNumber(opts);
- el_example.appendChild(input_num.el);
+ inputNum = new WuiInputNumber(opts);
+ elExample.appendChild(inputNum.el);
opts = {
label: "Input number with max and min",
@@ -119,31 +119,31 @@ function exampleInputNumber() {
max: 12,
min: -20,
onChangeHandler: (val: number) => {
- el_out.innerText = "" + val;
+ elOut.innerText = "" + val;
},
};
- input_num = new WuiInputNumber(opts);
- el_example.appendChild(input_num.el);
+ inputNum = new WuiInputNumber(opts);
+ elExample.appendChild(inputNum.el);
- let el_out_label = document.createElement("div");
- el_out_label.innerText = "Input number changes to ";
- el_out_label.appendChild(el_out);
- el_example.appendChild(el_out_label);
+ const elOutLabel = document.createElement("div");
+ elOutLabel.innerText = "Input number changes to ";
+ elOutLabel.appendChild(elOut);
+ elExample.appendChild(elOutLabel);
- document.body.appendChild(el_example);
+ document.body.appendChild(elExample);
}
function exampleInputSelect() {
- let el_example = document.createElement("div");
- document.body.appendChild(el_example);
+ const elExample = document.createElement("div");
+ document.body.appendChild(elExample);
- let el_title = document.createElement("h3");
- el_title.innerText = "Input select";
- el_example.appendChild(el_title);
+ const elTitle = document.createElement("h3");
+ elTitle.innerText = "Input select";
+ elExample.appendChild(elTitle);
- let el_log = document.createElement("div");
+ const elLog = document.createElement("div");
- let opts: WuiInputSelectOpts = {
+ const opts: WuiInputSelectOpts = {
name: "my_fruit_price",
label: "Input select",
options: {
@@ -163,23 +163,23 @@ function exampleInputSelect() {
hint: "Select one of the option to see the price.",
is_hint_toggled: true,
onChangeHandler: (key: string, value: string) => {
- el_log.innerText = `The select input changes to '${key}' with price '${value}'`;
+ elLog.innerText = `The select input changes to '${key}' with price '${value}'`;
},
};
- let input = new WuiInputSelect(opts);
- el_example.appendChild(input.el);
- el_example.appendChild(el_log);
+ const input = new WuiInputSelect(opts);
+ elExample.appendChild(input.el);
+ elExample.appendChild(elLog);
}
function exampleInputCheckboxes() {
- let el_example = document.createElement("div");
- document.body.appendChild(el_example);
+ const elExample = document.createElement("div");
+ document.body.appendChild(elExample);
- let el_title = document.createElement("h3");
- el_title.innerText = "Input checkboxes";
- el_example.appendChild(el_title);
+ const elTitle = document.createElement("h3");
+ elTitle.innerText = "Input checkboxes";
+ elExample.appendChild(elTitle);
- let el_log = document.createElement("div");
+ const elLog = document.createElement("div");
let opts: WuiInputCheckboxesOpts = {
name: "my_fruits",
@@ -200,11 +200,11 @@ function exampleInputCheckboxes() {
},
hint: "Select fruits.",
onChangeHandler: (values: string[]) => {
- el_log.innerText = `You are selecting ${values}`;
+ elLog.innerText = `You are selecting ${values}`;
},
};
let input = new WuiInputCheckboxes(opts);
- el_example.appendChild(input.el);
+ elExample.appendChild(input.el);
opts = {
name: "my_fruits",
@@ -227,13 +227,13 @@ function exampleInputCheckboxes() {
is_disabled: true,
is_hint_toggled: true,
onChangeHandler: (values: string[]) => {
- el_log.innerText = `You are selecting ${values}`;
+ elLog.innerText = `You are selecting ${values}`;
},
};
input = new WuiInputCheckboxes(opts);
- el_example.appendChild(input.el);
+ elExample.appendChild(input.el);
- el_example.appendChild(el_log);
+ elExample.appendChild(elLog);
}
exampleInputString();
diff --git a/input/number.d.ts b/input/number.d.ts
index 34b4cf5..885f1cb 100644
--- a/input/number.d.ts
+++ b/input/number.d.ts
@@ -1,30 +1,30 @@
export interface WuiInputNumberOpts {
- label: string | HTMLElement;
- value: number;
- id?: string;
- hint?: string;
- max?: number;
- min?: number;
- class_label?: string;
- class_input?: string;
- is_disabled?: boolean;
- is_hint_toggled?: boolean;
- onChangeHandler: (new_value: number) => void;
+ label: string | HTMLElement;
+ value: number;
+ id?: string;
+ hint?: string;
+ max?: number;
+ min?: number;
+ class_label?: string;
+ class_input?: string;
+ is_disabled?: boolean;
+ is_hint_toggled?: boolean;
+ onChangeHandler: (new_value: number) => void;
}
export declare class WuiInputNumber {
- opts: WuiInputNumberOpts;
- el: HTMLElement;
- private el_label;
- private el_input;
- private el_hint;
- private el_hint_toggler;
- private value;
- constructor(opts: WuiInputNumberOpts);
- private generateLabel;
- private generateInput;
- private generateHintToggler;
- private generateHint;
- private onClickHintToggler;
- private onKeyUp;
- Set(v: number): void;
+ opts: WuiInputNumberOpts;
+ el: HTMLElement;
+ private el_label;
+ private el_input;
+ private el_hint;
+ private el_hint_toggler;
+ private value;
+ constructor(opts: WuiInputNumberOpts);
+ private generateLabel;
+ private generateInput;
+ private generateHintToggler;
+ private generateHint;
+ private onClickHintToggler;
+ private onKeyUp;
+ Set(v: number): void;
}
diff --git a/input/number.ts b/input/number.ts
index 0b59dbe..e5c22a1 100644
--- a/input/number.ts
+++ b/input/number.ts
@@ -67,7 +67,7 @@ export class WuiInputNumber {
this.el.classList.add(WUI_INPUT_NUMBER_CLASS);
this.el.style.padding = "2px";
- let wrapper = document.createElement("div");
+ const wrapper = document.createElement("div");
this.generateLabel(wrapper);
this.generateInput(wrapper);
if (opts.hint) {
@@ -151,7 +151,7 @@ export class WuiInputNumber {
}
private generateHint() {
- let hint = this.opts.hint || "";
+ const hint = this.opts.hint || "";
this.el_hint = document.createElement("div");
this.el_hint.classList.add(WUI_INPUT_NUMBER_CLASS_HINT);
@@ -176,10 +176,10 @@ export class WuiInputNumber {
}
private onKeyUp(ev: KeyboardEvent) {
- let target = ev.target as HTMLInputElement;
+ const target = ev.target as HTMLInputElement;
ev.preventDefault();
- let newValue = +target.value;
+ const newValue = +target.value;
if (newValue === null) {
this.el_input.style.backgroundColor = "lightsalmon";
return false;
diff --git a/input/option.d.ts b/input/option.d.ts
index ac723d2..8077182 100644
--- a/input/option.d.ts
+++ b/input/option.d.ts
@@ -1,4 +1,4 @@
export interface WuiInputOption {
- value: string;
- selected: boolean;
+ value: string;
+ selected: boolean;
}
diff --git a/input/select.d.ts b/input/select.d.ts
index e92d82d..3f39184 100644
--- a/input/select.d.ts
+++ b/input/select.d.ts
@@ -1,37 +1,37 @@
import { WuiInputOption } from "./option.js";
export interface WuiKeyValue {
- [key: string]: string;
+ [key: string]: string;
}
export interface WuiKeySelectOption {
- [key: string]: WuiInputOption;
+ [key: string]: WuiInputOption;
}
export interface WuiInputSelectOpts {
- label: string | HTMLElement;
- name: string;
- options: WuiKeySelectOption;
- id?: string;
- hint?: string;
- class_label?: string;
- class_input?: string;
- is_disabled?: boolean;
- is_hint_toggled?: boolean;
- onChangeHandler?: (key: string, value: string) => void;
+ label: string | HTMLElement;
+ name: string;
+ options: WuiKeySelectOption;
+ id?: string;
+ hint?: string;
+ class_label?: string;
+ class_input?: string;
+ is_disabled?: boolean;
+ is_hint_toggled?: boolean;
+ onChangeHandler?: (key: string, value: string) => void;
}
export declare class WuiInputSelect {
- opts: WuiInputSelectOpts;
- el: HTMLElement;
- private el_label;
- private el_input;
- private el_hint;
- private el_hint_toggler;
- private value_key;
- private value;
- constructor(opts: WuiInputSelectOpts);
- private generateLabel;
- private generateInput;
- private generateHintToggler;
- private generateHint;
- private onClickHintToggler;
- private onClickInput;
- Set(v: string): void;
+ opts: WuiInputSelectOpts;
+ el: HTMLElement;
+ private el_label;
+ private el_input;
+ private el_hint;
+ private el_hint_toggler;
+ private value_key;
+ private value;
+ constructor(opts: WuiInputSelectOpts);
+ private generateLabel;
+ private generateInput;
+ private generateHintToggler;
+ private generateHint;
+ private onClickHintToggler;
+ private onClickInput;
+ Set(v: string): void;
}
diff --git a/input/select.ts b/input/select.ts
index 6bf4810..e874a29 100644
--- a/input/select.ts
+++ b/input/select.ts
@@ -73,7 +73,7 @@ export class WuiInputSelect {
this.el.classList.add(WUI_INPUT_SELECT_CLASS);
this.el.style.padding = "2px";
- let wrapper = document.createElement("div");
+ const wrapper = document.createElement("div");
this.generateLabel(wrapper);
this.generateInput(wrapper);
if (opts.hint) {
@@ -109,21 +109,19 @@ export class WuiInputSelect {
this.el_input.classList.add(this.opts.class_input);
}
- for (let key in this.opts.options) {
- let option = this.opts.options[key];
-
- let el_option = document.createElement("option");
- el_option.value = option.value;
- el_option.innerHTML = key;
+ Object.entries(this.opts.options).forEach(([key, option]) => {
+ const elOption = document.createElement("option");
+ elOption.value = option.value;
+ elOption.innerHTML = key;
if (option.selected) {
- el_option.selected = true;
+ elOption.selected = true;
}
- this.el_input.appendChild(el_option);
+ this.el_input.appendChild(elOption);
this.value_key[option.value] = key;
- }
+ });
if (this.opts.is_disabled) {
this.el_input.disabled = true;
@@ -182,12 +180,15 @@ export class WuiInputSelect {
return false;
}
- let value = this.el_input.value;
- let key = this.value_key[value];
+ const value = this.el_input.value;
if (this.value !== value) {
- this.opts.onChangeHandler(key, value);
- this.value = value;
+ const key = this.value_key[value];
+ if (key) {
+ this.opts.onChangeHandler(key, value);
+ this.value = value;
+ }
}
+ return true;
}
// Set the input value.
diff --git a/input/string.d.ts b/input/string.d.ts
index 747c4c6..e1b73ff 100644
--- a/input/string.d.ts
+++ b/input/string.d.ts
@@ -1,27 +1,27 @@
export interface WuiInputStringOpts {
- label: string | HTMLElement;
- value: string;
- id?: string;
- hint?: string;
- class_label?: string;
- class_input?: string;
- is_disabled?: boolean;
- is_hint_toggled?: boolean;
- onChangeHandler?: (new_value: string) => void;
+ label: string | HTMLElement;
+ value: string;
+ id?: string;
+ hint?: string;
+ class_label?: string;
+ class_input?: string;
+ is_disabled?: boolean;
+ is_hint_toggled?: boolean;
+ onChangeHandler?: (new_value: string) => void;
}
export declare class WuiInputString {
- opts: WuiInputStringOpts;
- el: HTMLElement;
- private el_label;
- private el_input;
- private el_hint;
- private el_hint_toggler;
- private value;
- constructor(opts: WuiInputStringOpts);
- private generateLabel;
- private generateInput;
- private generateHintToggler;
- private generateHint;
- private onClickHintToggler;
- Set(v: string): void;
+ opts: WuiInputStringOpts;
+ el: HTMLElement;
+ private el_label;
+ private el_input;
+ private el_hint;
+ private el_hint_toggler;
+ private value;
+ constructor(opts: WuiInputStringOpts);
+ private generateLabel;
+ private generateInput;
+ private generateHintToggler;
+ private generateHint;
+ private onClickHintToggler;
+ Set(v: string): void;
}
diff --git a/input/string.ts b/input/string.ts
index d428c32..f37a68f 100644
--- a/input/string.ts
+++ b/input/string.ts
@@ -62,7 +62,7 @@ export class WuiInputString {
this.el.classList.add(WUI_INPUT_STRING_CLASS);
this.el.style.padding = "2px";
- let wrapper = document.createElement("div");
+ const wrapper = document.createElement("div");
this.generateLabel(wrapper);
this.generateInput(wrapper);
if (opts.hint) {
@@ -104,7 +104,7 @@ export class WuiInputString {
}
if (this.opts.onChangeHandler) {
- this.el_input.onkeyup = (ev: Event) => {
+ this.el_input.onkeyup = () => {
if (this.opts.onChangeHandler) {
if (this.value !== this.el_input.value) {
this.opts.onChangeHandler(this.el_input.value);
diff --git a/notif/example.ts b/notif/example.ts
index a15f986..b2ff5d7 100644
--- a/notif/example.ts
+++ b/notif/example.ts
@@ -18,42 +18,42 @@ function main() {
inputMsg.value = `Hello world, this is a notification with HTML format using <b>bold</b> and <u>underline</u> words.`;
document.body.appendChild(inputMsg);
- let el_wrapper = document.createElement("div");
- el_wrapper.style.marginTop = "10px";
- document.body.appendChild(el_wrapper);
+ const elWrapper = document.createElement("div");
+ elWrapper.style.marginTop = "10px";
+ document.body.appendChild(elWrapper);
- let el_button_info = document.createElement("button");
- el_button_info.innerText = "Info";
- el_button_info.style.marginRight = "10px";
- el_button_info.onclick = notifInfo;
- el_wrapper.appendChild(el_button_info);
+ const elButtonInfo = document.createElement("button");
+ elButtonInfo.innerText = "Info";
+ elButtonInfo.style.marginRight = "10px";
+ elButtonInfo.onclick = notifInfo;
+ elWrapper.appendChild(elButtonInfo);
- let el_button_error = document.createElement("button");
- el_button_error.innerText = "Error";
- el_button_error.onclick = notifError;
- el_wrapper.appendChild(el_button_error);
+ const elButtonError = document.createElement("button");
+ elButtonError.innerText = "Error";
+ elButtonError.onclick = notifError;
+ elWrapper.appendChild(elButtonError);
document.body.appendChild(document.createElement("p"));
- let previewError = document.createElement("div");
+ const previewError = document.createElement("div");
previewError.classList.add(`${WUI_NOTIF_CLASS_ERROR}`);
previewError.innerText = `Preview of error style`;
document.body.appendChild(previewError);
- let previewInfo = document.createElement("div");
+ const previewInfo = document.createElement("div");
previewInfo.classList.add(`${WUI_NOTIF_CLASS_INFO}`);
previewInfo.innerText = `Preview of info style`;
document.body.appendChild(previewInfo);
}
function notifInfo() {
- wuiNotif.Info(inputMsg.value);
+ wuiNotif.info(inputMsg.value);
}
function notifError() {
- wuiNotif.Error(inputMsg.value);
+ wuiNotif.error(inputMsg.value);
}
-//----
+// ----
main();
diff --git a/notif/notif.d.ts b/notif/notif.d.ts
index ae2c331..0f90919 100644
--- a/notif/notif.d.ts
+++ b/notif/notif.d.ts
@@ -2,10 +2,10 @@ export declare const WUI_NOTIF_ID = "wui_notif";
export declare const WUI_NOTIF_CLASS_INFO = "wui_notif_info";
export declare const WUI_NOTIF_CLASS_ERROR = "wui_notif_error";
export declare class WuiNotif {
- private el;
- private timeout;
- constructor();
- Info(msg: string): void;
- Error(msg: string): void;
- private initStyle;
+ private el;
+ private timeout;
+ constructor();
+ Info(msg: string): void;
+ Error(msg: string): void;
+ private initStyle;
}
diff --git a/notif/notif.ts b/notif/notif.ts
index 8bc5d84..23933ab 100644
--- a/notif/notif.ts
+++ b/notif/notif.ts
@@ -6,7 +6,7 @@ export const WUI_NOTIF_CLASS_INFO = "wui_notif_info";
export const WUI_NOTIF_CLASS_ERROR = "wui_notif_error";
// WuiNotif implement the HTML interface to display pop-up notification.
-// The notification can be triggered by calling method Info() or Error().
+// The notification can be triggered by calling method info() or error().
// Each pop-up has 5 seconds duration, after that they will be removed
// automatically.
export class WuiNotif {
@@ -22,9 +22,9 @@ export class WuiNotif {
this.initStyle();
}
- // Info show the msg as information.
- Info(msg: string) {
- let item = document.createElement("div");
+ // info show the msg as information.
+ info(msg: string) {
+ const item = document.createElement("div");
item.innerHTML = msg;
item.classList.add(WUI_NOTIF_CLASS_INFO);
this.el.appendChild(item);
@@ -34,9 +34,9 @@ export class WuiNotif {
}, this.timeout);
}
- // Info show the msg as an error.
- Error(msg: string) {
- let item = document.createElement("div");
+ // error show the msg as an error.
+ error(msg: string) {
+ const item = document.createElement("div");
item.innerHTML = msg;
item.classList.add(WUI_NOTIF_CLASS_ERROR);
this.el.appendChild(item);
@@ -47,7 +47,7 @@ export class WuiNotif {
}
private initStyle() {
- let style = document.createElement("style");
+ const style = document.createElement("style");
style.type = "text/css";
style.innerText = `
#${WUI_NOTIF_ID} {
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..a6b1453
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2116 @@
+{
+ "name": "wui",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
+ "@typescript-eslint/parser": "^6.8.0",
+ "eslint": "^8.52.0",
+ "eslint-config-google": "^0.14.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-prettier": "^5.0.1",
+ "prettier": "^3.0.3",
+ "typescript": "^5.2.2"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
+ "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+ "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.52.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
+ "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
+ "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
+ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+ "dev": true
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pkgr/utils": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz",
+ "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "fast-glob": "^3.3.0",
+ "is-glob": "^4.0.3",
+ "open": "^9.1.0",
+ "picocolors": "^1.0.0",
+ "tslib": "^2.6.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.14",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz",
+ "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz",
+ "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/type-utils": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz",
+ "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz",
+ "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz",
+ "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz",
+ "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz",
+ "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz",
+ "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz",
+ "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bplist-parser": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
+ "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==",
+ "dev": true,
+ "dependencies": {
+ "big-integer": "^1.6.44"
+ },
+ "engines": {
+ "node": ">= 5.10.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bundle-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz",
+ "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==",
+ "dev": true,
+ "dependencies": {
+ "run-applescript": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "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/default-browser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz",
+ "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==",
+ "dev": true,
+ "dependencies": {
+ "bundle-name": "^3.0.0",
+ "default-browser-id": "^3.0.0",
+ "execa": "^7.1.1",
+ "titleize": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz",
+ "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==",
+ "dev": true,
+ "dependencies": {
+ "bplist-parser": "^0.2.0",
+ "untildify": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.52.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
+ "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.2",
+ "@eslint/js": "8.52.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-google": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz",
+ "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=5.16.0"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
+ "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz",
+ "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.8.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
+ "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.1",
+ "human-signals": "^4.3.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^3.0.7",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "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
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
+ "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
+ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-wsl/node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
+ "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz",
+ "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==",
+ "dev": true,
+ "dependencies": {
+ "default-browser": "^4.0.0",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
+ "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
+ "dev": true,
+ "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,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz",
+ "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/run-applescript/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/run-applescript/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/run-applescript/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/run-applescript/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-applescript/node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/synckit": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
+ "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/utils": "^2.3.1",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "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/titleize": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
+ "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+ "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b14910a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
+ "@typescript-eslint/parser": "^6.8.0",
+ "eslint": "^8.52.0",
+ "eslint-config-google": "^0.14.0",
+ "eslint-config-prettier": "^9.0.0",
+ "eslint-plugin-prettier": "^5.0.1",
+ "prettier": "^3.0.3",
+ "typescript": "^5.2.2"
+ }
+}
diff --git a/response.d.ts b/response.d.ts
index 532028d..84bf392 100644
--- a/response.d.ts
+++ b/response.d.ts
@@ -1,5 +1,5 @@
export interface WuiResponseInterface {
- code: number;
- message: string;
- data?: any;
+ code: number;
+ message: string;
+ data?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
}
diff --git a/response.ts b/response.ts
index f74161a..9991976 100644
--- a/response.ts
+++ b/response.ts
@@ -12,5 +12,5 @@
export interface WuiResponseInterface {
code: number;
message: string;
- data?: any;
+ data?: any; // eslint-disable-line @typescript-eslint/no-explicit-any
}
diff --git a/tsconfig.json b/tsconfig.json
index bcb70d1..707ff90 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,12 +1,23 @@
{
"compilerOptions": {
- "declaration": true,
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
+ "target": "es2018",
+ "module": "es2020",
+ "isolatedModules": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
- "inlineSourceMap": true,
- "lib": ["es2015", "dom", "es2015.promise"],
- "module": "es2015",
"strict": true,
- "target": "es2015"
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "useUnknownInCatchVariables": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "exactOptionalPropertyTypes": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedIndexedAccess": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "skipLibCheck": true,
}
}
diff --git a/vfs/example.ts b/vfs/example.ts
index f2bc91d..6c963d0 100644
--- a/vfs/example.ts
+++ b/vfs/example.ts
@@ -1,14 +1,14 @@
// SPDX-FileCopyrightText: 2021 M. Shulhan <ms@kilabit.info>
// SPDX-License-Identifier: GPL-3.0-or-later
-import { WuiVfs, WuiVfsNodeInterface } from "./vfs.js";
+import { WuiVfs, WuiVfsNodeInterface, WuiVfsOptions } from "./vfs.js";
import { WuiResponseInterface } from "../response.js";
interface PathNodeInterface {
[key: string]: WuiVfsNodeInterface;
}
-let dummyfs: PathNodeInterface = {
+const dummyfs: PathNodeInterface = {
"/": {
name: "/",
path: "/",
@@ -100,27 +100,27 @@ let dummyfs: PathNodeInterface = {
};
async function main() {
- let opts = {
+ const opts: WuiVfsOptions = {
id: "vfs",
- Open: Open,
- OpenNode: OpenNode,
+ open: open,
+ openNode: openNode,
};
- let wui_vfs = new WuiVfs(opts);
- wui_vfs.OpenDir("/");
+ const wuiVFS = new WuiVfs(opts);
+ wuiVFS.openDir("/");
}
-async function Open(
+async function open(
path: string,
- is_dir: boolean,
+ isDir: boolean,
): Promise<WuiResponseInterface> {
- console.log("Open:", path, is_dir);
- let res: WuiResponseInterface = {
+ console.log("Open:", path, isDir);
+ const res: WuiResponseInterface = {
code: 200,
message: "",
};
- if (is_dir) {
+ if (isDir) {
res.data = dummyfs[path];
return res;
}
@@ -158,10 +158,10 @@ async function Open(
return res;
}
-async function OpenNode(
+async function openNode(
node: WuiVfsNodeInterface,
): Promise<WuiResponseInterface> {
- return await Open(node.path, node.is_dir);
+ return await open(node.path, node.is_dir);
}
main();
diff --git a/vfs/vfs.d.ts b/vfs/vfs.d.ts
index 5e89b33..a7d365d 100644
--- a/vfs/vfs.d.ts
+++ b/vfs/vfs.d.ts
@@ -1,27 +1,27 @@
import { WuiResponseInterface } from "../response";
export interface WuiVfsNodeInterface {
- name: string;
- path: string;
- is_dir: boolean;
- content_type?: string;
- mod_time?: number;
- size?: number;
- mode?: string;
- childs?: WuiVfsNodeInterface[];
- content: string;
+ name: string;
+ path: string;
+ is_dir: boolean;
+ content_type?: string;
+ mod_time?: number;
+ size?: number;
+ mode?: string;
+ childs?: WuiVfsNodeInterface[];
+ content: string;
}
export interface WuiVfsOptions {
- id: string;
- Open(path: string, is_dir: boolean): Promise<WuiResponseInterface>;
- OpenNode(node: WuiVfsNodeInterface): Promise<WuiResponseInterface>;
+ id: string;
+ Open(path: string, is_dir: boolean): Promise<WuiResponseInterface>;
+ OpenNode(node: WuiVfsNodeInterface): Promise<WuiResponseInterface>;
}
export declare class WuiVfs {
- opts: WuiVfsOptions;
- private el;
- private com_path;
- private com_list;
- constructor(opts: WuiVfsOptions);
- OpenNode(node: WuiVfsNodeInterface): void;
- OpenDir(path: string): Promise<void>;
- Set(node: WuiVfsNodeInterface): void;
+ opts: WuiVfsOptions;
+ private el;
+ private com_path;
+ private com_list;
+ constructor(opts: WuiVfsOptions);
+ OpenNode(node: WuiVfsNodeInterface): void;
+ OpenDir(path: string): Promise<void>;
+ Set(node: WuiVfsNodeInterface): void;
}
diff --git a/vfs/vfs.ts b/vfs/vfs.ts
index 7c07814..20491e9 100644
--- a/vfs/vfs.ts
+++ b/vfs/vfs.ts
@@ -24,13 +24,13 @@ type NodeClickHandler = (node: WuiVfsNodeInterface) => void;
export interface WuiVfsOptions {
id: string;
- // Open define an handler that will be called when a directory is clicked
+ // open define an handler that will be called when a directory is clicked
// from the WuiVfsPath.
- Open(path: string, is_dir: boolean): Promise<WuiResponseInterface>;
+ open(path: string, is_dir: boolean): Promise<WuiResponseInterface>;
- // OpenNode define an handler that will be called when a file is clicked
+ // openNode define an handler that will be called when a file is clicked
// from the WuiVfsList.
- OpenNode(node: WuiVfsNodeInterface): Promise<WuiResponseInterface>;
+ openNode(node: WuiVfsNodeInterface): Promise<WuiResponseInterface>;
}
export class WuiVfs {
@@ -41,7 +41,7 @@ export class WuiVfs {
constructor(public opts: WuiVfsOptions) {
this.opts = opts;
- let el = document.getElementById(opts.id);
+ const el = document.getElementById(opts.id);
if (!el) {
console.error("WuiVfs: element id", opts.id, "not found");
return;
@@ -49,40 +49,40 @@ export class WuiVfs {
this.el = el;
this.com_path = new WuiVfsPath((path: string) => {
- this.OpenDir(path);
+ this.openDir(path);
});
this.el.appendChild(this.com_path.el);
this.com_list = new WuiVfsList((node: WuiVfsNodeInterface) => {
- this.OpenNode(node);
+ this.openNode(node);
});
this.el.appendChild(this.com_list.el);
}
- // OpenNode is a handler that will be called when a node is clicked
+ // openNode is a handler that will be called when a node is clicked
// inside the WuiVfsList.
- OpenNode(node: WuiVfsNodeInterface): void {
+ openNode(node: WuiVfsNodeInterface): void {
if (node.is_dir) {
- this.OpenDir(node.path);
+ this.openDir(node.path);
} else {
- this.opts.OpenNode(node);
+ this.opts.openNode(node);
}
}
- // OpenDir is a handler that will be called when a path is clicked
+ // openDir is a handler that will be called when a path is clicked
// inside the WuiVfsPath.
- async OpenDir(path: string): Promise<void> {
- let res = await this.opts.Open(path, true);
+ async openDir(path: string): Promise<void> {
+ const res = await this.opts.open(path, true);
if (res.code != 200) {
return;
}
- this.Set(res.data as WuiVfsNodeInterface);
+ this.set(res.data as WuiVfsNodeInterface);
}
- Set(node: WuiVfsNodeInterface) {
+ set(node: WuiVfsNodeInterface) {
if (node.is_dir) {
- this.com_path.Open(node);
- this.com_list.Open(node);
+ this.com_path.open(node);
+ this.com_list.open(node);
}
}
}
@@ -99,14 +99,14 @@ class WuiVfsList {
this.el.style.borderColor = "silver";
}
- Open(node: WuiVfsNodeInterface) {
+ open(node: WuiVfsNodeInterface) {
this.node = node;
this.el.innerHTML = "";
if (!this.node.childs) {
return;
}
- for (let c of this.node.childs) {
- let el = document.createElement("div");
+ for (const c of this.node.childs) {
+ const el = document.createElement("div");
el.style.padding = "1em";
el.style.cursor = "pointer";
el.innerHTML = c.name;
@@ -115,17 +115,17 @@ class WuiVfsList {
el.style.backgroundColor = "cornsilk";
}
- el.onclick = (ev: MouseEvent) => {
+ el.onclick = () => {
this.onClick(c);
};
- el.onmouseout = (event) => {
+ el.onmouseout = () => {
if (c.is_dir) {
el.style.backgroundColor = "cornsilk";
} else {
el.style.backgroundColor = "white";
}
};
- el.onmouseover = (event) => {
+ el.onmouseover = () => {
el.style.backgroundColor = "aliceblue";
};
@@ -136,7 +136,6 @@ class WuiVfsList {
class WuiVfsPath {
el: HTMLElement;
- private crumbs: string[];
private onClick: PathClickHandler;
constructor(onClick: PathClickHandler) {
@@ -146,14 +145,12 @@ class WuiVfsPath {
this.el.style.borderWidth = "1px";
this.el.style.borderStyle = "solid";
this.el.style.borderColor = "silver";
- this.crumbs = [];
this.onClick = onClick;
}
- Open(node: WuiVfsNodeInterface) {
+ open(node: WuiVfsNodeInterface) {
this.el.innerHTML = "";
- this.crumbs = [];
- let paths = [];
+ let paths: string[] = [];
if (node.path == "/") {
paths.push(node.path);
@@ -161,35 +158,35 @@ class WuiVfsPath {
paths = node.path.split("/");
}
- for (let x = 0; x < paths.length; x++) {
- let full_path = "";
+ paths.forEach((path, x) => {
+ let fullPath = "";
let p = "";
if (x == 0) {
p = "/";
- full_path = "/";
+ fullPath = "/";
} else {
- p = paths[x];
- full_path = paths.slice(0, x + 1).join("/");
+ p = path;
+ fullPath = paths.slice(0, x + 1).join("/");
}
- let crumb = document.createElement("span");
+ const crumb = document.createElement("span");
crumb.style.display = "inline-block";
crumb.style.padding = "1em";
crumb.style.cursor = "pointer";
crumb.innerHTML = p;
- crumb.onclick = (event) => {
- this.onClick(full_path);
+ crumb.onclick = () => {
+ this.onClick(fullPath);
};
- crumb.onmouseout = (event) => {
+ crumb.onmouseout = () => {
crumb.style.backgroundColor = "white";
};
- crumb.onmouseover = (event) => {
+ crumb.onmouseover = () => {
crumb.style.backgroundColor = "aliceblue";
};
this.el.appendChild(crumb);
- }
+ });
}
}
diff --git a/websocket_client.d.ts b/websocket_client.d.ts
index 00eb4c1..189f20d 100644
--- a/websocket_client.d.ts
+++ b/websocket_client.d.ts
@@ -1,44 +1,44 @@
import { WuiResponseInterface } from "./response.js";
interface RequestQueue {
- req: WuiWebSocketRequest;
- cbSuccess: (res: WuiWebSocketResponse) => void;
- cbFail: (err: string) => void;
+ req: WuiWebSocketRequest;
+ cbSuccess: (res: WuiWebSocketResponse) => void;
+ cbFail: (err: string) => void;
}
export interface WuiWebSocketOptions {
- address: string;
- auto_reconnect: boolean;
- auto_reconnect_interval: number;
- onBroadcast: (res: WuiWebSocketResponse) => void;
- onConnected: () => void;
- onDisconnected: () => void;
- onError: () => void;
+ address: string;
+ auto_reconnect: boolean;
+ auto_reconnect_interval: number;
+ onBroadcast: (res: WuiWebSocketResponse) => void;
+ onConnected: () => void;
+ onDisconnected: () => void;
+ onError: () => void;
}
export interface WuiWebSocketRequest {
- id: number;
- method: string;
- target: string;
- body?: string;
+ id: number;
+ method: string;
+ target: string;
+ body?: string;
}
export interface WuiWebSocketResponse {
- id: number;
- code: number;
- message: string;
- body: string;
+ id: number;
+ code: number;
+ message: string;
+ body: string;
}
export declare class WuiWebSocketClient {
- opts: WuiWebSocketOptions;
- address: string;
- conn: WebSocket;
- requestQueue: RequestQueue[];
- reconnect_id: number;
- isOpen: boolean;
- error: string;
- constructor(opts: WuiWebSocketOptions);
- Send(req: WuiWebSocketRequest): Promise<WuiResponseInterface>;
- connect(): void;
- onClose(ev: CloseEvent): void;
- onError(ev: Event): void;
- onMessage(ev: MessageEvent): void;
- onOpen(ev: Event): void;
+ opts: WuiWebSocketOptions;
+ address: string;
+ conn: WebSocket;
+ requestQueue: RequestQueue[];
+ reconnect_id: number;
+ isOpen: boolean;
+ error: string;
+ constructor(opts: WuiWebSocketOptions);
+ Send(req: WuiWebSocketRequest): Promise<WuiResponseInterface>;
+ connect(): void;
+ onClose(ev: CloseEvent): void;
+ onError(ev: Event): void;
+ onMessage(ev: MessageEvent): void;
+ onOpen(ev: Event): void;
}
export {};
diff --git a/websocket_client.ts b/websocket_client.ts
index 7ffdbc0..7e02982 100644
--- a/websocket_client.ts
+++ b/websocket_client.ts
@@ -58,12 +58,12 @@ export class WuiWebSocketClient {
// request-response.
//
async Send(req: WuiWebSocketRequest): Promise<WuiResponseInterface> {
- return new Promise((resolve, reject) => {
- let wuiRes: WuiResponseInterface = {
+ return new Promise((resolve) => {
+ const wuiRes: WuiResponseInterface = {
code: 0,
message: "",
};
- let reqQueue: RequestQueue = {
+ const reqQueue: RequestQueue = {
req: req,
cbSuccess: (res: WuiWebSocketResponse) => {
wuiRes.code = res.code;
@@ -87,26 +87,26 @@ export class WuiWebSocketClient {
connect() {
this.conn = new WebSocket(this.address);
- this.conn.onclose = (ev: CloseEvent) => {
- this.onClose(ev);
+ this.conn.onclose = () => {
+ this.onClose();
};
- this.conn.onerror = (ev: Event) => {
- this.onError(ev);
+ this.conn.onerror = () => {
+ this.onError();
};
this.conn.onmessage = (ev: MessageEvent) => {
this.onMessage(ev);
};
- this.conn.onopen = (ev: Event) => {
- this.onOpen(ev);
+ this.conn.onopen = () => {
+ this.onOpen();
};
}
// onClose handle connection closed by cleaning up the request
// queue.
- onClose(ev: CloseEvent) {
- for (let x = 0; x < this.requestQueue.length; x++) {
- this.requestQueue[x].cbFail("connection closed");
- }
+ onClose() {
+ this.requestQueue.forEach((reqq) => {
+ reqq.cbFail("connection closed");
+ });
this.isOpen = false;
this.error = "connection is closed by server";
@@ -121,30 +121,29 @@ export class WuiWebSocketClient {
}
}
- onError(ev: Event) {
+ onError() {
if (this.opts.onError) {
this.opts.onError();
}
}
onMessage(ev: MessageEvent) {
- let res: WuiWebSocketResponse = JSON.parse(ev.data);
+ const res: WuiWebSocketResponse = JSON.parse(ev.data);
- for (let x = 0; x < this.requestQueue.length; x++) {
- let reqq = this.requestQueue[x];
+ this.requestQueue.forEach((reqq, x) => {
if (reqq.req.id === res.id) {
reqq.cbSuccess(res);
this.requestQueue.splice(x, 1);
return;
}
- }
+ });
if (this.opts.onBroadcast && res.id == 0) {
this.opts.onBroadcast(res);
}
}
- onOpen(ev: Event) {
+ onOpen() {
this.isOpen = true;
this.error = "";