From 3ebc6f485ab6a2c102261bb45450789f21cb0b6e Mon Sep 17 00:00:00 2001 From: Philemon Chiro <49866367+PhilemonChiro@users.noreply.github.com> Date: Fri, 1 May 2026 20:08:14 +0200 Subject: [PATCH] v0.1.2: address Obsidian community-store reviewer bot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps minAppVersion to 1.7.2 (the lowest version where every API the plugin uses is supported — processFrontMatter and revealLeaf were the two that pushed this up). ESLint pass against eslint-plugin-obsidianmd is now clean (0 errors, 0 warnings). Notable changes: - Removes the deprecated MarkdownRenderer.renderMarkdown fallback; always uses MarkdownRenderer.render now (minAppVersion covers it) - Replaces Workspace.activeLeaf reads with Workspace.getActiveViewOfType - Replaces Vault.trash with FileManager.trashFile to respect the user's configured deletion preference - Replaces window.confirm() with a small ConfirmModal so the bulk-delete prompt is consistent with the rest of the UI - Dynamic style assignments now use HTMLElement.setCssStyles rather than el.style.* directly - All static modal styling has been moved out of inline styles into CSS classes (keep-modal-stack, keep-modal-row, keep-modal-buttons, etc.) - Async event handlers that returned Promise where the listener expects void are now sync wrappers that internally void-await - Empty catch blocks now have explanatory comments - Removes 'this' aliasing in openNotePreview (uses arrow function instead) - Drops unused vars and fixes sentence case in setting descriptions Adds eslint.config.mjs with the obsidianmd recommended config so future changes can be lint-checked locally before pushing. --- .gitignore | 1 + eslint.config.mjs | 33 + main.js | 1675 +++++++-------- main.ts | 489 +++-- manifest.json | 4 +- package-lock.json | 5113 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 +- styles.css | 63 + tsconfig.json | 3 +- versions.json | 3 +- 10 files changed, 6255 insertions(+), 1134 deletions(-) create mode 100644 eslint.config.mjs create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index cb62478..06d0344 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules/ data.json .env .env.local +launch/ diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..845c3fb --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,33 @@ +import obsidianmd from 'eslint-plugin-obsidianmd'; +import tsParser from '@typescript-eslint/parser'; + +const plugin = obsidianmd.default || obsidianmd; + +export default [ + ...plugin.configs.recommended, + { + files: ['main.ts'], + languageOptions: { + parser: tsParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: './tsconfig.json', + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + ignores: ['main.js', 'node_modules/**', 'docs/**', 'launch/**'], + }, + { + files: ['main.ts'], + rules: { + '@typescript-eslint/no-unsafe-member-access': 'off', + '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unsafe-assignment': 'off', + '@typescript-eslint/no-unsafe-argument': 'off', + '@typescript-eslint/no-unsafe-return': 'off', + }, + }, +]; diff --git a/main.js b/main.js index 96244d8..983a090 100644 --- a/main.js +++ b/main.js @@ -1,29 +1,57 @@ -'use strict'; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -const obsidian = require('obsidian'); - -// ============================ CONSTANTS ============================ -const VIEW_TYPE_CARDS = 'keep-cards-view'; - -const COLORS = [ - { name: 'Default', value: null }, - { name: 'Coral', value: '#5c2b29' }, - { name: 'Peach', value: '#614a19' }, - { name: 'Sand', value: '#635d19' }, - { name: 'Mint', value: '#345920' }, - { name: 'Sage', value: '#16504b' }, - { name: 'Fog', value: '#2d555e' }, - { name: 'Storm', value: '#1e3a5f' }, - { name: 'Dusk', value: '#42275e' }, - { name: 'Blossom', value: '#5b2245' }, - { name: 'Clay', value: '#442f19' }, - { name: 'Chalk', value: '#3c3f43' }, +// main.ts +var main_exports = {}; +__export(main_exports, { + default: () => main_default +}); +module.exports = __toCommonJS(main_exports); +var obsidian = __toESM(require("obsidian")); +var VIEW_TYPE_CARDS = "keep-cards-view"; +var COLORS = [ + { name: "Default", value: null }, + { name: "Coral", value: "#5c2b29" }, + { name: "Peach", value: "#614a19" }, + { name: "Sand", value: "#635d19" }, + { name: "Mint", value: "#345920" }, + { name: "Sage", value: "#16504b" }, + { name: "Fog", value: "#2d555e" }, + { name: "Storm", value: "#1e3a5f" }, + { name: "Dusk", value: "#42275e" }, + { name: "Blossom", value: "#5b2245" }, + { name: "Clay", value: "#442f19" }, + { name: "Chalk", value: "#3c3f43" } ]; - -const DEFAULT_SETTINGS = { - notesFolder: '', +var DEFAULT_SETTINGS = { + notesFolder: "", previewLines: 10, - density: 'comfortable', + density: "comfortable", colorAsBorder: false, tagColors: {}, cardColors: {}, @@ -32,47 +60,42 @@ const DEFAULT_SETTINGS = { pinnedHeader: true, showImages: true, autoCollapseSidebars: true, - sortMode: 'mtime-desc', + sortMode: "mtime-desc" }; - -const SORT_LABELS = { - 'mtime-desc': 'Modified · newest', - 'mtime-asc': 'Modified · oldest', - 'ctime-desc': 'Created · newest', - 'ctime-asc': 'Created · oldest', - 'name-asc': 'Title · A → Z', - 'name-desc': 'Title · Z → A', +var SORT_LABELS = { + "mtime-desc": "Modified \xB7 newest", + "mtime-asc": "Modified \xB7 oldest", + "ctime-desc": "Created \xB7 newest", + "ctime-asc": "Created \xB7 oldest", + "name-asc": "Title \xB7 A \u2192 Z", + "name-desc": "Title \xB7 Z \u2192 A" }; - -// ============================ HELPERS ============================ function escapeRegex(s) { - return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } - function parseQuery(raw) { const parts = raw.match(/(?:[^\s"]+|"[^"]*")+/g) || []; const out = { text: [], tag: [], color: null, path: null, pinned: null, archived: null }; for (const p of parts) { const m = /^(\w+):(.+)$/.exec(p); if (!m) { - out.text.push(p.replace(/^"|"$/g, '').toLowerCase()); + out.text.push(p.replace(/^"|"$/g, "").toLowerCase()); continue; } const k = m[1].toLowerCase(); - const v = m[2].replace(/^"|"$/g, ''); - if (k === 'tag') out.tag.push(v.replace(/^#/, '')); - else if (k === 'color') out.color = v; - else if (k === 'path') out.path = v.toLowerCase(); - else if (k === 'pinned') out.pinned = v === 'true' || v === 'yes'; - else if (k === 'archived') out.archived = v === 'true' || v === 'yes'; - else if (k === 'is') { - if (v === 'archived') out.archived = true; - if (v === 'pinned') out.pinned = true; + const v = m[2].replace(/^"|"$/g, ""); + if (k === "tag") out.tag.push(v.replace(/^#/, "")); + else if (k === "color") out.color = v; + else if (k === "path") out.path = v.toLowerCase(); + else if (k === "pinned") out.pinned = v === "true" || v === "yes"; + else if (k === "archived") out.archived = v === "true" || v === "yes"; + else if (k === "is") { + if (v === "archived") out.archived = true; + if (v === "pinned") out.pinned = true; } else out.text.push(p.toLowerCase()); } return out; } - function backlinksCount(app, file) { const links = app.metadataCache.resolvedLinks || {}; let count = 0; @@ -81,7 +104,6 @@ function backlinksCount(app, file) { } return count; } - function findFirstImage(app, file, content) { let m = content.match(/!\[\[([^\]|]+?)(?:\|[^\]]*)?\]\]/); if (m) { @@ -90,68 +112,54 @@ function findFirstImage(app, file, content) { } m = content.match(/!\[[^\]]*\]\(([^)]+)\)/); if (m) { - const p = m[1].split(/\s+/)[0].replace(/^<|>$/g, ''); + const p = m[1].split(/\s+/)[0].replace(/^<|>$/g, ""); let dest = app.metadataCache.getFirstLinkpathDest(p, file.path); if (!dest) dest = app.vault.getAbstractFileByPath(p); if (dest && /\.(png|jpe?g|gif|webp|svg|bmp)$/i.test(dest.path)) return dest; } return null; } - function estimateHeight(file, fm, settings) { let h = 60; const sizeChars = file.stat.size; const lines = Math.min(settings.previewLines, Math.max(1, Math.ceil(sizeChars / 80))); h += lines * 19; if (fm && (fm.tags || fm.color)) h += 28; - if (settings.showImages && /!\[/.test('') /* placeholder */) h += 120; - if (settings.density === 'compact') h *= 0.75; + if (settings.showImages && /!\[/.test("")) h += 120; + if (settings.density === "compact") h *= 0.75; return h; } - async function renderMarkdownInto(app, content, el, sourcePath, component) { - if (obsidian.MarkdownRenderer.render) { - await obsidian.MarkdownRenderer.render(app, content, el, sourcePath, component); - } else if (obsidian.MarkdownRenderer.renderMarkdown) { - await obsidian.MarkdownRenderer.renderMarkdown(content, el, sourcePath, component); - } else { - el.setText(content); - } + await obsidian.MarkdownRenderer.render(app, content, el, sourcePath, component); } - function stripFrontmatter(raw) { const m = raw.match(/^---\n[\s\S]*?\n---\n?/); - if (!m) return { front: '', body: raw }; + if (!m) return { front: "", body: raw }; return { front: m[0], body: raw.slice(m[0].length) }; } - function tagsMatchTarget(tags, target) { if (!tags) return false; for (const t of tags) { - const clean = t.replace(/^#/, ''); + const clean = t.replace(/^#/, ""); if (clean === target) return true; - if (clean.startsWith(target + '/')) return true; + if (clean.startsWith(target + "/")) return true; } return false; } - -// ============================ COLUMN LAYOUT ============================ -class ColumnLayout { +var ColumnLayout = class { constructor(host) { this.host = host; this.columns = []; this.heights = []; } - setColumnCount(n) { this.host.empty(); this.columns = []; this.heights = new Array(n).fill(0); for (let i = 0; i < n; i++) { - this.columns.push(this.host.createDiv({ cls: 'keep-col' })); + this.columns.push(this.host.createDiv({ cls: "keep-col" })); } } - add(card, estHeight) { let min = 0; for (let i = 1; i < this.heights.length; i++) { @@ -160,164 +168,167 @@ class ColumnLayout { this.columns[min].appendChild(card); this.heights[min] += (estHeight || 200) + 16; } -} - -// ============================ PLUGIN ============================ -class KeepCardsPlugin extends obsidian.Plugin { +}; +var KeepCardsPlugin = class extends obsidian.Plugin { constructor() { super(...arguments); this.settings = DEFAULT_SETTINGS; + this.savedSidebarState = null; } - async onload() { await this.loadSettings(); this.savedSidebarState = null; this.registerView(VIEW_TYPE_CARDS, (leaf) => new CardsView(leaf, this)); - this.addRibbonIcon('layout-grid', 'Open card view', () => this.activateView()); + this.addRibbonIcon("layout-grid", "Open card view", () => this.activateView()); this.addCommand({ - id: 'open-cards-view', - name: 'Open card view', - callback: () => this.activateView(), + id: "open-cards-view", + name: "Open card view", + callback: () => this.activateView() }); this.addCommand({ - id: 'manage-labels', - name: 'Manage labels', + id: "manage-labels", + name: "Manage labels", callback: () => { - const set = new Set(); - const folder = (this.settings.notesFolder || '').trim(); + const set = /* @__PURE__ */ new Set(); + const folder = (this.settings.notesFolder || "").trim(); for (const f of this.app.vault.getMarkdownFiles()) { - if (folder && !f.path.startsWith(folder + '/') && f.path !== folder) continue; + if (folder && !f.path.startsWith(folder + "/") && f.path !== folder) continue; const cache = this.app.metadataCache.getFileCache(f); if (!cache) continue; const tags = obsidian.getAllTags(cache); - if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ''))); + if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ""))); } new TagListModal(this.app, this, Array.from(set).sort()).open(); - }, + } }); this.addSettingTab(new KeepCardsSettingTab(this.app, this)); - this.registerEvent( - this.app.workspace.on('active-leaf-change', (leaf) => this.handleActiveLeafChange(leaf)) + this.app.workspace.on("active-leaf-change", (leaf) => this.handleActiveLeafChange(leaf)) ); this.app.workspace.onLayoutReady(() => { - this.handleActiveLeafChange(this.app.workspace.activeLeaf); + this.handleActiveLeafChange(this.app.workspace.getActiveViewOfType(CardsView)?.leaf ?? null); }); } - onunload() { this.restoreSidebars(); } - handleActiveLeafChange(leaf) { if (!this.settings.autoCollapseSidebars) return; const isCards = this.leafIsCardsView(leaf); - if (isCards && !this.savedSidebarState) { this.captureAndCollapse(); } else if (!isCards && this.savedSidebarState) { this.restoreSidebars(); } } - leafIsCardsView(leaf) { if (!leaf || !leaf.view) return false; - if (typeof leaf.view.getViewType !== 'function') return false; + const view = leaf.view; + if (typeof view.getViewType !== "function") return false; try { - return leaf.view.getViewType() === VIEW_TYPE_CARDS; - } catch (e) { + return view.getViewType() === VIEW_TYPE_CARDS; + } catch { return false; } } - captureAndCollapse() { const ws = this.app.workspace; this.savedSidebarState = { left: ws.leftSplit ? !!ws.leftSplit.collapsed : false, - right: ws.rightSplit ? !!ws.rightSplit.collapsed : false, + right: ws.rightSplit ? !!ws.rightSplit.collapsed : false }; this.collapseSidebars(); } - collapseSidebars() { const apply = () => { const ws = this.app.workspace; - try { if (ws.leftSplit && !ws.leftSplit.collapsed) ws.leftSplit.collapse(); } catch (e) {} - try { if (ws.rightSplit && !ws.rightSplit.collapsed) ws.rightSplit.collapse(); } catch (e) {} + try { + if (ws.leftSplit && !ws.leftSplit.collapsed) ws.leftSplit.collapse(); + } catch { + } + try { + if (ws.rightSplit && !ws.rightSplit.collapsed) ws.rightSplit.collapse(); + } catch { + } }; apply(); window.setTimeout(apply, 60); window.setTimeout(apply, 240); } - restoreSidebars() { if (!this.savedSidebarState) return; const { left, right } = this.savedSidebarState; this.savedSidebarState = null; const apply = () => { const ws = this.app.workspace; - try { if (!left && ws.leftSplit && ws.leftSplit.collapsed) ws.leftSplit.expand(); } catch (e) {} - try { if (!right && ws.rightSplit && ws.rightSplit.collapsed) ws.rightSplit.expand(); } catch (e) {} + try { + if (!left && ws.leftSplit && ws.leftSplit.collapsed) ws.leftSplit.expand(); + } catch { + } + try { + if (!right && ws.rightSplit && ws.rightSplit.collapsed) ws.rightSplit.expand(); + } catch { + } }; apply(); window.setTimeout(apply, 60); } - async activateView() { const { workspace } = this.app; let leaf = workspace.getLeavesOfType(VIEW_TYPE_CARDS)[0]; if (!leaf) { - leaf = workspace.getLeaf('tab'); + leaf = workspace.getLeaf("tab"); await leaf.setViewState({ type: VIEW_TYPE_CARDS, active: true }); } - workspace.revealLeaf(leaf); + await workspace.revealLeaf(leaf); } - async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } - async saveSettings(opts) { await this.saveData(this.settings); if (!opts || opts.refresh !== false) this.refreshViews(); } - refreshViews() { this.app.workspace.getLeavesOfType(VIEW_TYPE_CARDS).forEach((leaf) => { const view = leaf.view; if (view instanceof CardsView) view.scheduleRender(); }); } -} - -// ============================ VIEW ============================ -class CardsView extends obsidian.ItemView { +}; +var CardsView = class extends obsidian.ItemView { constructor(leaf, plugin) { super(leaf); this.plugin = plugin; - this.query = ''; - this.parsedQuery = parseQuery(''); - this.filter = { type: 'notes' }; - this.selection = new Set(); + this.query = ""; + this.parsedQuery = parseQuery(""); + this.filter = { type: "notes" }; + this.selection = /* @__PURE__ */ new Set(); this.editing = null; this.focusedPath = null; + this.lastClickedPath = null; this.debounceTimer = null; this.searchDebounce = null; - this.layouts = new Map(); + this.layouts = /* @__PURE__ */ new Map(); this.observer = null; this.resizeObs = null; - this.cardComponents = new Map(); + this.cardComponents = /* @__PURE__ */ new Map(); this.suppressEvents = 0; this.batches = []; this.batchObserver = null; this.batchSize = 60; this.activeModal = null; + this.keydownHandler = null; + } + getViewType() { + return VIEW_TYPE_CARDS; + } + getDisplayText() { + return "Card view"; + } + getIcon() { + return "layout-grid"; } - - getViewType() { return VIEW_TYPE_CARDS; } - getDisplayText() { return 'Card view'; } - getIcon() { return 'layout-grid'; } - async onOpen() { await this.render(); const refresh = () => { @@ -327,57 +338,54 @@ class CardsView extends obsidian.ItemView { } this.scheduleRender(); }; - this.registerEvent(this.app.vault.on('modify', refresh)); - this.registerEvent(this.app.vault.on('create', refresh)); - this.registerEvent(this.app.vault.on('delete', (file) => { + this.registerEvent(this.app.vault.on("modify", refresh)); + this.registerEvent(this.app.vault.on("create", refresh)); + this.registerEvent(this.app.vault.on("delete", (file) => { let dirty = false; - for (const key of ['cardColors', 'pinnedFiles', 'archivedFiles']) { + for (const key of ["cardColors", "pinnedFiles", "archivedFiles"]) { const data = this.plugin.settings[key]; - if (data && data[file.path] !== undefined) { + if (data && data[file.path] !== void 0) { delete data[file.path]; dirty = true; } } - if (dirty) this.plugin.saveData(this.plugin.settings); + if (dirty) void this.plugin.saveData(this.plugin.settings); refresh(); })); - this.registerEvent(this.app.vault.on('rename', (file, oldPath) => { + this.registerEvent(this.app.vault.on("rename", (file, oldPath) => { let dirty = false; - for (const key of ['cardColors', 'pinnedFiles', 'archivedFiles']) { + for (const key of ["cardColors", "pinnedFiles", "archivedFiles"]) { const data = this.plugin.settings[key]; - if (data && data[oldPath] !== undefined) { + if (data && data[oldPath] !== void 0) { data[file.path] = data[oldPath]; delete data[oldPath]; dirty = true; } } - if (dirty) this.plugin.saveData(this.plugin.settings); + if (dirty) void this.plugin.saveData(this.plugin.settings); refresh(); })); - this.registerEvent(this.app.metadataCache.on('changed', refresh)); - + this.registerEvent(this.app.metadataCache.on("changed", refresh)); this.containerEl.tabIndex = -1; this.keydownHandler = (e) => this.handleKeydown(e); - this.containerEl.addEventListener('keydown', this.keydownHandler); - + this.containerEl.addEventListener("keydown", this.keydownHandler); if (this.plugin && this.plugin.handleActiveLeafChange) { this.plugin.handleActiveLeafChange(this.leaf); } } - async onClose() { if (this.observer) this.observer.disconnect(); if (this.resizeObs) this.resizeObs.disconnect(); for (const c of this.cardComponents.values()) c.unload(); this.cardComponents.clear(); - if (this.keydownHandler) this.containerEl.removeEventListener('keydown', this.keydownHandler); + if (this.keydownHandler) this.containerEl.removeEventListener("keydown", this.keydownHandler); } - scheduleRender() { if (this.debounceTimer) window.clearTimeout(this.debounceTimer); - this.debounceTimer = window.setTimeout(() => this.render(), 200); + this.debounceTimer = window.setTimeout(() => { + void this.render(); + }, 200); } - async render() { if (this.observer) this.observer.disconnect(); if (this.resizeObs) this.resizeObs.disconnect(); @@ -386,32 +394,27 @@ class CardsView extends obsidian.ItemView { for (const c of this.cardComponents.values()) c.unload(); this.cardComponents.clear(); this.layouts.clear(); - const container = this.containerEl.children[1]; container.empty(); - container.addClass('keep-cards-root'); - container.toggleClass('density-compact', this.plugin.settings.density === 'compact'); - container.toggleClass('density-list', this.plugin.settings.density === 'list'); - - const header = container.createDiv({ cls: 'keep-cards-header' }); - const topRow = header.createDiv({ cls: 'keep-cards-header-top' }); + container.addClass("keep-cards-root"); + container.toggleClass("density-compact", this.plugin.settings.density === "compact"); + container.toggleClass("density-list", this.plugin.settings.density === "list"); + const header = container.createDiv({ cls: "keep-cards-header" }); + const topRow = header.createDiv({ cls: "keep-cards-header-top" }); this.renderSearch(topRow); this.renderActiveFilter(topRow); this.renderSortButton(topRow); this.renderArchiveToggle(topRow); this.renderToolbar(topRow); - const captureRow = header.createDiv({ cls: 'keep-cards-header-capture' }); + const captureRow = header.createDiv({ cls: "keep-cards-header-capture" }); this.renderCapture(captureRow); - - const body = container.createDiv({ cls: 'keep-cards-body' }); - const grid = body.createDiv({ cls: 'keep-cards-grid' }); - + const body = container.createDiv({ cls: "keep-cards-body" }); + const grid = body.createDiv({ cls: "keep-cards-grid" }); const files = this.collectFiles(); if (files.length === 0) { this.renderEmpty(grid); return; } - this.observer = new IntersectionObserver( (entries) => { for (const entry of entries) { @@ -421,14 +424,13 @@ class CardsView extends obsidian.ItemView { const path = card.dataset.path; const file = this.app.vault.getAbstractFileByPath(path); if (file instanceof obsidian.TFile) { - this.populateCard(card, file).catch((e) => console.error('populate failed', e)); + this.populateCard(card, file).catch((e) => console.error("populate failed", e)); } } } }, - { root: grid, rootMargin: '300px' } + { root: grid, rootMargin: "300px" } ); - this.batchObserver = new IntersectionObserver( (entries) => { for (const entry of entries) { @@ -438,42 +440,34 @@ class CardsView extends obsidian.ItemView { } } }, - { root: grid, rootMargin: '600px' } + { root: grid, rootMargin: "600px" } ); - const colCount = this.computeColumnCount(grid.clientWidth || container.clientWidth || 1200); - const pinned = files.filter((f) => this.isPinned(f)); const others = files.filter((f) => !this.isPinned(f)); - const showSections = - pinned.length > 0 && - this.plugin.settings.pinnedHeader && - this.plugin.settings.density !== 'list' && - this.filter.type !== 'archive'; - + const showSections = pinned.length > 0 && this.plugin.settings.pinnedHeader && this.plugin.settings.density !== "list" && this.filter.type !== "archive"; if (showSections) { - const pinSec = this.makeSection(grid, 'PINNED'); + const pinSec = this.makeSection(grid, "PINNED"); const pinLayout = new ColumnLayout(pinSec.cols); pinLayout.setColumnCount(colCount); - this.layouts.set('pinned', pinLayout); + this.layouts.set("pinned", pinLayout); pinned.sort((a, b) => this.pinOrderOf(a) - this.pinOrderOf(b)); this.addBatch(pinSec.sec, pinLayout, pinned); - if (others.length > 0) { - const otherSec = this.makeSection(grid, 'OTHERS'); + const otherSec = this.makeSection(grid, "OTHERS"); const otherLayout = new ColumnLayout(otherSec.cols); otherLayout.setColumnCount(colCount); - this.layouts.set('others', otherLayout); + this.layouts.set("others", otherLayout); this.addBatch(otherSec.sec, otherLayout, others); } } else { - const sec = grid.createDiv({ cls: 'keep-section' }); - const cols = sec.createDiv({ cls: 'keep-section-cols' }); + const sec = grid.createDiv({ cls: "keep-section" }); + const cols = sec.createDiv({ cls: "keep-section-cols" }); const layout = new ColumnLayout(cols); layout.setColumnCount(colCount); - this.layouts.set('all', layout); + this.layouts.set("all", layout); const ordered = files.slice(); - if (this.filter.type !== 'archive') { + if (this.filter.type !== "archive") { const sortFn = this.getSortFn(); ordered.sort((a, b) => { const pa = this.isPinned(a) ? 0 : 1; @@ -485,306 +479,286 @@ class CardsView extends obsidian.ItemView { } this.addBatch(sec, layout, ordered); } - this.attachResizeObserver(grid); this.renderBulkActions(container); } - renderCapture(header) { - const wrap = header.createDiv({ cls: 'keep-cards-capture-wrap' }); - const ta = wrap.createEl('textarea', { - cls: 'keep-cards-capture', - attr: { placeholder: 'Take a note…', rows: '1' }, + const wrap = header.createDiv({ cls: "keep-cards-capture-wrap" }); + const ta = wrap.createEl("textarea", { + cls: "keep-cards-capture", + attr: { placeholder: "Take a note\u2026", rows: "1" } }); - const grow = () => { - ta.style.height = 'auto'; - ta.style.height = Math.min(ta.scrollHeight, 240) + 'px'; + ta.setCssStyles({ height: "auto" }); + ta.setCssStyles({ height: `${Math.min(ta.scrollHeight, 240)}px` }); }; - ta.addEventListener('input', grow); - ta.addEventListener('focus', grow); - ta.addEventListener('blur', () => { - ta.style.height = ''; + ta.addEventListener("input", grow); + ta.addEventListener("focus", grow); + ta.addEventListener("blur", () => { + ta.setCssStyles({ height: "" }); }); - ta.addEventListener('keydown', async (e) => { - if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { + ta.addEventListener("keydown", async (e) => { + if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); if (ta.value.trim()) { await this.captureNote(ta.value); - ta.value = ''; + ta.value = ""; grow(); } - } else if (e.key === 'Enter' && !e.shiftKey && ta.value.indexOf('\n') === -1 && ta.value.trim()) { + } else if (e.key === "Enter" && !e.shiftKey && ta.value.indexOf("\n") === -1 && ta.value.trim()) { e.preventDefault(); await this.captureNote(ta.value); - ta.value = ''; + ta.value = ""; grow(); } }); - ta.addEventListener('paste', async (e) => { + ta.addEventListener("paste", async (e) => { const items = e.clipboardData && e.clipboardData.items; if (!items) return; for (const item of items) { - if (item.type.startsWith('image/')) { + if (item.type.startsWith("image/")) { e.preventDefault(); const file = item.getAsFile(); if (!file) continue; try { const buf = await file.arrayBuffer(); - const ext = (item.type.split('/')[1] || 'png').replace('jpeg', 'jpg'); - const folder = (this.app.vault.getConfig && this.app.vault.getConfig('attachmentFolderPath')) || ''; - const safe = (folder || '').replace(/^\/+|\/+$/g, ''); + const ext = (item.type.split("/")[1] || "png").replace("jpeg", "jpg"); + const vaultAny = this.app.vault; + const folder = vaultAny.getConfig && vaultAny.getConfig("attachmentFolderPath") || ""; + const safe = (folder || "").replace(/^\/+|\/+$/g, ""); const name = `Pasted ${Date.now()}.${ext}`; - const path = (safe ? safe + '/' : '') + name; + const path = (safe ? safe + "/" : "") + name; await this.app.vault.createBinary(path, buf); - const ins = `\n![[${path}]]`; + const ins = ` +![[${path}]]`; ta.value = ta.value + ins; grow(); } catch (err) { - new obsidian.Notice('Paste failed: ' + err.message); + new obsidian.Notice("Paste failed: " + err.message); } } } }); } - renderSearch(header) { - const wrap = header.createDiv({ cls: 'keep-cards-search-wrap' }); - const icon = wrap.createSpan({ cls: 'keep-cards-search-icon' }); - obsidian.setIcon(icon, 'search'); - const search = wrap.createEl('input', { - attr: { type: 'text', placeholder: 'Search notes', title: 'Try: tag:foo pinned:true color:#5c2b29 path:Inbox is:archived' }, - cls: 'keep-cards-search', + const wrap = header.createDiv({ cls: "keep-cards-search-wrap" }); + const icon = wrap.createSpan({ cls: "keep-cards-search-icon" }); + obsidian.setIcon(icon, "search"); + const search = wrap.createEl("input", { + attr: { type: "text", placeholder: "Search notes", title: "Try: tag:foo pinned:true color:#5c2b29 path:inbox is:archived" }, + cls: "keep-cards-search" }); search.value = this.query; - search.addEventListener('input', () => { + search.addEventListener("input", () => { this.query = search.value; this.parsedQuery = parseQuery(this.query); if (this.searchDebounce) window.clearTimeout(this.searchDebounce); this.searchDebounce = window.setTimeout(() => this.scheduleRender(), 150); }); } - renderArchiveToggle(parent) { - const isArchive = this.filter.type === 'archive'; - const btn = parent.createEl('button', { - cls: 'keep-cards-sort-btn' + (isArchive ? ' is-active' : ''), + const isArchive = this.filter.type === "archive"; + const btn = parent.createEl("button", { + cls: "keep-cards-sort-btn" + (isArchive ? " is-active" : ""), attr: { - type: 'button', - 'aria-label': isArchive ? 'Showing archived notes' : 'Show archived notes', - title: isArchive ? 'Showing archived notes — click to return' : 'Show archived notes', - }, + type: "button", + "aria-label": isArchive ? "Showing archived notes" : "Show archived notes", + title: isArchive ? "Showing archived notes \u2014 click to return" : "Show archived notes" + } }); - obsidian.setIcon(btn, isArchive ? 'archive-restore' : 'archive'); - btn.addEventListener('click', () => { - this.filter = isArchive ? { type: 'notes' } : { type: 'archive' }; + obsidian.setIcon(btn, isArchive ? "archive-restore" : "archive"); + btn.addEventListener("click", () => { + this.filter = isArchive ? { type: "notes" } : { type: "archive" }; this.selection.clear(); this.scheduleRender(); }); } - renderActiveFilter(parent) { - if (this.filter.type !== 'tag') return; - const chip = parent.createDiv({ cls: 'keep-cards-active-filter' }); - chip.createSpan({ cls: 'keep-cards-active-filter-label', text: '#' + this.filter.tag }); - const x = chip.createEl('button', { - cls: 'keep-cards-active-filter-x', - attr: { type: 'button', 'aria-label': 'Clear filter' }, + if (this.filter.type !== "tag") return; + const chip = parent.createDiv({ cls: "keep-cards-active-filter" }); + chip.createSpan({ cls: "keep-cards-active-filter-label", text: "#" + this.filter.tag }); + const x = chip.createEl("button", { + cls: "keep-cards-active-filter-x", + attr: { type: "button", "aria-label": "Clear filter" } }); - obsidian.setIcon(x, 'x'); - x.addEventListener('click', () => { - this.filter = { type: 'notes' }; + obsidian.setIcon(x, "x"); + x.addEventListener("click", () => { + this.filter = { type: "notes" }; this.scheduleRender(); }); } - renderSortButton(parent) { const current = this.plugin.settings.sortMode; - const btn = parent.createEl('button', { - cls: 'keep-cards-sort-btn', - attr: { type: 'button', 'aria-label': 'Sort', title: 'Sort: ' + (SORT_LABELS[current] || 'Modified · newest') }, + const btn = parent.createEl("button", { + cls: "keep-cards-sort-btn", + attr: { type: "button", "aria-label": "Sort", title: "Sort: " + (SORT_LABELS[current] || "Modified \xB7 newest") } }); - obsidian.setIcon(btn, 'arrow-up-down'); - btn.addEventListener('click', (e) => { + obsidian.setIcon(btn, "arrow-up-down"); + btn.addEventListener("click", (e) => { const menu = new obsidian.Menu(); - for (const k of Object.keys(SORT_LABELS)) { - menu.addItem((mi) => - mi - .setTitle(SORT_LABELS[k]) - .setChecked(this.plugin.settings.sortMode === k) - .onClick(async () => { - this.plugin.settings.sortMode = k; - await this.plugin.saveSettings(); - }) + for (const key of Object.keys(SORT_LABELS)) { + menu.addItem( + (mi) => mi.setTitle(SORT_LABELS[key]).setChecked(this.plugin.settings.sortMode === key).onClick(() => { + this.plugin.settings.sortMode = key; + void this.plugin.saveSettings(); + }) ); } menu.showAtMouseEvent(e); }); } - getSortFn() { switch (this.plugin.settings.sortMode) { - case 'mtime-asc': return (a, b) => a.stat.mtime - b.stat.mtime; - case 'ctime-desc': return (a, b) => b.stat.ctime - a.stat.ctime; - case 'ctime-asc': return (a, b) => a.stat.ctime - b.stat.ctime; - case 'name-asc': return (a, b) => a.basename.localeCompare(b.basename); - case 'name-desc': return (a, b) => b.basename.localeCompare(a.basename); - case 'mtime-desc': - default: return (a, b) => b.stat.mtime - a.stat.mtime; + case "mtime-asc": + return (a, b) => a.stat.mtime - b.stat.mtime; + case "ctime-desc": + return (a, b) => b.stat.ctime - a.stat.ctime; + case "ctime-asc": + return (a, b) => a.stat.ctime - b.stat.ctime; + case "name-asc": + return (a, b) => a.basename.localeCompare(b.basename); + case "name-desc": + return (a, b) => b.basename.localeCompare(a.basename); + case "mtime-desc": + default: + return (a, b) => b.stat.mtime - a.stat.mtime; } } - renderToolbar(header) { - const tb = header.createDiv({ cls: 'keep-cards-toolbar' }); + const tb = header.createDiv({ cls: "keep-cards-toolbar" }); const modes = [ - { v: 'comfortable', icon: 'layout-grid', label: 'Comfortable' }, - { v: 'compact', icon: 'grid', label: 'Compact' }, - { v: 'list', icon: 'list', label: 'List' }, + { v: "comfortable", icon: "layout-grid", label: "Comfortable" }, + { v: "compact", icon: "grid", label: "Compact" }, + { v: "list", icon: "list", label: "List" } ]; for (const m of modes) { - const btn = tb.createEl('button', { - cls: 'keep-cards-tb-btn', - attr: { type: 'button', 'aria-label': m.label, title: m.label }, + const btn = tb.createEl("button", { + cls: "keep-cards-tb-btn", + attr: { type: "button", "aria-label": m.label, title: m.label } }); obsidian.setIcon(btn, m.icon); - if (this.plugin.settings.density === m.v) btn.addClass('is-active'); - btn.addEventListener('click', async () => { + if (this.plugin.settings.density === m.v) btn.addClass("is-active"); + btn.addEventListener("click", () => { this.plugin.settings.density = m.v; - await this.plugin.saveSettings(); + void this.plugin.saveSettings(); }); } } - renderSidebar(sidebar) { const items = [ - { label: 'Notes', icon: 'lightbulb', filter: { type: 'notes' } }, - { label: 'Archive', icon: 'archive', filter: { type: 'archive' } }, + { label: "Notes", icon: "lightbulb", filter: { type: "notes" } }, + { label: "Archive", icon: "archive", filter: { type: "archive" } } ]; for (const it of items) this.makeSidebarItem(sidebar, it.icon, it.label, it.filter); - const tags = this.collectTags(); if (tags.length > 0) { - sidebar.createDiv({ cls: 'keep-sidebar-divider' }); - const heading = sidebar.createDiv({ cls: 'keep-sidebar-heading' }); - heading.createSpan({ text: 'LABELS' }); - const editBtn = heading.createEl('button', { - cls: 'keep-sidebar-edit', - attr: { type: 'button', 'aria-label': 'Edit labels', title: 'Edit labels' }, + sidebar.createDiv({ cls: "keep-sidebar-divider" }); + const heading = sidebar.createDiv({ cls: "keep-sidebar-heading" }); + heading.createSpan({ text: "LABELS" }); + const editBtn = heading.createEl("button", { + cls: "keep-sidebar-edit", + attr: { type: "button", "aria-label": "Edit labels", title: "Edit labels" } }); - obsidian.setIcon(editBtn, 'pencil'); - editBtn.addEventListener('click', () => { + obsidian.setIcon(editBtn, "pencil"); + editBtn.addEventListener("click", () => { new TagListModal(this.app, this.plugin, tags).open(); }); - - for (const tag of tags) this.makeSidebarItem(sidebar, 'tag', tag, { type: 'tag', tag }); + for (const tag of tags) this.makeSidebarItem(sidebar, "tag", tag, { type: "tag", tag }); } } - makeSidebarItem(parent, icon, label, filter) { - const row = parent.createDiv({ cls: 'keep-sidebar-item' }); - if (this.isActive(filter)) row.addClass('is-active'); - const iconEl = row.createSpan({ cls: 'keep-sidebar-icon' }); + const row = parent.createDiv({ cls: "keep-sidebar-item" }); + if (this.isActive(filter)) row.addClass("is-active"); + const iconEl = row.createSpan({ cls: "keep-sidebar-icon" }); obsidian.setIcon(iconEl, icon); - - if (filter.type === 'tag') { + if (filter.type === "tag") { const color = this.plugin.settings.tagColors[filter.tag]; if (color) { - const dot = row.createSpan({ cls: 'keep-sidebar-color-dot' }); - dot.style.background = color; + const dot = row.createSpan({ cls: "keep-sidebar-color-dot" }); + dot.setCssStyles({ background: color }); } } - - row.createSpan({ cls: 'keep-sidebar-label', text: label }); - - if (filter.type === 'tag') { - const more = row.createEl('button', { - cls: 'keep-sidebar-more', - attr: { type: 'button', 'aria-label': 'More' }, + row.createSpan({ cls: "keep-sidebar-label", text: label }); + if (filter.type === "tag") { + const more = row.createEl("button", { + cls: "keep-sidebar-more", + attr: { type: "button", "aria-label": "More" } }); - obsidian.setIcon(more, 'more-horizontal'); - more.addEventListener('click', (e) => { + obsidian.setIcon(more, "more-horizontal"); + more.addEventListener("click", (e) => { e.stopPropagation(); const menu = new obsidian.Menu(); - menu.addItem((mi) => - mi.setTitle('Rename label').setIcon('pencil').onClick(() => { + menu.addItem( + (mi) => mi.setTitle("Rename label").setIcon("pencil").onClick(() => { new TagRenameModal(this.app, this.plugin, filter.tag).open(); }) ); - menu.addItem((mi) => - mi.setTitle('Set label color').setIcon('palette').onClick(() => { + menu.addItem( + (mi) => mi.setTitle("Set label color").setIcon("palette").onClick(() => { new TagColorModal(this.app, this.plugin, filter.tag).open(); }) ); menu.showAtMouseEvent(e); }); } - - row.addEventListener('click', () => { + row.addEventListener("click", () => { this.filter = filter; this.selection.clear(); this.scheduleRender(); }); - - row.addEventListener('dragover', (e) => { - if (filter.type === 'tag') { + row.addEventListener("dragover", (e) => { + if (filter.type === "tag") { e.preventDefault(); - row.addClass('is-drop-target'); + row.addClass("is-drop-target"); } }); - row.addEventListener('dragleave', () => row.removeClass('is-drop-target')); - row.addEventListener('drop', async (e) => { - row.removeClass('is-drop-target'); - if (filter.type !== 'tag') return; + row.addEventListener("dragleave", () => row.removeClass("is-drop-target")); + row.addEventListener("drop", async (e) => { + row.removeClass("is-drop-target"); + if (filter.type !== "tag") return; e.preventDefault(); - const path = e.dataTransfer.getData('application/x-obsidian-path'); + const path = e.dataTransfer.getData("application/x-obsidian-path"); if (!path) return; const file = this.app.vault.getAbstractFileByPath(path); if (!(file instanceof obsidian.TFile)) return; await this.addTagToFile(file, filter.tag); }); } - isActive(f) { if (f.type !== this.filter.type) return false; - if (f.type === 'tag' && this.filter.type === 'tag') return f.tag === this.filter.tag; + if (f.type === "tag" && this.filter.type === "tag") return f.tag === this.filter.tag; return true; } - collectTags() { - const set = new Set(); + const set = /* @__PURE__ */ new Set(); const folder = this.plugin.settings.notesFolder.trim(); for (const f of this.app.vault.getMarkdownFiles()) { - if (folder && !f.path.startsWith(folder + '/') && f.path !== folder) continue; + if (folder && !f.path.startsWith(folder + "/") && f.path !== folder) continue; const cache = this.app.metadataCache.getFileCache(f); if (!cache) continue; const tags = obsidian.getAllTags(cache); - if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ''))); + if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ""))); } return Array.from(set).sort(); } - collectFiles() { const folder = this.plugin.settings.notesFolder.trim(); const cache = this.app.metadataCache; const q = this.parsedQuery; - const files = this.app.vault.getMarkdownFiles().filter((f) => { - if (folder && !f.path.startsWith(folder + '/') && f.path !== folder) return false; + if (folder && !f.path.startsWith(folder + "/") && f.path !== folder) return false; const fc = cache.getFileCache(f); const fm = fc && fc.frontmatter; const archived = this.isArchived(f); - - if (this.filter.type === 'archive') { + if (this.filter.type === "archive") { if (!archived) return false; } else { if (archived) return false; } - - if (this.filter.type === 'tag') { + if (this.filter.type === "tag") { const tags = fc ? obsidian.getAllTags(fc) : null; if (!tagsMatchTarget(tags, this.filter.tag)) return false; } - if (q.tag.length > 0) { const tags = fc ? obsidian.getAllTags(fc) : null; for (const t of q.tag) { @@ -793,7 +767,7 @@ class CardsView extends obsidian.ItemView { } if (q.color !== null) { const dataColor = (this.plugin.settings.cardColors || {})[f.path]; - const effective = (dataColor !== undefined ? dataColor : (fm && fm.color)) || ''; + const effective = (dataColor !== void 0 ? dataColor : fm && fm.color) || ""; if (String(effective).toLowerCase() !== q.color.toLowerCase()) return false; } if (q.path !== null) { @@ -806,56 +780,49 @@ class CardsView extends obsidian.ItemView { if (q.archived !== archived) return false; } if (q.text.length > 0) { - const hay = (f.basename + ' ' + f.path).toLowerCase(); + const hay = (f.basename + " " + f.path).toLowerCase(); for (const t of q.text) { if (!hay.includes(t)) return false; } } return true; }); - files.sort(this.getSortFn()); return files; } - isPinned(file) { const data = this.plugin.settings.pinnedFiles || {}; - if (data[file.path] !== undefined) return data[file.path] !== false; + if (data[file.path] !== void 0) return data[file.path] !== false; const fc = this.app.metadataCache.getFileCache(file); return !!(fc && fc.frontmatter && fc.frontmatter.pinned); } - isArchived(file) { const data = this.plugin.settings.archivedFiles || {}; - if (data[file.path] !== undefined) return data[file.path] !== false; + if (data[file.path] !== void 0) return data[file.path] !== false; const fc = this.app.metadataCache.getFileCache(file); return !!(fc && fc.frontmatter && fc.frontmatter.archived); } - pinOrderOf(file) { const data = this.plugin.settings.pinnedFiles || {}; const v = data[file.path]; - if (typeof v === 'number') return v; + if (typeof v === "number") return v; const fc = this.app.metadataCache.getFileCache(file); const fmv = fc && fc.frontmatter && fc.frontmatter.pinOrder; - if (typeof fmv === 'number') return fmv; + if (typeof fmv === "number") return fmv; return Number.MAX_SAFE_INTEGER; } - makeSection(grid, label) { - const sec = grid.createDiv({ cls: 'keep-section' }); - sec.createDiv({ cls: 'keep-section-header', text: label }); - const cols = sec.createDiv({ cls: 'keep-section-cols' }); + const sec = grid.createDiv({ cls: "keep-section" }); + sec.createDiv({ cls: "keep-section-header", text: label }); + const cols = sec.createDiv({ cls: "keep-section-cols" }); return { sec, cols }; } - addBatch(host, layout, files) { if (files.length === 0) return; const batch = { host, layout, files, renderedIndex: 0, sentinel: null }; this.batches.push(batch); this.renderNextBatch(batch); } - renderNextBatch(batch) { const { host, layout, files } = batch; const start = batch.renderedIndex; @@ -864,25 +831,22 @@ class CardsView extends obsidian.ItemView { this.addSkeleton(layout, files[i]); } batch.renderedIndex = end; - if (batch.sentinel) { this.batchObserver.unobserve(batch.sentinel); batch.sentinel.remove(); batch.sentinel = null; } - if (end < files.length) { - const sentinel = host.createDiv({ cls: 'keep-batch-sentinel' }); + const sentinel = host.createDiv({ cls: "keep-batch-sentinel" }); sentinel._batch = batch; this.batchObserver.observe(sentinel); batch.sentinel = sentinel; } } - computeColumnCount(width) { const d = this.plugin.settings.density; - if (d === 'list') return 1; - if (d === 'compact') { + if (d === "list") return 1; + if (d === "compact") { if (width < 600) return 1; if (width < 900) return 3; if (width < 1200) return 4; @@ -890,11 +854,10 @@ class CardsView extends obsidian.ItemView { return 6; } if (width < 700) return 1; - if (width < 1000) return 2; + if (width < 1e3) return 2; if (width < 1400) return 3; return 4; } - attachResizeObserver(grid) { let lastCols = this.computeColumnCount(grid.clientWidth); this.resizeObs = new ResizeObserver(() => { @@ -906,356 +869,320 @@ class CardsView extends obsidian.ItemView { }); this.resizeObs.observe(grid); } - renderEmpty(grid) { - const empty = grid.createDiv({ cls: 'keep-cards-empty' }); - const ic = empty.createDiv({ cls: 'keep-empty-icon' }); - obsidian.setIcon(ic, 'sticky-note'); - empty.createDiv({ cls: 'keep-empty-title', text: 'No notes here' }); + const empty = grid.createDiv({ cls: "keep-cards-empty" }); + const ic = empty.createDiv({ cls: "keep-empty-icon" }); + obsidian.setIcon(ic, "sticky-note"); + empty.createDiv({ cls: "keep-empty-title", text: "No notes here" }); empty.createDiv({ - cls: 'keep-empty-sub', - text: this.query - ? 'Try a different search.' - : this.filter.type === 'archive' - ? 'Archived notes will appear here.' - : this.filter.type === 'tag' - ? 'No notes with this label yet.' - : 'Type a note above to get started.', + cls: "keep-empty-sub", + text: this.query ? "Try a different search." : this.filter.type === "archive" ? "Archived notes will appear here." : this.filter.type === "tag" ? "No notes with this label yet." : "Type a note above to get started." }); } - // -------------------- skeleton + populate -------------------- addSkeleton(layout, file) { const fc = this.app.metadataCache.getFileCache(file); const fm = fc && fc.frontmatter; - const card = createDiv({ cls: 'keep-card is-skeleton' }); + const card = createDiv({ cls: "keep-card is-skeleton" }); card.dataset.path = file.path; - - if (this.selection.has(file.path)) card.addClass('is-selected'); - if (this.editing === file.path) card.addClass('is-editing-card'); - + if (this.selection.has(file.path)) card.addClass("is-selected"); + if (this.editing === file.path) card.addClass("is-editing-card"); const dataColor = (this.plugin.settings.cardColors || {})[file.path]; const fmColor = fm && fm.color; - const cardColor = dataColor !== undefined ? dataColor : fmColor; + const cardColor = dataColor !== void 0 ? dataColor : fmColor; if (cardColor) { if (this.plugin.settings.colorAsBorder) { - card.style.borderLeft = '4px solid ' + String(cardColor); + card.setCssStyles({ borderLeft: `4px solid ${String(cardColor)}` }); } else { - card.style.background = String(cardColor); + card.setCssStyles({ background: String(cardColor) }); } } else { const tags = fc ? obsidian.getAllTags(fc) : null; if (tags) { for (const t of tags) { - const c = this.plugin.settings.tagColors[t.replace(/^#/, '')]; + const c = this.plugin.settings.tagColors[t.replace(/^#/, "")]; if (c) { - if (this.plugin.settings.colorAsBorder) card.style.borderLeft = '4px solid ' + c; - else card.style.background = c; + if (this.plugin.settings.colorAsBorder) card.setCssStyles({ borderLeft: `4px solid ${c}` }); + else card.setCssStyles({ background: c }); break; } } } } - - if (this.isPinned(file)) card.addClass('keep-card--pinned'); - - const cb = card.createEl('input', { - cls: 'keep-card-checkbox', - attr: { type: 'checkbox', 'aria-label': 'Select note' }, + if (this.isPinned(file)) card.addClass("keep-card--pinned"); + const cb = card.createEl("input", { + cls: "keep-card-checkbox", + attr: { type: "checkbox", "aria-label": "Select note" } }); if (this.selection.has(file.path)) cb.checked = true; - cb.addEventListener('click', (e) => { + cb.addEventListener("click", (e) => { e.stopPropagation(); this.toggleSelection(file.path, e.shiftKey); }); - - card.createDiv({ cls: 'keep-card-title', text: file.basename }); - const body = card.createDiv({ cls: 'keep-card-body' }); - for (let i = 0; i < 3; i++) body.createDiv({ cls: 'keep-shimmer' }); - + card.createDiv({ cls: "keep-card-title", text: file.basename }); + const body = card.createDiv({ cls: "keep-card-body" }); + for (let i = 0; i < 3; i++) body.createDiv({ cls: "keep-shimmer" }); card.draggable = true; - card.addEventListener('dragstart', (e) => { - e.dataTransfer.effectAllowed = 'move'; - e.dataTransfer.setData('application/x-obsidian-path', file.path); - e.dataTransfer.setData('text/plain', file.basename); - card.addClass('is-dragging'); + card.addEventListener("dragstart", (e) => { + e.dataTransfer.effectAllowed = "move"; + e.dataTransfer.setData("application/x-obsidian-path", file.path); + e.dataTransfer.setData("text/plain", file.basename); + card.addClass("is-dragging"); }); - card.addEventListener('dragend', () => card.removeClass('is-dragging')); - + card.addEventListener("dragend", () => card.removeClass("is-dragging")); if (this.isPinned(file)) { - card.addEventListener('dragover', (e) => { - const path = e.dataTransfer && e.dataTransfer.types && e.dataTransfer.types.includes('application/x-obsidian-path'); + card.addEventListener("dragover", (e) => { + const path = e.dataTransfer && e.dataTransfer.types && e.dataTransfer.types.includes("application/x-obsidian-path"); if (!path) return; e.preventDefault(); - card.addClass('is-drop-target'); + card.addClass("is-drop-target"); }); - card.addEventListener('dragleave', () => card.removeClass('is-drop-target')); - card.addEventListener('drop', async (e) => { - card.removeClass('is-drop-target'); - const fromPath = e.dataTransfer.getData('application/x-obsidian-path'); + card.addEventListener("dragleave", () => card.removeClass("is-drop-target")); + card.addEventListener("drop", (e) => { + card.removeClass("is-drop-target"); + const fromPath = e.dataTransfer?.getData("application/x-obsidian-path"); if (!fromPath || fromPath === file.path) return; const fromFile = this.app.vault.getAbstractFileByPath(fromPath); if (!(fromFile instanceof obsidian.TFile)) return; if (!this.isPinned(fromFile)) return; e.preventDefault(); - await this.swapPinOrder(fromFile, file); + void this.swapPinOrder(fromFile, file); }); } - - card.addEventListener('click', (e) => { - if (e.target.closest('input, button, a, .keep-card-editor, .keep-color-picker')) return; + card.addEventListener("click", (e) => { + const target = e.target; + if (target.closest("input, button, a, .keep-card-editor, .keep-color-picker")) return; if (e.shiftKey || e.metaKey || e.ctrlKey) { this.toggleSelection(file.path, e.shiftKey); return; } this.openNotePreview(file); }); - - card.addEventListener('contextmenu', (e) => { + card.addEventListener("contextmenu", (e) => { e.preventDefault(); this.openContextMenu(e, file); }); - layout.add(card, estimateHeight(file, fm, this.plugin.settings)); this.observer.observe(card); } - async populateCard(card, file) { const fc = this.app.metadataCache.getFileCache(file); - const fm = fc && fc.frontmatter; const settings = this.plugin.settings; - - card.removeClass('is-skeleton'); - const oldBody = card.querySelector('.keep-card-body'); + card.removeClass("is-skeleton"); + const oldBody = card.querySelector(".keep-card-body"); if (oldBody) oldBody.empty(); - - let raw = ''; + let raw = ""; try { raw = await this.app.vault.cachedRead(file); - } catch (e) { - raw = ''; + } catch { + raw = ""; } const { body: stripped } = stripFrontmatter(raw); - if (settings.showImages) { const img = findFirstImage(this.app, file, stripped); if (img) { const url = this.app.vault.getResourcePath(img); - const imgEl = createEl('img', { cls: 'keep-card-image' }); + const imgEl = createEl("img", { cls: "keep-card-image" }); imgEl.src = url; - imgEl.loading = 'lazy'; - const titleEl = card.querySelector('.keep-card-title'); + imgEl.loading = "lazy"; + const titleEl = card.querySelector(".keep-card-title"); card.insertBefore(imgEl, titleEl); } } - - const bodyEl = card.querySelector('.keep-card-body'); + const bodyEl = card.querySelector(".keep-card-body"); + if (!bodyEl) return; if (this.editing === file.path) { this.mountEditor(bodyEl, file, raw); } else { const previewLines = settings.previewLines; - const lines = stripped.split('\n'); - const cap = lines.slice(0, previewLines * 4).join('\n'); - + const lines = stripped.split("\n"); + const cap = lines.slice(0, previewLines * 4).join("\n"); const comp = new obsidian.Component(); comp.load(); this.cardComponents.set(file.path, comp); try { await renderMarkdownInto(this.app, cap, bodyEl, file.path, comp); - } catch (e) { - bodyEl.setText(stripped.split('\n').slice(0, previewLines).join('\n')); + } catch { + bodyEl.setText(stripped.split("\n").slice(0, previewLines).join("\n")); } this.wireCheckboxes(bodyEl, file); this.clampBody(bodyEl, previewLines); } - const tags = fc ? obsidian.getAllTags(fc) : null; if (tags && tags.length > 0) { - const tagsEl = card.createDiv({ cls: 'keep-card-tags' }); + const tagsEl = card.createDiv({ cls: "keep-card-tags" }); for (const t of tags) { - const chip = tagsEl.createEl('span', { cls: 'keep-card-tag', text: t }); - chip.addEventListener('click', (e) => { + const chip = tagsEl.createSpan({ cls: "keep-card-tag", text: t }); + chip.addEventListener("click", (e) => { e.stopPropagation(); - this.filter = { type: 'tag', tag: t.replace(/^#/, '') }; + this.filter = { type: "tag", tag: t.replace(/^#/, "") }; this.scheduleRender(); }); } } - - const meta = card.createDiv({ cls: 'keep-card-meta' }); + const meta = card.createDiv({ cls: "keep-card-meta" }); const bl = backlinksCount(this.app, file); if (bl > 0) { - const badge = meta.createSpan({ cls: 'keep-card-backlinks', attr: { title: bl + ' backlink' + (bl === 1 ? '' : 's') } }); - const bicon = badge.createSpan({ cls: 'keep-card-backlinks-icon' }); - obsidian.setIcon(bicon, 'links-coming-in'); + const badge = meta.createSpan({ cls: "keep-card-backlinks", attr: { title: bl + " backlink" + (bl === 1 ? "" : "s") } }); + const bicon = badge.createSpan({ cls: "keep-card-backlinks-icon" }); + obsidian.setIcon(bicon, "links-coming-in"); badge.createSpan({ text: String(bl) }); } - const isPinnedNow = this.isPinned(file); const isArchivedNow = this.isArchived(file); - - const actions = card.createDiv({ cls: 'keep-card-actions' }); + const actions = card.createDiv({ cls: "keep-card-actions" }); this.makeAction( actions, - isPinnedNow ? 'pin-off' : 'pin', - isPinnedNow ? 'Unpin' : 'Pin', + isPinnedNow ? "pin-off" : "pin", + isPinnedNow ? "Unpin" : "Pin", async () => { await this.togglePinned(file); } ); - this.makeAction(actions, 'pencil', 'Edit', () => { + this.makeAction(actions, "pencil", "Edit", () => { this.beginEdit(file); }); - this.makeAction(actions, 'palette', 'Color', () => { + this.makeAction(actions, "palette", "Color", () => { this.toggleColorPicker(card, file); }); this.makeAction( actions, - isArchivedNow ? 'archive-restore' : 'archive', - isArchivedNow ? 'Unarchive' : 'Archive', + isArchivedNow ? "archive-restore" : "archive", + isArchivedNow ? "Unarchive" : "Archive", async () => { await this.toggleArchived(file); } ); } - clampBody(bodyEl, lines) { - bodyEl.style.maxHeight = (lines * 1.5) + 'em'; - bodyEl.style.overflow = 'hidden'; + bodyEl.setCssStyles({ maxHeight: `${lines * 1.5}em`, overflow: "hidden" }); } - wireCheckboxes(bodyEl, file) { - const boxes = bodyEl.querySelectorAll('input[type=checkbox]'); + const boxes = bodyEl.querySelectorAll("input[type=checkbox]"); boxes.forEach((cb, i) => { - cb.addEventListener('click', async (e) => { + cb.addEventListener("click", async (e) => { e.stopPropagation(); try { const raw = await this.app.vault.read(file); let n = 0; const updated = raw.replace(/^(\s*[-*+] \[)( |x|X)(\])/gm, (m, open, mark, close) => { - if (n++ === i) return open + (mark === ' ' ? 'x' : ' ') + close; + if (n++ === i) return open + (mark === " " ? "x" : " ") + close; return m; }); this.suppressEvents++; await this.app.vault.modify(file, updated); } catch (err) { - new obsidian.Notice('Could not toggle checkbox: ' + err.message); + new obsidian.Notice("Could not toggle checkbox: " + err.message); } }); }); } - makeAction(parent, icon, label, handler) { - const btn = parent.createEl('button', { - cls: 'keep-card-action', - attr: { 'aria-label': label, type: 'button', title: label }, + const btn = parent.createEl("button", { + cls: "keep-card-action", + attr: { "aria-label": label, type: "button", title: label } }); obsidian.setIcon(btn, icon); - btn.addEventListener('click', async (e) => { + btn.addEventListener("click", async (e) => { e.stopPropagation(); await handler(); }); } - // -------------------- note preview -------------------- openNotePreview(file) { const modal = new NotePreviewModal(this.app, this.plugin, this, file); this.activeModal = modal; const origOnClose = modal.onClose.bind(modal); - const view = this; - modal.onClose = function () { - if (view.activeModal === modal) view.activeModal = null; - return origOnClose(); + modal.onClose = () => { + if (this.activeModal === modal) this.activeModal = null; + origOnClose(); }; modal.open(); } - refreshActiveModal(file) { if (this.activeModal && this.activeModal.file && this.activeModal.file.path === file.path) { this.activeModal.rerender(); } } - // -------------------- inline edit -------------------- beginEdit(file) { this.editing = file.path; - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); + const cards = Array.from(this.containerEl.querySelectorAll(".keep-card[data-path]")); let card = null; for (const c of cards) { - if (c.dataset.path === file.path) { card = c; break; } + if (c.dataset.path === file.path) { + card = c; + break; + } } if (!card) return; - card.addClass('is-editing-card'); - const body = card.querySelector('.keep-card-body'); + card.addClass("is-editing-card"); + const body = card.querySelector(".keep-card-body"); if (!body) return; body.empty(); - this.app.vault.read(file).then((raw) => { - this.mountEditor(body, file, raw); - }); + this.app.vault.read(file).then((raw) => this.mountEditor(body, file, raw)).catch((err) => new obsidian.Notice("Read failed: " + err.message)); } - mountEditor(body, file, raw) { const { front, body: stripped } = stripFrontmatter(raw); - const ta = body.createEl('textarea', { cls: 'keep-card-editor' }); + const ta = body.createEl("textarea", { cls: "keep-card-editor" }); ta.value = stripped; - ta.style.height = 'auto'; - setTimeout(() => { + ta.setCssStyles({ height: "auto" }); + activeWindow.setTimeout(() => { ta.focus(); - ta.style.height = ta.scrollHeight + 'px'; + ta.setCssStyles({ height: `${ta.scrollHeight}px` }); }, 0); - ta.addEventListener('input', () => { - ta.style.height = 'auto'; - ta.style.height = ta.scrollHeight + 'px'; + ta.addEventListener("input", () => { + ta.setCssStyles({ height: "auto" }); + ta.setCssStyles({ height: `${ta.scrollHeight}px` }); }); - ta.addEventListener('click', (e) => e.stopPropagation()); + ta.addEventListener("click", (e) => e.stopPropagation()); const save = async () => { try { this.suppressEvents++; await this.app.vault.modify(file, front + ta.value); } catch (err) { - new obsidian.Notice('Save failed: ' + err.message); + new obsidian.Notice("Save failed: " + err.message); } }; - ta.addEventListener('blur', async () => { - await save(); - this.editing = null; - this.scheduleRender(); + ta.addEventListener("blur", () => { + void save().then(() => { + this.editing = null; + this.scheduleRender(); + }); }); - ta.addEventListener('keydown', (e) => { - if (e.key === 'Escape') { + ta.addEventListener("keydown", (e) => { + if (e.key === "Escape") { e.preventDefault(); ta.blur(); - } else if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { + } else if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); ta.blur(); } }); } - // -------------------- color picker -------------------- toggleColorPicker(card, file) { - const existing = card.querySelector('.keep-color-picker'); + const existing = card.querySelector(".keep-color-picker"); if (existing) { existing.remove(); return; } - const picker = card.createDiv({ cls: 'keep-color-picker' }); - picker.addEventListener('click', (e) => e.stopPropagation()); + const picker = card.createDiv({ cls: "keep-color-picker" }); + picker.addEventListener("click", (e) => e.stopPropagation()); for (const c of COLORS) { const swatch = picker.createDiv({ - cls: 'keep-color-swatch', - attr: { 'aria-label': c.name, title: c.name }, + cls: "keep-color-swatch", + attr: { "aria-label": c.name, title: c.name } }); - if (c.value) swatch.style.background = c.value; - else swatch.addClass('keep-color-swatch--default'); - swatch.addEventListener('click', async (e) => { + if (c.value) swatch.setCssStyles({ background: c.value }); + else swatch.addClass("keep-color-swatch--default"); + swatch.addEventListener("click", async (e) => { e.stopPropagation(); await this.setColor(file, c.value); picker.remove(); }); } } - // -------------------- frontmatter mutations -------------------- async togglePinned(file) { try { @@ -1270,26 +1197,24 @@ class CardsView extends obsidian.ItemView { this.scheduleRender(); this.refreshActiveModal(file); } catch (err) { - new obsidian.Notice('Could not pin: ' + err.message); + new obsidian.Notice("Could not pin: " + err.message); } } - maxPinOrder() { const data = this.plugin.settings.pinnedFiles || {}; let m = 0; for (const k in data) { const v = data[k]; - if (typeof v === 'number' && v > m) m = v; + if (typeof v === "number" && v > m) m = v; } for (const f of this.app.vault.getMarkdownFiles()) { - if (data[f.path] !== undefined) continue; + if (data[f.path] !== void 0) continue; const fc = this.app.metadataCache.getFileCache(f); const v = fc && fc.frontmatter && fc.frontmatter.pinOrder; - if (typeof v === 'number' && v > m) m = v; + if (typeof v === "number" && v > m) m = v; } return m; } - async swapPinOrder(a, b) { try { if (!this.plugin.settings.pinnedFiles) this.plugin.settings.pinnedFiles = {}; @@ -1304,10 +1229,9 @@ class CardsView extends obsidian.ItemView { await this.plugin.saveData(this.plugin.settings); this.scheduleRender(); } catch (err) { - new obsidian.Notice('Reorder failed: ' + err.message); + new obsidian.Notice("Reorder failed: " + err.message); } } - async toggleArchived(file) { try { if (!this.plugin.settings.archivedFiles) this.plugin.settings.archivedFiles = {}; @@ -1317,7 +1241,7 @@ class CardsView extends obsidian.ItemView { await this.plugin.saveData(this.plugin.settings); this.scheduleRender(); this.refreshActiveModal(file); - this.showUndoToast(wasArchived ? 'Unarchived' : 'Archived', async () => { + this.showUndoToast(wasArchived ? "Unarchived" : "Archived", async () => { const d = this.plugin.settings.archivedFiles; d[file.path] = wasArchived; await this.plugin.saveData(this.plugin.settings); @@ -1325,10 +1249,9 @@ class CardsView extends obsidian.ItemView { this.refreshActiveModal(file); }); } catch (err) { - new obsidian.Notice('Could not archive: ' + err.message); + new obsidian.Notice("Could not archive: " + err.message); } } - async setColor(file, color) { try { if (!this.plugin.settings.cardColors) this.plugin.settings.cardColors = {}; @@ -1337,135 +1260,123 @@ class CardsView extends obsidian.ItemView { this.applyCardColor(file.path, color); this.refreshActiveModal(file); } catch (err) { - new obsidian.Notice('Could not set color: ' + err.message); + new obsidian.Notice("Could not set color: " + err.message); } } - applyCardColor(path, color) { - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); + const cards = Array.from(this.containerEl.querySelectorAll(".keep-card[data-path]")); for (const card of cards) { if (card.dataset.path !== path) continue; - card.style.background = ''; - card.style.borderLeft = ''; + card.setCssStyles({ background: "", borderLeft: "" }); if (color) { if (this.plugin.settings.colorAsBorder) { - card.style.borderLeft = '4px solid ' + color; + card.setCssStyles({ borderLeft: `4px solid ${color}` }); } else { - card.style.background = color; + card.setCssStyles({ background: color }); } } break; } } - async addTagToFile(file, tag) { try { await this.app.fileManager.processFrontMatter(file, (fm) => { const cur = fm.tags; - const target = tag.replace(/^#/, ''); + const target = tag.replace(/^#/, ""); if (Array.isArray(cur)) { if (!cur.includes(target)) cur.push(target); - } else if (typeof cur === 'string') { + } else if (typeof cur === "string") { if (cur !== target) fm.tags = [cur, target]; } else { fm.tags = [target]; } }); - new obsidian.Notice('Added #' + tag); + new obsidian.Notice("Added #" + tag); } catch (err) { - new obsidian.Notice('Could not add tag: ' + err.message); + new obsidian.Notice("Could not add tag: " + err.message); } } - // -------------------- context menu -------------------- openContextMenu(evt, file) { const menu = new obsidian.Menu(); const isPinnedNow = this.isPinned(file); const isArchivedNow = this.isArchived(file); - - menu.addItem((mi) => - mi.setTitle('Open in new tab').setIcon('external-link').onClick(() => { - this.app.workspace.getLeaf('tab').openFile(file); + menu.addItem( + (mi) => mi.setTitle("Open in new tab").setIcon("external-link").onClick(() => { + void this.app.workspace.getLeaf("tab").openFile(file); }) ); - menu.addItem((mi) => - mi.setTitle('Open in new pane').setIcon('separator-vertical').onClick(() => { - this.app.workspace.getLeaf('split').openFile(file); + menu.addItem( + (mi) => mi.setTitle("Open in new pane").setIcon("separator-vertical").onClick(() => { + void this.app.workspace.getLeaf("split").openFile(file); }) ); menu.addSeparator(); - menu.addItem((mi) => - mi.setTitle('Edit in card').setIcon('pencil').onClick(() => this.beginEdit(file)) + menu.addItem( + (mi) => mi.setTitle("Edit in card").setIcon("pencil").onClick(() => this.beginEdit(file)) ); - menu.addItem((mi) => - mi - .setTitle(isPinnedNow ? 'Unpin' : 'Pin') - .setIcon(isPinnedNow ? 'pin-off' : 'pin') - .onClick(() => this.togglePinned(file)) + menu.addItem( + (mi) => mi.setTitle(isPinnedNow ? "Unpin" : "Pin").setIcon(isPinnedNow ? "pin-off" : "pin").onClick(() => void this.togglePinned(file)) ); - menu.addItem((mi) => - mi - .setTitle(isArchivedNow ? 'Unarchive' : 'Archive') - .setIcon(isArchivedNow ? 'archive-restore' : 'archive') - .onClick(() => this.toggleArchived(file)) + menu.addItem( + (mi) => mi.setTitle(isArchivedNow ? "Unarchive" : "Archive").setIcon(isArchivedNow ? "archive-restore" : "archive").onClick(() => void this.toggleArchived(file)) ); menu.addSeparator(); - menu.addItem((mi) => - mi.setTitle('Rename').setIcon('input').onClick(() => { + menu.addItem( + (mi) => mi.setTitle("Rename").setIcon("input").onClick(() => { const old = file.basename; const m = new RenameModal(this.app, old, async (next) => { if (!next || next === old) return; - const newPath = (file.parent && file.parent.path && file.parent.path !== '/' ? file.parent.path + '/' : '') + next + '.md'; + const newPath = (file.parent && file.parent.path && file.parent.path !== "/" ? file.parent.path + "/" : "") + next + ".md"; try { await this.app.fileManager.renameFile(file, newPath); } catch (err) { - new obsidian.Notice('Rename failed: ' + err.message); + new obsidian.Notice("Rename failed: " + err.message); } }); m.open(); }) ); - menu.addItem((mi) => - mi.setTitle('Reveal in file explorer').setIcon('folder').onClick(() => { - const fe = this.app.workspace.getLeavesOfType('file-explorer')[0]; - if (fe && fe.view && fe.view.revealInFolder) { - fe.view.revealInFolder(file); + menu.addItem( + (mi) => mi.setTitle("Reveal in file explorer").setIcon("folder").onClick(() => { + const fe = this.app.workspace.getLeavesOfType("file-explorer")[0]; + const feView = fe && fe.view; + if (feView && feView.revealInFolder) { + feView.revealInFolder(file); } else { - this.app.workspace.revealLeaf && this.app.workspace.revealLeaf(this.app.workspace.getLeaf()); + void this.app.workspace.revealLeaf(this.app.workspace.getLeaf()); } }) ); - menu.addItem((mi) => - mi.setTitle('Copy Obsidian link').setIcon('link').onClick(async () => { - await navigator.clipboard.writeText('[[' + file.basename + ']]'); - new obsidian.Notice('Link copied'); + menu.addItem( + (mi) => mi.setTitle("Copy Obsidian link").setIcon("link").onClick(async () => { + await navigator.clipboard.writeText("[[" + file.basename + "]]"); + new obsidian.Notice("Link copied"); }) ); - menu.addItem((mi) => - mi.setTitle('Copy embed').setIcon('layers').onClick(async () => { - await navigator.clipboard.writeText('![[' + file.basename + ']]'); - new obsidian.Notice('Embed copied'); + menu.addItem( + (mi) => mi.setTitle("Copy embed").setIcon("layers").onClick(async () => { + await navigator.clipboard.writeText("![[" + file.basename + "]]"); + new obsidian.Notice("Embed copied"); }) ); menu.addSeparator(); - menu.addItem((mi) => - mi.setTitle('Delete').setIcon('trash').onClick(async () => { + menu.addItem( + (mi) => mi.setTitle("Delete").setIcon("trash").onClick(async () => { try { - await this.app.vault.trash(file, true); - this.showUndoToast('Deleted', null); + await this.app.fileManager.trashFile(file); + this.showUndoToast("Deleted", null); } catch (err) { - new obsidian.Notice('Delete failed: ' + err.message); + new obsidian.Notice("Delete failed: " + err.message); } }) ); - menu.showAtMouseEvent(evt); } - // -------------------- selection + bulk -------------------- toggleSelection(path, range) { if (range && this.lastClickedPath) { - const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); + const cards = Array.from(this.containerEl.querySelectorAll(".keep-card[data-path]")); const paths = cards.map((c) => c.dataset.path); const i1 = paths.indexOf(this.lastClickedPath); const i2 = paths.indexOf(path); @@ -1483,53 +1394,49 @@ class CardsView extends obsidian.ItemView { this.lastClickedPath = path; this.refreshSelectionUI(); } - refreshSelectionUI() { - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); + const cards = this.containerEl.querySelectorAll(".keep-card[data-path]"); cards.forEach((c) => { const sel = this.selection.has(c.dataset.path); - c.toggleClass('is-selected', sel); - const cb = c.querySelector('.keep-card-checkbox'); + c.toggleClass("is-selected", sel); + const cb = c.querySelector(".keep-card-checkbox"); if (cb) cb.checked = sel; }); this.renderBulkActions(this.containerEl.children[1]); } - renderBulkActions(parent) { - const existing = parent.querySelector('.keep-cards-bulk'); + const existing = parent.querySelector(".keep-cards-bulk"); if (existing) existing.remove(); if (this.selection.size === 0) return; - - const bar = parent.createDiv({ cls: 'keep-cards-bulk' }); - bar.createSpan({ cls: 'keep-cards-bulk-count', text: this.selection.size + ' selected' }); - + const bar = parent.createDiv({ cls: "keep-cards-bulk" }); + bar.createSpan({ cls: "keep-cards-bulk-count", text: this.selection.size + " selected" }); const make = (icon, label, fn) => { - const b = bar.createEl('button', { cls: 'keep-cards-bulk-btn', attr: { type: 'button', title: label, 'aria-label': label } }); + const b = bar.createEl("button", { cls: "keep-cards-bulk-btn", attr: { type: "button", title: label, "aria-label": label } }); obsidian.setIcon(b, icon); - b.addEventListener('click', async () => { await fn(); }); + b.addEventListener("click", async () => { + await fn(); + }); }; - - make('pin', 'Pin selected', async () => { + make("pin", "Pin selected", async () => { for (const path of Array.from(this.selection)) { const f = this.app.vault.getAbstractFileByPath(path); if (f instanceof obsidian.TFile) await this.togglePinned(f); } }); - make('archive', 'Archive selected', async () => { + make("archive", "Archive selected", async () => { for (const path of Array.from(this.selection)) { const f = this.app.vault.getAbstractFileByPath(path); if (f instanceof obsidian.TFile) await this.toggleArchived(f); } this.selection.clear(); }); - - const colorBtn = bar.createEl('button', { cls: 'keep-cards-bulk-btn', attr: { type: 'button', title: 'Color', 'aria-label': 'Color' } }); - obsidian.setIcon(colorBtn, 'palette'); - colorBtn.addEventListener('click', (e) => { + const colorBtn = bar.createEl("button", { cls: "keep-cards-bulk-btn", attr: { type: "button", title: "Color", "aria-label": "Color" } }); + obsidian.setIcon(colorBtn, "palette"); + colorBtn.addEventListener("click", (e) => { const menu = new obsidian.Menu(); for (const c of COLORS) { - menu.addItem((mi) => - mi.setTitle(c.name).onClick(async () => { + menu.addItem( + (mi) => mi.setTitle(c.name).onClick(async () => { for (const path of Array.from(this.selection)) { const f = this.app.vault.getAbstractFileByPath(path); if (f instanceof obsidian.TFile) await this.setColor(f, c.value); @@ -1539,77 +1446,78 @@ class CardsView extends obsidian.ItemView { } menu.showAtMouseEvent(e); }); - - make('trash', 'Delete selected', async () => { + make("trash", "Delete selected", async () => { const paths = Array.from(this.selection); - const ok = confirm('Delete ' + paths.length + ' note' + (paths.length === 1 ? '' : 's') + ' to system trash?'); - if (!ok) return; - for (const path of paths) { - const f = this.app.vault.getAbstractFileByPath(path); - if (f instanceof obsidian.TFile) { - try { await this.app.vault.trash(f, true); } catch (e) { /* skip */ } + const message = `Delete ${paths.length} note${paths.length === 1 ? "" : "s"}?`; + new ConfirmModal(this.app, "Delete selected", message, "Delete", async () => { + for (const path of paths) { + const f = this.app.vault.getAbstractFileByPath(path); + if (f instanceof obsidian.TFile) { + try { + await this.app.fileManager.trashFile(f); + } catch { + } + } } - } - this.selection.clear(); + this.selection.clear(); + this.refreshSelectionUI(); + }).open(); }); - - make('x', 'Clear selection', () => { + make("x", "Clear selection", () => { this.selection.clear(); this.refreshSelectionUI(); }); } - // -------------------- capture -------------------- async captureNote(content) { const folder = this.plugin.settings.notesFolder.trim(); - const firstLine = content.trim().split('\n')[0].slice(0, 60); - const safe = firstLine.replace(/[\\/:*?"<>|#]/g, '').trim() || 'Untitled'; - const base = (folder ? folder + '/' : '') + safe; - - let path = base + '.md'; + const firstLine = content.trim().split("\n")[0].slice(0, 60); + const safe = firstLine.replace(/[\\/:*?"<>|#]/g, "").trim() || "Untitled"; + const base = (folder ? folder + "/" : "") + safe; + let path = base + ".md"; let i = 1; while (this.app.vault.getAbstractFileByPath(path)) { - path = base + ' ' + i++ + '.md'; + path = base + " " + i++ + ".md"; } try { if (folder) { - try { await this.app.vault.createFolder(folder); } catch (e) {} + try { + await this.app.vault.createFolder(folder); + } catch { + } } await this.app.vault.create(path, content); } catch (err) { - new obsidian.Notice('Could not create note: ' + err.message); + new obsidian.Notice("Could not create note: " + err.message); } } - // -------------------- undo toast -------------------- showUndoToast(label, undo) { const root = this.containerEl; - const old = root.querySelector('.keep-undo-toast'); + const old = root.querySelector(".keep-undo-toast"); if (old) old.remove(); - const toast = root.createDiv({ cls: 'keep-undo-toast' }); + const toast = root.createDiv({ cls: "keep-undo-toast" }); toast.createSpan({ text: label }); if (undo) { - const btn = toast.createEl('button', { text: 'Undo', cls: 'keep-undo-btn', attr: { type: 'button' } }); - btn.addEventListener('click', async () => { - try { await undo(); } catch (e) { new obsidian.Notice('Undo failed: ' + e.message); } - toast.remove(); + const btn = toast.createEl("button", { text: "Undo", cls: "keep-undo-btn", attr: { type: "button" } }); + btn.addEventListener("click", () => { + void Promise.resolve(undo()).catch((err) => new obsidian.Notice("Undo failed: " + err.message)).finally(() => toast.remove()); }); } - setTimeout(() => toast.remove(), 5000); + activeWindow.setTimeout(() => toast.remove(), 5e3); } - // -------------------- keyboard -------------------- handleKeydown(e) { - const tag = e.target.tagName; - const inField = tag === 'INPUT' || tag === 'TEXTAREA' || (e.target instanceof HTMLElement && e.target.isContentEditable); - - if (e.key === '/' && !inField) { + const target = e.target; + const tag = target ? target.tagName : ""; + const inField = tag === "INPUT" || tag === "TEXTAREA" || target.instanceOf(HTMLElement) && target.isContentEditable; + if (e.key === "/" && !inField) { e.preventDefault(); - const search = this.containerEl.querySelector('.keep-cards-search'); + const search = this.containerEl.querySelector(".keep-cards-search"); if (search) search.focus(); return; } - if (e.key === 'Escape') { + if (e.key === "Escape") { if (this.selection.size > 0) { this.selection.clear(); this.refreshSelectionUI(); @@ -1618,26 +1526,39 @@ class CardsView extends obsidian.ItemView { } } if (inField) return; - - const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); + const cards = Array.from(this.containerEl.querySelectorAll(".keep-card[data-path]")); if (cards.length === 0) return; let idx = cards.findIndex((c) => c.dataset.path === this.focusedPath); if (idx === -1) idx = 0; - const moveTo = (n) => { n = Math.max(0, Math.min(cards.length - 1, n)); const c = cards[n]; this.focusedPath = c.dataset.path; - cards.forEach((x) => x.removeClass('is-focused')); - c.addClass('is-focused'); - c.scrollIntoView({ block: 'nearest' }); + cards.forEach((x) => x.removeClass("is-focused")); + c.addClass("is-focused"); + c.scrollIntoView({ block: "nearest" }); }; - - if (e.key === 'ArrowRight') { e.preventDefault(); moveTo(idx + 1); return; } - if (e.key === 'ArrowLeft') { e.preventDefault(); moveTo(idx - 1); return; } - if (e.key === 'ArrowDown') { e.preventDefault(); moveTo(idx + 1); return; } - if (e.key === 'ArrowUp') { e.preventDefault(); moveTo(idx - 1); return; } - if (e.key === 'Enter') { + if (e.key === "ArrowRight") { + e.preventDefault(); + moveTo(idx + 1); + return; + } + if (e.key === "ArrowLeft") { + e.preventDefault(); + moveTo(idx - 1); + return; + } + if (e.key === "ArrowDown") { + e.preventDefault(); + moveTo(idx + 1); + return; + } + if (e.key === "ArrowUp") { + e.preventDefault(); + moveTo(idx - 1); + return; + } + if (e.key === "Enter") { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); @@ -1645,7 +1566,7 @@ class CardsView extends obsidian.ItemView { e.preventDefault(); return; } - if (e.key === 'e') { + if (e.key === "e") { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); @@ -1653,23 +1574,23 @@ class CardsView extends obsidian.ItemView { e.preventDefault(); return; } - if (e.key === 'p') { + if (e.key === "p") { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); - if (f instanceof obsidian.TFile) this.togglePinned(f); + if (f instanceof obsidian.TFile) void this.togglePinned(f); e.preventDefault(); return; } - if (e.key === 'a') { + if (e.key === "a") { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); - if (f instanceof obsidian.TFile) this.toggleArchived(f); + if (f instanceof obsidian.TFile) void this.toggleArchived(f); e.preventDefault(); return; } - if (e.key === 'x') { + if (e.key === "x") { const c = cards[idx]; if (!c) return; this.toggleSelection(c.dataset.path, false); @@ -1677,10 +1598,8 @@ class CardsView extends obsidian.ItemView { return; } } -} - -// ============================ MODALS ============================ -class NotePreviewModal extends obsidian.Modal { +}; +var NotePreviewModal = class extends obsidian.Modal { constructor(app, plugin, view, file) { super(app); this.plugin = plugin; @@ -1689,47 +1608,38 @@ class NotePreviewModal extends obsidian.Modal { this.editing = false; this.component = null; this.eventRef = null; - this._currentFront = ''; + this._currentFront = ""; this._currentTextarea = null; this._dirty = false; } - onOpen() { - this.modalEl.addClass('keep-note-modal'); + this.modalEl.addClass("keep-note-modal"); this.component = new obsidian.Component(); this.component.load(); - - this.eventRef = this.app.metadataCache.on('changed', (changedFile) => { + this.eventRef = this.app.metadataCache.on("changed", (changedFile) => { if (this.editing) return; if (changedFile && changedFile.path === this.file.path) { this.rerender(); } }); - this.rerender(); } - rerender() { this.titleEl.empty(); this.contentEl.empty(); this.renderHeader(); - this.renderBody(); + void this.renderBody(); } - renderHeader() { const isPinnedNow = this.view.isPinned(this.file); const isArchivedNow = this.view.isArchived(this.file); - - const row = this.titleEl.createDiv({ cls: 'keep-modal-titlerow' }); - row.createDiv({ cls: 'keep-modal-title', text: this.file.basename }); - - const actions = row.createDiv({ cls: 'keep-modal-actions' }); - - this.makeAction(actions, isPinnedNow ? 'pin-off' : 'pin', isPinnedNow ? 'Unpin' : 'Pin', async () => { + const row = this.titleEl.createDiv({ cls: "keep-modal-titlerow" }); + row.createDiv({ cls: "keep-modal-title", text: this.file.basename }); + const actions = row.createDiv({ cls: "keep-modal-actions" }); + this.makeAction(actions, isPinnedNow ? "pin-off" : "pin", isPinnedNow ? "Unpin" : "Pin", async () => { await this.view.togglePinned(this.file); }); - - this.makeAction(actions, this.editing ? 'eye' : 'pencil', this.editing ? 'View' : 'Edit', async () => { + this.makeAction(actions, this.editing ? "eye" : "pencil", this.editing ? "View" : "Edit", async () => { if (this.editing) { await this.saveEdit(); this.editing = false; @@ -1738,142 +1648,133 @@ class NotePreviewModal extends obsidian.Modal { } this.rerender(); }); - - this.makeAction(actions, 'palette', 'Color', (e) => { + this.makeAction(actions, "palette", "Color", (e) => { const menu = new obsidian.Menu(); for (const c of COLORS) { - menu.addItem((mi) => - mi.setTitle(c.name).onClick(async () => { + menu.addItem( + (mi) => mi.setTitle(c.name).onClick(async () => { await this.view.setColor(this.file, c.value); }) ); } menu.showAtMouseEvent(e); }); - - this.makeAction(actions, isArchivedNow ? 'archive-restore' : 'archive', isArchivedNow ? 'Unarchive' : 'Archive', async () => { + this.makeAction(actions, isArchivedNow ? "archive-restore" : "archive", isArchivedNow ? "Unarchive" : "Archive", async () => { await this.view.toggleArchived(this.file); }); - - this.makeAction(actions, 'external-link', 'Open in tab', () => { - if (this.editing) this.saveEdit(); - this.app.workspace.getLeaf('tab').openFile(this.file); + this.makeAction(actions, "external-link", "Open in tab", () => { + if (this.editing) void this.saveEdit(); + void this.app.workspace.getLeaf("tab").openFile(this.file); this.close(); }); } - makeAction(parent, icon, label, handler) { - const btn = parent.createEl('button', { - cls: 'keep-modal-action-btn', - attr: { type: 'button', 'aria-label': label, title: label }, + const btn = parent.createEl("button", { + cls: "keep-modal-action-btn", + attr: { type: "button", "aria-label": label, title: label } }); obsidian.setIcon(btn, icon); - btn.addEventListener('click', async (e) => { + btn.addEventListener("click", async (e) => { e.preventDefault(); e.stopPropagation(); await handler(e); }); } - async renderBody() { - let raw = ''; + let raw = ""; try { raw = await this.app.vault.read(this.file); - } catch (e) { - raw = ''; + } catch { + raw = ""; } const { front, body: stripped } = stripFrontmatter(raw); this._currentFront = front; - if (this.editing) { - const ta = this.contentEl.createEl('textarea', { cls: 'keep-modal-editor' }); + const ta = this.contentEl.createEl("textarea", { cls: "keep-modal-editor" }); ta.value = stripped; this._currentTextarea = ta; this._dirty = false; - ta.addEventListener('input', () => { this._dirty = true; }); - ta.addEventListener('keydown', async (e) => { - if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { + ta.addEventListener("input", () => { + this._dirty = true; + }); + ta.addEventListener("keydown", (e) => { + if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); - await this.saveEdit(); - this.editing = false; - this.rerender(); + void this.saveEdit().then(() => { + this.editing = false; + this.rerender(); + }); } }); - setTimeout(() => ta.focus(), 0); + activeWindow.setTimeout(() => ta.focus(), 0); return; } - const fc = this.app.metadataCache.getFileCache(this.file); const tags = fc ? obsidian.getAllTags(fc) : null; if (tags && tags.length > 0) { - const tagsRow = this.contentEl.createDiv({ cls: 'keep-modal-tags' }); + const tagsRow = this.contentEl.createDiv({ cls: "keep-modal-tags" }); for (const t of tags) { - const chip = tagsRow.createEl('span', { cls: 'keep-card-tag', text: t }); - chip.addEventListener('click', (e) => { + const chip = tagsRow.createSpan({ cls: "keep-card-tag", text: t }); + chip.addEventListener("click", (e) => { e.stopPropagation(); - this.view.filter = { type: 'tag', tag: t.replace(/^#/, '') }; + this.view.filter = { type: "tag", tag: t.replace(/^#/, "") }; this.view.scheduleRender(); this.close(); }); } } - - const body = this.contentEl.createDiv({ cls: 'keep-modal-body' }); - const md = body.createDiv({ cls: 'keep-modal-md' }); + const body = this.contentEl.createDiv({ cls: "keep-modal-body" }); + const md = body.createDiv({ cls: "keep-modal-md" }); try { await renderMarkdownInto(this.app, stripped, md, this.file.path, this.component); - } catch (e) { + } catch { md.setText(stripped); } this.wireModalCheckboxes(md); - - const meta = body.createDiv({ cls: 'keep-modal-meta' }); + const meta = body.createDiv({ cls: "keep-modal-meta" }); const bl = backlinksCount(this.app, this.file); if (bl > 0) { - const span = meta.createSpan({ cls: 'keep-card-backlinks' }); - const ic = span.createSpan({ cls: 'keep-card-backlinks-icon' }); - obsidian.setIcon(ic, 'links-coming-in'); - span.createSpan({ text: bl + ' backlink' + (bl === 1 ? '' : 's') }); + const span = meta.createSpan({ cls: "keep-card-backlinks" }); + const ic = span.createSpan({ cls: "keep-card-backlinks-icon" }); + obsidian.setIcon(ic, "links-coming-in"); + span.createSpan({ text: bl + " backlink" + (bl === 1 ? "" : "s") }); } - const path = meta.createSpan({ cls: 'keep-modal-path', text: this.file.path }); + meta.createSpan({ cls: "keep-modal-path", text: this.file.path }); } - wireModalCheckboxes(el) { - const boxes = el.querySelectorAll('input[type=checkbox]'); + const boxes = el.querySelectorAll("input[type=checkbox]"); boxes.forEach((cb, i) => { - cb.addEventListener('click', async (e) => { + cb.addEventListener("click", async (e) => { e.stopPropagation(); try { const raw = await this.app.vault.read(this.file); let n = 0; const updated = raw.replace(/^(\s*[-*+] \[)( |x|X)(\])/gm, (m, open, mark, close) => { - if (n++ === i) return open + (mark === ' ' ? 'x' : ' ') + close; + if (n++ === i) return open + (mark === " " ? "x" : " ") + close; return m; }); await this.app.vault.modify(this.file, updated); } catch (err) { - new obsidian.Notice('Toggle failed: ' + err.message); + new obsidian.Notice("Toggle failed: " + err.message); } }); }); } - async saveEdit() { if (!this._currentTextarea) return; if (!this._dirty) return; try { - const front = this._currentFront || ''; + const front = this._currentFront || ""; this.view.suppressEvents++; await this.app.vault.modify(this.file, front + this._currentTextarea.value); this._dirty = false; } catch (err) { - new obsidian.Notice('Save failed: ' + err.message); + new obsidian.Notice("Save failed: " + err.message); } } - - async onClose() { + onClose() { if (this.editing && this._dirty) { - await this.saveEdit(); + void this.saveEdit(); } if (this.eventRef) { this.app.metadataCache.offref(this.eventRef); @@ -1885,9 +1786,32 @@ class NotePreviewModal extends obsidian.Modal { } this.contentEl.empty(); } -} - -class RenameModal extends obsidian.Modal { +}; +var ConfirmModal = class extends obsidian.Modal { + constructor(app, title, message, confirmLabel, onConfirm) { + super(app); + this.title = title; + this.message = message; + this.confirmLabel = confirmLabel; + this.onConfirm = onConfirm; + } + onOpen() { + this.titleEl.setText(this.title); + this.contentEl.createDiv({ cls: "keep-confirm-message", text: this.message }); + const row = this.contentEl.createDiv({ cls: "keep-modal-buttons" }); + const cancel = row.createEl("button", { text: "Cancel", attr: { type: "button" } }); + cancel.addEventListener("click", () => this.close()); + const ok = row.createEl("button", { + text: this.confirmLabel, + cls: "mod-warning", + attr: { type: "button" } + }); + ok.addEventListener("click", () => { + void Promise.resolve(this.onConfirm()).then(() => this.close()); + }); + } +}; +var RenameModal = class extends obsidian.Modal { constructor(app, current, onSubmit) { super(app); this.current = current; @@ -1895,108 +1819,84 @@ class RenameModal extends obsidian.Modal { this.value = current; } onOpen() { - this.titleEl.setText('Rename note'); - const input = this.contentEl.createEl('input', { attr: { type: 'text' } }); + this.titleEl.setText("Rename note"); + const input = this.contentEl.createEl("input", { + attr: { type: "text" }, + cls: "keep-modal-input" + }); input.value = this.current; - input.style.width = '100%'; - input.addEventListener('input', () => { this.value = input.value; }); - input.addEventListener('keydown', async (e) => { - if (e.key === 'Enter') { + input.addEventListener("input", () => { + this.value = input.value; + }); + input.addEventListener("keydown", (e) => { + if (e.key === "Enter") { e.preventDefault(); - await this.onSubmit(this.value); - this.close(); + void Promise.resolve(this.onSubmit(this.value)).then(() => this.close()); } }); - setTimeout(() => input.focus(), 0); - - const row = this.contentEl.createDiv(); - row.style.marginTop = '12px'; - row.style.display = 'flex'; - row.style.justifyContent = 'flex-end'; - row.style.gap = '8px'; - const cancel = row.createEl('button', { text: 'Cancel', attr: { type: 'button' } }); - cancel.addEventListener('click', () => this.close()); - const ok = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); - ok.addEventListener('click', async () => { - await this.onSubmit(this.value); - this.close(); + activeWindow.setTimeout(() => input.focus(), 0); + const row = this.contentEl.createDiv({ cls: "keep-modal-buttons" }); + const cancel = row.createEl("button", { text: "Cancel", attr: { type: "button" } }); + cancel.addEventListener("click", () => this.close()); + const ok = row.createEl("button", { text: "Rename", cls: "mod-cta", attr: { type: "button" } }); + ok.addEventListener("click", () => { + void Promise.resolve(this.onSubmit(this.value)).then(() => this.close()); }); } -} - -class TagListModal extends obsidian.Modal { +}; +var TagListModal = class extends obsidian.Modal { constructor(app, plugin, tags) { super(app); this.plugin = plugin; this.tags = tags; } onOpen() { - this.titleEl.setText('Edit labels'); - const list = this.contentEl.createDiv(); - list.style.display = 'flex'; - list.style.flexDirection = 'column'; - list.style.gap = '8px'; + this.titleEl.setText("Edit labels"); + const list = this.contentEl.createDiv({ cls: "keep-modal-stack" }); for (const t of this.tags) { - const row = list.createDiv(); - row.style.display = 'flex'; - row.style.alignItems = 'center'; - row.style.gap = '8px'; - row.style.padding = '4px 0'; - const dot = row.createEl('span'); - dot.style.width = '12px'; - dot.style.height = '12px'; - dot.style.borderRadius = '50%'; - dot.style.background = this.plugin.settings.tagColors[t] || 'transparent'; - dot.style.border = '1px solid var(--background-modifier-border)'; - row.createSpan({ text: '#' + t }); - const spacer = row.createDiv(); - spacer.style.flex = '1'; - const colorBtn = row.createEl('button', { text: 'Color', attr: { type: 'button' } }); - colorBtn.addEventListener('click', () => { + const row = list.createDiv({ cls: "keep-modal-row" }); + const dot = row.createSpan({ cls: "keep-tag-dot" }); + const dotColor = this.plugin.settings.tagColors[t] || "transparent"; + dot.setCssStyles({ background: dotColor }); + row.createSpan({ text: "#" + t }); + row.createDiv({ cls: "keep-modal-spacer" }); + const colorBtn = row.createEl("button", { text: "Color", attr: { type: "button" } }); + colorBtn.addEventListener("click", () => { new TagColorModal(this.app, this.plugin, t).open(); }); - const renameBtn = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); - renameBtn.addEventListener('click', () => { + const renameBtn = row.createEl("button", { + text: "Rename", + cls: "mod-cta", + attr: { type: "button" } + }); + renameBtn.addEventListener("click", () => { new TagRenameModal(this.app, this.plugin, t).open(); this.close(); }); } } -} - -class TagColorModal extends obsidian.Modal { +}; +var TagColorModal = class extends obsidian.Modal { constructor(app, plugin, tag) { super(app); this.plugin = plugin; this.tag = tag; } onOpen() { - this.titleEl.setText('Color for #' + this.tag); - const grid = this.contentEl.createDiv(); - grid.style.display = 'grid'; - grid.style.gridTemplateColumns = 'repeat(6, 1fr)'; - grid.style.gap = '8px'; - grid.style.marginTop = '8px'; + this.titleEl.setText("Color for #" + this.tag); + const grid = this.contentEl.createDiv({ cls: "keep-modal-color-grid" }); for (const c of COLORS) { - const sw = grid.createEl('div'); - sw.style.width = '32px'; - sw.style.height = '32px'; - sw.style.borderRadius = '50%'; - sw.style.cursor = 'pointer'; - sw.style.border = '1px solid var(--background-modifier-border)'; - if (c.value) sw.style.background = c.value; - sw.title = c.name; - sw.addEventListener('click', async () => { + const sw = grid.createDiv({ cls: "keep-modal-color-swatch", attr: { title: c.name } }); + if (c.value) sw.setCssStyles({ background: c.value }); + sw.addEventListener("click", () => { if (c.value === null) delete this.plugin.settings.tagColors[this.tag]; else this.plugin.settings.tagColors[this.tag] = c.value; - await this.plugin.saveSettings(); - this.close(); + void this.plugin.saveSettings().then(() => this.close()); }); } } -} - -class TagRenameModal extends obsidian.Modal { +}; +var TagRenameModal = class extends obsidian.Modal { constructor(app, plugin, oldTag) { super(app); this.plugin = plugin; @@ -2004,37 +1904,32 @@ class TagRenameModal extends obsidian.Modal { this.newTag = oldTag; } onOpen() { - this.titleEl.setText('Rename label "' + this.oldTag + '"'); - const input = this.contentEl.createEl('input', { attr: { type: 'text' } }); + this.titleEl.setText(`Rename label "${this.oldTag}"`); + const input = this.contentEl.createEl("input", { + attr: { type: "text" }, + cls: "keep-modal-input" + }); input.value = this.oldTag; - input.style.width = '100%'; - input.addEventListener('input', () => { this.newTag = input.value; }); - setTimeout(() => input.focus(), 0); - - const note = this.contentEl.createDiv(); - note.style.marginTop = '8px'; - note.style.fontSize = '12px'; - note.style.color = 'var(--text-muted)'; - note.setText('Renames in frontmatter (tags:) and inline #tags across the vault.'); - - const row = this.contentEl.createDiv(); - row.style.marginTop = '12px'; - row.style.display = 'flex'; - row.style.justifyContent = 'flex-end'; - row.style.gap = '8px'; - const cancel = row.createEl('button', { text: 'Cancel', attr: { type: 'button' } }); - cancel.addEventListener('click', () => this.close()); - const ok = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); - ok.addEventListener('click', async () => { - await this.doRename(); - this.close(); + input.addEventListener("input", () => { + this.newTag = input.value; + }); + activeWindow.setTimeout(() => input.focus(), 0); + this.contentEl.createDiv({ + cls: "keep-modal-hint", + text: "Renames in frontmatter (tags:) and inline #tags across the vault." + }); + const row = this.contentEl.createDiv({ cls: "keep-modal-buttons" }); + const cancel = row.createEl("button", { text: "Cancel", attr: { type: "button" } }); + cancel.addEventListener("click", () => this.close()); + const ok = row.createEl("button", { text: "Rename", cls: "mod-cta", attr: { type: "button" } }); + ok.addEventListener("click", () => { + void this.doRename().then(() => this.close()); }); } async doRename() { - const oldT = this.oldTag.replace(/^#/, ''); - const newT = (this.newTag || '').replace(/^#/, '').trim(); + const oldT = this.oldTag.replace(/^#/, ""); + const newT = (this.newTag || "").replace(/^#/, "").trim(); if (!newT || newT === oldT) return; - const files = this.app.vault.getMarkdownFiles(); let count = 0; for (const file of files) { @@ -2042,24 +1937,22 @@ class TagRenameModal extends obsidian.Modal { await this.app.fileManager.processFrontMatter(file, (fm) => { if (!fm.tags) return; if (Array.isArray(fm.tags)) { - const idx = fm.tags.findIndex((x) => String(x).replace(/^#/, '') === oldT); + const idx = fm.tags.findIndex((x) => String(x).replace(/^#/, "") === oldT); if (idx !== -1) fm.tags[idx] = newT; - } else if (typeof fm.tags === 'string') { - if (fm.tags.replace(/^#/, '') === oldT) fm.tags = newT; + } else if (typeof fm.tags === "string") { + if (fm.tags.replace(/^#/, "") === oldT) fm.tags = newT; } }); - const raw = await this.app.vault.read(file); - const re = new RegExp('(^|[^\\w/])#' + escapeRegex(oldT) + '(?![\\w/-])', 'g'); + const re = new RegExp("(^|[^\\w/])#" + escapeRegex(oldT) + "(?![\\w/-])", "g"); if (re.test(raw)) { - const updated = raw.replace(re, '$1#' + newT); + const updated = raw.replace(re, "$1#" + newT); if (updated !== raw) { await this.app.vault.modify(file, updated); count++; } } - } catch (e) { - // skip + } catch { } } if (this.plugin.settings.tagColors[oldT]) { @@ -2067,86 +1960,60 @@ class TagRenameModal extends obsidian.Modal { delete this.plugin.settings.tagColors[oldT]; await this.plugin.saveSettings(); } - new obsidian.Notice('Renamed #' + oldT + ' → #' + newT + ' (' + count + ' file' + (count === 1 ? '' : 's') + ' changed)'); + new obsidian.Notice("Renamed #" + oldT + " \u2192 #" + newT + " (" + count + " file" + (count === 1 ? "" : "s") + " changed)"); } -} - -// ============================ SETTINGS ============================ -class KeepCardsSettingTab extends obsidian.PluginSettingTab { +}; +var KeepCardsSettingTab = class extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } - display() { const { containerEl } = this; containerEl.empty(); - - new obsidian.Setting(containerEl) - .setName('Notes folder') - .setDesc('Only show notes from this folder. Leave empty for the whole vault.') - .addText((t) => - t.setValue(this.plugin.settings.notesFolder).onChange(async (v) => { - this.plugin.settings.notesFolder = v.trim(); + new obsidian.Setting(containerEl).setName("Notes folder").setDesc("Only show notes from this folder. Leave empty for the whole vault.").addText( + (t) => t.setValue(this.plugin.settings.notesFolder).onChange(async (v) => { + this.plugin.settings.notesFolder = v.trim(); + await this.plugin.saveSettings(); + }) + ); + new obsidian.Setting(containerEl).setName("Preview lines").setDesc("Approximate lines of body shown on each card.").addText( + (t) => t.setValue(String(this.plugin.settings.previewLines)).onChange(async (v) => { + const n = parseInt(v, 10); + if (!isNaN(n) && n > 0) { + this.plugin.settings.previewLines = n; await this.plugin.saveSettings(); - }) - ); - - new obsidian.Setting(containerEl) - .setName('Preview lines') - .setDesc('Approximate lines of body shown on each card.') - .addText((t) => - t.setValue(String(this.plugin.settings.previewLines)).onChange(async (v) => { - const n = parseInt(v, 10); - if (!isNaN(n) && n > 0) { - this.plugin.settings.previewLines = n; - await this.plugin.saveSettings(); - } - }) - ); - - new obsidian.Setting(containerEl) - .setName('Color as left border') - .setDesc('Show note color as a 4px left border instead of the full card background.') - .addToggle((t) => - t.setValue(this.plugin.settings.colorAsBorder).onChange(async (v) => { - this.plugin.settings.colorAsBorder = v; - await this.plugin.saveSettings(); - }) - ); - - new obsidian.Setting(containerEl) - .setName('Pinned section header') - .setDesc('Group pinned cards under a "PINNED" / "OTHERS" divider.') - .addToggle((t) => - t.setValue(this.plugin.settings.pinnedHeader).onChange(async (v) => { - this.plugin.settings.pinnedHeader = v; - await this.plugin.saveSettings(); - }) - ); - - new obsidian.Setting(containerEl) - .setName('Show image thumbnails') - .setDesc('Render the first attached image at the top of each card.') - .addToggle((t) => - t.setValue(this.plugin.settings.showImages).onChange(async (v) => { - this.plugin.settings.showImages = v; - await this.plugin.saveSettings(); - }) - ); - - new obsidian.Setting(containerEl) - .setName('Auto-collapse sidebars in card view') - .setDesc('Collapse the left and right sidebars while a Cards view is active; restore them when you leave.') - .addToggle((t) => - t.setValue(this.plugin.settings.autoCollapseSidebars).onChange(async (v) => { - this.plugin.settings.autoCollapseSidebars = v; - await this.plugin.saveSettings(); - if (!v) this.plugin.restoreSidebars(); - else this.plugin.handleActiveLeafChange(this.app.workspace.activeLeaf); - }) - ); + } + }) + ); + new obsidian.Setting(containerEl).setName("Color as left border").setDesc("Show note color as a 4px left border instead of the full card background.").addToggle( + (t) => t.setValue(this.plugin.settings.colorAsBorder).onChange(async (v) => { + this.plugin.settings.colorAsBorder = v; + await this.plugin.saveSettings(); + }) + ); + new obsidian.Setting(containerEl).setName("Pinned section header").setDesc('Group pinned cards under a "pinned" / "others" divider.').addToggle( + (t) => t.setValue(this.plugin.settings.pinnedHeader).onChange(async (v) => { + this.plugin.settings.pinnedHeader = v; + await this.plugin.saveSettings(); + }) + ); + new obsidian.Setting(containerEl).setName("Show image thumbnails").setDesc("Render the first attached image at the top of each card.").addToggle( + (t) => t.setValue(this.plugin.settings.showImages).onChange(async (v) => { + this.plugin.settings.showImages = v; + await this.plugin.saveSettings(); + }) + ); + new obsidian.Setting(containerEl).setName("Auto-collapse sidebars in card view").setDesc("Collapse the left and right sidebars while a cards view is active; restore them when you leave.").addToggle( + (t) => t.setValue(this.plugin.settings.autoCollapseSidebars).onChange((v) => { + this.plugin.settings.autoCollapseSidebars = v; + void this.plugin.saveSettings(); + if (!v) this.plugin.restoreSidebars(); + else this.plugin.handleActiveLeafChange( + this.app.workspace.getActiveViewOfType(CardsView)?.leaf ?? null + ); + }) + ); } -} - -module.exports = KeepCardsPlugin; +}; +var main_default = KeepCardsPlugin; diff --git a/main.ts b/main.ts index 4de3c05..bb4c112 100644 --- a/main.ts +++ b/main.ts @@ -153,14 +153,14 @@ function estimateHeight(file, fm, settings) { return h; } -async function renderMarkdownInto(app, content, el, sourcePath, component) { - if (obsidian.MarkdownRenderer.render) { - await obsidian.MarkdownRenderer.render(app, content, el, sourcePath, component); - } else if (obsidian.MarkdownRenderer.renderMarkdown) { - await obsidian.MarkdownRenderer.renderMarkdown(content, el, sourcePath, component); - } else { - el.setText(content); - } +async function renderMarkdownInto( + app: obsidian.App, + content: string, + el: HTMLElement, + sourcePath: string, + component: obsidian.Component, +): Promise { + await obsidian.MarkdownRenderer.render(app, content, el, sourcePath, component); } function stripFrontmatter(raw) { @@ -236,9 +236,9 @@ class KeepCardsPlugin extends obsidian.Plugin { const cache = this.app.metadataCache.getFileCache(f); if (!cache) continue; const tags = obsidian.getAllTags(cache); - if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ''))); + if (tags) tags.forEach((t: string) => set.add(t.replace(/^#/, ''))); } - new TagListModal(this.app, this, Array.from(set).sort()).open(); + new TagListModal(this.app, this, Array.from(set).sort() as string[]).open(); }, }); this.addSettingTab(new KeepCardsSettingTab(this.app, this)); @@ -247,15 +247,15 @@ class KeepCardsPlugin extends obsidian.Plugin { this.app.workspace.on('active-leaf-change', (leaf) => this.handleActiveLeafChange(leaf)) ); this.app.workspace.onLayoutReady(() => { - this.handleActiveLeafChange(this.app.workspace.activeLeaf); + this.handleActiveLeafChange(this.app.workspace.getActiveViewOfType(CardsView)?.leaf ?? null); }); } - onunload() { + onunload(): void { this.restoreSidebars(); } - handleActiveLeafChange(leaf) { + handleActiveLeafChange(leaf: WorkspaceLeaf | null): void { if (!this.settings.autoCollapseSidebars) return; const isCards = this.leafIsCardsView(leaf); @@ -266,17 +266,18 @@ class KeepCardsPlugin extends obsidian.Plugin { } } - leafIsCardsView(leaf) { + leafIsCardsView(leaf: WorkspaceLeaf | null): boolean { if (!leaf || !leaf.view) return false; - if (typeof leaf.view.getViewType !== 'function') return false; + const view = leaf.view as { getViewType?: () => string }; + if (typeof view.getViewType !== 'function') return false; try { - return leaf.view.getViewType() === VIEW_TYPE_CARDS; - } catch (e) { + return view.getViewType() === VIEW_TYPE_CARDS; + } catch { return false; } } - captureAndCollapse() { + captureAndCollapse(): void { const ws = this.app.workspace; this.savedSidebarState = { left: ws.leftSplit ? !!ws.leftSplit.collapsed : false, @@ -285,45 +286,53 @@ class KeepCardsPlugin extends obsidian.Plugin { this.collapseSidebars(); } - collapseSidebars() { + collapseSidebars(): void { const apply = () => { const ws = this.app.workspace; - try { if (ws.leftSplit && !ws.leftSplit.collapsed) ws.leftSplit.collapse(); } catch (e) {} - try { if (ws.rightSplit && !ws.rightSplit.collapsed) ws.rightSplit.collapse(); } catch (e) {} + try { + if (ws.leftSplit && !ws.leftSplit.collapsed) ws.leftSplit.collapse(); + } catch { /* swallow transition races */ } + try { + if (ws.rightSplit && !ws.rightSplit.collapsed) ws.rightSplit.collapse(); + } catch { /* swallow transition races */ } }; apply(); window.setTimeout(apply, 60); window.setTimeout(apply, 240); } - restoreSidebars() { + restoreSidebars(): void { if (!this.savedSidebarState) return; const { left, right } = this.savedSidebarState; this.savedSidebarState = null; const apply = () => { const ws = this.app.workspace; - try { if (!left && ws.leftSplit && ws.leftSplit.collapsed) ws.leftSplit.expand(); } catch (e) {} - try { if (!right && ws.rightSplit && ws.rightSplit.collapsed) ws.rightSplit.expand(); } catch (e) {} + try { + if (!left && ws.leftSplit && ws.leftSplit.collapsed) ws.leftSplit.expand(); + } catch { /* swallow transition races */ } + try { + if (!right && ws.rightSplit && ws.rightSplit.collapsed) ws.rightSplit.expand(); + } catch { /* swallow transition races */ } }; apply(); window.setTimeout(apply, 60); } - async activateView() { + async activateView(): Promise { const { workspace } = this.app; let leaf = workspace.getLeavesOfType(VIEW_TYPE_CARDS)[0]; if (!leaf) { leaf = workspace.getLeaf('tab'); await leaf.setViewState({ type: VIEW_TYPE_CARDS, active: true }); } - workspace.revealLeaf(leaf); + await workspace.revealLeaf(leaf); } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } - async saveSettings(opts) { + async saveSettings(opts?: { refresh?: boolean }): Promise { await this.saveData(this.settings); if (!opts || opts.refresh !== false) this.refreshViews(); } @@ -407,7 +416,7 @@ class CardsView extends obsidian.ItemView { dirty = true; } } - if (dirty) this.plugin.saveData(this.plugin.settings); + if (dirty) void this.plugin.saveData(this.plugin.settings); refresh(); })); this.registerEvent(this.app.vault.on('rename', (file, oldPath) => { @@ -420,7 +429,7 @@ class CardsView extends obsidian.ItemView { dirty = true; } } - if (dirty) this.plugin.saveData(this.plugin.settings); + if (dirty) void this.plugin.saveData(this.plugin.settings); refresh(); })); this.registerEvent(this.app.metadataCache.on('changed', refresh)); @@ -442,12 +451,12 @@ class CardsView extends obsidian.ItemView { if (this.keydownHandler) this.containerEl.removeEventListener('keydown', this.keydownHandler); } - scheduleRender() { + scheduleRender(): void { if (this.debounceTimer) window.clearTimeout(this.debounceTimer); - this.debounceTimer = window.setTimeout(() => this.render(), 200); + this.debounceTimer = window.setTimeout(() => { void this.render(); }, 200); } - async render() { + async render(): Promise { if (this.observer) this.observer.disconnect(); if (this.resizeObs) this.resizeObs.disconnect(); if (this.batchObserver) this.batchObserver.disconnect(); @@ -485,7 +494,7 @@ class CardsView extends obsidian.ItemView { (entries) => { for (const entry of entries) { if (entry.isIntersecting) { - const card = entry.target; + const card = entry.target as HTMLElement; this.observer.unobserve(card); const path = card.dataset.path; const file = this.app.vault.getAbstractFileByPath(path); @@ -502,7 +511,7 @@ class CardsView extends obsidian.ItemView { (entries) => { for (const entry of entries) { if (entry.isIntersecting) { - const batch = entry.target._batch; + const batch = (entry.target as HTMLElement & { _batch?: BatchState })._batch; if (batch) this.renderNextBatch(batch); } } @@ -567,13 +576,13 @@ class CardsView extends obsidian.ItemView { }); const grow = () => { - ta.style.height = 'auto'; - ta.style.height = Math.min(ta.scrollHeight, 240) + 'px'; + ta.setCssStyles({ height: 'auto' }); + ta.setCssStyles({ height: `${Math.min(ta.scrollHeight, 240)}px` }); }; ta.addEventListener('input', grow); ta.addEventListener('focus', grow); ta.addEventListener('blur', () => { - ta.style.height = ''; + ta.setCssStyles({ height: '' }); }); ta.addEventListener('keydown', async (e) => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { @@ -601,7 +610,10 @@ class CardsView extends obsidian.ItemView { try { const buf = await file.arrayBuffer(); const ext = (item.type.split('/')[1] || 'png').replace('jpeg', 'jpg'); - const folder = (this.app.vault.getConfig && this.app.vault.getConfig('attachmentFolderPath')) || ''; + const vaultAny = this.app.vault as unknown as { + getConfig?: (key: string) => string | undefined; + }; + const folder = (vaultAny.getConfig && vaultAny.getConfig('attachmentFolderPath')) || ''; const safe = (folder || '').replace(/^\/+|\/+$/g, ''); const name = `Pasted ${Date.now()}.${ext}`; const path = (safe ? safe + '/' : '') + name; @@ -622,7 +634,7 @@ class CardsView extends obsidian.ItemView { const icon = wrap.createSpan({ cls: 'keep-cards-search-icon' }); obsidian.setIcon(icon, 'search'); const search = wrap.createEl('input', { - attr: { type: 'text', placeholder: 'Search notes', title: 'Try: tag:foo pinned:true color:#5c2b29 path:Inbox is:archived' }, + attr: { type: 'text', placeholder: 'Search notes', title: 'Try: tag:foo pinned:true color:#5c2b29 path:inbox is:archived' }, cls: 'keep-cards-search', }); search.value = this.query; @@ -676,14 +688,14 @@ class CardsView extends obsidian.ItemView { obsidian.setIcon(btn, 'arrow-up-down'); btn.addEventListener('click', (e) => { const menu = new obsidian.Menu(); - for (const k of Object.keys(SORT_LABELS)) { + for (const key of Object.keys(SORT_LABELS) as SortMode[]) { menu.addItem((mi) => mi - .setTitle(SORT_LABELS[k]) - .setChecked(this.plugin.settings.sortMode === k) - .onClick(async () => { - this.plugin.settings.sortMode = k; - await this.plugin.saveSettings(); + .setTitle(SORT_LABELS[key]) + .setChecked(this.plugin.settings.sortMode === key) + .onClick(() => { + this.plugin.settings.sortMode = key; + void this.plugin.saveSettings(); }) ); } @@ -703,9 +715,9 @@ class CardsView extends obsidian.ItemView { } } - renderToolbar(header) { + renderToolbar(header: HTMLElement): void { const tb = header.createDiv({ cls: 'keep-cards-toolbar' }); - const modes = [ + const modes: { v: Density; icon: string; label: string }[] = [ { v: 'comfortable', icon: 'layout-grid', label: 'Comfortable' }, { v: 'compact', icon: 'grid', label: 'Compact' }, { v: 'list', icon: 'list', label: 'List' }, @@ -717,9 +729,9 @@ class CardsView extends obsidian.ItemView { }); obsidian.setIcon(btn, m.icon); if (this.plugin.settings.density === m.v) btn.addClass('is-active'); - btn.addEventListener('click', async () => { + btn.addEventListener('click', () => { this.plugin.settings.density = m.v; - await this.plugin.saveSettings(); + void this.plugin.saveSettings(); }); } } @@ -759,7 +771,7 @@ class CardsView extends obsidian.ItemView { const color = this.plugin.settings.tagColors[filter.tag]; if (color) { const dot = row.createSpan({ cls: 'keep-sidebar-color-dot' }); - dot.style.background = color; + dot.setCssStyles({ background: color }); } } @@ -819,15 +831,15 @@ class CardsView extends obsidian.ItemView { return true; } - collectTags() { - const set = new Set(); + collectTags(): string[] { + const set = new Set(); const folder = this.plugin.settings.notesFolder.trim(); for (const f of this.app.vault.getMarkdownFiles()) { if (folder && !f.path.startsWith(folder + '/') && f.path !== folder) continue; const cache = this.app.metadataCache.getFileCache(f); if (!cache) continue; const tags = obsidian.getAllTags(cache); - if (tags) tags.forEach((t) => set.add(t.replace(/^#/, ''))); + if (tags) tags.forEach((t: string) => set.add(t.replace(/^#/, ''))); } return Array.from(set).sort(); } @@ -1008,9 +1020,9 @@ class CardsView extends obsidian.ItemView { const cardColor = dataColor !== undefined ? dataColor : fmColor; if (cardColor) { if (this.plugin.settings.colorAsBorder) { - card.style.borderLeft = '4px solid ' + String(cardColor); + card.setCssStyles({ borderLeft: `4px solid ${String(cardColor)}` }); } else { - card.style.background = String(cardColor); + card.setCssStyles({ background: String(cardColor) }); } } else { const tags = fc ? obsidian.getAllTags(fc) : null; @@ -1018,8 +1030,8 @@ class CardsView extends obsidian.ItemView { for (const t of tags) { const c = this.plugin.settings.tagColors[t.replace(/^#/, '')]; if (c) { - if (this.plugin.settings.colorAsBorder) card.style.borderLeft = '4px solid ' + c; - else card.style.background = c; + if (this.plugin.settings.colorAsBorder) card.setCssStyles({ borderLeft: `4px solid ${c}` }); + else card.setCssStyles({ background: c }); break; } } @@ -1059,20 +1071,21 @@ class CardsView extends obsidian.ItemView { card.addClass('is-drop-target'); }); card.addEventListener('dragleave', () => card.removeClass('is-drop-target')); - card.addEventListener('drop', async (e) => { + card.addEventListener('drop', (e) => { card.removeClass('is-drop-target'); - const fromPath = e.dataTransfer.getData('application/x-obsidian-path'); + const fromPath = e.dataTransfer?.getData('application/x-obsidian-path'); if (!fromPath || fromPath === file.path) return; const fromFile = this.app.vault.getAbstractFileByPath(fromPath); if (!(fromFile instanceof obsidian.TFile)) return; if (!this.isPinned(fromFile)) return; e.preventDefault(); - await this.swapPinOrder(fromFile, file); + void this.swapPinOrder(fromFile, file); }); } card.addEventListener('click', (e) => { - if (e.target.closest('input, button, a, .keep-card-editor, .keep-color-picker')) return; + const target = e.target as HTMLElement; + if (target.closest('input, button, a, .keep-card-editor, .keep-color-picker')) return; if (e.shiftKey || e.metaKey || e.ctrlKey) { this.toggleSelection(file.path, e.shiftKey); return; @@ -1089,9 +1102,8 @@ class CardsView extends obsidian.ItemView { this.observer.observe(card); } - async populateCard(card, file) { + async populateCard(card: HTMLElement, file: TFile): Promise { const fc = this.app.metadataCache.getFileCache(file); - const fm = fc && fc.frontmatter; const settings = this.plugin.settings; card.removeClass('is-skeleton'); @@ -1101,7 +1113,7 @@ class CardsView extends obsidian.ItemView { let raw = ''; try { raw = await this.app.vault.cachedRead(file); - } catch (e) { + } catch { raw = ''; } const { body: stripped } = stripFrontmatter(raw); @@ -1118,7 +1130,8 @@ class CardsView extends obsidian.ItemView { } } - const bodyEl = card.querySelector('.keep-card-body'); + const bodyEl = card.querySelector('.keep-card-body'); + if (!bodyEl) return; if (this.editing === file.path) { this.mountEditor(bodyEl, file, raw); } else { @@ -1131,7 +1144,7 @@ class CardsView extends obsidian.ItemView { this.cardComponents.set(file.path, comp); try { await renderMarkdownInto(this.app, cap, bodyEl, file.path, comp); - } catch (e) { + } catch { bodyEl.setText(stripped.split('\n').slice(0, previewLines).join('\n')); } this.wireCheckboxes(bodyEl, file); @@ -1142,7 +1155,7 @@ class CardsView extends obsidian.ItemView { if (tags && tags.length > 0) { const tagsEl = card.createDiv({ cls: 'keep-card-tags' }); for (const t of tags) { - const chip = tagsEl.createEl('span', { cls: 'keep-card-tag', text: t }); + const chip = tagsEl.createSpan({ cls: 'keep-card-tag', text: t }); chip.addEventListener('click', (e) => { e.stopPropagation(); this.filter = { type: 'tag', tag: t.replace(/^#/, '') }; @@ -1188,9 +1201,8 @@ class CardsView extends obsidian.ItemView { ); } - clampBody(bodyEl, lines) { - bodyEl.style.maxHeight = (lines * 1.5) + 'em'; - bodyEl.style.overflow = 'hidden'; + clampBody(bodyEl: HTMLElement, lines: number): void { + bodyEl.setCssStyles({ maxHeight: `${lines * 1.5}em`, overflow: 'hidden' }); } wireCheckboxes(bodyEl, file) { @@ -1227,19 +1239,18 @@ class CardsView extends obsidian.ItemView { } // -------------------- note preview -------------------- - openNotePreview(file) { + openNotePreview(file: TFile): void { const modal = new NotePreviewModal(this.app, this.plugin, this, file); this.activeModal = modal; const origOnClose = modal.onClose.bind(modal); - const view = this; - modal.onClose = function () { - if (view.activeModal === modal) view.activeModal = null; - return origOnClose(); + modal.onClose = () => { + if (this.activeModal === modal) this.activeModal = null; + origOnClose(); }; modal.open(); } - refreshActiveModal(file) { + refreshActiveModal(file: TFile): void { if (this.activeModal && this.activeModal.file && this.activeModal.file.path === file.path) { this.activeModal.rerender(); } @@ -1248,33 +1259,34 @@ class CardsView extends obsidian.ItemView { // -------------------- inline edit -------------------- beginEdit(file) { this.editing = file.path; - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); - let card = null; + const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); + let card: HTMLElement | null = null; for (const c of cards) { if (c.dataset.path === file.path) { card = c; break; } } if (!card) return; card.addClass('is-editing-card'); - const body = card.querySelector('.keep-card-body'); + const body = card.querySelector('.keep-card-body'); if (!body) return; body.empty(); - this.app.vault.read(file).then((raw) => { - this.mountEditor(body, file, raw); - }); + this.app.vault + .read(file) + .then((raw) => this.mountEditor(body, file, raw)) + .catch((err: Error) => new obsidian.Notice('Read failed: ' + err.message)); } - mountEditor(body, file, raw) { + mountEditor(body: HTMLElement, file: TFile, raw: string): void { const { front, body: stripped } = stripFrontmatter(raw); const ta = body.createEl('textarea', { cls: 'keep-card-editor' }); ta.value = stripped; - ta.style.height = 'auto'; - setTimeout(() => { + ta.setCssStyles({ height: 'auto' }); + activeWindow.setTimeout(() => { ta.focus(); - ta.style.height = ta.scrollHeight + 'px'; + ta.setCssStyles({ height: `${ta.scrollHeight}px` }); }, 0); ta.addEventListener('input', () => { - ta.style.height = 'auto'; - ta.style.height = ta.scrollHeight + 'px'; + ta.setCssStyles({ height: 'auto' }); + ta.setCssStyles({ height: `${ta.scrollHeight}px` }); }); ta.addEventListener('click', (e) => e.stopPropagation()); const save = async () => { @@ -1285,10 +1297,11 @@ class CardsView extends obsidian.ItemView { new obsidian.Notice('Save failed: ' + err.message); } }; - ta.addEventListener('blur', async () => { - await save(); - this.editing = null; - this.scheduleRender(); + ta.addEventListener('blur', () => { + void save().then(() => { + this.editing = null; + this.scheduleRender(); + }); }); ta.addEventListener('keydown', (e) => { if (e.key === 'Escape') { @@ -1315,7 +1328,7 @@ class CardsView extends obsidian.ItemView { cls: 'keep-color-swatch', attr: { 'aria-label': c.name, title: c.name }, }); - if (c.value) swatch.style.background = c.value; + if (c.value) swatch.setCssStyles({ background: c.value }); else swatch.addClass('keep-color-swatch--default'); swatch.addEventListener('click', async (e) => { e.stopPropagation(); @@ -1410,17 +1423,16 @@ class CardsView extends obsidian.ItemView { } } - applyCardColor(path, color) { - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); + applyCardColor(path: string, color: string | null) { + const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); for (const card of cards) { if (card.dataset.path !== path) continue; - card.style.background = ''; - card.style.borderLeft = ''; + card.setCssStyles({ background: '', borderLeft: '' }); if (color) { if (this.plugin.settings.colorAsBorder) { - card.style.borderLeft = '4px solid ' + color; + card.setCssStyles({ borderLeft: `4px solid ${color}` }); } else { - card.style.background = color; + card.setCssStyles({ background: color }); } } break; @@ -1454,12 +1466,12 @@ class CardsView extends obsidian.ItemView { menu.addItem((mi) => mi.setTitle('Open in new tab').setIcon('external-link').onClick(() => { - this.app.workspace.getLeaf('tab').openFile(file); + void this.app.workspace.getLeaf('tab').openFile(file); }) ); menu.addItem((mi) => mi.setTitle('Open in new pane').setIcon('separator-vertical').onClick(() => { - this.app.workspace.getLeaf('split').openFile(file); + void this.app.workspace.getLeaf('split').openFile(file); }) ); menu.addSeparator(); @@ -1470,13 +1482,13 @@ class CardsView extends obsidian.ItemView { mi .setTitle(isPinnedNow ? 'Unpin' : 'Pin') .setIcon(isPinnedNow ? 'pin-off' : 'pin') - .onClick(() => this.togglePinned(file)) + .onClick(() => void this.togglePinned(file)) ); menu.addItem((mi) => mi .setTitle(isArchivedNow ? 'Unarchive' : 'Archive') .setIcon(isArchivedNow ? 'archive-restore' : 'archive') - .onClick(() => this.toggleArchived(file)) + .onClick(() => void this.toggleArchived(file)) ); menu.addSeparator(); menu.addItem((mi) => @@ -1497,10 +1509,11 @@ class CardsView extends obsidian.ItemView { menu.addItem((mi) => mi.setTitle('Reveal in file explorer').setIcon('folder').onClick(() => { const fe = this.app.workspace.getLeavesOfType('file-explorer')[0]; - if (fe && fe.view && fe.view.revealInFolder) { - fe.view.revealInFolder(file); + const feView = fe && (fe.view as { revealInFolder?: (f: TFile) => void }); + if (feView && feView.revealInFolder) { + feView.revealInFolder(file); } else { - this.app.workspace.revealLeaf && this.app.workspace.revealLeaf(this.app.workspace.getLeaf()); + void this.app.workspace.revealLeaf(this.app.workspace.getLeaf()); } }) ); @@ -1520,10 +1533,10 @@ class CardsView extends obsidian.ItemView { menu.addItem((mi) => mi.setTitle('Delete').setIcon('trash').onClick(async () => { try { - await this.app.vault.trash(file, true); + await this.app.fileManager.trashFile(file); this.showUndoToast('Deleted', null); } catch (err) { - new obsidian.Notice('Delete failed: ' + err.message); + new obsidian.Notice('Delete failed: ' + (err as Error).message); } }) ); @@ -1534,7 +1547,7 @@ class CardsView extends obsidian.ItemView { // -------------------- selection + bulk -------------------- toggleSelection(path, range) { if (range && this.lastClickedPath) { - const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); + const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); const paths = cards.map((c) => c.dataset.path); const i1 = paths.indexOf(this.lastClickedPath); const i2 = paths.indexOf(path); @@ -1554,11 +1567,11 @@ class CardsView extends obsidian.ItemView { } refreshSelectionUI() { - const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); + const cards = this.containerEl.querySelectorAll('.keep-card[data-path]'); cards.forEach((c) => { const sel = this.selection.has(c.dataset.path); c.toggleClass('is-selected', sel); - const cb = c.querySelector('.keep-card-checkbox'); + const cb = c.querySelector('.keep-card-checkbox'); if (cb) cb.checked = sel; }); this.renderBulkActions(this.containerEl.children[1]); @@ -1611,15 +1624,21 @@ class CardsView extends obsidian.ItemView { make('trash', 'Delete selected', async () => { const paths = Array.from(this.selection); - const ok = confirm('Delete ' + paths.length + ' note' + (paths.length === 1 ? '' : 's') + ' to system trash?'); - if (!ok) return; - for (const path of paths) { - const f = this.app.vault.getAbstractFileByPath(path); - if (f instanceof obsidian.TFile) { - try { await this.app.vault.trash(f, true); } catch (e) { /* skip */ } + const message = `Delete ${paths.length} note${paths.length === 1 ? '' : 's'}?`; + new ConfirmModal(this.app, 'Delete selected', message, 'Delete', async () => { + for (const path of paths) { + const f = this.app.vault.getAbstractFileByPath(path); + if (f instanceof obsidian.TFile) { + try { + await this.app.fileManager.trashFile(f); + } catch { + /* skip individual failures */ + } + } } - } - this.selection.clear(); + this.selection.clear(); + this.refreshSelectionUI(); + }).open(); }); make('x', 'Clear selection', () => { @@ -1642,11 +1661,15 @@ class CardsView extends obsidian.ItemView { } try { if (folder) { - try { await this.app.vault.createFolder(folder); } catch (e) {} + try { + await this.app.vault.createFolder(folder); + } catch { + /* folder may already exist */ + } } await this.app.vault.create(path, content); } catch (err) { - new obsidian.Notice('Could not create note: ' + err.message); + new obsidian.Notice('Could not create note: ' + (err as Error).message); } } @@ -1659,22 +1682,24 @@ class CardsView extends obsidian.ItemView { toast.createSpan({ text: label }); if (undo) { const btn = toast.createEl('button', { text: 'Undo', cls: 'keep-undo-btn', attr: { type: 'button' } }); - btn.addEventListener('click', async () => { - try { await undo(); } catch (e) { new obsidian.Notice('Undo failed: ' + e.message); } - toast.remove(); + btn.addEventListener('click', () => { + void Promise.resolve(undo()) + .catch((err: Error) => new obsidian.Notice('Undo failed: ' + err.message)) + .finally(() => toast.remove()); }); } - setTimeout(() => toast.remove(), 5000); + activeWindow.setTimeout(() => toast.remove(), 5000); } // -------------------- keyboard -------------------- - handleKeydown(e) { - const tag = e.target.tagName; - const inField = tag === 'INPUT' || tag === 'TEXTAREA' || (e.target instanceof HTMLElement && e.target.isContentEditable); + handleKeydown(e: KeyboardEvent) { + const target = e.target as HTMLElement | null; + const tag = target ? target.tagName : ''; + const inField = tag === 'INPUT' || tag === 'TEXTAREA' || (target.instanceOf(HTMLElement) && target.isContentEditable); if (e.key === '/' && !inField) { e.preventDefault(); - const search = this.containerEl.querySelector('.keep-cards-search'); + const search = this.containerEl.querySelector('.keep-cards-search'); if (search) search.focus(); return; } @@ -1688,15 +1713,15 @@ class CardsView extends obsidian.ItemView { } if (inField) return; - const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); + const cards = Array.from(this.containerEl.querySelectorAll('.keep-card[data-path]')); if (cards.length === 0) return; let idx = cards.findIndex((c) => c.dataset.path === this.focusedPath); if (idx === -1) idx = 0; - const moveTo = (n) => { + const moveTo = (n: number) => { n = Math.max(0, Math.min(cards.length - 1, n)); const c = cards[n]; - this.focusedPath = c.dataset.path; + this.focusedPath = c.dataset.path!; cards.forEach((x) => x.removeClass('is-focused')); c.addClass('is-focused'); c.scrollIntoView({ block: 'nearest' }); @@ -1726,7 +1751,7 @@ class CardsView extends obsidian.ItemView { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); - if (f instanceof obsidian.TFile) this.togglePinned(f); + if (f instanceof obsidian.TFile) void this.togglePinned(f); e.preventDefault(); return; } @@ -1734,7 +1759,7 @@ class CardsView extends obsidian.ItemView { const c = cards[idx]; if (!c) return; const f = this.app.vault.getAbstractFileByPath(c.dataset.path); - if (f instanceof obsidian.TFile) this.toggleArchived(f); + if (f instanceof obsidian.TFile) void this.toggleArchived(f); e.preventDefault(); return; } @@ -1788,11 +1813,11 @@ class NotePreviewModal extends obsidian.Modal { this.rerender(); } - rerender() { + rerender(): void { this.titleEl.empty(); this.contentEl.empty(); this.renderHeader(); - this.renderBody(); + void this.renderBody(); } renderHeader() { @@ -1835,8 +1860,8 @@ class NotePreviewModal extends obsidian.Modal { }); this.makeAction(actions, 'external-link', 'Open in tab', () => { - if (this.editing) this.saveEdit(); - this.app.workspace.getLeaf('tab').openFile(this.file); + if (this.editing) void this.saveEdit(); + void this.app.workspace.getLeaf('tab').openFile(this.file); this.close(); }); } @@ -1858,7 +1883,7 @@ class NotePreviewModal extends obsidian.Modal { let raw = ''; try { raw = await this.app.vault.read(this.file); - } catch (e) { + } catch { raw = ''; } const { front, body: stripped } = stripFrontmatter(raw); @@ -1870,15 +1895,16 @@ class NotePreviewModal extends obsidian.Modal { this._currentTextarea = ta; this._dirty = false; ta.addEventListener('input', () => { this._dirty = true; }); - ta.addEventListener('keydown', async (e) => { + ta.addEventListener('keydown', (e) => { if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) { e.preventDefault(); - await this.saveEdit(); - this.editing = false; - this.rerender(); + void this.saveEdit().then(() => { + this.editing = false; + this.rerender(); + }); } }); - setTimeout(() => ta.focus(), 0); + activeWindow.setTimeout(() => ta.focus(), 0); return; } @@ -1887,7 +1913,7 @@ class NotePreviewModal extends obsidian.Modal { if (tags && tags.length > 0) { const tagsRow = this.contentEl.createDiv({ cls: 'keep-modal-tags' }); for (const t of tags) { - const chip = tagsRow.createEl('span', { cls: 'keep-card-tag', text: t }); + const chip = tagsRow.createSpan({ cls: 'keep-card-tag', text: t }); chip.addEventListener('click', (e) => { e.stopPropagation(); this.view.filter = { type: 'tag', tag: t.replace(/^#/, '') }; @@ -1901,7 +1927,7 @@ class NotePreviewModal extends obsidian.Modal { const md = body.createDiv({ cls: 'keep-modal-md' }); try { await renderMarkdownInto(this.app, stripped, md, this.file.path, this.component); - } catch (e) { + } catch { md.setText(stripped); } this.wireModalCheckboxes(md); @@ -1914,7 +1940,7 @@ class NotePreviewModal extends obsidian.Modal { obsidian.setIcon(ic, 'links-coming-in'); span.createSpan({ text: bl + ' backlink' + (bl === 1 ? '' : 's') }); } - const path = meta.createSpan({ cls: 'keep-modal-path', text: this.file.path }); + meta.createSpan({ cls: 'keep-modal-path', text: this.file.path }); } wireModalCheckboxes(el) { @@ -1950,9 +1976,9 @@ class NotePreviewModal extends obsidian.Modal { } } - async onClose() { + onClose(): void { if (this.editing && this._dirty) { - await this.saveEdit(); + void this.saveEdit(); } if (this.eventRef) { this.app.metadataCache.offref(this.eventRef); @@ -1966,6 +1992,43 @@ class NotePreviewModal extends obsidian.Modal { } } +class ConfirmModal extends obsidian.Modal { + title: string; + message: string; + confirmLabel: string; + onConfirm: () => Promise | void; + + constructor( + app: obsidian.App, + title: string, + message: string, + confirmLabel: string, + onConfirm: () => Promise | void, + ) { + super(app); + this.title = title; + this.message = message; + this.confirmLabel = confirmLabel; + this.onConfirm = onConfirm; + } + + onOpen(): void { + this.titleEl.setText(this.title); + this.contentEl.createDiv({ cls: 'keep-confirm-message', text: this.message }); + const row = this.contentEl.createDiv({ cls: 'keep-modal-buttons' }); + const cancel = row.createEl('button', { text: 'Cancel', attr: { type: 'button' } }); + cancel.addEventListener('click', () => this.close()); + const ok = row.createEl('button', { + text: this.confirmLabel, + cls: 'mod-warning', + attr: { type: 'button' }, + }); + ok.addEventListener('click', () => { + void Promise.resolve(this.onConfirm()).then(() => this.close()); + }); + } +} + class RenameModal extends obsidian.Modal { current: string; onSubmit: (value: string) => Promise | void; @@ -1977,32 +2040,28 @@ class RenameModal extends obsidian.Modal { this.onSubmit = onSubmit; this.value = current; } - onOpen() { + onOpen(): void { this.titleEl.setText('Rename note'); - const input = this.contentEl.createEl('input', { attr: { type: 'text' } }); + const input = this.contentEl.createEl('input', { + attr: { type: 'text' }, + cls: 'keep-modal-input', + }); input.value = this.current; - input.style.width = '100%'; input.addEventListener('input', () => { this.value = input.value; }); - input.addEventListener('keydown', async (e) => { + input.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); - await this.onSubmit(this.value); - this.close(); + void Promise.resolve(this.onSubmit(this.value)).then(() => this.close()); } }); - setTimeout(() => input.focus(), 0); + activeWindow.setTimeout(() => input.focus(), 0); - const row = this.contentEl.createDiv(); - row.style.marginTop = '12px'; - row.style.display = 'flex'; - row.style.justifyContent = 'flex-end'; - row.style.gap = '8px'; + const row = this.contentEl.createDiv({ cls: 'keep-modal-buttons' }); const cancel = row.createEl('button', { text: 'Cancel', attr: { type: 'button' } }); cancel.addEventListener('click', () => this.close()); const ok = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); - ok.addEventListener('click', async () => { - await this.onSubmit(this.value); - this.close(); + ok.addEventListener('click', () => { + void Promise.resolve(this.onSubmit(this.value)).then(() => this.close()); }); } } @@ -2016,32 +2075,25 @@ class TagListModal extends obsidian.Modal { this.plugin = plugin; this.tags = tags; } - onOpen() { + onOpen(): void { this.titleEl.setText('Edit labels'); - const list = this.contentEl.createDiv(); - list.style.display = 'flex'; - list.style.flexDirection = 'column'; - list.style.gap = '8px'; + const list = this.contentEl.createDiv({ cls: 'keep-modal-stack' }); for (const t of this.tags) { - const row = list.createDiv(); - row.style.display = 'flex'; - row.style.alignItems = 'center'; - row.style.gap = '8px'; - row.style.padding = '4px 0'; - const dot = row.createEl('span'); - dot.style.width = '12px'; - dot.style.height = '12px'; - dot.style.borderRadius = '50%'; - dot.style.background = this.plugin.settings.tagColors[t] || 'transparent'; - dot.style.border = '1px solid var(--background-modifier-border)'; + const row = list.createDiv({ cls: 'keep-modal-row' }); + const dot = row.createSpan({ cls: 'keep-tag-dot' }); + const dotColor = this.plugin.settings.tagColors[t] || 'transparent'; + dot.setCssStyles({ background: dotColor }); row.createSpan({ text: '#' + t }); - const spacer = row.createDiv(); - spacer.style.flex = '1'; + row.createDiv({ cls: 'keep-modal-spacer' }); const colorBtn = row.createEl('button', { text: 'Color', attr: { type: 'button' } }); colorBtn.addEventListener('click', () => { new TagColorModal(this.app, this.plugin, t).open(); }); - const renameBtn = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); + const renameBtn = row.createEl('button', { + text: 'Rename', + cls: 'mod-cta', + attr: { type: 'button' }, + }); renameBtn.addEventListener('click', () => { new TagRenameModal(this.app, this.plugin, t).open(); this.close(); @@ -2059,27 +2111,16 @@ class TagColorModal extends obsidian.Modal { this.plugin = plugin; this.tag = tag; } - onOpen() { + onOpen(): void { this.titleEl.setText('Color for #' + this.tag); - const grid = this.contentEl.createDiv(); - grid.style.display = 'grid'; - grid.style.gridTemplateColumns = 'repeat(6, 1fr)'; - grid.style.gap = '8px'; - grid.style.marginTop = '8px'; + const grid = this.contentEl.createDiv({ cls: 'keep-modal-color-grid' }); for (const c of COLORS) { - const sw = grid.createEl('div'); - sw.style.width = '32px'; - sw.style.height = '32px'; - sw.style.borderRadius = '50%'; - sw.style.cursor = 'pointer'; - sw.style.border = '1px solid var(--background-modifier-border)'; - if (c.value) sw.style.background = c.value; - sw.title = c.name; - sw.addEventListener('click', async () => { + const sw = grid.createDiv({ cls: 'keep-modal-color-swatch', attr: { title: c.name } }); + if (c.value) sw.setCssStyles({ background: c.value }); + sw.addEventListener('click', () => { if (c.value === null) delete this.plugin.settings.tagColors[this.tag]; else this.plugin.settings.tagColors[this.tag] = c.value; - await this.plugin.saveSettings(); - this.close(); + void this.plugin.saveSettings().then(() => this.close()); }); } } @@ -2096,31 +2137,27 @@ class TagRenameModal extends obsidian.Modal { this.oldTag = oldTag; this.newTag = oldTag; } - onOpen() { - this.titleEl.setText('Rename label "' + this.oldTag + '"'); - const input = this.contentEl.createEl('input', { attr: { type: 'text' } }); + onOpen(): void { + this.titleEl.setText(`Rename label "${this.oldTag}"`); + const input = this.contentEl.createEl('input', { + attr: { type: 'text' }, + cls: 'keep-modal-input', + }); input.value = this.oldTag; - input.style.width = '100%'; input.addEventListener('input', () => { this.newTag = input.value; }); - setTimeout(() => input.focus(), 0); + activeWindow.setTimeout(() => input.focus(), 0); - const note = this.contentEl.createDiv(); - note.style.marginTop = '8px'; - note.style.fontSize = '12px'; - note.style.color = 'var(--text-muted)'; - note.setText('Renames in frontmatter (tags:) and inline #tags across the vault.'); + this.contentEl.createDiv({ + cls: 'keep-modal-hint', + text: 'Renames in frontmatter (tags:) and inline #tags across the vault.', + }); - const row = this.contentEl.createDiv(); - row.style.marginTop = '12px'; - row.style.display = 'flex'; - row.style.justifyContent = 'flex-end'; - row.style.gap = '8px'; + const row = this.contentEl.createDiv({ cls: 'keep-modal-buttons' }); const cancel = row.createEl('button', { text: 'Cancel', attr: { type: 'button' } }); cancel.addEventListener('click', () => this.close()); const ok = row.createEl('button', { text: 'Rename', cls: 'mod-cta', attr: { type: 'button' } }); - ok.addEventListener('click', async () => { - await this.doRename(); - this.close(); + ok.addEventListener('click', () => { + void this.doRename().then(() => this.close()); }); } async doRename() { @@ -2151,8 +2188,8 @@ class TagRenameModal extends obsidian.Modal { count++; } } - } catch (e) { - // skip + } catch { + // skip files that fail to update; rename is best-effort across the vault } } if (this.plugin.settings.tagColors[oldT]) { @@ -2212,7 +2249,7 @@ class KeepCardsSettingTab extends obsidian.PluginSettingTab { new obsidian.Setting(containerEl) .setName('Pinned section header') - .setDesc('Group pinned cards under a "PINNED" / "OTHERS" divider.') + .setDesc('Group pinned cards under a "pinned" / "others" divider.') .addToggle((t) => t.setValue(this.plugin.settings.pinnedHeader).onChange(async (v) => { this.plugin.settings.pinnedHeader = v; @@ -2232,13 +2269,15 @@ class KeepCardsSettingTab extends obsidian.PluginSettingTab { new obsidian.Setting(containerEl) .setName('Auto-collapse sidebars in card view') - .setDesc('Collapse the left and right sidebars while a Cards view is active; restore them when you leave.') + .setDesc('Collapse the left and right sidebars while a cards view is active; restore them when you leave.') .addToggle((t) => - t.setValue(this.plugin.settings.autoCollapseSidebars).onChange(async (v) => { + t.setValue(this.plugin.settings.autoCollapseSidebars).onChange((v) => { this.plugin.settings.autoCollapseSidebars = v; - await this.plugin.saveSettings(); + void this.plugin.saveSettings(); if (!v) this.plugin.restoreSidebars(); - else this.plugin.handleActiveLeafChange(this.app.workspace.activeLeaf); + else this.plugin.handleActiveLeafChange( + this.app.workspace.getActiveViewOfType(CardsView)?.leaf ?? null + ); }) ); } diff --git a/manifest.json b/manifest.json index df4b177..2aeb4a9 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "id": "notekeeper", "name": "Notekeeper", - "version": "0.1.1", - "minAppVersion": "1.4.0", + "version": "0.1.2", + "minAppVersion": "1.7.2", "description": "Browse your vault as a Google Keep-style masonry of cards. Quick capture, pin, color, archive, and filter notes by labels — sticky-note style.", "author": "Philemon Chiro", "authorUrl": "https://github.com/PhilemonChiro", diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b6ff595 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5113 @@ +{ + "name": "obsidian-notekeeper", + "version": "0.1.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "obsidian-notekeeper", + "version": "0.1.1", + "license": "MIT", + "devDependencies": { + "@types/node": "^20", + "@typescript-eslint/parser": "^8.59.1", + "builtin-modules": "^3.3.0", + "esbuild": "^0.21.0", + "eslint": "^9.39.4", + "eslint-plugin-obsidianmd": "^0.2.9", + "obsidian": "latest", + "tslib": "^2.6.0", + "typescript": "^5.4.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.0.tgz", + "integrity": "sha512-MwBHVK60IiIHDcoMet78lxt6iw5gJOGSbNbOIVBHWVXIH4/Nq1+GQgLLGgI1KlnN86WDXsPudVaqYHKBIx7Eyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.38.6", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.6.tgz", + "integrity": "sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/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, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/json": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.14.0.tgz", + "integrity": "sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "@eslint/plugin-kit": "^0.4.1", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", + "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@microsoft/eslint-plugin-sdl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-plugin-sdl/-/eslint-plugin-sdl-1.1.0.tgz", + "integrity": "sha512-dxdNHOemLnBhfY3eByrujX9KyLigcNtW8sU+axzWv5nLGcsSBeKW2YYyTpfPo1hV8YPOmIGnfA4fZHyKVtWqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-plugin-n": "17.10.3", + "eslint-plugin-react": "7.37.3", + "eslint-plugin-security": "1.4.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "eslint": "^9" + } + }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/eslint-plugin-security": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.4.0.tgz", + "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-regex": "^1.1.0" + } + }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/codemirror": { + "version": "5.60.8", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", + "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/type-utils": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", + "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "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, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "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, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-depend": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-depend/-/eslint-plugin-depend-1.3.1.tgz", + "integrity": "sha512-1uo2rFAr9vzNrCYdp7IBZRB54LiyVxfaIso0R6/QV3t6Dax6DTbW/EV2Hktf0f4UtmGHK8UyzJWI382pwW04jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "empathic": "^2.0.0", + "module-replacements": "^2.8.0", + "semver": "^7.6.3" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/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, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-json-schema-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-json-schema-validator/-/eslint-plugin-json-schema-validator-5.1.0.tgz", + "integrity": "sha512-ZmVyxRIjm58oqe2kTuy90PpmZPrrKvOjRPXKzq8WCgRgAkidCgm5X8domL2KSfadZ3QFAmifMgGTcVNhZ5ez2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "ajv": "^8.0.0", + "debug": "^4.3.1", + "eslint-compat-utils": "^0.5.0", + "json-schema-migrate": "^2.0.0", + "jsonc-eslint-parser": "^2.0.0", + "minimatch": "^8.0.0", + "synckit": "^0.9.0", + "toml-eslint-parser": "^0.9.0", + "tunnel-agent": "^0.6.0", + "yaml-eslint-parser": "^1.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-plugin-json-schema-validator/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, + "license": "MIT" + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-json-schema-validator/node_modules/minimatch": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.7.tgz", + "integrity": "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.3.tgz", + "integrity": "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "enhanced-resolve": "^5.17.0", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^15.8.0", + "ignore": "^5.2.4", + "minimatch": "^9.0.5", + "semver": "^7.5.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/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, + "license": "MIT" + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-no-unsanitized": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.5.tgz", + "integrity": "sha512-MSB4hXPVFQrI8weqzs6gzl7reP2k/qSjtCoL2vUMSDejIIq9YL1ZKvq5/ORBXab/PvfBBrWO2jWviYpL+4Ghfg==", + "dev": true, + "license": "MPL-2.0", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-plugin-obsidianmd": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-obsidianmd/-/eslint-plugin-obsidianmd-0.2.9.tgz", + "integrity": "sha512-+dF5Zz5T6/j0QYGu+wHbY3UZb45Kh+QFkFdfvkVk05o4YIIVqHMlrTFrlRVhuBd6Htu8QxcFOwzeMTN4aysVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/config-helpers": "^0.4.2", + "@eslint/js": "^9.30.1", + "@eslint/json": "0.14.0", + "@microsoft/eslint-plugin-sdl": "^1.1.0", + "@types/eslint": "9.6.1", + "@types/node": "20.12.12", + "@typescript-eslint/types": "^8.33.1", + "@typescript-eslint/utils": "^8.33.1", + "eslint": ">=9.0.0", + "eslint-plugin-depend": "1.3.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-json-schema-validator": "5.1.0", + "eslint-plugin-no-unsanitized": "^4.1.5", + "eslint-plugin-security": "2.1.1", + "globals": "14.0.0", + "obsidian": "1.12.3", + "semver": "^7.7.4", + "typescript": "5.4.5", + "typescript-eslint": "^8.35.1" + }, + "bin": { + "eslint-plugin-obsidian": "dist/lib/index.js" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@eslint/js": "^9.30.1", + "@eslint/json": "0.14.0", + "eslint": ">=9.0.0", + "obsidian": "1.8.7", + "typescript-eslint": "^8.35.1" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/eslint-plugin-obsidianmd/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/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, + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-security": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-2.1.1.tgz", + "integrity": "sha512-7cspIGj7WTfR3EhaILzAPcfCo5R9FbeWvbgsPYWivSurTBKW88VQxtP3c4aWMG9Hz/GfJlJVdXEJ3c8LqS+u2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-regex": "^2.1.1" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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, + "license": "MIT", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-migrate/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/json-schema-migrate/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz", + "integrity": "sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/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, + "license": "BSD-2-Clause", + "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/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-replacements": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/module-replacements/-/module-replacements-2.11.0.tgz", + "integrity": "sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obsidian": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.12.3.tgz", + "integrity": "sha512-HxWqe763dOqzXjnNiHmAJTRERN8KILBSqxDSEqbeSr7W8R8Jxezzbca+nz1LiiqXnMpM8lV2jzAezw3CZ4xNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "6.5.0", + "@codemirror/view": "6.38.6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", + "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.9.3.tgz", + "integrity": "sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/toml-eslint-parser/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz", + "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.1", + "@typescript-eslint/parser": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.2.tgz", + "integrity": "sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yaml-eslint-parser/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 571e08b..5ef7649 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-notekeeper", - "version": "0.1.1", + "version": "0.1.2", "description": "Browse your vault as a Google Keep-style masonry of cards. Quick capture, pin, color, archive, and filter notes by labels.", "author": "Philemon Chiro", "license": "MIT", @@ -11,8 +11,11 @@ }, "devDependencies": { "@types/node": "^20", + "@typescript-eslint/parser": "^8.59.1", "builtin-modules": "^3.3.0", "esbuild": "^0.21.0", + "eslint": "^9.39.4", + "eslint-plugin-obsidianmd": "^0.2.9", "obsidian": "latest", "tslib": "^2.6.0", "typescript": "^5.4.0" diff --git a/styles.css b/styles.css index ae5c047..512fab4 100644 --- a/styles.css +++ b/styles.css @@ -1007,6 +1007,69 @@ border-color: var(--text-accent); } +/* ========== shared modal helpers ========== */ +.keep-modal-stack { + display: flex; + flex-direction: column; + gap: 8px; +} + +.keep-modal-row { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 0; +} + +.keep-modal-spacer { + flex: 1; +} + +.keep-modal-input { + width: 100%; +} + +.keep-modal-buttons { + display: flex; + justify-content: flex-end; + gap: 8px; + margin-top: 12px; +} + +.keep-modal-hint { + font-size: 12px; + color: var(--text-muted); + margin-top: 8px; +} + +.keep-modal-color-grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: 8px; + margin-top: 8px; +} + +.keep-modal-color-swatch { + width: 32px; + height: 32px; + border-radius: 50%; + cursor: pointer; + border: 1px solid var(--background-modifier-border); +} + +.keep-tag-dot { + width: 12px; + height: 12px; + border-radius: 50%; + border: 1px solid var(--background-modifier-border); + flex-shrink: 0; +} + +.keep-confirm-message { + margin: 8px 0 4px; + color: var(--text-muted); +} + /* ========== batch sentinel ========== */ .keep-batch-sentinel { height: 1px; diff --git a/tsconfig.json b/tsconfig.json index cd0282c..f8d86f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,8 @@ "strictNullChecks": false, "lib": ["DOM", "ES2020"], "esModuleInterop": true, - "skipLibCheck": true + "skipLibCheck": true, + "downlevelIteration": true }, "include": ["**/*.ts"], "exclude": ["node_modules", "main.js"] diff --git a/versions.json b/versions.json index 3e03766..d1549b0 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,5 @@ { "0.1.0": "1.4.0", - "0.1.1": "1.4.0" + "0.1.1": "1.4.0", + "0.1.2": "1.7.2" }