├── versions.json ├── .vscode └── settings.json ├── src ├── types │ ├── constant.ts │ ├── types.d.ts │ └── obsidian.d.ts ├── utils.ts ├── settings.ts ├── styles.css ├── patch │ ├── sorter.ts │ ├── collapse.ts │ └── filter.ts ├── custom-sort.ts └── main.ts ├── manifest.json ├── CHANGELOG-beta.md ├── manifest-beta.json ├── .gitignore ├── .github ├── workflows │ ├── auto_assign.yml │ └── ci.yaml └── ISSUE_TEMPLATE │ ├── feature_request.yml │ └── bug_report.yml ├── tsconfig.json ├── hooks └── _changelog.mjs ├── package.json ├── commit-and-tag-version.mjs ├── biome.json ├── CHANGELOG.md ├── esbuild.config.mjs ├── README.md └── pnpm-lock.yaml /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "0.0.1": "0.12.5", 3 | "0.5.14": "1.2.0", 4 | "0.5.15": "1.7.1" 5 | } 6 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "biome.enabled": true, 3 | "biome.rename": true, 4 | "editor.defaultFormatter": "biomejs.biome", 5 | "eslint.enable": false 6 | } 7 | -------------------------------------------------------------------------------- /src/types/constant.ts: -------------------------------------------------------------------------------- 1 | export const STATUS_BAR_SELECTOR = "body > div.app-container div.status-bar"; 2 | export const RIBBON_BAR_SELECTOR = "body > div.app-container div.side-dock-actions"; 3 | export const ANIMATION_DURATION = 500; 4 | -------------------------------------------------------------------------------- /src/types/types.d.ts: -------------------------------------------------------------------------------- 1 | import type { i18n } from "i18next"; 2 | import "obsidian"; 3 | import "sortablejs"; 4 | import type Sortable from "sortablejs"; 5 | 6 | declare global { 7 | const i18next: i18n; 8 | } 9 | 10 | declare module "sortablejs" { 11 | interface SortableEvent extends Event { 12 | items: HTMLElement[]; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-bartender", 3 | "name": "Bartender", 4 | "version": "1.0.0", 5 | "minAppVersion": "1.7.1", 6 | "description": "Allows for rearranging the elements in the status bar and sidebar ribbon", 7 | "author": "NothingIsLost, zansbang, Mara-Li", 8 | "authorUrl": "https://github.com/Mara-Li", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /CHANGELOG-beta.md: -------------------------------------------------------------------------------- 1 | ## [0.5.17-0](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.16...0.5.17-0) (2024-09-11) 2 | ### Bug Fixes 3 | 4 | * **filter:** filter doesn't appear when first loading obsidian ([ab0174c](https://github.com/Mara-Li/obsidian-bartender/commit/ab0174cfd5fecb47492e642dd85f17238edf3f07)), closes [#9](https://github.com/Mara-Li/obsidian-bartender/issues/9) -------------------------------------------------------------------------------- /manifest-beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-bartender", 3 | "name": "Bartender", 4 | "version": "1.0.0", 5 | "minAppVersion": "1.7.1", 6 | "description": "Allows for rearranging the elements in the status bar and sidebar ribbon", 7 | "author": "NothingIsLost, zansbang, Mara-Li", 8 | "authorUrl": "https://github.com/Mara-Li", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | *.iml 3 | .idea 4 | 5 | # npm 6 | node_modules 7 | package-lock.json 8 | 9 | # Don't include the compiled main.js file in the repo. 10 | # They should be uploaded to GitHub releases instead. 11 | main.js 12 | styles.css 13 | !src/styles.css 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | .env 21 | dist/ 22 | -------------------------------------------------------------------------------- /.github/workflows/auto_assign.yml: -------------------------------------------------------------------------------- 1 | name: Auto Assign 2 | on: 3 | issues: 4 | types: [opened, edited, labeled, unlabeled] 5 | pull_request: 6 | types: [opened, edited, labeled, unlabeled] 7 | jobs: 8 | auto-assign: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: wow-actions/auto-assign@v3 12 | with: 13 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 14 | reviewers: ${{github.repository_owner}} 15 | assignees: ${{github.repository_owner}} 16 | skipKeywords: wip, draft 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "noEmit": true, 4 | "baseUrl": ".", 5 | "inlineSourceMap": true, 6 | "inlineSources": true, 7 | "skipLibCheck": true, 8 | "allowSyntheticDefaultImports": true, 9 | "module": "ESNext", 10 | "target": "ESNext", 11 | "allowJs": true, 12 | "noImplicitAny": true, 13 | "moduleResolution": "node", 14 | "importHelpers": true, 15 | "isolatedModules": true, 16 | "resolveJsonModule": true, 17 | "strictNullChecks": true, 18 | "lib": [ 19 | "DOM", 20 | "ES5", 21 | "ES6", 22 | "ES7", 23 | "ES2015", 24 | "ES2021", 25 | "ES2022", 26 | "DOM.Iterable" 27 | ], 28 | "types": ["obsidian-typings"] 29 | }, 30 | "include": [ 31 | "**/*.ts" 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /hooks/_changelog.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFile } from "fs"; 2 | 3 | import { Command } from "commander"; 4 | const program = new Command(); 5 | 6 | program.option("-b, --beta", "Pre-release version"); 7 | 8 | program.parse(); 9 | const opt = program.opts(); 10 | 11 | /** 12 | * Remove text from the file 13 | * @param {string} path 14 | */ 15 | function removeText(path) { 16 | const toRemove = [ 17 | "# Changelog", 18 | "All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.", 19 | ]; 20 | let changelog = readFileSync(path, "utf8"); 21 | for (const remove of toRemove) changelog = changelog.replace(remove, "").trim(); 22 | changelog = changelog.replaceAll(/[\n\r]{3,}/gm, "\n\n").trim(); 23 | changelog = changelog.replaceAll(/## (.*)[\n\r]{2}### /gm, "## $1\n### ").trim(); 24 | writeFile(path, changelog.trim(), "utf8", (err) => { 25 | if (err) return console.error(err); 26 | }); 27 | } 28 | 29 | if (!opt.beta) removeText("CHANGELOG.md"); 30 | else removeText("CHANGELOG-beta.md"); 31 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: Release obsidian plugin 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | bump: 7 | default: false 8 | description: "Bump version based on semantic release" 9 | type: boolean 10 | required: false 11 | beta: 12 | default: false 13 | description: "Make a beta release" 14 | type: boolean 15 | required: false 16 | push: 17 | tags: 18 | - "*" 19 | permissions: 20 | contents: write 21 | 22 | jobs: 23 | release: 24 | if: (github.event_name == 'push') || (github.event_name == 'workflow_dispatch' && !inputs.bump) 25 | uses: mara-li/reusable-workflows/.github/workflows/obsidian-plugin-release.yaml@main 26 | 27 | with: 28 | PLUGIN_NAME: ${{ github.event.repository.name}} 29 | CACHE: "pnpm" 30 | secrets: 31 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 32 | 33 | bump-version-and-release: 34 | if: ${{ inputs.bump }} 35 | uses: mara-li/reusable-workflows/.github/workflows/obsidian-plugin-bump-version.yaml@main 36 | with: 37 | PLUGIN_NAME: ${{ github.event.repository.name}} 38 | BETA: ${{ inputs.beta }} 39 | CACHE: "pnpm" 40 | BRANCH: "main" 41 | secrets: 42 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-bartender", 3 | "version": "1.0.0", 4 | "description": "Allows for rearranging the elements in the status bar and sidebar ribbon", 5 | "main": "main.js", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node esbuild.config.mjs", 9 | "build": "node esbuild.config.mjs --production", 10 | "dev:prod": "node esbuild.config.mjs --vault", 11 | "build:prod": "node esbuild.config.mjs --production --vault", 12 | "lint": "pnpm biome format --write src/", 13 | "prebuild": "tsc", 14 | "prebuild:prod": "tsc", 15 | "release": "node commit-and-tag-version.mjs" 16 | }, 17 | "keywords": [], 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/Mara-Li/obsidian-bartender/" 21 | }, 22 | "author": "nothingislost", 23 | "contributors": ["Mara-Li", "zansbang"], 24 | "license": "MIT", 25 | "devDependencies": { 26 | "@biomejs/biome": "1.9.4", 27 | "@types/electron": "npm:@ophidian/electron-types@^24.3.1", 28 | "@types/node": "^22.8.1", 29 | "@types/sortablejs": "^1.15.8", 30 | "builtin-modules": "^4.0.0", 31 | "esbuild": "^0.24.0", 32 | "i18next": "^23.16.4", 33 | "monkey-around": "^3.0.0", 34 | "obsidian": "1.7.2", 35 | "obsidian-typings": "^2.2.0", 36 | "sortablejs": "^1.15.3", 37 | "tslib": "2.8.0", 38 | "typescript": "5.6.3" 39 | }, 40 | "dependencies": { 41 | "ansi-colors": "^4.1.3", 42 | "commander": "^12.1.0", 43 | "commit-and-tag-version": "^12.5.0", 44 | "dedent": "^1.5.3", 45 | "dotenv": "^16.4.5", 46 | "fuse.js": "^7.0.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export function getPreviousSiblings( 2 | el: HTMLElement, 3 | filter?: (el: HTMLElement) => boolean 4 | ): HTMLElement[] { 5 | const sibs = []; 6 | while ((el = el.previousSibling as HTMLElement)) { 7 | if (el.nodeType === 3) continue; // text node 8 | if (!filter || filter(el)) sibs.push(el); 9 | } 10 | return sibs; 11 | } 12 | export function getNextSiblings( 13 | el: HTMLElement, 14 | filter?: (el: HTMLElement) => boolean 15 | ): HTMLElement[] { 16 | const sibs = []; 17 | while ((el = el.nextSibling as HTMLElement)) { 18 | if (el.nodeType === 3) continue; // text node 19 | if (!filter || filter(el)) sibs.push(el); 20 | } 21 | return sibs; 22 | } 23 | 24 | export interface GenerateIdOptions { 25 | useTag?: boolean; 26 | useAria?: boolean; 27 | useClass?: boolean; 28 | useIcon?: boolean; 29 | useText?: boolean; 30 | } 31 | 32 | export function generateId(el: HTMLElement, options?: GenerateIdOptions) { 33 | const classes = options?.useClass 34 | ? Array.from(el.classList) 35 | .filter((c) => !c.startsWith("is-")) 36 | .sort() 37 | .join(" ") 38 | : ""; 39 | const str = 40 | (options?.useTag ? el.tagName : "") + 41 | (options?.useClass ? classes : "") + 42 | (options?.useText ? el.textContent : "") + 43 | (options?.useAria ? el.getAttr("aria-label") : "") + 44 | (options?.useIcon ? el.querySelector("svg")?.className?.baseVal : ""); 45 | return cyrb53(str); 46 | } 47 | 48 | export function base36(str: string) { 49 | let i = str.length; 50 | let sum = 0; 51 | 52 | while (i--) { 53 | sum += str.charCodeAt(i); 54 | } 55 | return sum.toString(36); 56 | } 57 | 58 | export const cyrb53 = function (str: string, seed = 0) { 59 | let h1 = 0xdeadbeef ^ seed; 60 | let h2 = 0x41c6ce57 ^ seed; 61 | for (let i = 0, ch; i < str.length; i++) { 62 | ch = str.charCodeAt(i); 63 | h1 = Math.imul(h1 ^ ch, 2654435761); 64 | h2 = Math.imul(h2 ^ ch, 1597334677); 65 | } 66 | h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909); 67 | h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909); 68 | return 4294967296 * (2097151 & h2) + (h1 >>> 0).toString(); 69 | }; 70 | 71 | export function reorderArray(array: any[], from: number, to: number, on = 1) { 72 | return array.splice(to, 0, ...array.splice(from, on)), array; 73 | } 74 | 75 | // flatten infinity scroll root elements 76 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import { type App, PluginSettingTab, Setting } from "obsidian"; 2 | import type BartenderPlugin from "./main"; 3 | 4 | export interface BartenderSettings { 5 | statusBarOrder: string[]; 6 | ribbonBarOrder: string[]; 7 | fileExplorerOrder: Record; 8 | actionBarOrder: Record; 9 | autoHide: boolean; 10 | autoHideDelay: number; 11 | dragDelay: number; 12 | sortOrder: string; 13 | useCollapse: boolean; 14 | } 15 | 16 | export const DEFAULT_SETTINGS: BartenderSettings = { 17 | statusBarOrder: [], 18 | ribbonBarOrder: [], 19 | fileExplorerOrder: {}, 20 | actionBarOrder: {}, 21 | autoHide: false, 22 | autoHideDelay: 2000, 23 | dragDelay: 200, 24 | sortOrder: "alphabetical", 25 | useCollapse: true, 26 | }; 27 | 28 | export class SettingTab extends PluginSettingTab { 29 | plugin: BartenderPlugin; 30 | 31 | constructor(app: App, plugin: BartenderPlugin) { 32 | super(app, plugin); 33 | this.plugin = plugin; 34 | } 35 | 36 | display(): void { 37 | const { containerEl } = this; 38 | 39 | containerEl.empty(); 40 | 41 | new Setting(containerEl) 42 | .setName("Support collapse") 43 | .setDesc("Add a button to collapse the ribbon and status bar items") 44 | .addToggle((toggle) => 45 | toggle.setValue(this.plugin.settings.useCollapse).onChange((value) => { 46 | this.plugin.settings.useCollapse = value; 47 | this.plugin.saveSettings(); 48 | this.display(); 49 | }) 50 | ); 51 | if (this.plugin.settings.useCollapse) { 52 | new Setting(containerEl) 53 | .setName("Auto Collapse") 54 | .setDesc( 55 | "Automatically hide ribbon and status bar items once your mouse leaves the icon container" 56 | ) 57 | .addToggle((toggle) => 58 | toggle.setValue(this.plugin.settings.autoHide).onChange((value) => { 59 | this.plugin.settings.autoHide = value; 60 | this.plugin.saveSettings(); 61 | }) 62 | ); 63 | 64 | new Setting(containerEl) 65 | .setName("Auto Collapse Delay") 66 | .setDesc( 67 | "How long to wait before auto collapsing hidden icons on the ribbon and status bar" 68 | ) 69 | .addText((textfield) => { 70 | textfield.setPlaceholder(String(2000)); 71 | textfield.inputEl.type = "number"; 72 | textfield.setValue(String(this.plugin.settings.autoHideDelay)); 73 | textfield.onChange(async (value) => { 74 | this.plugin.settings.autoHideDelay = Number(value); 75 | this.plugin.saveSettings(); 76 | }); 77 | }); 78 | } 79 | 80 | new Setting(containerEl) 81 | .setName("Drag Start Delay (ms)") 82 | .setDesc( 83 | "How long to wait before triggering the drag behavior after clicking. ⚠️ Requires an app restart." 84 | ) 85 | .addText((textfield) => { 86 | textfield.setPlaceholder(String(200)); 87 | textfield.inputEl.type = "number"; 88 | textfield.setValue(String(this.plugin.settings.dragDelay)); 89 | textfield.onChange(async (value) => { 90 | this.plugin.settings.dragDelay = Number(value); 91 | this.plugin.saveSettings(); 92 | }); 93 | }); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /commit-and-tag-version.mjs: -------------------------------------------------------------------------------- 1 | import { Command, Option } from "commander"; 2 | import commitAndTagVersion from "commit-and-tag-version"; 3 | import dedent from "dedent"; 4 | import pkg from "ansi-colors"; 5 | const { red, dim, gray, italic, bold, cyan, blue, green, underline, yellow, theme } = pkg; 6 | 7 | const program = new Command(); 8 | 9 | theme({ 10 | danger: red, 11 | dark: dim.gray, 12 | disabled: gray, 13 | em: italic, 14 | heading: bold.underline, 15 | info: cyan, 16 | muted: dim, 17 | primary: blue, 18 | strong: bold, 19 | success: green.bold, 20 | warning: yellow.underline, 21 | }); 22 | 23 | const info = (msg) => pkg.info(msg); 24 | const heading = (msg) => pkg.heading(msg); 25 | const em = (msg) => pkg.em(msg); 26 | 27 | program 28 | .description("Bump version and create a new tag") 29 | .option("-b, --beta", "Pre-release version") 30 | .option("--dry-run", "Dry run") 31 | .addOption( 32 | new Option("-r, --release-as ", "release type version").choices([ 33 | "major", 34 | "minor", 35 | "patch", 36 | ]) 37 | ); 38 | 39 | program.parse(); 40 | const opt = program.opts(); 41 | 42 | const betaMsg = opt.beta ? em("- Pre-release\n\t") : ""; 43 | const dryRunMsg = opt.dryRun ? em("- Dry run\n\t") : ""; 44 | const releaseAsMsg = opt.releaseAs ? em(`- Release as ${underline(opt.releaseAs)}`) : ""; 45 | 46 | const msg = dedent(` 47 | ${heading("Options :")} 48 | ${betaMsg}${dryRunMsg}${releaseAsMsg} 49 | `); 50 | 51 | console.log(msg); 52 | console.log(); 53 | 54 | if (opt.beta) { 55 | console.log(`${bold.green(">")} ${info(underline("Bumping beta version..."))}`); 56 | console.log(); 57 | const bumpFiles = [ 58 | { 59 | filename: "manifest-beta.json", 60 | type: "json", 61 | }, 62 | { 63 | filename: "package.json", 64 | type: "json", 65 | }, 66 | { 67 | filename: "package-lock.json", 68 | type: "json", 69 | }, 70 | ]; 71 | commitAndTagVersion({ 72 | infile: "CHANGELOG-beta.md", 73 | bumpFiles, 74 | prerelease: "", 75 | dryRun: opt.dryRun, 76 | tagPrefix: "", 77 | scripts: { 78 | postchangelog: "node hooks/_changelog.mjs -b", 79 | }, 80 | }) 81 | .then(() => { 82 | console.log("Done"); 83 | }) 84 | .catch((err) => { 85 | console.error(err); 86 | }); 87 | } else { 88 | const versionBumped = opt.releaseAs 89 | ? info(`Release as ${underline(opt.releaseAs)}`) 90 | : info("Release"); 91 | console.log(`${bold.green(">")} ${underline(versionBumped)}`); 92 | console.log(); 93 | 94 | const bumpFiles = [ 95 | { 96 | filename: "manifest-beta.json", 97 | type: "json", 98 | }, 99 | { 100 | filename: "package.json", 101 | type: "json", 102 | }, 103 | { 104 | filename: "package-lock.json", 105 | type: "json", 106 | }, 107 | { 108 | filename: "manifest.json", 109 | type: "json", 110 | }, 111 | ]; 112 | 113 | commitAndTagVersion({ 114 | infile: "CHANGELOG.md", 115 | bumpFiles, 116 | dryRun: opt.dryRun, 117 | tagPrefix: "", 118 | releaseAs: opt.releaseAs, 119 | scripts: { 120 | postchangelog: "node hooks/_changelog.mjs", 121 | }, 122 | }) 123 | .then(() => { 124 | console.log("Done"); 125 | }) 126 | .catch((err) => { 127 | console.error(err); 128 | }); 129 | } 130 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": false, 10 | "complexity": { 11 | "noExtraBooleanCast": "error", 12 | "noMultipleSpacesInRegularExpressionLiterals": "error", 13 | "noUselessCatch": "error", 14 | "noWith": "error" 15 | }, 16 | "style": { 17 | "noVar": "error", 18 | "useFilenamingConvention": "error", 19 | "useImportType": "error", 20 | "useNamingConvention": { 21 | "level": "warn", 22 | "options": { 23 | "strictCase": false 24 | } 25 | }, 26 | "useTemplate": "warn", 27 | "useConst": "error" 28 | }, 29 | "correctness": { 30 | "noConstAssign": "error", 31 | "noConstantCondition": "error", 32 | "noEmptyCharacterClassInRegex": "error", 33 | "noEmptyPattern": "error", 34 | "noGlobalObjectCalls": "error", 35 | "noInnerDeclarations": "error", 36 | "noInvalidConstructorSuper": "error", 37 | "noNewSymbol": "error", 38 | "noNonoctalDecimalEscape": "error", 39 | "noPrecisionLoss": "error", 40 | "noSelfAssign": "error", 41 | "noSetterReturn": "error", 42 | "noSwitchDeclarations": "error", 43 | "noUnreachable": "error", 44 | "noUnreachableSuper": "error", 45 | "noUnsafeFinally": "error", 46 | "noUnsafeOptionalChaining": "error", 47 | "noUnusedLabels": "off", 48 | "noUnusedVariables": "off", 49 | "noUnusedImports": "warn", 50 | "useIsNan": "error", 51 | "useValidForDirection": "error", 52 | "useYield": "error" 53 | }, 54 | "suspicious": { 55 | "noAssignInExpressions": "off", 56 | "noAsyncPromiseExecutor": "error", 57 | "noCatchAssign": "error", 58 | "noClassAssign": "error", 59 | "noCompareNegZero": "error", 60 | "noControlCharactersInRegex": "error", 61 | "noDebugger": "error", 62 | "noDuplicateCase": "error", 63 | "noDuplicateClassMembers": "error", 64 | "noDuplicateObjectKeys": "error", 65 | "noDuplicateParameters": "error", 66 | "noEmptyBlockStatements": "error", 67 | "noFallthroughSwitchClause": "error", 68 | "noFunctionAssign": "error", 69 | "noGlobalAssign": "error", 70 | "noImportAssign": "error", 71 | "noMisleadingCharacterClass": "error", 72 | "noPrototypeBuiltins": "off", 73 | "noRedeclare": "error", 74 | "noShadowRestrictedNames": "error", 75 | "noUnsafeNegation": "error", 76 | "useGetterReturn": "error", 77 | "useValidTypeof": "error" 78 | } 79 | }, 80 | "ignore": ["**/npm node_modules", "**/build", "**/dist", "**/src/i18n/locales"] 81 | }, 82 | "overrides": [ 83 | { 84 | "ignore": ["**/*.js"], 85 | "include": ["**/*.ts", "**/*.tsx"] 86 | }, 87 | { 88 | "include": ["**/*.js"] 89 | }, 90 | { 91 | "include": ["*.json"] 92 | } 93 | ], 94 | "formatter": { 95 | "enabled": true, 96 | "indentStyle": "tab", 97 | "indentWidth": 2, 98 | "lineWidth": 90 99 | }, 100 | "javascript": { 101 | "formatter": { 102 | "quoteStyle": "double", 103 | "semicolons": "always", 104 | "trailingCommas": "es5" 105 | } 106 | }, 107 | "json": { 108 | "formatter": { 109 | "trailingCommas": "none" 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: "Feature request" 2 | description: "Suggest an idea for this project" 3 | title: "[FR]: " 4 | labels: ["enhancement"] 5 | assignees: 6 | - Mara-Li 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: Thanks for taking the time to fill out this Feature request! 11 | - type: checkboxes 12 | attributes: 13 | label: Issue validation 14 | description: | 15 | - Thanks to check if your issue is relative to the repository. Any non relative or duplicate issue will be closed. 16 | - Please, check the documentation and the configuration files before submitting your request. 17 | - Issue not in English will be closed. 18 | 19 | > [!WARNING] 20 | > The code is not my own, so I can't guarantee I can fix everything, as I barely understand some part of it. 21 | > As the plugin is heavy experimental, you should understand that most of the time, I can't accept the request, or it will take a long time to be implemented. 22 | > Moreover, it patch some part of the internal code of Obsidian, and can break some part of it, or broke at any update of Obsidian. 23 | options: 24 | - label: "I checked the issue to prevent duplicate" 25 | required: true 26 | - label: "I checked my configurations files and the documentation" 27 | required: true 28 | - type: textarea 29 | id: describe-request 30 | attributes: 31 | label: Is your feature related to a problem ? 32 | description: If you found a solution with the inherent limit I had with Obsidian, please, add it here! 33 | placeholder: "Tell me the original problem" 34 | - type: textarea 35 | id: describe-solution 36 | attributes: 37 | label: What solution do you want to see ? 38 | description: Describe your idea here! 39 | validations: 40 | required: true 41 | - type: textarea 42 | id: alternative 43 | attributes: 44 | label: Describe the alternative you've considered 45 | - type: textarea 46 | attributes: 47 | label: Anything else? 48 | description: | 49 | Links? References? Anything that will give us more context about the issue you are encountering! 50 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 51 | validations: 52 | required: false 53 | - type: markdown 54 | attributes: 55 | value: | 56 | ## Environment 57 | Please fill out the following information about your environment. If you are unsure about any of them, just leave it blank. 58 | - type: dropdown 59 | id: version 60 | attributes: 61 | label: OS 62 | description: Check your OS 63 | multiple: true 64 | options: 65 | - IOS 66 | - Android 67 | - MacOS 68 | - Windows 69 | - Linux 70 | - type: textarea 71 | attributes: 72 | label: Obsidian information 73 | description: | 74 | Please copy and paste the information about your Obsidian version using the command "show debug info" in the obsidian's commands palette. 75 | render: bash session 76 | validations: 77 | required: true 78 | - type: input 79 | id: plugin-version 80 | attributes: 81 | label: Plugin version 82 | description: Please copy and paste the version of the plugin you are using. 83 | placeholder: "1.0.0" 84 | validations: 85 | required: true -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.5.20](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.18...0.5.20) (2024-11-18) 2 | ### Bug Fixes 3 | 4 | * remove deprecated "is-being-dragged" usage ([bd91295](https://github.com/Mara-Li/obsidian-bartender/commit/bd9129597b6159f03b026c38caefa510ce2af4a1)), closes [#17](https://github.com/Mara-Li/obsidian-bartender/issues/17) 5 | * **sorter:** collision between draggable into folder & drag to rearrange (Obsidian v.1.7.4) ([2781f27](https://github.com/Mara-Li/obsidian-bartender/commit/2781f27a0da285bde4e20d45db195d3fd5e5fc2f)), closes [#15](https://github.com/Mara-Li/obsidian-bartender/issues/15) 6 | 7 | ## [0.5.19](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.18...0.5.19) (2024-10-26) 8 | ### Bug Fixes 9 | 10 | * **sorter:** collision between draggable into folder & drag to rearrange (Obsidian v.1.7.4) ([7e21e19](https://github.com/Mara-Li/obsidian-bartender/commit/7e21e190c1c6f8b85f2f361a8a6c4776b74d4aa0)) 11 | 12 | ## [0.5.18](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.17-1...0.5.18) (2024-10-20) 13 | ### Bug Fixes 14 | 15 | * **filter:** Prevent dragging when filtering without clicking rearrange ([e0dbb42](https://github.com/Mara-Li/obsidian-bartender/commit/e0dbb42e79ddb866c00e4ccfb6288074b3d6882e)) 16 | * **leaf:** file closed at plugin load ([bcae354](https://github.com/Mara-Li/obsidian-bartender/commit/bcae354f3e8d41397a2cf3c4932a7b27b3fc2d40)), closes [#13](https://github.com/Mara-Li/obsidian-bartender/issues/13) 17 | 18 | ## 0.5.17 (2024-10-14) 19 | 20 | ## [0.5.16](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.15...0.5.16) (2024-09-05) 21 | ### Features 22 | 23 | * **filter:** exclude user defined excluded files/folder ([9554b9e](https://github.com/Mara-Li/obsidian-bartender/commit/9554b9efb6edaa31686551d80c8f7bab5af7a2b6)), closes [#4](https://github.com/Mara-Li/obsidian-bartender/issues/4) 24 | * **filter:** path shortener ([c3607d3](https://github.com/Mara-Li/obsidian-bartender/commit/c3607d3911c7828a237848b6b460bb3294331296)), closes [#5](https://github.com/Mara-Li/obsidian-bartender/issues/5) 25 | 26 | ### Bug Fixes 27 | 28 | * adjust position of custom sort ([9d1a8dc](https://github.com/Mara-Li/obsidian-bartender/commit/9d1a8dcbdd4e18dc1e7f702c7f06c875801e8f49)) 29 | 30 | ## [0.5.15](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.14...0.5.15) (2024-09-04) 31 | ### Bug Fixes 32 | 33 | * bartender doesn't appear with new Obsidian version (up to 1.7.1) ([ef06301](https://github.com/Mara-Li/obsidian-bartender/commit/ef063015a27b0fbfcb62291203918fb7b7713ab2)) 34 | 35 | ## [0.5.14](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.13...0.5.14) (2024-06-11) 36 | 37 | ## [0.5.13](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.12...0.5.13) (2024-06-10) 38 | ### Features 39 | 40 | * support to disable collapse ([2184b78](https://github.com/Mara-Li/obsidian-bartender/commit/2184b78ce69ea75dc735a1d5aef335ff2752148b)) 41 | 42 | ## [0.5.12](https://github.com/Mara-Li/obsidian-bartender/compare/0.5.11...0.5.12) (2024-06-09) 43 | ### Features 44 | 45 | * support for deleting and renaming folder ([8445697](https://github.com/Mara-Li/obsidian-bartender/commit/84456974311945d916fc44206e19010e96529906)) 46 | 47 | ## [0.5.11](https://github.com/Mara-Li/obsidian-bartender/compare/v0.5.9...v0.5.11) (2024-06-09) 48 | ### Features 49 | 50 | * respect obsidian button & change button when switching on custom order ([cefc9e1](https://github.com/Mara-Li/obsidian-bartender/commit/cefc9e1973248f7b99bf8c2be5b1f94331dbb311)) 51 | 52 | ### Bug Fixes 53 | 54 | * doesn't work on root ([7942391](https://github.com/Mara-Li/obsidian-bartender/commit/79423911833a2affe2447dd37f5f6271a65c1b04)) 55 | * root.file.path not found ([fa880e2](https://github.com/Mara-Li/obsidian-bartender/commit/fa880e2818f7e12c737483ed5362db8ed8d0576d)) 56 | * use setIcon ([775e3e4](https://github.com/Mara-Li/obsidian-bartender/commit/775e3e4e5d34b4cc36884900733958302450435f)) -------------------------------------------------------------------------------- /src/types/obsidian.d.ts: -------------------------------------------------------------------------------- 1 | import "obsidian"; 2 | import type { AppVaultConfig } from "obsidian-typings"; 3 | import type Sortable from "sortablejs"; 4 | 5 | declare module "obsidian" { 6 | export interface Workspace extends Events { 7 | on(name: "status-bar-updated", callback: () => any, ctx?: any): EventRef; 8 | on(name: "ribbon-bar-updated", callback: () => any, ctx?: any): EventRef; 9 | on(name: "bartender-workspace-change", callback: () => any, ctx?: any): EventRef; 10 | on( 11 | name: "bartender-leaf-split", 12 | callback: (originLeaf: WorkspaceItem, newLeaf: WorkspaceItem) => any, 13 | ctx?: any 14 | ): EventRef; 15 | on( 16 | name: "view-registered", 17 | callback: (type: string, viewCreator: ViewCreator) => any, 18 | ctx?: any 19 | ): EventRef; 20 | on( 21 | name: "file-explorer-load", 22 | callback: (fileExplorer: FileExplorerView) => any, 23 | ctx?: any 24 | ): EventRef; 25 | on( 26 | name: "file-explorer-sort-change", 27 | callback: (sortMethod: string) => any, 28 | ctx?: any 29 | ): EventRef; 30 | on( 31 | name: "infinity-scroll-compute", 32 | callback: (infinityScroll: InfinityScroll) => any, 33 | ctx?: any 34 | ): EventRef; 35 | on( 36 | name: "file-explorer-draggable-change", 37 | callback: (dragEnabled: boolean) => any, 38 | ctx?: any 39 | ): EventRef; 40 | on( 41 | name: "file-explorer-filter-change", 42 | callback: (filterEnabled: boolean) => any, 43 | ctx?: any 44 | ): EventRef; 45 | } 46 | interface Vault { 47 | getConfig(config: String): unknown; 48 | setConfig(config: String, value: any): void; 49 | config: AppVaultConfig; 50 | } 51 | export interface PluginInstance { 52 | id: string; 53 | } 54 | interface View { 55 | actionsEl: HTMLElement; 56 | iconSorter?: Sortable; 57 | } 58 | interface WorkspaceLeaf { 59 | tabHeaderEl: HTMLElement; 60 | parentSplit: WorkspaceSplit; 61 | iconSorter?: Sortable; 62 | } 63 | interface WorkspaceSplit { 64 | children: WorkspaceTabs[]; 65 | } 66 | interface WorkspaceItem { 67 | tabsInnerEl: HTMLElement; 68 | view: View; 69 | type: string; 70 | } 71 | interface WorkspaceTabs { 72 | children: WorkspaceLeaf[]; 73 | component: Component; 74 | currentTab: number; 75 | iconSorter?: Sortable; 76 | recomputeChildrenDimensions(): void; 77 | updateDecorativeCurves(): void; 78 | } 79 | export interface ViewRegistry { 80 | viewByType: Record unknown>; 81 | isExtensionRegistered(extension: string): boolean; 82 | } 83 | 84 | export interface App { 85 | internalPlugins: InternalPlugins; 86 | viewRegistry: ViewRegistry; 87 | } 88 | export interface InstalledPlugin { 89 | enabled: boolean; 90 | instance: PluginInstance; 91 | } 92 | 93 | export interface InternalPlugins { 94 | plugins: Record; 95 | getPluginById(id: string): InstalledPlugin; 96 | } 97 | export interface FileExplorerView extends View { 98 | dom: FileExplorerViewDom; 99 | tree: FileExplorerViewDom; 100 | createFolderDom(folder: TFolder): FileExplorerFolder; 101 | headerDom: FileExplorerHeader; 102 | sortOrder: string; 103 | hasCustomSorter?: boolean; 104 | dragEnabled: boolean; 105 | setSortOrder(order: String): void; 106 | } 107 | interface FileExplorerHeader { 108 | addSortButton(sorter: (sortType: string) => void, sortOrder: () => string): void; 109 | navHeaderEl: HTMLElement; 110 | } 111 | interface FileExplorerFolder {} 112 | export interface FileExplorerViewDom { 113 | infinityScroll: InfinityScroll; 114 | navFileContainerEl: HTMLElement; 115 | } 116 | export interface InfinityScroll { 117 | rootEl: RootElements; 118 | scrollEl: HTMLElement; 119 | filtered: boolean; 120 | filter: string; 121 | compute(): void; 122 | } 123 | export interface VirtualChildren { 124 | children: ChildElement[]; 125 | _children: ChildElement[]; 126 | owner: ChildElement; 127 | } 128 | export interface RootElements { 129 | childrenEl: HTMLElement; 130 | children: ChildElement[]; 131 | _children: ChildElement[]; 132 | vChildren: VirtualChildren; 133 | file: TAbstractFile; 134 | sorter: Sortable; 135 | fileExplorer: FileExplorerView; 136 | } 137 | export interface ChildElement { 138 | el: HTMLElement; 139 | file: TAbstractFile; 140 | fileExplorer: FileExplorerView; 141 | titleEl: HTMLElement; 142 | titleInnerEl: HTMLElement; 143 | children?: ChildElement[]; 144 | vChildren: VirtualChildren; 145 | childrenEl?: HTMLElement; 146 | sorter?: Sortable; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: "Bug report" 2 | description: Fill a bug report 3 | title: "[Bug]: " 4 | labels: ["bug"] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: Thanks for taking the time to fill out this bug report. 10 | - type: checkboxes 11 | attributes: 12 | label: Issue validation 13 | description: | 14 | - Thanks to check if your issue is relative to the repository. Any non relative or duplicate issue will be closed. 15 | - Please, check the documentation and the configuration files before submitting your request. 16 | - Issue not in English will be closed. 17 | 18 | > [!WARNING] 19 | > The code is not my own, so I can't guarantee I can fix everything, as I barely understand some part of it. But I will do my best to help you. 20 | > Moreover, it patch some part of the internal code of Obsidian, and can break some part of it, or broke at any update of Obsidian. Consider the plugin as heavy experimental. 21 | options: 22 | - label: "I checked the issue to prevent duplicate" 23 | required: true 24 | - label: "I checked my configurations files and the documentation" 25 | required: true 26 | - type: textarea 27 | id: describe-bug 28 | attributes: 29 | label: Describe the bug 30 | description: A clear and concise description of what the bug is. 31 | placeholder: "Tell us what you see! And don't forget the error" 32 | validations: 33 | required: true 34 | - type: textarea 35 | id: repro-bug 36 | attributes: 37 | label: How to reproduce ? 38 | description: Step to reproduce the behavior 39 | placeholder: | 40 | 1. Go to '...' 41 | 2. Click on '....' 42 | 3. Scroll down to '....' 43 | 4. See error 44 | validations: 45 | required: false 46 | - type: textarea 47 | id: minimal-repro 48 | attributes: 49 | label: Minimal Reproducible Example 50 | description: Please provide a minimal reproducible example. 51 | validations: 52 | required: true 53 | - type: textarea 54 | attributes: 55 | label: Configuration 56 | description: | 57 | Open the configuration settings with any text editor. The settings are located in `.obsidian/plugins/obsidian-bartender/data.json` 58 | render: JSON 59 | validations: 60 | required: true 61 | - type: textarea 62 | id: logs 63 | attributes: 64 | label: Relevant log output 65 | description: | 66 | Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. You can open the Obsidian's console with "CTRL+MAJ+I." 67 | render: bash session 68 | - type: textarea 69 | attributes: 70 | label: Anything else? 71 | description: | 72 | Links? References? Anything that will give us more context about the issue you are encountering! 73 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 74 | validations: 75 | required: false 76 | - type: markdown 77 | attributes: 78 | value: | 79 | ## Environment 80 | Please fill out the following information about your environment. If you are unsure about any of them, just leave it blank. 81 | - type: dropdown 82 | id: version 83 | attributes: 84 | label: OS 85 | description: Check your OS 86 | multiple: true 87 | options: 88 | - IOS 89 | - Android 90 | - MacOS 91 | - Windows 92 | - Linux 93 | - type: textarea 94 | attributes: 95 | label: Obsidian information 96 | description: | 97 | Please copy and paste the information about your Obsidian version using the command "show debug info" in the obsidian's commands palette. 98 | render: bash session 99 | validations: 100 | required: true 101 | - type: input 102 | id: plugin-version 103 | attributes: 104 | label: Plugin version 105 | description: Please copy and paste the version of the plugin you are using. 106 | placeholder: "1.0.0" 107 | validations: 108 | required: true -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import * as fs from "fs"; 2 | import process from "node:process"; 3 | import * as path from "path"; 4 | import builtins from "builtin-modules"; 5 | import { Command } from "commander"; 6 | import dotenv from "dotenv"; 7 | import esbuild from "esbuild"; 8 | import manifest from "./manifest.json" with { type: "json" }; 9 | import packageJson from "./package.json" with { type: "json" }; 10 | 11 | const banner = `/* 12 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 13 | if you want to view the source, please visit the github repository of this plugin: ${packageJson.repository} 14 | */ 15 | `; 16 | 17 | function cleanOutdir(outdir) { 18 | if (fs.existsSync(outdir)) { 19 | fs.rm(outdir, { recursive: true }); 20 | } 21 | } 22 | 23 | dotenv.config(); 24 | 25 | const program = new Command(); 26 | program 27 | .option("-p, --production", "Production build") 28 | .option("-v, --vault", "Use vault path") 29 | .option("-o, --output-dir ", "Output path") 30 | .option("-b, --beta", "Pre-release version") 31 | .parse(); 32 | program.parse(); 33 | 34 | /** OPTIONS */ 35 | const opt = program.opts(); 36 | const prod = opt.production ?? false; 37 | const exportToVault = opt.vault ?? false; 38 | 39 | /** VARIABLES **/ 40 | const isStyled = fs.existsSync("src/styles.css"); 41 | const pluginID = manifest.id; 42 | 43 | /** FOLDER PATHS **/ 44 | const vaultPath = process.env.VAULT; 45 | const folderPlugin = vaultPath 46 | ? path.join(vaultPath, ".obsidian", "plugins", pluginID) 47 | : undefined; 48 | 49 | if (vaultPath && exportToVault && !fs.existsSync(folderPlugin)) { 50 | fs.mkdirSync(folderPlugin, { recursive: true }); 51 | } 52 | if (opt.beta && !fs.existsSync("manifest-beta.json")) { 53 | fs.copyFileSync("manifest.json", "manifest-beta.json"); 54 | } 55 | 56 | let outDir = "./"; 57 | if (opt.outputDir) { 58 | outDir = opt.outputDir; 59 | cleanOutdir(outDir); 60 | } else if (exportToVault) { 61 | outDir = folderPlugin; 62 | if (!prod) fs.writeFileSync(path.join(folderPlugin, ".hotreload"), ""); 63 | } else if (prod) { 64 | outDir = "./dist"; 65 | //clean dist if 66 | cleanOutdir(outDir); 67 | } 68 | 69 | /** 70 | * Move styles.css to output directory 71 | */ 72 | const moveStyles = { 73 | name: "move-styles", 74 | setup(build) { 75 | build.onEnd(() => { 76 | fs.copyFileSync("src/styles.css", "./styles.css"); 77 | }); 78 | }, 79 | }; 80 | 81 | /** 82 | * Export to vault if set in environment variable 83 | */ 84 | const exportToVaultFunc = { 85 | name: "export-to-vault", 86 | setup(build) { 87 | build.onEnd(() => { 88 | if (!folderPlugin) 89 | throw new Error("VAULT environment variable not set, skipping export to vault"); 90 | 91 | fs.copyFileSync(`${outDir}/main.js`, path.join(folderPlugin, "main.js")); 92 | if (fs.existsSync(`${outDir}/styles.css`)) 93 | fs.copyFileSync("./styles.css", path.join(folderPlugin, "styles.css")); 94 | if (opt.beta) 95 | fs.copyFileSync("manifest-beta.json", path.join(folderPlugin, "manifest.json")); 96 | else fs.copyFileSync("./manifest.json", path.join(folderPlugin, "manifest.json")); 97 | }); 98 | }, 99 | }; 100 | 101 | /** 102 | * Export to production folder 103 | */ 104 | const exportToDist = { 105 | name: "export-to-dist", 106 | setup(build) { 107 | build.onEnd(() => { 108 | if (opt.beta) 109 | fs.copyFileSync("manifest-beta.json", path.join(outDir, "manifest.json")); 110 | else fs.copyFileSync("manifest.json", path.join(outDir, "manifest.json")); 111 | }); 112 | }, 113 | }; 114 | 115 | /** 116 | * ENTRIES * 117 | */ 118 | const entryPoints = ["src/main.ts"]; 119 | if (isStyled) entryPoints.push("src/styles.css"); 120 | 121 | /** PLUGINS **/ 122 | const plugins = []; 123 | if (isStyled) plugins.push(moveStyles); 124 | if (prod) plugins.push(exportToDist); 125 | if (prod && exportToVault) plugins.push(exportToVaultFunc); 126 | 127 | /** 128 | * BUILD 129 | */ 130 | const context = await esbuild.context({ 131 | banner: { 132 | js: banner, 133 | }, 134 | entryPoints, 135 | bundle: true, 136 | external: [ 137 | "obsidian", 138 | "electron", 139 | "@codemirror/autocomplete", 140 | "@codemirror/collab", 141 | "@codemirror/commands", 142 | "@codemirror/language", 143 | "@codemirror/lint", 144 | "@codemirror/search", 145 | "@codemirror/state", 146 | "@codemirror/view", 147 | "@lezer/common", 148 | "@lezer/highlight", 149 | "@lezer/lr", 150 | ...builtins, 151 | ], 152 | format: "cjs", 153 | target: "esnext", 154 | logLevel: "info", 155 | sourcemap: prod ? false : "inline", 156 | treeShaking: true, 157 | minifySyntax: prod, 158 | minifyWhitespace: prod, 159 | outdir: outDir, 160 | plugins, 161 | }); 162 | 163 | if (prod) { 164 | console.log("🎉 Build for production"); 165 | console.log(`📤 Output directory: ${outDir}`); 166 | await context.rebuild(); 167 | console.log("✅ Build successful"); 168 | process.exit(0); 169 | } else { 170 | console.log("🚀 Start development build"); 171 | console.log(`📤 Output directory: ${outDir}`); 172 | await context.watch(); 173 | } 174 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!IMPORTANT] 2 | > This plugin is now archived in favor of [Manual Sorting](https://github.com/Kh4f/obsidian-manual-sorting). 3 | > Manual Sorting provides similar features with a smoother user experience. It offers an intuitive UI, reliable file and folder reordering, and is actively maintained to stay compatible with Obsidian's updates. 4 | 5 | Thanks to everyone who used and supported Obsidian Bartender! 6 | 7 | --- 8 | # Obsidian Bartender 9 | 10 | > [!WARNING] 11 | > The plugin is heavely experimental and use some internal function of Obsidian to make it works. It can break at any update of Obsidian. 12 | > As I'm not the original maintainer some part of the code are obscure to me. I will try to fix any bug you can [make](https://github.com/Mara-Li/obsidian-bartender/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml&title=%5BBug%5D%3A+), but new feature can be difficult to support. 13 | > More over, the loading of the plugin and the unloading doesn't work pretty well, and you **always** should to reload Obsidian to make it works. 14 | 15 | Take control of your Obsidian workspace by organizing, rearranging, and filtering the file explorer. It also adds collapse (optionally) in the status bar and ribbon. 16 | 17 | ## File Explorer 18 | 19 | To rearrange : 20 | - Click on the sort icon ![image](https://github.com/Mara-Li/obsidian-bartender/assets/30244939/146d3e09-43f6-4b7f-8509-ed15d4427ccf) 21 | - Choose "custom", the icon will change to: ![image](https://github.com/Mara-Li/obsidian-bartender/assets/30244939/9bb320f1-0e52-46cd-8e70-c02181c52619) and a burger button will appear next to it: ![image](https://github.com/Mara-Li/obsidian-bartender/assets/30244939/8c41438c-8690-41e2-a4a2-83c29d203486) 22 | - Click on the burger 23 | - Now, drag and drop the folder or files you want to move. 24 | - When you are pleased, click again on the burger to disable rearranging. 25 | - Keep the sort option on custom to keep your rearrange. If you want to return at any sort of Obsidian, just click again on the "move" icon and choose your sort. 26 | 27 | ### Filtering 28 | 29 | The file explorer can be filtered using fuse.js extended search syntax: 30 | 31 | White space acts as an **AND** operator, while a single pipe (`|`) character acts as an **OR** operator. To escape white space, use double quote ex. `="scheme language"` for exact match. 32 | 33 | | Token | Match type | Description | 34 | | ----------- | -------------------------- | -------------------------------------- | 35 | | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | 36 | | `=scheme` | exact-match | Items that are `scheme` | 37 | | `'python` | include-match | Items that include `python` | 38 | | `!ruby` | inverse-exact-match | Items that do not include `ruby` | 39 | | `^java` | prefix-exact-match | Items that start with `java` | 40 | | `!^erlang` | inverse-prefix-exact-match | Items that do not start with `erlang` | 41 | | `.js$` | suffix-exact-match | Items that end with `.js` | 42 | | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | 43 | 44 | White space acts as an **AND** operator, while a single pipe (`|`) character acts as an **OR** operator. 45 | 46 | ## Installation 47 | 48 | - [x] Using [BRAT](https://tfthacker.com/BRAT) with `https://github.com/mara-li/obsidian-bartender` 49 | → Or copy and open `obsidian://brat?plugin=mara-li/obsidian-bartender` in your explorer or browser. It will automatically open Obsidian and install the plugin. 50 | - [x] From the release page: 51 | - Download the latest release 52 | - Unzip `obsidian-bartender.zip` in `.obsidian/plugins/` path 53 | - In Obsidian settings, at "Community Plugin", reload the plugin list 54 | - Enable the plugin (or reload it if already installed) 55 | 56 | 57 | ## Compatibility 58 | 59 | Some plugins will cause bug to this plugin. You can try to force the loading of Bartender after them to prevents issues. 60 | 61 | The best way is to use [Lazy plugin loader](https://github.com/alangrainger/obsidian-lazy-plugins) and set bartender to load at short (other must be instant). 62 | 63 | If anyone know what are the plugins that cause issues, please let me know and I will add a list here. 64 | 65 | For the moment, plugin that **can maybe** (not sure) cause issues, are: 66 | - [Explorer Hider](https://github.com/Mara-Li/obsidian-explorer-hider) 67 | - [Iconic](https://github.com/gfxholo/iconic) 68 | - [Iconize](https://github.com/FlorianWoelki/obsidian-iconize) 69 | - Workspace (official): Bartender prevent the explorer to load (as in Obsidian v1.8.7). 70 | 71 | ## Credit 72 | 73 | - Original work: [NothingIsLost](https://github.com/nothingislost/obsidian-bartender/) 74 | - Update for Obsidian 1.5.8: [zansbang](https://github.com/zansbang/obsidian-bartender) 75 | 76 | --- 77 | Discord server support 78 | -------------------------------------------------------------------------------- /src/styles.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --left-indicator: url('data:image/svg+xml;utf8,'); 3 | --right-indicator: url('data:image/svg+xml;utf8,'); 4 | --up-indicator: url('data:image/svg+xml;utf8,'); 5 | --down-indicator: url('data:image/svg+xml;utf8,'); 6 | } 7 | 8 | .side-dock-actions .sortable-ghost, 9 | .status-bar .sortable-ghost, 10 | .view-actions .sortable-ghost, 11 | .workspace-tab-header-container .sortable-ghost { 12 | visibility: hidden; 13 | } 14 | 15 | .side-dock-ribbon div.separator { 16 | cursor: grab; 17 | padding: 0px 4px; 18 | display: flex; 19 | place-items: center; 20 | justify-content: center; 21 | height: 1em; 22 | } 23 | 24 | div.separator svg { 25 | background-color: currentColor; 26 | } 27 | 28 | .side-dock-ribbon div.separator .glyph { 29 | /* margin-top: -4px; */ 30 | display: flex; 31 | align-self: flex-end; 32 | } 33 | 34 | .side-dock-ribbon div.separator:hover { 35 | /* some themes highlight the hovered icon and it looks bad on the separator */ 36 | background: none; 37 | } 38 | 39 | .side-dock-ribbon div.separator svg { 40 | -webkit-mask-image: var(--up-indicator); 41 | } 42 | .side-dock-ribbon div.separator.is-collapsed.bt-sortable-chosen svg { 43 | /* so that the icon updates to show the expand icon on drag start */ 44 | -webkit-mask-image: var(--up-indicator); 45 | } 46 | .side-dock-ribbon div.separator.is-collapsed svg { 47 | -webkit-mask-image: var(--down-indicator); 48 | } 49 | 50 | /* for minimal floating ribbon support */ 51 | 52 | .hider-ribbon .side-dock-ribbon div.separator { 53 | height: 26px; 54 | } 55 | 56 | .hider-ribbon .side-dock-ribbon div.separator .glyph { 57 | display: flex; 58 | align-self: flex-end; 59 | } 60 | .hider-ribbon .side-dock-ribbon div.separator svg { 61 | -webkit-mask-image: var(--left-indicator); 62 | } 63 | .hider-ribbon .side-dock-ribbon div.separator.is-collapsed.bt-sortable-chosen svg { 64 | /* so that the icon updates to show the expand icon on drag start */ 65 | -webkit-mask-image: var(--left-indicator); 66 | } 67 | .hider-ribbon .side-dock-ribbon div.separator.is-collapsed svg { 68 | -webkit-mask-image: var(--right-indicator); 69 | } 70 | 71 | .view-actions div.separator.is-collapsed { 72 | transform: rotateY(180deg); 73 | } 74 | 75 | .status-bar .is-hidden, 76 | .side-dock-ribbon .is-hidden, 77 | .view-actions .is-hidden { 78 | /* if you're mad about this !important 79 | set the --is-hidden-display variable to override it */ 80 | --is-hidden-display: none; 81 | display: var(--is-hidden-display) !important; 82 | } 83 | 84 | .status-bar div.separator { 85 | --cursor: grab; /* to deal with minimal theme */ 86 | cursor: grab; 87 | padding: 0px 4px; 88 | display: flex; 89 | align-items: center; 90 | /* line-height: 1; */ 91 | } 92 | 93 | .status-bar div.separator .glyph { 94 | display: flex; 95 | } 96 | 97 | .status-bar div.separator svg, 98 | .status-bar div.separator.is-collapsed.bt-sortable-chosen svg { 99 | -webkit-mask-image: var(--right-indicator); 100 | } 101 | 102 | .status-bar div.separator.is-collapsed svg { 103 | -webkit-mask-image: var(--left-indicator); 104 | } 105 | 106 | .side-dock-ribbon div.side-dock-ribbon-action.bt-sortable-chosen, 107 | .side-dock-ribbon div.separator.bt-sortable-chosen, 108 | .status-bar div.separator.bt-sortable-chosen { 109 | --cursor: grabbing; 110 | cursor: grabbing; 111 | } 112 | 113 | body.is-dragging .tooltip { 114 | display: none; 115 | } 116 | 117 | .workspace-tab-header-container.is-dragging .workspace-tab-header, 118 | .workspace-tab-header-container.is-dragging .workspace-tab-container-before, 119 | .workspace-tab-header-container.is-dragging .workspace-tab-container-after { 120 | background: none; 121 | } 122 | .workspace-tab-header-container.is-dragging .workspace-tab-header-inner-icon:hover { 123 | background: none; 124 | } 125 | 126 | .workspace-leaf-content[data-type="file-explorer"] .nav-header .search-input-container { 127 | display: none; 128 | } 129 | 130 | .workspace-leaf-content[data-type="file-explorer"] 131 | .nav-header 132 | .search-input-container.is-active { 133 | display: block; 134 | } 135 | 136 | div.nav-action-button[data-sort-method] + div.nav-action-button.drag-to-rearrange { 137 | display: none; 138 | } 139 | 140 | div.nav-action-button[data-sort-method="custom"] 141 | + div.nav-action-button.drag-to-rearrange { 142 | display: flex; 143 | } 144 | 145 | .nav-files-container .sortable-fallback { 146 | display: none; 147 | } 148 | 149 | div.nav-buttons-container > div.nav-action-button.hide { 150 | display: none; 151 | } 152 | 153 | .search-input-container.filter { 154 | margin: 5px; 155 | } 156 | 157 | .is-moved { 158 | background-color: var(--background-secondary-alt) !important; 159 | border-color: var(--background-secondary-alt) !important; 160 | } 161 | 162 | 163 | -------------------------------------------------------------------------------- /src/patch/sorter.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type App, 3 | type ChildElement, 4 | type FileExplorerView, 5 | type RootElements, 6 | requireApiVersion, 7 | } from "obsidian"; 8 | import Sortable from "sortablejs"; 9 | import type BartenderPlugin from "../main"; 10 | import type { BartenderSettings } from "../settings"; 11 | import { ANIMATION_DURATION } from "../types/constant"; 12 | import { reorderArray } from "../utils"; 13 | 14 | export class CustomSorter { 15 | plugin: BartenderPlugin; 16 | settings: BartenderSettings; 17 | app: App; 18 | 19 | constructor(plugin: BartenderPlugin) { 20 | this.plugin = plugin; 21 | this.settings = plugin.settings; 22 | this.app = plugin.app; 23 | } 24 | 25 | getRootFolders( 26 | fileExplorer?: FileExplorerView 27 | ): [RootElements | ChildElement] | undefined { 28 | if (!fileExplorer) fileExplorer = this.plugin.getFileExplorer(); 29 | if (!fileExplorer) return; 30 | const root = fileExplorer.tree?.infinityScroll?.rootEl; 31 | return root && this.traverseRoots(root); 32 | } 33 | 34 | traverseRoots( 35 | root: RootElements | ChildElement, 36 | items?: [RootElements | ChildElement] 37 | ) { 38 | if (!items) items = [root]; 39 | const supportsVirtualChildren = requireApiVersion?.("0.15.0"); 40 | const _children = supportsVirtualChildren ? root.vChildren?._children : root.children; 41 | for (const child of _children || []) { 42 | if (child.children || child.vChildren?._children) { 43 | items.push(child); 44 | } 45 | this.traverseRoots(child, items); 46 | } 47 | return items; 48 | } 49 | 50 | toggleFileExplorerSorters(enable: boolean) { 51 | const fileExplorer = this.plugin.getFileExplorer(); 52 | const roots = this.getRootFolders(fileExplorer); 53 | if (roots?.length) { 54 | for (const root of roots) { 55 | if (root.sorter) { 56 | root.sorter.option("sort", enable); 57 | root.sorter.option("disabled", !enable); 58 | } 59 | } 60 | } 61 | } 62 | 63 | cleanupFileExplorerSorters() { 64 | const fileExplorer = this.plugin.getFileExplorer(); 65 | const roots = this.getRootFolders(fileExplorer); 66 | if (roots?.length) { 67 | for (const root of roots) { 68 | if (root.sorter) { 69 | root.sorter.destroy(); 70 | delete root.sorter; 71 | Object.keys(root.childrenEl!).forEach( 72 | (key) => key.startsWith("Sortable") && delete (root.childrenEl as any)[key] 73 | ); 74 | // sortable.destroy removes all of the draggble attributes :( so we put them back 75 | root 76 | .childrenEl!.querySelectorAll("div.nav-file-title") 77 | .forEach((el: HTMLDivElement) => (el.draggable = true)); 78 | root 79 | .childrenEl!.querySelectorAll("div.nav-folder-title") 80 | .forEach((el: HTMLDivElement) => (el.draggable = true)); 81 | } 82 | } 83 | } 84 | delete fileExplorer.hasCustomSorter; 85 | // unset "custom" file explorer sort 86 | if ( 87 | this.app.vault.getConfig("fileSortOrder") === "custom" || 88 | this.settings.sortOrder === "custom" 89 | ) { 90 | fileExplorer.setSortOrder("alphabetical"); 91 | this.settings.sortOrder = "alphabetical"; 92 | } else { 93 | fileExplorer.setSortOrder(this.settings.sortOrder); 94 | } 95 | } 96 | 97 | setFileExplorerSorter(fileExplorer?: FileExplorerView) { 98 | if (!fileExplorer) fileExplorer = this.plugin.getFileExplorer(); 99 | if ( 100 | !fileExplorer || 101 | this.settings.sortOrder !== "custom" || 102 | fileExplorer.hasCustomSorter 103 | ) 104 | return; 105 | 106 | const roots = this.getRootFolders(fileExplorer); 107 | if (!roots || !roots.length) return; 108 | for (const root of roots) { 109 | const el = root?.childrenEl; 110 | if (!el) continue; 111 | let draggedItems: HTMLElement[]; 112 | fileExplorer.hasCustomSorter = true; 113 | const dragEnabled = !!document.body 114 | .querySelector("div.nav-action-button.drag-to-rearrange") 115 | ?.hasClass("is-active"); 116 | const path = root.file?.path ?? ""; 117 | 118 | root.sorter = Sortable.create(el!, { 119 | group: `fileExplorer${path}`, 120 | forceFallback: true, 121 | multiDrag: true, 122 | // @ts-ignore 123 | multiDragKey: "alt", 124 | // selectedClass: "is-selected", 125 | chosenClass: "bt-sortable-chosen", 126 | delay: 0, 127 | disabled: !dragEnabled, 128 | sort: dragEnabled, // init with dragging disabled. the nav bar button will toggle on/off 129 | animation: ANIMATION_DURATION, 130 | onStart: (evt) => { 131 | draggedItems = evt.items.length ? evt.items : [evt.item]; 132 | //disable the draggable 133 | for (const elem of draggedItems) { 134 | const it = elem.querySelector(".tree-item-self") as HTMLElement | undefined; 135 | if (it) { 136 | it.draggable = false; 137 | it.classList.add("is-moved"); 138 | } 139 | } 140 | }, 141 | onMove: (evt) => { 142 | const supportsVirtualChildren = requireApiVersion?.("0.15.0"); 143 | let _children = supportsVirtualChildren 144 | ? root.vChildren?._children 145 | : root.children; 146 | if (!_children || !draggedItems?.length) return; 147 | let children = _children.map((child) => child.el); 148 | const adjacentEl = evt.related; 149 | const targetIndex = children.indexOf(adjacentEl); 150 | const firstItem = draggedItems.first(); 151 | const firstItemIndex = children.indexOf(firstItem!); 152 | const _draggedItems = draggedItems.slice(); 153 | if (firstItemIndex > targetIndex) _draggedItems.reverse(); 154 | for (const item of _draggedItems) { 155 | const itemIndex = children.indexOf(item); 156 | _children = reorderArray(_children, itemIndex, targetIndex); 157 | children = reorderArray(children, itemIndex, targetIndex); 158 | } 159 | this.settings.fileExplorerOrder[path] = _children.map( 160 | (child) => child.file.path 161 | ); 162 | this.plugin.saveSettings(); 163 | // return !adjacentEl.hasClass("nav-folder"); 164 | }, 165 | onEnd: (_evt) => { 166 | for (const elem of draggedItems) { 167 | const it = elem.querySelector(".tree-item-self") as HTMLElement | undefined; 168 | if (it) { 169 | it.draggable = true; 170 | it.classList.remove("is-moved"); 171 | } 172 | } 173 | draggedItems = []; 174 | document.querySelector("body>div.drag-ghost")?.detach(); 175 | }, 176 | }); 177 | } 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/patch/collapse.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type App, 3 | Platform, 4 | type View, 5 | type WorkspaceSplit, 6 | type WorkspaceTabs, 7 | requireApiVersion, 8 | setIcon, 9 | } from "obsidian"; 10 | import Sortable from "sortablejs"; 11 | import type BartenderPlugin from "../main"; 12 | import type { BartenderSettings } from "../settings"; 13 | import { ANIMATION_DURATION, STATUS_BAR_SELECTOR } from "../types/constant"; 14 | import { 15 | type GenerateIdOptions, 16 | generateId, 17 | getNextSiblings, 18 | getPreviousSiblings, 19 | reorderArray, 20 | } from "../utils"; 21 | 22 | export class Collapse { 23 | plugin: BartenderPlugin; 24 | settings: BartenderSettings; 25 | ribbonBarSorter: Sortable | undefined; 26 | statusBarSorter: Sortable; 27 | app: App; 28 | 29 | constructor(plugin: BartenderPlugin) { 30 | this.plugin = plugin; 31 | this.settings = plugin.settings; 32 | this.app = plugin.app; 33 | } 34 | 35 | insertSeparator(selector: string, className: string, rtl: Boolean) { 36 | const elements = document.body.querySelectorAll(selector); 37 | elements.forEach((el: HTMLElement) => { 38 | const getSiblings = rtl ? getPreviousSiblings : getNextSiblings; 39 | if (!el) { 40 | return; 41 | } 42 | const separator = el.createDiv(`${className} separator`); 43 | rtl && el.prepend(separator); 44 | const glyphEl = separator.createDiv("glyph"); 45 | const glyphName = "plus-with-circle"; // this gets replaced using CSS 46 | setIcon(glyphEl, glyphName); 47 | separator.addClass("is-collapsed"); 48 | this.plugin.register(() => separator.detach()); 49 | let hideTimeout: NodeJS.Timeout; 50 | separator.onClickEvent((event: MouseEvent) => { 51 | if (separator.hasClass("is-collapsed")) { 52 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 53 | separator.removeClass("is-collapsed"); 54 | } else { 55 | getSiblings(separator).forEach((el) => el.addClass("is-hidden")); 56 | separator.addClass("is-collapsed"); 57 | } 58 | }); 59 | el.onmouseenter = (ev) => { 60 | if (hideTimeout) clearTimeout(hideTimeout); 61 | }; 62 | el.onmouseleave = (ev) => { 63 | if (this.settings.autoHide) { 64 | hideTimeout = setTimeout(() => { 65 | getSiblings(separator).forEach((el) => el.addClass("is-hidden")); 66 | separator.addClass("is-collapsed"); 67 | }, this.plugin.settings.autoHideDelay); 68 | } 69 | }; 70 | setTimeout(() => { 71 | getSiblings(separator).forEach((el) => el.addClass("is-hidden")); 72 | separator.addClass("is-collapsed"); 73 | }, 0); 74 | }); 75 | } 76 | 77 | initCollapse() { 78 | if (Platform.isDesktop && this.settings.useCollapse) { 79 | // add sorter to the status bar 80 | this.insertSeparator(STATUS_BAR_SELECTOR, "status-bar-item", true); 81 | this.setStatusBarSorter(); 82 | 83 | // add sorter to the sidebar tabs 84 | if (requireApiVersion && !requireApiVersion("0.15.3")) { 85 | const left = (this.app.workspace.leftSplit as WorkspaceSplit).children; 86 | const right = (this.app.workspace.rightSplit as WorkspaceSplit).children; 87 | left.concat(right).forEach((child) => { 88 | if (child.hasOwnProperty("tabsInnerEl") && !child.iconSorter) { 89 | child.iconSorter = this.setTabBarSorter(child.tabsInnerEl, child); 90 | } 91 | }); 92 | } 93 | } 94 | } 95 | 96 | setTabBarSorter(element: HTMLElement, leaf: WorkspaceTabs) { 97 | this.setElementIDs(element, { useClass: true, useIcon: true }); 98 | return Sortable.create(element, { 99 | group: "leftTabBar", 100 | dataIdAttr: "data-id", 101 | chosenClass: "bt-sortable-chosen", 102 | delay: Platform.isMobile ? 200 : this.plugin.settings.dragDelay, 103 | dropBubble: false, 104 | dragoverBubble: false, 105 | animation: ANIMATION_DURATION, 106 | onChoose: () => element.parentElement?.addClass("is-dragging"), 107 | onUnchoose: () => element.parentElement?.removeClass("is-dragging"), 108 | onStart: () => { 109 | document.body.addClass("is-dragging"); 110 | element.querySelector(".separator")?.removeClass("is-collapsed"); 111 | Array.from(element.children).forEach((el) => el.removeClass("is-hidden")); 112 | }, 113 | onEnd: (event) => { 114 | document.body.removeClass("is-dragging"); 115 | if (event.oldIndex !== undefined && event.newIndex !== undefined) { 116 | reorderArray(leaf.children, event.oldIndex, event.newIndex); 117 | leaf.currentTab = event.newIndex; 118 | leaf.recomputeChildrenDimensions(); 119 | } 120 | this.app.workspace.requestSaveLayout(); 121 | }, 122 | }); 123 | } 124 | 125 | setViewActionSorter(el: HTMLElement, view: View): Sortable | undefined { 126 | this.setElementIDs(el, { useClass: true, useIcon: true }); 127 | const hasSorter = Object.values(el).find((value) => 128 | value?.hasOwnProperty("nativeDraggable") 129 | ); 130 | if (hasSorter) return undefined; 131 | const viewType = view?.getViewType() || "unknown"; 132 | return new Sortable(el, { 133 | group: "actionBar", 134 | dataIdAttr: "data-id", 135 | chosenClass: "bt-sortable-chosen", 136 | delay: Platform.isMobile ? 200 : this.plugin.settings.dragDelay, 137 | sort: true, 138 | animation: ANIMATION_DURATION, 139 | onStart: () => { 140 | el.querySelector(".separator")?.removeClass("is-collapsed"); 141 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 142 | }, 143 | store: { 144 | get: () => { 145 | return this.settings.actionBarOrder[viewType]; 146 | }, 147 | set: (s) => { 148 | this.settings.actionBarOrder[viewType] = s.toArray(); 149 | this.plugin.saveSettings(); 150 | }, 151 | }, 152 | }); 153 | } 154 | 155 | setRibbonBarSorter() { 156 | const el = document.body.querySelector( 157 | "body > div.app-container div.side-dock-actions" 158 | ) as HTMLElement; 159 | if (el) { 160 | this.setElementIDs(el, { useClass: true, useAria: true, useIcon: true }); 161 | this.ribbonBarSorter = Sortable.create(el, { 162 | group: "ribbonBar", 163 | dataIdAttr: "data-id", 164 | delay: Platform.isMobile ? 200 : this.plugin.settings.dragDelay, 165 | chosenClass: "bt-sortable-chosen", 166 | animation: ANIMATION_DURATION, 167 | onChoose: () => { 168 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 169 | }, 170 | onStart: () => { 171 | el.querySelector(".separator")?.removeClass("is-collapsed"); 172 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 173 | }, 174 | store: { 175 | get: (sortable) => { 176 | return this.settings.ribbonBarOrder; 177 | }, 178 | set: (s) => { 179 | this.settings.ribbonBarOrder = s.toArray(); 180 | this.plugin.saveSettings(); 181 | }, 182 | }, 183 | }); 184 | } 185 | } 186 | 187 | setElementIDs(parentEl: HTMLElement, options: GenerateIdOptions) { 188 | Array.from(parentEl.children).forEach((child) => { 189 | if (child instanceof HTMLElement && !child.getAttribute("data-id")) { 190 | child.setAttribute("data-id", generateId(child, options)); 191 | } 192 | }); 193 | } 194 | 195 | setStatusBarSorter() { 196 | const el = document.body.querySelector( 197 | "body > div.app-container > div.status-bar" 198 | ) as HTMLElement; 199 | if (el) { 200 | this.setElementIDs(el, { useClass: true, useAria: true, useIcon: true }); 201 | this.statusBarSorter = Sortable.create(el, { 202 | group: "statusBar", 203 | dataIdAttr: "data-id", 204 | chosenClass: "bt-sortable-chosen", 205 | delay: Platform.isMobile ? 200 : this.plugin.settings.dragDelay, 206 | animation: ANIMATION_DURATION, 207 | onChoose: () => { 208 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 209 | }, 210 | onStart: () => { 211 | el.querySelector(".separator")?.removeClass("is-collapsed"); 212 | Array.from(el.children).forEach((el) => el.removeClass("is-hidden")); 213 | }, 214 | store: { 215 | get: (sortable) => { 216 | return this.settings.statusBarOrder; 217 | }, 218 | set: (s) => { 219 | this.settings.statusBarOrder = s.toArray(); 220 | this.plugin.saveSettings(); 221 | }, 222 | }, 223 | }); 224 | } 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /src/patch/filter.ts: -------------------------------------------------------------------------------- 1 | import Fuse from "fuse.js"; 2 | import { 3 | type App, 4 | type ChildElement, 5 | type FileExplorerView, 6 | Scope, 7 | requireApiVersion, 8 | } from "obsidian"; 9 | import type BartenderPlugin from "../main"; 10 | import type { BartenderSettings } from "../settings"; 11 | type NestedObject = { [key: string]: string | NestedObject }; 12 | 13 | export class CustomFilter { 14 | settings: BartenderSettings; 15 | plugin: BartenderPlugin; 16 | app: App; 17 | 18 | constructor(plugin: BartenderPlugin) { 19 | this.plugin = plugin; 20 | this.settings = plugin.settings; 21 | this.app = plugin.app; 22 | } 23 | 24 | setFileExplorerFilter(fileExplorer?: FileExplorerView) { 25 | fileExplorer = fileExplorer ?? this.plugin.getFileExplorer(); 26 | const fileExplorerNav = fileExplorer?.headerDom?.navHeaderEl; 27 | if (!fileExplorerNav) { 28 | return; 29 | } 30 | const fileExplorerFilter = fileExplorerNav.createDiv("search-input-container filter"); 31 | fileExplorerNav.insertAdjacentElement("afterend", fileExplorerFilter); 32 | const fileExplorerFilterInput = fileExplorerFilter.createEl("input"); 33 | fileExplorerFilterInput.placeholder = "Type to filter..."; 34 | fileExplorerFilterInput.type = "text"; 35 | fileExplorerFilter.hide(); 36 | const filterScope = new Scope(this.app.scope); 37 | fileExplorerFilterInput.onfocus = () => { 38 | this.app.keymap.pushScope(filterScope); 39 | }; 40 | fileExplorerFilterInput.onblur = () => { 41 | this.app.keymap.popScope(filterScope); 42 | }; 43 | 44 | //register arrow keys to navigate the file explorer 45 | 46 | fileExplorerFilterInput.oninput = (ev: InputEvent) => { 47 | if (ev.target instanceof HTMLInputElement) { 48 | if (ev.target.value.length) { 49 | clearButtonEl.show(); 50 | } else { 51 | clearButtonEl.hide(); 52 | } 53 | fileExplorer.tree.infinityScroll.filter = ev.target.value; 54 | } 55 | fileExplorer.tree.infinityScroll.compute(); 56 | }; 57 | const clearButtonEl = fileExplorerFilter.createDiv( 58 | "search-input-clear-button", 59 | (el) => { 60 | el.addEventListener("click", () => { 61 | fileExplorerFilterInput.value = ""; 62 | clearButtonEl.hide(); 63 | fileExplorerFilterInput.focus(); 64 | fileExplorerFilterInput.dispatchEvent(new Event("input")); 65 | }); 66 | el.hide(); 67 | } 68 | ); 69 | } 70 | 71 | clearFileExplorerFilter() { 72 | const fileExplorer = this.plugin.getFileExplorer(); 73 | const fileExplorerFilterEl: HTMLInputElement | null = 74 | fileExplorer.containerEl.querySelector( 75 | '.workspace-leaf-content[data-type="file-explorer"] .search-input-container > input' 76 | ); 77 | fileExplorerFilterEl?.remove(); 78 | if (fileExplorerFilterEl) fileExplorerFilterEl.value = ""; 79 | fileExplorer.tree.infinityScroll.filter = ""; 80 | fileExplorer.tree.infinityScroll.compute(); 81 | } 82 | 83 | private getItems = (items: ChildElement[], app: App): ChildElement[] => { 84 | let children: any[] = []; 85 | const supportsVirtualChildren = requireApiVersion && requireApiVersion("0.15.0"); 86 | const excluded = app.vault.config.userIgnoreFilters; 87 | if (excluded) { 88 | items = items.filter((item) => { 89 | //if the item.file.path startswith any of the excluded paths, return false 90 | return !excluded.some((exclude) => item.file.path.startsWith(exclude)); 91 | }); 92 | } 93 | return supportsVirtualChildren 94 | ? items 95 | .reduce((res, item) => { 96 | if (item.vChildren?._children) { 97 | children = [...children, ...item.vChildren._children]; 98 | } else { 99 | res.push(item); 100 | } 101 | return res; 102 | }, [] as ChildElement[]) 103 | .concat(children.length ? this.getItems(children, app) : children) 104 | : items 105 | .reduce((res, item) => { 106 | if (item.children) { 107 | children = [...children, ...item.children]; 108 | } else { 109 | res.push(item); 110 | } 111 | return res; 112 | }, [] as ChildElement[]) 113 | .concat(children.length ? this.getItems(children, app) : children); 114 | }; 115 | 116 | // highlight fuzzy filter matches 117 | 118 | fileExplorerFilter = function ( 119 | fileExplorer: FileExplorerView, 120 | filter: CustomFilter = this 121 | ) { 122 | const supportsVirtualChildren = requireApiVersion?.("0.15.0"); 123 | if (!fileExplorer) return; 124 | const _children = supportsVirtualChildren 125 | ? this.rootEl?.vChildren._children 126 | : this.rootEl?.children; 127 | if (!_children) return; 128 | if (this.filter?.length >= 1) { 129 | if (!this.filtered) { 130 | this.rootEl._children = _children; 131 | this.filtered = true; 132 | } 133 | const options = { 134 | includeScore: true, 135 | includeMatches: true, 136 | useExtendedSearch: true, 137 | getFn: filter.getFn, 138 | threshold: 0.1, 139 | ignoreLocation: true, 140 | keys: ["file.path"], 141 | }; 142 | const flattenedItems = filter.getItems(this.rootEl._children, fileExplorer.app); 143 | const fuse = new Fuse(flattenedItems, options); 144 | const maxResults = 200; 145 | const results = fuse.search(this.filter).slice(0, maxResults); 146 | if (supportsVirtualChildren) { 147 | this.rootEl.vChildren._children = filter.highlight(results); 148 | } else { 149 | this.rootEl.children = filter.highlight(results); 150 | } 151 | 152 | return; 153 | } 154 | if (!(this.filter?.length < 1 && this.filtered)) { 155 | return; 156 | } 157 | if (this.rootEl._children) { 158 | if (supportsVirtualChildren) { 159 | this.rootEl.vChildren._children = this.rootEl._children; 160 | } else { 161 | this.rootEl.children = this.rootEl._children; 162 | } 163 | } 164 | 165 | const flattenedItems = filter.getItems(this.rootEl._children, fileExplorer.app); 166 | flattenedItems.map((match: ChildElement) => { 167 | if (!(match).innerEl.origContent) { 168 | return; 169 | } 170 | 171 | // @ts-ignore 172 | match.innerEl.setText((match).innerEl.origContent); 173 | delete (match).innerEl.origContent; 174 | // @ts-ignore 175 | match.innerEl.removeClass("has-matches"); 176 | }); 177 | 178 | this.filtered = false; 179 | }; 180 | 181 | private highlight = ( 182 | fuseSearchResult: any, 183 | highlightClassName: string = "suggestion-highlight" 184 | ) => { 185 | const set = (obj: NestedObject, path: string, value: any) => { 186 | const pathValue = path.split("."); 187 | let i; 188 | 189 | for (i = 0; i < pathValue.length - 1; i++) { 190 | obj = obj[pathValue[i]] as NestedObject; 191 | } 192 | 193 | obj[pathValue[i]] = value; 194 | }; 195 | 196 | const generateHighlightedText = (inputText: string, regions: number[][] = []) => { 197 | return regions 198 | .reduce((str, [start, end]) => { 199 | str[start] = `${str[start]}`; 200 | str[end] = `${str[end]}`; 201 | return str; 202 | }, inputText.split("")) 203 | .join(""); 204 | }; 205 | 206 | return fuseSearchResult 207 | .filter(({ matches }: any) => matches && matches.length) 208 | .map(({ item, matches }: any) => { 209 | const highlightedItem = { ...item }; 210 | matches.forEach((match: any) => { 211 | if (!highlightedItem.innerEl.origContent) 212 | highlightedItem.innerEl.origContent = highlightedItem.innerEl.textContent; 213 | set( 214 | highlightedItem, 215 | "innerEl.innerHTML", 216 | generateHighlightedText(match.value, match.indices) 217 | ); 218 | highlightedItem.innerEl?.addClass("has-matches"); 219 | }); 220 | 221 | return highlightedItem; 222 | }); 223 | }; 224 | 225 | private getFn(obj: any, path: string[]) { 226 | const removeExt = function (obj: any) { 227 | if (typeof obj === "string" || obj instanceof String) { 228 | const parts = obj.split("/"); 229 | let newObj = obj; 230 | if (parts.length >= 3) { 231 | for (let i = 1; i < parts.length - 1; i += 2) { 232 | parts[i] = "…"; 233 | } 234 | newObj = parts.join("/"); 235 | } 236 | return newObj.replace(/.md$/, ""); 237 | } 238 | return obj; 239 | }; 240 | const value = Fuse.config.getFn(obj, path); 241 | if (Array.isArray(value)) { 242 | return value.map((el) => removeExt(el)); 243 | } 244 | return removeExt(value); 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /src/custom-sort.ts: -------------------------------------------------------------------------------- 1 | import { Menu, type TAbstractFile, type TFile, TFolder, setIcon } from "obsidian"; 2 | import type BartenderPlugin from "./main"; 3 | import type { BartenderSettings } from "./settings"; 4 | 5 | const Collator = new Intl.Collator(undefined, { 6 | usage: "sort", 7 | sensitivity: "base", 8 | numeric: true, 9 | }).compare; 10 | 11 | const Sorter = { 12 | alphabetical(first: TFile, second: TFile) { 13 | return Collator(first.basename, second.basename); 14 | }, 15 | alphabeticalReverse(first: TFile, second: TFile) { 16 | return -Sorter.alphabetical(first, second); 17 | }, 18 | byModifiedTime(first: TFile, second: TFile) { 19 | return second.stat.mtime - first.stat.mtime; 20 | }, 21 | byModifiedTimeReverse(first: TFile, second: TFile) { 22 | return -Sorter.byModifiedTime(first, second); 23 | }, 24 | byCreatedTime(first: TFile, second: TFile) { 25 | return second.stat.ctime - first.stat.ctime; 26 | }, 27 | byCreatedTimeReverse(first: TFile, second: TFile) { 28 | return -Sorter.byCreatedTime(first, second); 29 | }, 30 | }; 31 | 32 | const Translate = i18next.t.bind(i18next); 33 | 34 | const sortOptionStrings = { 35 | alphabetical: "plugins.file-explorer.label-sort-a-to-z", 36 | alphabeticalReverse: "plugins.file-explorer.label-sort-z-to-a", 37 | byModifiedTime: "plugins.file-explorer.label-sort-new-to-old", 38 | byModifiedTimeReverse: "plugins.file-explorer.label-sort-old-to-new", 39 | byCreatedTime: "plugins.file-explorer.label-sort-created-new-to-old", 40 | byCreatedTimeReverse: "plugins.file-explorer.label-sort-created-old-to-new", 41 | custom: "Custom", 42 | }; 43 | 44 | const sortOptionGroups = [ 45 | ["alphabetical", "alphabeticalReverse"], 46 | ["byModifiedTime", "byModifiedTimeReverse"], 47 | ["byCreatedTime", "byCreatedTimeReverse"], 48 | ["custom"], 49 | ]; 50 | 51 | /** 52 | * For the moment, we copy the original function 53 | * Will be modify to add the custom sort after, but first I need to understand how it works 54 | * @param settings 55 | * @param e 56 | * @param foldersOnBottom 57 | */ 58 | export const folderSortV2 = function ( 59 | settings: BartenderSettings, 60 | e: any, 61 | foldersOnBottom?: boolean 62 | ) { 63 | const children = e.children.slice(); 64 | children.sort((firstEl: TAbstractFile, secondEl: TAbstractFile) => { 65 | let firstIsFolder; 66 | let secondIsFolder; 67 | if ( 68 | foldersOnBottom && 69 | ((firstIsFolder = firstEl instanceof TFolder) || 70 | (secondIsFolder = secondEl instanceof TFolder)) 71 | ) { 72 | return firstIsFolder && !secondIsFolder 73 | ? 1 74 | : secondIsFolder && !firstIsFolder 75 | ? -1 76 | : Collator(firstEl.name, secondEl.name); 77 | } 78 | 79 | const order = 80 | firstEl.parent && 81 | secondEl.parent && 82 | firstEl.parent === secondEl.parent && 83 | !firstEl.parent.isRoot() 84 | ? settings.fileExplorerOrder[firstEl.parent.path] || undefined 85 | : settings.fileExplorerOrder[""]; 86 | if (!order) return Collator(firstEl.name, secondEl.name); 87 | const index1 = order.indexOf(firstEl.path); 88 | const index2 = order.indexOf(secondEl.path); 89 | 90 | return (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity); 91 | }); 92 | const i = []; 93 | for (let r = 0, o = children; r < o.length; r++) { 94 | const a = o[r]; 95 | const s = this.fileItems[a.path]; 96 | s && i.push(s); 97 | } 98 | 99 | return i; 100 | }; 101 | 102 | function addButton( 103 | icon: "move" | "arrow-up-narrow-wide" | "three-horizontal-bars" | "search", 104 | addSortButton: any, 105 | title: string, 106 | onClick: (event: MouseEvent) => void 107 | ) { 108 | const leaf = addSortButton.app.workspace 109 | .getLeavesOfType("file-explorer") 110 | ?.first()?.view; 111 | const button = createDiv({ 112 | cls: "clickable-icon nav-action-button custom-sort", 113 | attr: { 114 | "aria-label": title, 115 | }, 116 | }); 117 | setIcon(button, icon); 118 | button.addEventListener("click", onClick); 119 | if (leaf) { 120 | const oldChild = leaf.containerEl 121 | .querySelector("div.nav-buttons-container") 122 | .querySelectorAll(`[aria-label="${title}"]`); 123 | for (let i = 0; i < oldChild.length; i++) { 124 | if (oldChild[i].hasClass("custom-sort")) oldChild[i].remove(); 125 | else oldChild[i].addClass("hide"); 126 | } 127 | const shouldBeBefore = 128 | icon === "move" || 129 | icon === "arrow-up-narrow-wide" || 130 | icon === "three-horizontal-bars"; 131 | if (shouldBeBefore) { 132 | const devAll = leaf.containerEl.querySelector( 133 | `div.nav-buttons-container > .nav-action-button[aria-label='${Translate("plugins.file-explorer.action-collapse-all")}']` 134 | ); 135 | const expandAll = leaf.containerEl.querySelector( 136 | `div.nav-buttons-container > .nav-action-button[aria-label='${Translate("plugins.file-explorer.action-expand-all")}']` 137 | ); 138 | if (devAll) { 139 | leaf.containerEl 140 | .querySelector("div.nav-buttons-container") 141 | .insertBefore(button, devAll); 142 | } else if (expandAll) { 143 | leaf.containerEl 144 | .querySelector("div.nav-buttons-container") 145 | .insertBefore(button, expandAll); 146 | } else { 147 | leaf.containerEl.querySelector("div.nav-buttons-container").appendChild(button); 148 | } 149 | } else 150 | leaf.containerEl.querySelector("div.nav-buttons-container").appendChild(button); 151 | } 152 | return button; 153 | } 154 | 155 | export const addSortButton = function ( 156 | bartender: BartenderPlugin, 157 | _sorter: any, 158 | sortOption: any, 159 | _setSortOrder: any, 160 | _currentSort: any 161 | ) { 162 | const plugin = this; 163 | const settings = bartender.settings; 164 | const sortEl = addButton( 165 | settings.sortOrder === "custom" ? "move" : "arrow-up-narrow-wide", 166 | this, 167 | Translate("plugins.file-explorer.action-change-sort"), 168 | (event: MouseEvent) => { 169 | event.preventDefault(); 170 | const menu = new Menu(); 171 | for ( 172 | let currentSortOption = settings.sortOrder, 173 | groupIndex = 0, 174 | _sortOptionGroups = sortOptionGroups; 175 | groupIndex < _sortOptionGroups.length; 176 | groupIndex++ 177 | ) { 178 | for ( 179 | let addMenuItem = (_sortOption: keyof typeof sortOptionStrings) => { 180 | const label = Translate(sortOptionStrings[_sortOption]); 181 | menu.addItem((item) => 182 | item 183 | .setTitle(label) 184 | .setChecked(_sortOption === currentSortOption) 185 | .onClick(() => { 186 | if (_sortOption !== currentSortOption) { 187 | sortEl.setAttribute("data-sort-method", _sortOption); 188 | plugin.app.workspace.trigger( 189 | "file-explorer-sort-change", 190 | _sortOption 191 | ); 192 | //force the sort with the new sort method 193 | const leaf = plugin.app.workspace 194 | .getLeavesOfType("file-explorer") 195 | ?.first()?.view; 196 | if (leaf) leaf.sort(); 197 | } 198 | //setSortOrder(_sortOption); 199 | if (_sortOption === "custom") setIcon(sortEl, "move"); 200 | else setIcon(sortEl, "arrow-up-narrow-wide"); 201 | }) 202 | ); 203 | }, 204 | itemIndex = 0, 205 | sortOptionGroup = _sortOptionGroups[groupIndex]; 206 | itemIndex < sortOptionGroup.length; 207 | itemIndex++ 208 | ) { 209 | addMenuItem(sortOptionGroup[itemIndex] as keyof typeof sortOptionStrings); 210 | } 211 | menu.addSeparator(); 212 | } 213 | menu.showAtMouseEvent(event); 214 | } 215 | ); 216 | setTimeout(() => { 217 | sortEl.setAttribute("data-sort-method", settings.sortOrder); 218 | }, 100); 219 | addButton( 220 | "three-horizontal-bars", 221 | this, 222 | "Drag to rearrange", 223 | function (event: MouseEvent) { 224 | event.preventDefault(); 225 | const value = !this.hasClass("is-active"); 226 | this.toggleClass("is-active", value); 227 | plugin.app.workspace.trigger("file-explorer-draggable-change", value); 228 | } 229 | ).addClass("drag-to-rearrange"); 230 | addButton("search", this, "Filter items", function (event: MouseEvent) { 231 | event.preventDefault(); 232 | const value = !this.hasClass("is-active"); 233 | this.toggleClass("is-active", value); 234 | const filterEl = document.body.querySelector( 235 | '.workspace-leaf-content[data-type="file-explorer"] .search-input-container > input' 236 | ) as HTMLInputElement; 237 | if (filterEl && !value) { 238 | filterEl.parentElement?.hide(); 239 | filterEl.value = ""; 240 | filterEl.dispatchEvent(new Event("input")); 241 | } else { 242 | filterEl?.parentElement?.show(); 243 | filterEl?.focus(); 244 | } 245 | }); 246 | return sortEl; 247 | }; 248 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { around } from "monkey-around"; 2 | import { 3 | type FileExplorerView, 4 | Platform, 5 | Plugin, 6 | type SplitDirection, 7 | View, 8 | type ViewCreator, 9 | Workspace, 10 | type WorkspaceItem, 11 | type WorkspaceLeaf, 12 | WorkspaceTabs, 13 | requireApiVersion, 14 | } from "obsidian"; 15 | 16 | import Sortable, { MultiDrag } from "sortablejs"; 17 | import { addSortButton, folderSortV2 } from "./custom-sort"; 18 | import { Collapse } from "./patch/collapse"; 19 | import { CustomFilter } from "./patch/filter"; 20 | import { CustomSorter } from "./patch/sorter"; 21 | import { type BartenderSettings, DEFAULT_SETTINGS, SettingTab } from "./settings"; 22 | import { RIBBON_BAR_SELECTOR } from "./types/constant"; 23 | 24 | Sortable.mount(new MultiDrag()); 25 | 26 | export default class BartenderPlugin extends Plugin { 27 | settings: BartenderSettings; 28 | settingsTab: SettingTab; 29 | collapse: Collapse; 30 | customFilter: CustomFilter; 31 | customSorter: CustomSorter; 32 | 33 | async onload() { 34 | await this.loadSettings(); 35 | this.collapse = new Collapse(this); 36 | this.customFilter = new CustomFilter(this); 37 | this.customSorter = new CustomSorter(this); 38 | console.log("Bartender loaded"); 39 | this.registerMonkeyPatches(); 40 | this.registerEventHandlers(); 41 | this.registerSettingsTab(); 42 | this.initialize(); 43 | 44 | this.app.vault.on("rename", async (file, oldFile) => { 45 | // change the path in the settings 46 | //first check if folder and search this path in the settings 47 | for (const key in this.settings.fileExplorerOrder) { 48 | for (const item of this.settings.fileExplorerOrder[key]) { 49 | if (item === oldFile) { 50 | const index = this.settings.fileExplorerOrder[key].indexOf(item); 51 | this.settings.fileExplorerOrder[key][index] = file.path; 52 | } 53 | } 54 | if (key.startsWith(oldFile)) { 55 | this.settings.fileExplorerOrder[file.path] = 56 | this.settings.fileExplorerOrder[key]; 57 | delete this.settings.fileExplorerOrder[key]; 58 | } 59 | } 60 | await this.saveSettings(); 61 | }); 62 | 63 | this.app.vault.on("delete", async (file) => { 64 | // remove the path from the settings 65 | for (const key in this.settings.fileExplorerOrder) { 66 | for (const item of this.settings.fileExplorerOrder[key]) { 67 | if (item === file.path) { 68 | const index = this.settings.fileExplorerOrder[key].indexOf(item); 69 | this.settings.fileExplorerOrder[key].splice(index, 1); 70 | } 71 | } 72 | if (key.startsWith(file.path)) { 73 | delete this.settings.fileExplorerOrder[key]; 74 | } 75 | } 76 | await this.saveSettings(); 77 | }); 78 | } 79 | 80 | async loadSettings() { 81 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 82 | } 83 | 84 | async saveSettings() { 85 | await this.saveData(this.settings); 86 | } 87 | 88 | patchFileExplorerFolder() { 89 | const plugin = this; 90 | const leaf = plugin.app.workspace.getLeaf(true); 91 | const fileExplorer = plugin.app.viewRegistry.viewByType["file-explorer"]( 92 | leaf 93 | ) as FileExplorerView; 94 | this.register( 95 | around(fileExplorer.constructor.prototype, { 96 | getSortedFolderItems: (old: any) => { 97 | return function (...args: any[]) { 98 | if (plugin.settings.sortOrder === "custom") { 99 | return folderSortV2.call(this, plugin.settings, ...args); 100 | } 101 | return old.call(this, ...args); 102 | }; 103 | }, 104 | }) 105 | ); 106 | leaf.detach(); 107 | } 108 | 109 | initialize() { 110 | this.app.workspace.onLayoutReady(() => { 111 | this.patchFileExplorerFolder(); 112 | const fileExplorer = this.getFileExplorer(); 113 | this.customFilter.setFileExplorerFilter(fileExplorer); 114 | setTimeout( 115 | () => { 116 | // add file explorer sorter 117 | this.customSorter.setFileExplorerSorter(); 118 | 119 | // add sorter to the left sidebar ribbon 120 | if (this.settings.useCollapse) { 121 | this.collapse.insertSeparator( 122 | RIBBON_BAR_SELECTOR, 123 | "side-dock-ribbon-action", 124 | false 125 | ); 126 | this.collapse.setRibbonBarSorter(); 127 | } 128 | 129 | addSortButton(this, null, null, null, null); 130 | // add sorter to all view actions icon groups 131 | this.app.workspace.iterateRootLeaves((leaf) => { 132 | if ( 133 | leaf?.view?.hasOwnProperty("actionsEl") && 134 | !leaf?.view?.hasOwnProperty("iconSorter") 135 | ) { 136 | leaf.view.iconSorter = this.collapse.setViewActionSorter( 137 | leaf.view.actionsEl, 138 | leaf.view 139 | ); 140 | } 141 | }); 142 | }, 143 | Platform.isMobile ? 3000 : 400 144 | ); 145 | 146 | // give time for plugins like Customizable Page Header to add their icons 147 | }); 148 | } 149 | 150 | registerSettingsTab() { 151 | this.settingsTab = new SettingTab(this.app, this); 152 | this.addSettingTab(this.settingsTab); 153 | } 154 | 155 | registerEventHandlers() { 156 | this.registerEvent( 157 | this.app.workspace.on("file-explorer-draggable-change", (value) => { 158 | this.customSorter.toggleFileExplorerSorters(value); 159 | }) 160 | ); 161 | this.registerEvent( 162 | this.app.workspace.on("file-explorer-sort-change", (sortMethod: string) => { 163 | this.settings.sortOrder = sortMethod; 164 | this.saveSettings(); 165 | if (sortMethod === "custom") { 166 | setTimeout(() => { 167 | this.customSorter.setFileExplorerSorter(); 168 | }, 10); 169 | } else { 170 | this.customSorter.cleanupFileExplorerSorters(); 171 | } 172 | }) 173 | ); 174 | this.registerEvent( 175 | this.app.workspace.on("file-explorer-load", (fileExplorer: FileExplorerView) => { 176 | setTimeout(() => { 177 | this.customSorter.setFileExplorerSorter(); 178 | }, 1000); 179 | }) 180 | ); 181 | this.registerEvent( 182 | this.app.workspace.on( 183 | "bartender-leaf-split", 184 | (_originLeaf: WorkspaceItem, newLeaf: WorkspaceItem) => { 185 | const element: HTMLElement = newLeaf.tabsInnerEl as HTMLElement; 186 | if (newLeaf.type === "tabs" && newLeaf instanceof WorkspaceTabs) { 187 | if (requireApiVersion && !requireApiVersion("0.15.3")) { 188 | this.collapse.setTabBarSorter(element, newLeaf); 189 | } 190 | } 191 | } 192 | ) 193 | ); 194 | 195 | this.registerEvent( 196 | this.app.workspace.on("ribbon-bar-updated", () => { 197 | setTimeout(() => { 198 | if (this.settings.ribbonBarOrder && this.collapse.ribbonBarSorter) { 199 | this.collapse.setElementIDs(this.collapse.ribbonBarSorter.el, { 200 | useClass: true, 201 | useAria: true, 202 | useIcon: true, 203 | }); 204 | this.collapse.ribbonBarSorter.sort(this.settings.ribbonBarOrder); 205 | } 206 | }, 0); 207 | }) 208 | ); 209 | this.registerEvent( 210 | this.app.workspace.on("status-bar-updated", () => { 211 | setTimeout(() => { 212 | if (this.settings.statusBarOrder && this.collapse.statusBarSorter) { 213 | this.collapse.setElementIDs(this.collapse.statusBarSorter.el, { 214 | useClass: true, 215 | useIcon: true, 216 | }); 217 | this.collapse.statusBarSorter.sort(this.settings.statusBarOrder); 218 | } 219 | }, 0); 220 | }) 221 | ); 222 | } 223 | 224 | registerMonkeyPatches() { 225 | const plugin = this; 226 | this.register( 227 | around(this.app.viewRegistry.constructor.prototype, { 228 | registerView(old: any) { 229 | return function (type: string, viewCreator: ViewCreator, ...args: unknown[]) { 230 | plugin.app.workspace.trigger("view-registered", type, viewCreator); 231 | return old.call(this, type, viewCreator, ...args); 232 | }; 233 | }, 234 | }) 235 | ); 236 | if (this.app.workspace.layoutReady) { 237 | this.patchFileExplorer(); 238 | } else { 239 | // wait for layout to be ready 240 | this.registerEvent( 241 | this.app.workspace.on("layout-ready", () => { 242 | this.patchFileExplorer(); 243 | }) 244 | ); 245 | } 246 | 247 | this.register( 248 | around(View.prototype, { 249 | onunload(old: any) { 250 | return function (...args) { 251 | try { 252 | if (this.iconSorter) { 253 | this.iconSorter.destroy(); 254 | this.iconSorter = null; 255 | } 256 | } catch { 257 | //pass 258 | } 259 | return old.call(this, ...args); 260 | }; 261 | }, 262 | onload(old: any) { 263 | return function (...args) { 264 | setTimeout(() => { 265 | if (this.app.workspace.layoutReady) { 266 | try { 267 | if ( 268 | !(this.leaf.parentSplit instanceof WorkspaceTabs) && 269 | this.hasOwnProperty("actionsEl") && 270 | !this.iconSorter 271 | ) { 272 | this.iconSorter = plugin.collapse.setViewActionSorter( 273 | this.actionsEl, 274 | this 275 | ); 276 | } 277 | } catch { 278 | //pass 279 | } 280 | } 281 | }, 200); 282 | 283 | return old.call(this, ...args); 284 | }; 285 | }, 286 | }) 287 | ); 288 | if (Platform.isDesktop) { 289 | this.register( 290 | around(HTMLDivElement.prototype, { 291 | addEventListener(old: any) { 292 | return function ( 293 | type: string, 294 | listener: EventListenerOrEventListenerObject, 295 | options?: boolean | AddEventListenerOptions 296 | ) { 297 | if ( 298 | type === "mousedown" && 299 | listener instanceof Function && 300 | this.hasClass("workspace-tab-header") 301 | ) { 302 | const origListener = listener; 303 | listener = (event) => { 304 | if (event instanceof MouseEvent && (event?.altKey || event?.metaKey)) 305 | return; 306 | else origListener(event); 307 | }; 308 | } 309 | return old.call(this, type, listener, options); 310 | }; 311 | }, 312 | }) 313 | ); 314 | } 315 | this.register( 316 | around(Workspace.prototype, { 317 | splitLeaf(old: any) { 318 | return function ( 319 | source: WorkspaceItem, 320 | newLeaf: WorkspaceItem, 321 | direction?: SplitDirection, 322 | before?: boolean, 323 | ...args 324 | ) { 325 | const result = old.call(this, source, newLeaf, direction, before, ...args); 326 | this.trigger("bartender-leaf-split", source, newLeaf); 327 | return result; 328 | }; 329 | }, 330 | changeLayout(old: any) { 331 | return async function (workspace: any, ...args): Promise { 332 | const result = await old.call(this, workspace, ...args); 333 | this.trigger("bartender-workspace-change"); 334 | return result; 335 | }; 336 | }, 337 | }) 338 | ); 339 | this.register( 340 | around(Plugin.prototype, { 341 | addStatusBarItem(old: any) { 342 | return function (...args): HTMLElement { 343 | const result = old.call(this, ...args); 344 | this.app.workspace.trigger("status-bar-updated"); 345 | return result; 346 | }; 347 | }, 348 | addRibbonIcon(old: any) { 349 | return function (...args): HTMLElement { 350 | const result = old.call(this, ...args); 351 | this.app.workspace.trigger("ribbon-bar-updated"); 352 | return result; 353 | }; 354 | }, 355 | }) 356 | ); 357 | } 358 | 359 | patchFileExplorer(fileExplorer?: FileExplorerView) { 360 | const plugin = this; 361 | const customFilter = this.customFilter; 362 | if (!fileExplorer) fileExplorer = this.getFileExplorer(); 363 | const InfinityScroll = fileExplorer.tree.infinityScroll.constructor; 364 | // register clear first so that it gets called first onunload 365 | this.register(() => this.customFilter.clearFileExplorerFilter()); 366 | this.register( 367 | around(InfinityScroll.prototype, { 368 | compute(old: any) { 369 | return function (...args: any[]) { 370 | try { 371 | if (this.scrollEl.hasClass("nav-files-container")) { 372 | plugin.customFilter.fileExplorerFilter.call( 373 | this, 374 | fileExplorer, 375 | customFilter, 376 | plugin.app 377 | ); 378 | } 379 | } catch (err) { 380 | console.log(err); 381 | } 382 | return old.call(this, ...args); 383 | }; 384 | }, 385 | }) 386 | ); 387 | this.register( 388 | around(fileExplorer.headerDom.constructor.prototype, { 389 | addSortButton(old: any) { 390 | return function (...args: any[]) { 391 | if (this.navHeaderEl?.parentElement?.dataset?.type === "file-explorer") { 392 | plugin.customFilter.setFileExplorerFilter(this); 393 | return addSortButton.call(this, plugin, ...args); 394 | } 395 | return old.call(this, ...args); 396 | }; 397 | }, 398 | }) 399 | ); 400 | } 401 | 402 | getFileExplorer() { 403 | const fileExplorer: FileExplorerView | undefined = this.app.workspace 404 | .getLeavesOfType("file-explorer") 405 | ?.first()?.view as unknown as FileExplorerView; 406 | 407 | return fileExplorer; 408 | } 409 | 410 | onunload(): void { 411 | this.collapse.statusBarSorter?.destroy(); 412 | this.collapse.ribbonBarSorter?.destroy(); 413 | this.app.workspace.iterateAllLeaves((leaf) => { 414 | let sorterParent: View | WorkspaceTabs | WorkspaceLeaf | boolean; 415 | if ( 416 | (sorterParent = leaf?.iconSorter ? leaf : false) || 417 | (sorterParent = leaf?.view?.iconSorter ? leaf.view : false) || 418 | (sorterParent = 419 | leaf?.parentSplit instanceof WorkspaceTabs && leaf?.parentSplit?.iconSorter 420 | ? leaf?.parentSplit 421 | : false) 422 | ) { 423 | try { 424 | sorterParent.iconSorter?.destroy(); 425 | } finally { 426 | delete sorterParent.iconSorter; 427 | } 428 | } 429 | }); 430 | 431 | // clean up file explorer sorters 432 | this.customSorter.cleanupFileExplorerSorters(); 433 | const leaf = this.app.workspace.getLeavesOfType("file-explorer")?.first()?.view; 434 | if (leaf) { 435 | const oldChild = 436 | leaf.containerEl 437 | .querySelector("div.nav-buttons-container") 438 | ?.querySelectorAll("div.nav-action-button.custom-sort") || []; 439 | for (const el of oldChild) { 440 | if (el.ariaLabel === "move" || el.ariaLabel === "arrow-up-narrow-wide") { 441 | //only remove the custom sort option 442 | const hiddenButton = leaf.containerEl.querySelector( 443 | `div.nav-buttons-container > div.nav-action-button.hide[aria-label="${el.ariaLabel}"]` 444 | ); 445 | if (hiddenButton) hiddenButton.removeClass("hide"); 446 | el.remove(); 447 | } else el.remove(); 448 | } 449 | const filterEl = leaf.containerEl.querySelectorAll( 450 | ".search-input-container.filter" 451 | ); 452 | for (const el of filterEl) { 453 | el.remove(); 454 | } 455 | } 456 | } 457 | } 458 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | ansi-colors: 12 | specifier: ^4.1.3 13 | version: 4.1.3 14 | commander: 15 | specifier: ^12.1.0 16 | version: 12.1.0 17 | commit-and-tag-version: 18 | specifier: ^12.5.0 19 | version: 12.5.0 20 | dedent: 21 | specifier: ^1.5.3 22 | version: 1.5.3 23 | dotenv: 24 | specifier: ^16.4.5 25 | version: 16.4.5 26 | fuse.js: 27 | specifier: ^7.0.0 28 | version: 7.0.0 29 | devDependencies: 30 | '@biomejs/biome': 31 | specifier: 1.9.4 32 | version: 1.9.4 33 | '@types/electron': 34 | specifier: npm:@ophidian/electron-types@^24.3.1 35 | version: '@ophidian/electron-types@24.3.1' 36 | '@types/node': 37 | specifier: ^22.8.1 38 | version: 22.8.1 39 | '@types/sortablejs': 40 | specifier: ^1.15.8 41 | version: 1.15.8 42 | builtin-modules: 43 | specifier: ^4.0.0 44 | version: 4.0.0 45 | esbuild: 46 | specifier: ^0.24.0 47 | version: 0.24.0 48 | i18next: 49 | specifier: ^23.16.4 50 | version: 23.16.4 51 | monkey-around: 52 | specifier: ^3.0.0 53 | version: 3.0.0 54 | obsidian: 55 | specifier: 1.7.2 56 | version: 1.7.2(@codemirror/state@6.4.1)(@codemirror/view@6.27.0) 57 | obsidian-typings: 58 | specifier: ^2.2.0 59 | version: 2.2.0(@types/node@22.8.1)(electron@32.0.1)(obsidian@1.7.2(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)) 60 | sortablejs: 61 | specifier: ^1.15.3 62 | version: 1.15.3 63 | tslib: 64 | specifier: 2.8.0 65 | version: 2.8.0 66 | typescript: 67 | specifier: 5.6.3 68 | version: 5.6.3 69 | 70 | packages: 71 | 72 | '@babel/code-frame@7.26.0': 73 | resolution: {integrity: sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/helper-validator-identifier@7.25.9': 77 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@babel/runtime@7.26.0': 81 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} 82 | engines: {node: '>=6.9.0'} 83 | 84 | '@biomejs/biome@1.9.4': 85 | resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 86 | engines: {node: '>=14.21.3'} 87 | hasBin: true 88 | 89 | '@biomejs/cli-darwin-arm64@1.9.4': 90 | resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 91 | engines: {node: '>=14.21.3'} 92 | cpu: [arm64] 93 | os: [darwin] 94 | 95 | '@biomejs/cli-darwin-x64@1.9.4': 96 | resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 97 | engines: {node: '>=14.21.3'} 98 | cpu: [x64] 99 | os: [darwin] 100 | 101 | '@biomejs/cli-linux-arm64-musl@1.9.4': 102 | resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 103 | engines: {node: '>=14.21.3'} 104 | cpu: [arm64] 105 | os: [linux] 106 | 107 | '@biomejs/cli-linux-arm64@1.9.4': 108 | resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 109 | engines: {node: '>=14.21.3'} 110 | cpu: [arm64] 111 | os: [linux] 112 | 113 | '@biomejs/cli-linux-x64-musl@1.9.4': 114 | resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 115 | engines: {node: '>=14.21.3'} 116 | cpu: [x64] 117 | os: [linux] 118 | 119 | '@biomejs/cli-linux-x64@1.9.4': 120 | resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 121 | engines: {node: '>=14.21.3'} 122 | cpu: [x64] 123 | os: [linux] 124 | 125 | '@biomejs/cli-win32-arm64@1.9.4': 126 | resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 127 | engines: {node: '>=14.21.3'} 128 | cpu: [arm64] 129 | os: [win32] 130 | 131 | '@biomejs/cli-win32-x64@1.9.4': 132 | resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 133 | engines: {node: '>=14.21.3'} 134 | cpu: [x64] 135 | os: [win32] 136 | 137 | '@codemirror/state@6.4.1': 138 | resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} 139 | 140 | '@codemirror/view@6.27.0': 141 | resolution: {integrity: sha512-8kqX1sHbVW1lVzWwrjAbh4dR7eKhV8eIQ952JKaBXOoXE04WncoqCy4DMU701LSrPZ3N2Q4zsTawz7GQ+2mrUw==} 142 | 143 | '@electron/get@2.0.3': 144 | resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} 145 | engines: {node: '>=12'} 146 | 147 | '@esbuild/aix-ppc64@0.24.0': 148 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 149 | engines: {node: '>=18'} 150 | cpu: [ppc64] 151 | os: [aix] 152 | 153 | '@esbuild/android-arm64@0.24.0': 154 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 155 | engines: {node: '>=18'} 156 | cpu: [arm64] 157 | os: [android] 158 | 159 | '@esbuild/android-arm@0.24.0': 160 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 161 | engines: {node: '>=18'} 162 | cpu: [arm] 163 | os: [android] 164 | 165 | '@esbuild/android-x64@0.24.0': 166 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 167 | engines: {node: '>=18'} 168 | cpu: [x64] 169 | os: [android] 170 | 171 | '@esbuild/darwin-arm64@0.24.0': 172 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 173 | engines: {node: '>=18'} 174 | cpu: [arm64] 175 | os: [darwin] 176 | 177 | '@esbuild/darwin-x64@0.24.0': 178 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 179 | engines: {node: '>=18'} 180 | cpu: [x64] 181 | os: [darwin] 182 | 183 | '@esbuild/freebsd-arm64@0.24.0': 184 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 185 | engines: {node: '>=18'} 186 | cpu: [arm64] 187 | os: [freebsd] 188 | 189 | '@esbuild/freebsd-x64@0.24.0': 190 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 191 | engines: {node: '>=18'} 192 | cpu: [x64] 193 | os: [freebsd] 194 | 195 | '@esbuild/linux-arm64@0.24.0': 196 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 197 | engines: {node: '>=18'} 198 | cpu: [arm64] 199 | os: [linux] 200 | 201 | '@esbuild/linux-arm@0.24.0': 202 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 203 | engines: {node: '>=18'} 204 | cpu: [arm] 205 | os: [linux] 206 | 207 | '@esbuild/linux-ia32@0.24.0': 208 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 209 | engines: {node: '>=18'} 210 | cpu: [ia32] 211 | os: [linux] 212 | 213 | '@esbuild/linux-loong64@0.24.0': 214 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 215 | engines: {node: '>=18'} 216 | cpu: [loong64] 217 | os: [linux] 218 | 219 | '@esbuild/linux-mips64el@0.24.0': 220 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 221 | engines: {node: '>=18'} 222 | cpu: [mips64el] 223 | os: [linux] 224 | 225 | '@esbuild/linux-ppc64@0.24.0': 226 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 227 | engines: {node: '>=18'} 228 | cpu: [ppc64] 229 | os: [linux] 230 | 231 | '@esbuild/linux-riscv64@0.24.0': 232 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 233 | engines: {node: '>=18'} 234 | cpu: [riscv64] 235 | os: [linux] 236 | 237 | '@esbuild/linux-s390x@0.24.0': 238 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 239 | engines: {node: '>=18'} 240 | cpu: [s390x] 241 | os: [linux] 242 | 243 | '@esbuild/linux-x64@0.24.0': 244 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 245 | engines: {node: '>=18'} 246 | cpu: [x64] 247 | os: [linux] 248 | 249 | '@esbuild/netbsd-x64@0.24.0': 250 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 251 | engines: {node: '>=18'} 252 | cpu: [x64] 253 | os: [netbsd] 254 | 255 | '@esbuild/openbsd-arm64@0.24.0': 256 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 257 | engines: {node: '>=18'} 258 | cpu: [arm64] 259 | os: [openbsd] 260 | 261 | '@esbuild/openbsd-x64@0.24.0': 262 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 263 | engines: {node: '>=18'} 264 | cpu: [x64] 265 | os: [openbsd] 266 | 267 | '@esbuild/sunos-x64@0.24.0': 268 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 269 | engines: {node: '>=18'} 270 | cpu: [x64] 271 | os: [sunos] 272 | 273 | '@esbuild/win32-arm64@0.24.0': 274 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 275 | engines: {node: '>=18'} 276 | cpu: [arm64] 277 | os: [win32] 278 | 279 | '@esbuild/win32-ia32@0.24.0': 280 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 281 | engines: {node: '>=18'} 282 | cpu: [ia32] 283 | os: [win32] 284 | 285 | '@esbuild/win32-x64@0.24.0': 286 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 287 | engines: {node: '>=18'} 288 | cpu: [x64] 289 | os: [win32] 290 | 291 | '@hutson/parse-repository-url@3.0.2': 292 | resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} 293 | engines: {node: '>=6.9.0'} 294 | 295 | '@ophidian/electron-types@24.3.1': 296 | resolution: {integrity: sha512-fzvB7sQMxTbQHbp3rcYIxaqHiWjFnpSBVvZBSDH0Rq0xMvihBH1D4/O2JqybSlVpYtbvXR4nVKeH3w4JmHLTag==} 297 | 298 | '@sindresorhus/is@4.6.0': 299 | resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} 300 | engines: {node: '>=10'} 301 | 302 | '@szmarczak/http-timer@4.0.6': 303 | resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} 304 | engines: {node: '>=10'} 305 | 306 | '@types/cacheable-request@6.0.3': 307 | resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} 308 | 309 | '@types/codemirror@5.60.8': 310 | resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} 311 | 312 | '@types/estree@1.0.6': 313 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 314 | 315 | '@types/http-cache-semantics@4.0.4': 316 | resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} 317 | 318 | '@types/keyv@3.1.4': 319 | resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} 320 | 321 | '@types/minimist@1.2.5': 322 | resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} 323 | 324 | '@types/node@20.17.1': 325 | resolution: {integrity: sha512-j2VlPv1NnwPJbaCNv69FO/1z4lId0QmGvpT41YxitRtWlg96g/j8qcv2RKsLKe2F6OJgyXhupN1Xo17b2m139Q==} 326 | 327 | '@types/node@22.8.1': 328 | resolution: {integrity: sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==} 329 | 330 | '@types/normalize-package-data@2.4.4': 331 | resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 332 | 333 | '@types/responselike@1.0.3': 334 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} 335 | 336 | '@types/sortablejs@1.15.8': 337 | resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==} 338 | 339 | '@types/tern@0.23.9': 340 | resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} 341 | 342 | '@types/yauzl@2.10.3': 343 | resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} 344 | 345 | JSONStream@1.3.5: 346 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 347 | hasBin: true 348 | 349 | add-stream@1.0.0: 350 | resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} 351 | 352 | agent-base@7.1.1: 353 | resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} 354 | engines: {node: '>= 14'} 355 | 356 | ansi-colors@4.1.3: 357 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 358 | engines: {node: '>=6'} 359 | 360 | ansi-regex@5.0.1: 361 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 362 | engines: {node: '>=8'} 363 | 364 | ansi-styles@3.2.1: 365 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 366 | engines: {node: '>=4'} 367 | 368 | ansi-styles@4.3.0: 369 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 370 | engines: {node: '>=8'} 371 | 372 | array-ify@1.0.0: 373 | resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} 374 | 375 | arrify@1.0.1: 376 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 377 | engines: {node: '>=0.10.0'} 378 | 379 | asynckit@0.4.0: 380 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 381 | 382 | balanced-match@1.0.2: 383 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 384 | 385 | boolean@3.2.0: 386 | resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} 387 | deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. 388 | 389 | brace-expansion@1.1.11: 390 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 391 | 392 | buffer-crc32@0.2.13: 393 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 394 | 395 | buffer-from@1.1.2: 396 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 397 | 398 | builtin-modules@4.0.0: 399 | resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} 400 | engines: {node: '>=18.20'} 401 | 402 | cacheable-lookup@5.0.4: 403 | resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} 404 | engines: {node: '>=10.6.0'} 405 | 406 | cacheable-request@7.0.4: 407 | resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} 408 | engines: {node: '>=8'} 409 | 410 | camelcase-keys@6.2.2: 411 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 412 | engines: {node: '>=8'} 413 | 414 | camelcase@5.3.1: 415 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 416 | engines: {node: '>=6'} 417 | 418 | chalk@2.4.2: 419 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 420 | engines: {node: '>=4'} 421 | 422 | cliui@7.0.4: 423 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 424 | 425 | cliui@8.0.1: 426 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 427 | engines: {node: '>=12'} 428 | 429 | clone-response@1.0.3: 430 | resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} 431 | 432 | color-convert@1.9.3: 433 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 434 | 435 | color-convert@2.0.1: 436 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 437 | engines: {node: '>=7.0.0'} 438 | 439 | color-name@1.1.3: 440 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 441 | 442 | color-name@1.1.4: 443 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 444 | 445 | combined-stream@1.0.8: 446 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 447 | engines: {node: '>= 0.8'} 448 | 449 | commander@12.1.0: 450 | resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 451 | engines: {node: '>=18'} 452 | 453 | commit-and-tag-version@12.5.0: 454 | resolution: {integrity: sha512-Ll7rkKntH20iEFOPUT4e503Jf3J0J8jSN+aSeHuvNdtv4xmv9kSLSBg2CWsMVihwF3J2WvMHBEUSCKuDNesiTA==} 455 | engines: {node: '>=18'} 456 | hasBin: true 457 | 458 | compare-func@2.0.0: 459 | resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} 460 | 461 | concat-map@0.0.1: 462 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 463 | 464 | concat-stream@2.0.0: 465 | resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} 466 | engines: {'0': node >= 6.0} 467 | 468 | conventional-changelog-angular@6.0.0: 469 | resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} 470 | engines: {node: '>=14'} 471 | 472 | conventional-changelog-atom@3.0.0: 473 | resolution: {integrity: sha512-pnN5bWpH+iTUWU3FaYdw5lJmfWeqSyrUkG+wyHBI9tC1dLNnHkbAOg1SzTQ7zBqiFrfo55h40VsGXWMdopwc5g==} 474 | engines: {node: '>=14'} 475 | 476 | conventional-changelog-codemirror@3.0.0: 477 | resolution: {integrity: sha512-wzchZt9HEaAZrenZAUUHMCFcuYzGoZ1wG/kTRMICxsnW5AXohYMRxnyecP9ob42Gvn5TilhC0q66AtTPRSNMfw==} 478 | engines: {node: '>=14'} 479 | 480 | conventional-changelog-config-spec@2.1.0: 481 | resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} 482 | 483 | conventional-changelog-conventionalcommits@6.1.0: 484 | resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} 485 | engines: {node: '>=14'} 486 | 487 | conventional-changelog-core@5.0.2: 488 | resolution: {integrity: sha512-RhQOcDweXNWvlRwUDCpaqXzbZemKPKncCWZG50Alth72WITVd6nhVk9MJ6w1k9PFNBcZ3YwkdkChE+8+ZwtUug==} 489 | engines: {node: '>=14'} 490 | 491 | conventional-changelog-ember@3.0.0: 492 | resolution: {integrity: sha512-7PYthCoSxIS98vWhVcSphMYM322OxptpKAuHYdVspryI0ooLDehRXWeRWgN+zWSBXKl/pwdgAg8IpLNSM1/61A==} 493 | engines: {node: '>=14'} 494 | 495 | conventional-changelog-eslint@4.0.0: 496 | resolution: {integrity: sha512-nEZ9byP89hIU0dMx37JXQkE1IpMmqKtsaR24X7aM3L6Yy/uAtbb+ogqthuNYJkeO1HyvK7JsX84z8649hvp43Q==} 497 | engines: {node: '>=14'} 498 | 499 | conventional-changelog-express@3.0.0: 500 | resolution: {integrity: sha512-HqxihpUMfIuxvlPvC6HltA4ZktQEUan/v3XQ77+/zbu8No/fqK3rxSZaYeHYant7zRxQNIIli7S+qLS9tX9zQA==} 501 | engines: {node: '>=14'} 502 | 503 | conventional-changelog-jquery@4.0.0: 504 | resolution: {integrity: sha512-TTIN5CyzRMf8PUwyy4IOLmLV2DFmPtasKN+x7EQKzwSX8086XYwo+NeaeA3VUT8bvKaIy5z/JoWUvi7huUOgaw==} 505 | engines: {node: '>=14'} 506 | 507 | conventional-changelog-jshint@3.0.0: 508 | resolution: {integrity: sha512-bQof4byF4q+n+dwFRkJ/jGf9dCNUv4/kCDcjeCizBvfF81TeimPZBB6fT4HYbXgxxfxWXNl/i+J6T0nI4by6DA==} 509 | engines: {node: '>=14'} 510 | 511 | conventional-changelog-preset-loader@3.0.0: 512 | resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} 513 | engines: {node: '>=14'} 514 | 515 | conventional-changelog-writer@6.0.1: 516 | resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} 517 | engines: {node: '>=14'} 518 | hasBin: true 519 | 520 | conventional-changelog@4.0.0: 521 | resolution: {integrity: sha512-JbZjwE1PzxQCvm+HUTIr+pbSekS8qdOZzMakdFyPtdkEWwFvwEJYONzjgMm0txCb2yBcIcfKDmg8xtCKTdecNQ==} 522 | engines: {node: '>=14'} 523 | 524 | conventional-commits-filter@3.0.0: 525 | resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} 526 | engines: {node: '>=14'} 527 | 528 | conventional-commits-parser@4.0.0: 529 | resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} 530 | engines: {node: '>=14'} 531 | hasBin: true 532 | 533 | conventional-recommended-bump@7.0.1: 534 | resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} 535 | engines: {node: '>=14'} 536 | hasBin: true 537 | 538 | core-util-is@1.0.3: 539 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 540 | 541 | cssstyle@4.1.0: 542 | resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} 543 | engines: {node: '>=18'} 544 | 545 | dargs@7.0.0: 546 | resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} 547 | engines: {node: '>=8'} 548 | 549 | data-urls@5.0.0: 550 | resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} 551 | engines: {node: '>=18'} 552 | 553 | dateformat@3.0.3: 554 | resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} 555 | 556 | debug@4.3.7: 557 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 558 | engines: {node: '>=6.0'} 559 | peerDependencies: 560 | supports-color: '*' 561 | peerDependenciesMeta: 562 | supports-color: 563 | optional: true 564 | 565 | decamelize-keys@1.1.1: 566 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} 567 | engines: {node: '>=0.10.0'} 568 | 569 | decamelize@1.2.0: 570 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 571 | engines: {node: '>=0.10.0'} 572 | 573 | decimal.js@10.4.3: 574 | resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} 575 | 576 | decompress-response@6.0.0: 577 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 578 | engines: {node: '>=10'} 579 | 580 | dedent@1.5.3: 581 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 582 | peerDependencies: 583 | babel-plugin-macros: ^3.1.0 584 | peerDependenciesMeta: 585 | babel-plugin-macros: 586 | optional: true 587 | 588 | defer-to-connect@2.0.1: 589 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 590 | engines: {node: '>=10'} 591 | 592 | define-data-property@1.1.4: 593 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 594 | engines: {node: '>= 0.4'} 595 | 596 | define-properties@1.2.1: 597 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 598 | engines: {node: '>= 0.4'} 599 | 600 | delayed-stream@1.0.0: 601 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 602 | engines: {node: '>=0.4.0'} 603 | 604 | detect-indent@6.1.0: 605 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 606 | engines: {node: '>=8'} 607 | 608 | detect-newline@3.1.0: 609 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 610 | engines: {node: '>=8'} 611 | 612 | detect-node@2.1.0: 613 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} 614 | 615 | dot-prop@5.3.0: 616 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 617 | engines: {node: '>=8'} 618 | 619 | dotenv@16.4.5: 620 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 621 | engines: {node: '>=12'} 622 | 623 | dotgitignore@2.1.0: 624 | resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} 625 | engines: {node: '>=6'} 626 | 627 | electron@32.0.1: 628 | resolution: {integrity: sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==} 629 | engines: {node: '>= 12.20.55'} 630 | hasBin: true 631 | 632 | emoji-regex@8.0.0: 633 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 634 | 635 | end-of-stream@1.4.4: 636 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 637 | 638 | entities@4.5.0: 639 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 640 | engines: {node: '>=0.12'} 641 | 642 | env-paths@2.2.1: 643 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 644 | engines: {node: '>=6'} 645 | 646 | error-ex@1.3.2: 647 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 648 | 649 | es-define-property@1.0.0: 650 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 651 | engines: {node: '>= 0.4'} 652 | 653 | es-errors@1.3.0: 654 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 655 | engines: {node: '>= 0.4'} 656 | 657 | es6-error@4.1.1: 658 | resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 659 | 660 | esbuild@0.24.0: 661 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 662 | engines: {node: '>=18'} 663 | hasBin: true 664 | 665 | escalade@3.2.0: 666 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 667 | engines: {node: '>=6'} 668 | 669 | escape-string-regexp@1.0.5: 670 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 671 | engines: {node: '>=0.8.0'} 672 | 673 | escape-string-regexp@4.0.0: 674 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 675 | engines: {node: '>=10'} 676 | 677 | extract-zip@2.0.1: 678 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 679 | engines: {node: '>= 10.17.0'} 680 | hasBin: true 681 | 682 | fd-slicer@1.1.0: 683 | resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 684 | 685 | figures@3.2.0: 686 | resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} 687 | engines: {node: '>=8'} 688 | 689 | find-up@2.1.0: 690 | resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} 691 | engines: {node: '>=4'} 692 | 693 | find-up@3.0.0: 694 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 695 | engines: {node: '>=6'} 696 | 697 | find-up@4.1.0: 698 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 699 | engines: {node: '>=8'} 700 | 701 | find-up@5.0.0: 702 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 703 | engines: {node: '>=10'} 704 | 705 | form-data@4.0.1: 706 | resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} 707 | engines: {node: '>= 6'} 708 | 709 | fs-extra@8.1.0: 710 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 711 | engines: {node: '>=6 <7 || >=8'} 712 | 713 | function-bind@1.1.2: 714 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 715 | 716 | fuse.js@7.0.0: 717 | resolution: {integrity: sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==} 718 | engines: {node: '>=10'} 719 | 720 | get-caller-file@2.0.5: 721 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 722 | engines: {node: 6.* || 8.* || >= 10.*} 723 | 724 | get-intrinsic@1.2.4: 725 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 726 | engines: {node: '>= 0.4'} 727 | 728 | get-pkg-repo@4.2.1: 729 | resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} 730 | engines: {node: '>=6.9.0'} 731 | hasBin: true 732 | 733 | get-stream@5.2.0: 734 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 735 | engines: {node: '>=8'} 736 | 737 | git-raw-commits@3.0.0: 738 | resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} 739 | engines: {node: '>=14'} 740 | hasBin: true 741 | 742 | git-remote-origin-url@2.0.0: 743 | resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} 744 | engines: {node: '>=4'} 745 | 746 | git-semver-tags@5.0.1: 747 | resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} 748 | engines: {node: '>=14'} 749 | hasBin: true 750 | 751 | gitconfiglocal@1.0.0: 752 | resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} 753 | 754 | global-agent@3.0.0: 755 | resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} 756 | engines: {node: '>=10.0'} 757 | 758 | globalthis@1.0.4: 759 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 760 | engines: {node: '>= 0.4'} 761 | 762 | gopd@1.0.1: 763 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 764 | 765 | got@11.8.6: 766 | resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} 767 | engines: {node: '>=10.19.0'} 768 | 769 | graceful-fs@4.2.11: 770 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 771 | 772 | handlebars@4.7.8: 773 | resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} 774 | engines: {node: '>=0.4.7'} 775 | hasBin: true 776 | 777 | hard-rejection@2.1.0: 778 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 779 | engines: {node: '>=6'} 780 | 781 | has-flag@3.0.0: 782 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 783 | engines: {node: '>=4'} 784 | 785 | has-property-descriptors@1.0.2: 786 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 787 | 788 | has-proto@1.0.3: 789 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 790 | engines: {node: '>= 0.4'} 791 | 792 | has-symbols@1.0.3: 793 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 794 | engines: {node: '>= 0.4'} 795 | 796 | hasown@2.0.2: 797 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 798 | engines: {node: '>= 0.4'} 799 | 800 | hosted-git-info@2.8.9: 801 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 802 | 803 | hosted-git-info@4.1.0: 804 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 805 | engines: {node: '>=10'} 806 | 807 | html-encoding-sniffer@4.0.0: 808 | resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} 809 | engines: {node: '>=18'} 810 | 811 | http-cache-semantics@4.1.1: 812 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 813 | 814 | http-proxy-agent@7.0.2: 815 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 816 | engines: {node: '>= 14'} 817 | 818 | http2-wrapper@1.0.3: 819 | resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} 820 | engines: {node: '>=10.19.0'} 821 | 822 | https-proxy-agent@7.0.5: 823 | resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} 824 | engines: {node: '>= 14'} 825 | 826 | i18next@23.16.4: 827 | resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} 828 | 829 | iconv-lite@0.6.3: 830 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 831 | engines: {node: '>=0.10.0'} 832 | 833 | indent-string@4.0.0: 834 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 835 | engines: {node: '>=8'} 836 | 837 | inherits@2.0.4: 838 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 839 | 840 | ini@1.3.8: 841 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 842 | 843 | is-arrayish@0.2.1: 844 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 845 | 846 | is-core-module@2.15.1: 847 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 848 | engines: {node: '>= 0.4'} 849 | 850 | is-fullwidth-code-point@3.0.0: 851 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 852 | engines: {node: '>=8'} 853 | 854 | is-obj@2.0.0: 855 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 856 | engines: {node: '>=8'} 857 | 858 | is-plain-obj@1.1.0: 859 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} 860 | engines: {node: '>=0.10.0'} 861 | 862 | is-potential-custom-element-name@1.0.1: 863 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 864 | 865 | is-text-path@1.0.1: 866 | resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} 867 | engines: {node: '>=0.10.0'} 868 | 869 | isarray@1.0.0: 870 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 871 | 872 | js-tokens@4.0.0: 873 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 874 | 875 | jsdom@25.0.1: 876 | resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} 877 | engines: {node: '>=18'} 878 | peerDependencies: 879 | canvas: ^2.11.2 880 | peerDependenciesMeta: 881 | canvas: 882 | optional: true 883 | 884 | json-buffer@3.0.1: 885 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 886 | 887 | json-parse-better-errors@1.0.2: 888 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 889 | 890 | json-parse-even-better-errors@2.3.1: 891 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 892 | 893 | json-stringify-safe@5.0.1: 894 | resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} 895 | 896 | jsonfile@4.0.0: 897 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 898 | 899 | jsonparse@1.3.1: 900 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 901 | engines: {'0': node >= 0.2.0} 902 | 903 | keyv@4.5.4: 904 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 905 | 906 | kind-of@6.0.3: 907 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 908 | engines: {node: '>=0.10.0'} 909 | 910 | lines-and-columns@1.2.4: 911 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 912 | 913 | load-json-file@4.0.0: 914 | resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 915 | engines: {node: '>=4'} 916 | 917 | locate-path@2.0.0: 918 | resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} 919 | engines: {node: '>=4'} 920 | 921 | locate-path@3.0.0: 922 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 923 | engines: {node: '>=6'} 924 | 925 | locate-path@5.0.0: 926 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 927 | engines: {node: '>=8'} 928 | 929 | locate-path@6.0.0: 930 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 931 | engines: {node: '>=10'} 932 | 933 | lodash.ismatch@4.4.0: 934 | resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} 935 | 936 | lowercase-keys@2.0.0: 937 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 938 | engines: {node: '>=8'} 939 | 940 | lru-cache@6.0.0: 941 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 942 | engines: {node: '>=10'} 943 | 944 | map-obj@1.0.1: 945 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} 946 | engines: {node: '>=0.10.0'} 947 | 948 | map-obj@4.3.0: 949 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 950 | engines: {node: '>=8'} 951 | 952 | matcher@3.0.0: 953 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} 954 | engines: {node: '>=10'} 955 | 956 | meow@8.1.2: 957 | resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} 958 | engines: {node: '>=10'} 959 | 960 | mime-db@1.52.0: 961 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 962 | engines: {node: '>= 0.6'} 963 | 964 | mime-types@2.1.35: 965 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 966 | engines: {node: '>= 0.6'} 967 | 968 | mimic-response@1.0.1: 969 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 970 | engines: {node: '>=4'} 971 | 972 | mimic-response@3.1.0: 973 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 974 | engines: {node: '>=10'} 975 | 976 | min-indent@1.0.1: 977 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 978 | engines: {node: '>=4'} 979 | 980 | minimatch@3.1.2: 981 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 982 | 983 | minimist-options@4.1.0: 984 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 985 | engines: {node: '>= 6'} 986 | 987 | minimist@1.2.8: 988 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 989 | 990 | modify-values@1.0.1: 991 | resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} 992 | engines: {node: '>=0.10.0'} 993 | 994 | moment@2.29.4: 995 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 996 | 997 | monkey-around@3.0.0: 998 | resolution: {integrity: sha512-jL6uY2lEAoaHxZep1cNRkCZjoIWY4g5VYCjriEWmcyHU7w8NU1+JH57xE251UVTohK0lCxMjv0ZV4ByDLIXEpw==} 999 | 1000 | ms@2.1.3: 1001 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1002 | 1003 | neo-async@2.6.2: 1004 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1005 | 1006 | normalize-package-data@2.5.0: 1007 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1008 | 1009 | normalize-package-data@3.0.3: 1010 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} 1011 | engines: {node: '>=10'} 1012 | 1013 | normalize-url@6.1.0: 1014 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 1015 | engines: {node: '>=10'} 1016 | 1017 | nwsapi@2.2.13: 1018 | resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} 1019 | 1020 | object-keys@1.1.1: 1021 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1022 | engines: {node: '>= 0.4'} 1023 | 1024 | obsidian-typings@2.2.0: 1025 | resolution: {integrity: sha512-LELYemQtJvIOEABv/m7bWxEhOXoCan8YLu/soZp3CSe5C72hKVk4rvglzcwMQJa95HcP8zeKyABR13Us25ydnw==} 1026 | peerDependencies: 1027 | '@types/node': '>=14.0.0' 1028 | electron: '>=1.6.10' 1029 | obsidian: ^1.6.6 1030 | 1031 | obsidian@1.7.2: 1032 | resolution: {integrity: sha512-k9hN9brdknJC+afKr5FQzDRuEFGDKbDjfCazJwpgibwCAoZNYHYV8p/s3mM8I6AsnKrPKNXf8xGuMZ4enWelZQ==} 1033 | peerDependencies: 1034 | '@codemirror/state': ^6.0.0 1035 | '@codemirror/view': ^6.0.0 1036 | 1037 | once@1.4.0: 1038 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1039 | 1040 | p-cancelable@2.1.1: 1041 | resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} 1042 | engines: {node: '>=8'} 1043 | 1044 | p-limit@1.3.0: 1045 | resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} 1046 | engines: {node: '>=4'} 1047 | 1048 | p-limit@2.3.0: 1049 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1050 | engines: {node: '>=6'} 1051 | 1052 | p-limit@3.1.0: 1053 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1054 | engines: {node: '>=10'} 1055 | 1056 | p-locate@2.0.0: 1057 | resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} 1058 | engines: {node: '>=4'} 1059 | 1060 | p-locate@3.0.0: 1061 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 1062 | engines: {node: '>=6'} 1063 | 1064 | p-locate@4.1.0: 1065 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1066 | engines: {node: '>=8'} 1067 | 1068 | p-locate@5.0.0: 1069 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1070 | engines: {node: '>=10'} 1071 | 1072 | p-try@1.0.0: 1073 | resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} 1074 | engines: {node: '>=4'} 1075 | 1076 | p-try@2.2.0: 1077 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1078 | engines: {node: '>=6'} 1079 | 1080 | parse-json@4.0.0: 1081 | resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1082 | engines: {node: '>=4'} 1083 | 1084 | parse-json@5.2.0: 1085 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1086 | engines: {node: '>=8'} 1087 | 1088 | parse5@7.2.0: 1089 | resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} 1090 | 1091 | path-exists@3.0.0: 1092 | resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} 1093 | engines: {node: '>=4'} 1094 | 1095 | path-exists@4.0.0: 1096 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1097 | engines: {node: '>=8'} 1098 | 1099 | path-parse@1.0.7: 1100 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1101 | 1102 | path-type@3.0.0: 1103 | resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1104 | engines: {node: '>=4'} 1105 | 1106 | pend@1.2.0: 1107 | resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 1108 | 1109 | picocolors@1.1.1: 1110 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1111 | 1112 | pify@2.3.0: 1113 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1114 | engines: {node: '>=0.10.0'} 1115 | 1116 | pify@3.0.0: 1117 | resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1118 | engines: {node: '>=4'} 1119 | 1120 | process-nextick-args@2.0.1: 1121 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1122 | 1123 | progress@2.0.3: 1124 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1125 | engines: {node: '>=0.4.0'} 1126 | 1127 | pump@3.0.2: 1128 | resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} 1129 | 1130 | punycode@2.3.1: 1131 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1132 | engines: {node: '>=6'} 1133 | 1134 | quick-lru@4.0.1: 1135 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 1136 | engines: {node: '>=8'} 1137 | 1138 | quick-lru@5.1.1: 1139 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1140 | engines: {node: '>=10'} 1141 | 1142 | read-pkg-up@3.0.0: 1143 | resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} 1144 | engines: {node: '>=4'} 1145 | 1146 | read-pkg-up@7.0.1: 1147 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} 1148 | engines: {node: '>=8'} 1149 | 1150 | read-pkg@3.0.0: 1151 | resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1152 | engines: {node: '>=4'} 1153 | 1154 | read-pkg@5.2.0: 1155 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} 1156 | engines: {node: '>=8'} 1157 | 1158 | readable-stream@2.3.8: 1159 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1160 | 1161 | readable-stream@3.6.2: 1162 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1163 | engines: {node: '>= 6'} 1164 | 1165 | redent@3.0.0: 1166 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 1167 | engines: {node: '>=8'} 1168 | 1169 | regenerator-runtime@0.14.1: 1170 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1171 | 1172 | require-directory@2.1.1: 1173 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1174 | engines: {node: '>=0.10.0'} 1175 | 1176 | resolve-alpn@1.2.1: 1177 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 1178 | 1179 | resolve@1.22.8: 1180 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1181 | hasBin: true 1182 | 1183 | responselike@2.0.1: 1184 | resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} 1185 | 1186 | roarr@2.15.4: 1187 | resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} 1188 | engines: {node: '>=8.0'} 1189 | 1190 | rrweb-cssom@0.7.1: 1191 | resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} 1192 | 1193 | safe-buffer@5.1.2: 1194 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1195 | 1196 | safe-buffer@5.2.1: 1197 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1198 | 1199 | safer-buffer@2.1.2: 1200 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1201 | 1202 | saxes@6.0.0: 1203 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 1204 | engines: {node: '>=v12.22.7'} 1205 | 1206 | semver-compare@1.0.0: 1207 | resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} 1208 | 1209 | semver@5.7.2: 1210 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1211 | hasBin: true 1212 | 1213 | semver@6.3.1: 1214 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1215 | hasBin: true 1216 | 1217 | semver@7.6.3: 1218 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1219 | engines: {node: '>=10'} 1220 | hasBin: true 1221 | 1222 | serialize-error@7.0.1: 1223 | resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} 1224 | engines: {node: '>=10'} 1225 | 1226 | sortablejs@1.15.3: 1227 | resolution: {integrity: sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==} 1228 | 1229 | source-map@0.6.1: 1230 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1231 | engines: {node: '>=0.10.0'} 1232 | 1233 | spdx-correct@3.2.0: 1234 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1235 | 1236 | spdx-exceptions@2.5.0: 1237 | resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1238 | 1239 | spdx-expression-parse@3.0.1: 1240 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1241 | 1242 | spdx-license-ids@3.0.20: 1243 | resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} 1244 | 1245 | split2@3.2.2: 1246 | resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} 1247 | 1248 | split@1.0.1: 1249 | resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} 1250 | 1251 | sprintf-js@1.1.3: 1252 | resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} 1253 | 1254 | string-width@4.2.3: 1255 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1256 | engines: {node: '>=8'} 1257 | 1258 | string_decoder@1.1.1: 1259 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1260 | 1261 | string_decoder@1.3.0: 1262 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1263 | 1264 | strip-ansi@6.0.1: 1265 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1266 | engines: {node: '>=8'} 1267 | 1268 | strip-bom@3.0.0: 1269 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1270 | engines: {node: '>=4'} 1271 | 1272 | strip-indent@3.0.0: 1273 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1274 | engines: {node: '>=8'} 1275 | 1276 | style-mod@4.1.2: 1277 | resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} 1278 | 1279 | sumchecker@3.0.1: 1280 | resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} 1281 | engines: {node: '>= 8.0'} 1282 | 1283 | supports-color@5.5.0: 1284 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1285 | engines: {node: '>=4'} 1286 | 1287 | supports-preserve-symlinks-flag@1.0.0: 1288 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1289 | engines: {node: '>= 0.4'} 1290 | 1291 | symbol-tree@3.2.4: 1292 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 1293 | 1294 | text-extensions@1.9.0: 1295 | resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} 1296 | engines: {node: '>=0.10'} 1297 | 1298 | through2@2.0.5: 1299 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 1300 | 1301 | through@2.3.8: 1302 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1303 | 1304 | tldts-core@6.1.55: 1305 | resolution: {integrity: sha512-BL+BuKHHaOpntE5BGI6naXjULU6aRlgaYdfDHR3T/hdbNTWkWUZ9yuc11wGnwgpvRwlyUiIK+QohYK3olaVU6Q==} 1306 | 1307 | tldts@6.1.55: 1308 | resolution: {integrity: sha512-HxQR/9roQ07Pwc8RyyrJMAxRz5/ssoF3qIPPUiIo3zUt6yMdmYZjM2OZIFMiZ3jHyz9jrGHEHuQZrUhoc1LkDw==} 1309 | hasBin: true 1310 | 1311 | tough-cookie@5.0.0: 1312 | resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} 1313 | engines: {node: '>=16'} 1314 | 1315 | tr46@5.0.0: 1316 | resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} 1317 | engines: {node: '>=18'} 1318 | 1319 | trim-newlines@3.0.1: 1320 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 1321 | engines: {node: '>=8'} 1322 | 1323 | tslib@2.8.0: 1324 | resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} 1325 | 1326 | type-fest@0.13.1: 1327 | resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} 1328 | engines: {node: '>=10'} 1329 | 1330 | type-fest@0.18.1: 1331 | resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} 1332 | engines: {node: '>=10'} 1333 | 1334 | type-fest@0.6.0: 1335 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} 1336 | engines: {node: '>=8'} 1337 | 1338 | type-fest@0.8.1: 1339 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1340 | engines: {node: '>=8'} 1341 | 1342 | typedarray@0.0.6: 1343 | resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 1344 | 1345 | typescript@5.6.3: 1346 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 1347 | engines: {node: '>=14.17'} 1348 | hasBin: true 1349 | 1350 | uglify-js@3.19.3: 1351 | resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} 1352 | engines: {node: '>=0.8.0'} 1353 | hasBin: true 1354 | 1355 | undici-types@6.19.8: 1356 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 1357 | 1358 | universalify@0.1.2: 1359 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1360 | engines: {node: '>= 4.0.0'} 1361 | 1362 | util-deprecate@1.0.2: 1363 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1364 | 1365 | validate-npm-package-license@3.0.4: 1366 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1367 | 1368 | w3c-keyname@2.2.8: 1369 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 1370 | 1371 | w3c-xmlserializer@5.0.0: 1372 | resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} 1373 | engines: {node: '>=18'} 1374 | 1375 | webidl-conversions@7.0.0: 1376 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1377 | engines: {node: '>=12'} 1378 | 1379 | whatwg-encoding@3.1.1: 1380 | resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 1381 | engines: {node: '>=18'} 1382 | 1383 | whatwg-mimetype@4.0.0: 1384 | resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 1385 | engines: {node: '>=18'} 1386 | 1387 | whatwg-url@14.0.0: 1388 | resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} 1389 | engines: {node: '>=18'} 1390 | 1391 | wordwrap@1.0.0: 1392 | resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 1393 | 1394 | wrap-ansi@7.0.0: 1395 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1396 | engines: {node: '>=10'} 1397 | 1398 | wrappy@1.0.2: 1399 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1400 | 1401 | ws@8.18.0: 1402 | resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} 1403 | engines: {node: '>=10.0.0'} 1404 | peerDependencies: 1405 | bufferutil: ^4.0.1 1406 | utf-8-validate: '>=5.0.2' 1407 | peerDependenciesMeta: 1408 | bufferutil: 1409 | optional: true 1410 | utf-8-validate: 1411 | optional: true 1412 | 1413 | xml-name-validator@5.0.0: 1414 | resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} 1415 | engines: {node: '>=18'} 1416 | 1417 | xmlchars@2.2.0: 1418 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 1419 | 1420 | xtend@4.0.2: 1421 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1422 | engines: {node: '>=0.4'} 1423 | 1424 | y18n@5.0.8: 1425 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1426 | engines: {node: '>=10'} 1427 | 1428 | yallist@4.0.0: 1429 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1430 | 1431 | yaml@2.6.0: 1432 | resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} 1433 | engines: {node: '>= 14'} 1434 | hasBin: true 1435 | 1436 | yargs-parser@20.2.9: 1437 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1438 | engines: {node: '>=10'} 1439 | 1440 | yargs-parser@21.1.1: 1441 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1442 | engines: {node: '>=12'} 1443 | 1444 | yargs@16.2.0: 1445 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1446 | engines: {node: '>=10'} 1447 | 1448 | yargs@17.7.2: 1449 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1450 | engines: {node: '>=12'} 1451 | 1452 | yauzl@2.10.0: 1453 | resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 1454 | 1455 | yocto-queue@0.1.0: 1456 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1457 | engines: {node: '>=10'} 1458 | 1459 | snapshots: 1460 | 1461 | '@babel/code-frame@7.26.0': 1462 | dependencies: 1463 | '@babel/helper-validator-identifier': 7.25.9 1464 | js-tokens: 4.0.0 1465 | picocolors: 1.1.1 1466 | 1467 | '@babel/helper-validator-identifier@7.25.9': {} 1468 | 1469 | '@babel/runtime@7.26.0': 1470 | dependencies: 1471 | regenerator-runtime: 0.14.1 1472 | 1473 | '@biomejs/biome@1.9.4': 1474 | optionalDependencies: 1475 | '@biomejs/cli-darwin-arm64': 1.9.4 1476 | '@biomejs/cli-darwin-x64': 1.9.4 1477 | '@biomejs/cli-linux-arm64': 1.9.4 1478 | '@biomejs/cli-linux-arm64-musl': 1.9.4 1479 | '@biomejs/cli-linux-x64': 1.9.4 1480 | '@biomejs/cli-linux-x64-musl': 1.9.4 1481 | '@biomejs/cli-win32-arm64': 1.9.4 1482 | '@biomejs/cli-win32-x64': 1.9.4 1483 | 1484 | '@biomejs/cli-darwin-arm64@1.9.4': 1485 | optional: true 1486 | 1487 | '@biomejs/cli-darwin-x64@1.9.4': 1488 | optional: true 1489 | 1490 | '@biomejs/cli-linux-arm64-musl@1.9.4': 1491 | optional: true 1492 | 1493 | '@biomejs/cli-linux-arm64@1.9.4': 1494 | optional: true 1495 | 1496 | '@biomejs/cli-linux-x64-musl@1.9.4': 1497 | optional: true 1498 | 1499 | '@biomejs/cli-linux-x64@1.9.4': 1500 | optional: true 1501 | 1502 | '@biomejs/cli-win32-arm64@1.9.4': 1503 | optional: true 1504 | 1505 | '@biomejs/cli-win32-x64@1.9.4': 1506 | optional: true 1507 | 1508 | '@codemirror/state@6.4.1': {} 1509 | 1510 | '@codemirror/view@6.27.0': 1511 | dependencies: 1512 | '@codemirror/state': 6.4.1 1513 | style-mod: 4.1.2 1514 | w3c-keyname: 2.2.8 1515 | 1516 | '@electron/get@2.0.3': 1517 | dependencies: 1518 | debug: 4.3.7 1519 | env-paths: 2.2.1 1520 | fs-extra: 8.1.0 1521 | got: 11.8.6 1522 | progress: 2.0.3 1523 | semver: 6.3.1 1524 | sumchecker: 3.0.1 1525 | optionalDependencies: 1526 | global-agent: 3.0.0 1527 | transitivePeerDependencies: 1528 | - supports-color 1529 | 1530 | '@esbuild/aix-ppc64@0.24.0': 1531 | optional: true 1532 | 1533 | '@esbuild/android-arm64@0.24.0': 1534 | optional: true 1535 | 1536 | '@esbuild/android-arm@0.24.0': 1537 | optional: true 1538 | 1539 | '@esbuild/android-x64@0.24.0': 1540 | optional: true 1541 | 1542 | '@esbuild/darwin-arm64@0.24.0': 1543 | optional: true 1544 | 1545 | '@esbuild/darwin-x64@0.24.0': 1546 | optional: true 1547 | 1548 | '@esbuild/freebsd-arm64@0.24.0': 1549 | optional: true 1550 | 1551 | '@esbuild/freebsd-x64@0.24.0': 1552 | optional: true 1553 | 1554 | '@esbuild/linux-arm64@0.24.0': 1555 | optional: true 1556 | 1557 | '@esbuild/linux-arm@0.24.0': 1558 | optional: true 1559 | 1560 | '@esbuild/linux-ia32@0.24.0': 1561 | optional: true 1562 | 1563 | '@esbuild/linux-loong64@0.24.0': 1564 | optional: true 1565 | 1566 | '@esbuild/linux-mips64el@0.24.0': 1567 | optional: true 1568 | 1569 | '@esbuild/linux-ppc64@0.24.0': 1570 | optional: true 1571 | 1572 | '@esbuild/linux-riscv64@0.24.0': 1573 | optional: true 1574 | 1575 | '@esbuild/linux-s390x@0.24.0': 1576 | optional: true 1577 | 1578 | '@esbuild/linux-x64@0.24.0': 1579 | optional: true 1580 | 1581 | '@esbuild/netbsd-x64@0.24.0': 1582 | optional: true 1583 | 1584 | '@esbuild/openbsd-arm64@0.24.0': 1585 | optional: true 1586 | 1587 | '@esbuild/openbsd-x64@0.24.0': 1588 | optional: true 1589 | 1590 | '@esbuild/sunos-x64@0.24.0': 1591 | optional: true 1592 | 1593 | '@esbuild/win32-arm64@0.24.0': 1594 | optional: true 1595 | 1596 | '@esbuild/win32-ia32@0.24.0': 1597 | optional: true 1598 | 1599 | '@esbuild/win32-x64@0.24.0': 1600 | optional: true 1601 | 1602 | '@hutson/parse-repository-url@3.0.2': {} 1603 | 1604 | '@ophidian/electron-types@24.3.1': {} 1605 | 1606 | '@sindresorhus/is@4.6.0': {} 1607 | 1608 | '@szmarczak/http-timer@4.0.6': 1609 | dependencies: 1610 | defer-to-connect: 2.0.1 1611 | 1612 | '@types/cacheable-request@6.0.3': 1613 | dependencies: 1614 | '@types/http-cache-semantics': 4.0.4 1615 | '@types/keyv': 3.1.4 1616 | '@types/node': 20.17.1 1617 | '@types/responselike': 1.0.3 1618 | 1619 | '@types/codemirror@5.60.8': 1620 | dependencies: 1621 | '@types/tern': 0.23.9 1622 | 1623 | '@types/estree@1.0.6': {} 1624 | 1625 | '@types/http-cache-semantics@4.0.4': {} 1626 | 1627 | '@types/keyv@3.1.4': 1628 | dependencies: 1629 | '@types/node': 20.17.1 1630 | 1631 | '@types/minimist@1.2.5': {} 1632 | 1633 | '@types/node@20.17.1': 1634 | dependencies: 1635 | undici-types: 6.19.8 1636 | 1637 | '@types/node@22.8.1': 1638 | dependencies: 1639 | undici-types: 6.19.8 1640 | 1641 | '@types/normalize-package-data@2.4.4': {} 1642 | 1643 | '@types/responselike@1.0.3': 1644 | dependencies: 1645 | '@types/node': 20.17.1 1646 | 1647 | '@types/sortablejs@1.15.8': {} 1648 | 1649 | '@types/tern@0.23.9': 1650 | dependencies: 1651 | '@types/estree': 1.0.6 1652 | 1653 | '@types/yauzl@2.10.3': 1654 | dependencies: 1655 | '@types/node': 20.17.1 1656 | optional: true 1657 | 1658 | JSONStream@1.3.5: 1659 | dependencies: 1660 | jsonparse: 1.3.1 1661 | through: 2.3.8 1662 | 1663 | add-stream@1.0.0: {} 1664 | 1665 | agent-base@7.1.1: 1666 | dependencies: 1667 | debug: 4.3.7 1668 | transitivePeerDependencies: 1669 | - supports-color 1670 | 1671 | ansi-colors@4.1.3: {} 1672 | 1673 | ansi-regex@5.0.1: {} 1674 | 1675 | ansi-styles@3.2.1: 1676 | dependencies: 1677 | color-convert: 1.9.3 1678 | 1679 | ansi-styles@4.3.0: 1680 | dependencies: 1681 | color-convert: 2.0.1 1682 | 1683 | array-ify@1.0.0: {} 1684 | 1685 | arrify@1.0.1: {} 1686 | 1687 | asynckit@0.4.0: {} 1688 | 1689 | balanced-match@1.0.2: {} 1690 | 1691 | boolean@3.2.0: 1692 | optional: true 1693 | 1694 | brace-expansion@1.1.11: 1695 | dependencies: 1696 | balanced-match: 1.0.2 1697 | concat-map: 0.0.1 1698 | 1699 | buffer-crc32@0.2.13: {} 1700 | 1701 | buffer-from@1.1.2: {} 1702 | 1703 | builtin-modules@4.0.0: {} 1704 | 1705 | cacheable-lookup@5.0.4: {} 1706 | 1707 | cacheable-request@7.0.4: 1708 | dependencies: 1709 | clone-response: 1.0.3 1710 | get-stream: 5.2.0 1711 | http-cache-semantics: 4.1.1 1712 | keyv: 4.5.4 1713 | lowercase-keys: 2.0.0 1714 | normalize-url: 6.1.0 1715 | responselike: 2.0.1 1716 | 1717 | camelcase-keys@6.2.2: 1718 | dependencies: 1719 | camelcase: 5.3.1 1720 | map-obj: 4.3.0 1721 | quick-lru: 4.0.1 1722 | 1723 | camelcase@5.3.1: {} 1724 | 1725 | chalk@2.4.2: 1726 | dependencies: 1727 | ansi-styles: 3.2.1 1728 | escape-string-regexp: 1.0.5 1729 | supports-color: 5.5.0 1730 | 1731 | cliui@7.0.4: 1732 | dependencies: 1733 | string-width: 4.2.3 1734 | strip-ansi: 6.0.1 1735 | wrap-ansi: 7.0.0 1736 | 1737 | cliui@8.0.1: 1738 | dependencies: 1739 | string-width: 4.2.3 1740 | strip-ansi: 6.0.1 1741 | wrap-ansi: 7.0.0 1742 | 1743 | clone-response@1.0.3: 1744 | dependencies: 1745 | mimic-response: 1.0.1 1746 | 1747 | color-convert@1.9.3: 1748 | dependencies: 1749 | color-name: 1.1.3 1750 | 1751 | color-convert@2.0.1: 1752 | dependencies: 1753 | color-name: 1.1.4 1754 | 1755 | color-name@1.1.3: {} 1756 | 1757 | color-name@1.1.4: {} 1758 | 1759 | combined-stream@1.0.8: 1760 | dependencies: 1761 | delayed-stream: 1.0.0 1762 | 1763 | commander@12.1.0: {} 1764 | 1765 | commit-and-tag-version@12.5.0: 1766 | dependencies: 1767 | chalk: 2.4.2 1768 | conventional-changelog: 4.0.0 1769 | conventional-changelog-config-spec: 2.1.0 1770 | conventional-changelog-conventionalcommits: 6.1.0 1771 | conventional-recommended-bump: 7.0.1 1772 | detect-indent: 6.1.0 1773 | detect-newline: 3.1.0 1774 | dotgitignore: 2.1.0 1775 | figures: 3.2.0 1776 | find-up: 5.0.0 1777 | git-semver-tags: 5.0.1 1778 | jsdom: 25.0.1 1779 | semver: 7.6.3 1780 | w3c-xmlserializer: 5.0.0 1781 | yaml: 2.6.0 1782 | yargs: 17.7.2 1783 | transitivePeerDependencies: 1784 | - bufferutil 1785 | - canvas 1786 | - supports-color 1787 | - utf-8-validate 1788 | 1789 | compare-func@2.0.0: 1790 | dependencies: 1791 | array-ify: 1.0.0 1792 | dot-prop: 5.3.0 1793 | 1794 | concat-map@0.0.1: {} 1795 | 1796 | concat-stream@2.0.0: 1797 | dependencies: 1798 | buffer-from: 1.1.2 1799 | inherits: 2.0.4 1800 | readable-stream: 3.6.2 1801 | typedarray: 0.0.6 1802 | 1803 | conventional-changelog-angular@6.0.0: 1804 | dependencies: 1805 | compare-func: 2.0.0 1806 | 1807 | conventional-changelog-atom@3.0.0: {} 1808 | 1809 | conventional-changelog-codemirror@3.0.0: {} 1810 | 1811 | conventional-changelog-config-spec@2.1.0: {} 1812 | 1813 | conventional-changelog-conventionalcommits@6.1.0: 1814 | dependencies: 1815 | compare-func: 2.0.0 1816 | 1817 | conventional-changelog-core@5.0.2: 1818 | dependencies: 1819 | add-stream: 1.0.0 1820 | conventional-changelog-writer: 6.0.1 1821 | conventional-commits-parser: 4.0.0 1822 | dateformat: 3.0.3 1823 | get-pkg-repo: 4.2.1 1824 | git-raw-commits: 3.0.0 1825 | git-remote-origin-url: 2.0.0 1826 | git-semver-tags: 5.0.1 1827 | normalize-package-data: 3.0.3 1828 | read-pkg: 3.0.0 1829 | read-pkg-up: 3.0.0 1830 | 1831 | conventional-changelog-ember@3.0.0: {} 1832 | 1833 | conventional-changelog-eslint@4.0.0: {} 1834 | 1835 | conventional-changelog-express@3.0.0: {} 1836 | 1837 | conventional-changelog-jquery@4.0.0: {} 1838 | 1839 | conventional-changelog-jshint@3.0.0: 1840 | dependencies: 1841 | compare-func: 2.0.0 1842 | 1843 | conventional-changelog-preset-loader@3.0.0: {} 1844 | 1845 | conventional-changelog-writer@6.0.1: 1846 | dependencies: 1847 | conventional-commits-filter: 3.0.0 1848 | dateformat: 3.0.3 1849 | handlebars: 4.7.8 1850 | json-stringify-safe: 5.0.1 1851 | meow: 8.1.2 1852 | semver: 7.6.3 1853 | split: 1.0.1 1854 | 1855 | conventional-changelog@4.0.0: 1856 | dependencies: 1857 | conventional-changelog-angular: 6.0.0 1858 | conventional-changelog-atom: 3.0.0 1859 | conventional-changelog-codemirror: 3.0.0 1860 | conventional-changelog-conventionalcommits: 6.1.0 1861 | conventional-changelog-core: 5.0.2 1862 | conventional-changelog-ember: 3.0.0 1863 | conventional-changelog-eslint: 4.0.0 1864 | conventional-changelog-express: 3.0.0 1865 | conventional-changelog-jquery: 4.0.0 1866 | conventional-changelog-jshint: 3.0.0 1867 | conventional-changelog-preset-loader: 3.0.0 1868 | 1869 | conventional-commits-filter@3.0.0: 1870 | dependencies: 1871 | lodash.ismatch: 4.4.0 1872 | modify-values: 1.0.1 1873 | 1874 | conventional-commits-parser@4.0.0: 1875 | dependencies: 1876 | JSONStream: 1.3.5 1877 | is-text-path: 1.0.1 1878 | meow: 8.1.2 1879 | split2: 3.2.2 1880 | 1881 | conventional-recommended-bump@7.0.1: 1882 | dependencies: 1883 | concat-stream: 2.0.0 1884 | conventional-changelog-preset-loader: 3.0.0 1885 | conventional-commits-filter: 3.0.0 1886 | conventional-commits-parser: 4.0.0 1887 | git-raw-commits: 3.0.0 1888 | git-semver-tags: 5.0.1 1889 | meow: 8.1.2 1890 | 1891 | core-util-is@1.0.3: {} 1892 | 1893 | cssstyle@4.1.0: 1894 | dependencies: 1895 | rrweb-cssom: 0.7.1 1896 | 1897 | dargs@7.0.0: {} 1898 | 1899 | data-urls@5.0.0: 1900 | dependencies: 1901 | whatwg-mimetype: 4.0.0 1902 | whatwg-url: 14.0.0 1903 | 1904 | dateformat@3.0.3: {} 1905 | 1906 | debug@4.3.7: 1907 | dependencies: 1908 | ms: 2.1.3 1909 | 1910 | decamelize-keys@1.1.1: 1911 | dependencies: 1912 | decamelize: 1.2.0 1913 | map-obj: 1.0.1 1914 | 1915 | decamelize@1.2.0: {} 1916 | 1917 | decimal.js@10.4.3: {} 1918 | 1919 | decompress-response@6.0.0: 1920 | dependencies: 1921 | mimic-response: 3.1.0 1922 | 1923 | dedent@1.5.3: {} 1924 | 1925 | defer-to-connect@2.0.1: {} 1926 | 1927 | define-data-property@1.1.4: 1928 | dependencies: 1929 | es-define-property: 1.0.0 1930 | es-errors: 1.3.0 1931 | gopd: 1.0.1 1932 | optional: true 1933 | 1934 | define-properties@1.2.1: 1935 | dependencies: 1936 | define-data-property: 1.1.4 1937 | has-property-descriptors: 1.0.2 1938 | object-keys: 1.1.1 1939 | optional: true 1940 | 1941 | delayed-stream@1.0.0: {} 1942 | 1943 | detect-indent@6.1.0: {} 1944 | 1945 | detect-newline@3.1.0: {} 1946 | 1947 | detect-node@2.1.0: 1948 | optional: true 1949 | 1950 | dot-prop@5.3.0: 1951 | dependencies: 1952 | is-obj: 2.0.0 1953 | 1954 | dotenv@16.4.5: {} 1955 | 1956 | dotgitignore@2.1.0: 1957 | dependencies: 1958 | find-up: 3.0.0 1959 | minimatch: 3.1.2 1960 | 1961 | electron@32.0.1: 1962 | dependencies: 1963 | '@electron/get': 2.0.3 1964 | '@types/node': 20.17.1 1965 | extract-zip: 2.0.1 1966 | transitivePeerDependencies: 1967 | - supports-color 1968 | 1969 | emoji-regex@8.0.0: {} 1970 | 1971 | end-of-stream@1.4.4: 1972 | dependencies: 1973 | once: 1.4.0 1974 | 1975 | entities@4.5.0: {} 1976 | 1977 | env-paths@2.2.1: {} 1978 | 1979 | error-ex@1.3.2: 1980 | dependencies: 1981 | is-arrayish: 0.2.1 1982 | 1983 | es-define-property@1.0.0: 1984 | dependencies: 1985 | get-intrinsic: 1.2.4 1986 | optional: true 1987 | 1988 | es-errors@1.3.0: 1989 | optional: true 1990 | 1991 | es6-error@4.1.1: 1992 | optional: true 1993 | 1994 | esbuild@0.24.0: 1995 | optionalDependencies: 1996 | '@esbuild/aix-ppc64': 0.24.0 1997 | '@esbuild/android-arm': 0.24.0 1998 | '@esbuild/android-arm64': 0.24.0 1999 | '@esbuild/android-x64': 0.24.0 2000 | '@esbuild/darwin-arm64': 0.24.0 2001 | '@esbuild/darwin-x64': 0.24.0 2002 | '@esbuild/freebsd-arm64': 0.24.0 2003 | '@esbuild/freebsd-x64': 0.24.0 2004 | '@esbuild/linux-arm': 0.24.0 2005 | '@esbuild/linux-arm64': 0.24.0 2006 | '@esbuild/linux-ia32': 0.24.0 2007 | '@esbuild/linux-loong64': 0.24.0 2008 | '@esbuild/linux-mips64el': 0.24.0 2009 | '@esbuild/linux-ppc64': 0.24.0 2010 | '@esbuild/linux-riscv64': 0.24.0 2011 | '@esbuild/linux-s390x': 0.24.0 2012 | '@esbuild/linux-x64': 0.24.0 2013 | '@esbuild/netbsd-x64': 0.24.0 2014 | '@esbuild/openbsd-arm64': 0.24.0 2015 | '@esbuild/openbsd-x64': 0.24.0 2016 | '@esbuild/sunos-x64': 0.24.0 2017 | '@esbuild/win32-arm64': 0.24.0 2018 | '@esbuild/win32-ia32': 0.24.0 2019 | '@esbuild/win32-x64': 0.24.0 2020 | 2021 | escalade@3.2.0: {} 2022 | 2023 | escape-string-regexp@1.0.5: {} 2024 | 2025 | escape-string-regexp@4.0.0: 2026 | optional: true 2027 | 2028 | extract-zip@2.0.1: 2029 | dependencies: 2030 | debug: 4.3.7 2031 | get-stream: 5.2.0 2032 | yauzl: 2.10.0 2033 | optionalDependencies: 2034 | '@types/yauzl': 2.10.3 2035 | transitivePeerDependencies: 2036 | - supports-color 2037 | 2038 | fd-slicer@1.1.0: 2039 | dependencies: 2040 | pend: 1.2.0 2041 | 2042 | figures@3.2.0: 2043 | dependencies: 2044 | escape-string-regexp: 1.0.5 2045 | 2046 | find-up@2.1.0: 2047 | dependencies: 2048 | locate-path: 2.0.0 2049 | 2050 | find-up@3.0.0: 2051 | dependencies: 2052 | locate-path: 3.0.0 2053 | 2054 | find-up@4.1.0: 2055 | dependencies: 2056 | locate-path: 5.0.0 2057 | path-exists: 4.0.0 2058 | 2059 | find-up@5.0.0: 2060 | dependencies: 2061 | locate-path: 6.0.0 2062 | path-exists: 4.0.0 2063 | 2064 | form-data@4.0.1: 2065 | dependencies: 2066 | asynckit: 0.4.0 2067 | combined-stream: 1.0.8 2068 | mime-types: 2.1.35 2069 | 2070 | fs-extra@8.1.0: 2071 | dependencies: 2072 | graceful-fs: 4.2.11 2073 | jsonfile: 4.0.0 2074 | universalify: 0.1.2 2075 | 2076 | function-bind@1.1.2: {} 2077 | 2078 | fuse.js@7.0.0: {} 2079 | 2080 | get-caller-file@2.0.5: {} 2081 | 2082 | get-intrinsic@1.2.4: 2083 | dependencies: 2084 | es-errors: 1.3.0 2085 | function-bind: 1.1.2 2086 | has-proto: 1.0.3 2087 | has-symbols: 1.0.3 2088 | hasown: 2.0.2 2089 | optional: true 2090 | 2091 | get-pkg-repo@4.2.1: 2092 | dependencies: 2093 | '@hutson/parse-repository-url': 3.0.2 2094 | hosted-git-info: 4.1.0 2095 | through2: 2.0.5 2096 | yargs: 16.2.0 2097 | 2098 | get-stream@5.2.0: 2099 | dependencies: 2100 | pump: 3.0.2 2101 | 2102 | git-raw-commits@3.0.0: 2103 | dependencies: 2104 | dargs: 7.0.0 2105 | meow: 8.1.2 2106 | split2: 3.2.2 2107 | 2108 | git-remote-origin-url@2.0.0: 2109 | dependencies: 2110 | gitconfiglocal: 1.0.0 2111 | pify: 2.3.0 2112 | 2113 | git-semver-tags@5.0.1: 2114 | dependencies: 2115 | meow: 8.1.2 2116 | semver: 7.6.3 2117 | 2118 | gitconfiglocal@1.0.0: 2119 | dependencies: 2120 | ini: 1.3.8 2121 | 2122 | global-agent@3.0.0: 2123 | dependencies: 2124 | boolean: 3.2.0 2125 | es6-error: 4.1.1 2126 | matcher: 3.0.0 2127 | roarr: 2.15.4 2128 | semver: 7.6.3 2129 | serialize-error: 7.0.1 2130 | optional: true 2131 | 2132 | globalthis@1.0.4: 2133 | dependencies: 2134 | define-properties: 1.2.1 2135 | gopd: 1.0.1 2136 | optional: true 2137 | 2138 | gopd@1.0.1: 2139 | dependencies: 2140 | get-intrinsic: 1.2.4 2141 | optional: true 2142 | 2143 | got@11.8.6: 2144 | dependencies: 2145 | '@sindresorhus/is': 4.6.0 2146 | '@szmarczak/http-timer': 4.0.6 2147 | '@types/cacheable-request': 6.0.3 2148 | '@types/responselike': 1.0.3 2149 | cacheable-lookup: 5.0.4 2150 | cacheable-request: 7.0.4 2151 | decompress-response: 6.0.0 2152 | http2-wrapper: 1.0.3 2153 | lowercase-keys: 2.0.0 2154 | p-cancelable: 2.1.1 2155 | responselike: 2.0.1 2156 | 2157 | graceful-fs@4.2.11: {} 2158 | 2159 | handlebars@4.7.8: 2160 | dependencies: 2161 | minimist: 1.2.8 2162 | neo-async: 2.6.2 2163 | source-map: 0.6.1 2164 | wordwrap: 1.0.0 2165 | optionalDependencies: 2166 | uglify-js: 3.19.3 2167 | 2168 | hard-rejection@2.1.0: {} 2169 | 2170 | has-flag@3.0.0: {} 2171 | 2172 | has-property-descriptors@1.0.2: 2173 | dependencies: 2174 | es-define-property: 1.0.0 2175 | optional: true 2176 | 2177 | has-proto@1.0.3: 2178 | optional: true 2179 | 2180 | has-symbols@1.0.3: 2181 | optional: true 2182 | 2183 | hasown@2.0.2: 2184 | dependencies: 2185 | function-bind: 1.1.2 2186 | 2187 | hosted-git-info@2.8.9: {} 2188 | 2189 | hosted-git-info@4.1.0: 2190 | dependencies: 2191 | lru-cache: 6.0.0 2192 | 2193 | html-encoding-sniffer@4.0.0: 2194 | dependencies: 2195 | whatwg-encoding: 3.1.1 2196 | 2197 | http-cache-semantics@4.1.1: {} 2198 | 2199 | http-proxy-agent@7.0.2: 2200 | dependencies: 2201 | agent-base: 7.1.1 2202 | debug: 4.3.7 2203 | transitivePeerDependencies: 2204 | - supports-color 2205 | 2206 | http2-wrapper@1.0.3: 2207 | dependencies: 2208 | quick-lru: 5.1.1 2209 | resolve-alpn: 1.2.1 2210 | 2211 | https-proxy-agent@7.0.5: 2212 | dependencies: 2213 | agent-base: 7.1.1 2214 | debug: 4.3.7 2215 | transitivePeerDependencies: 2216 | - supports-color 2217 | 2218 | i18next@23.16.4: 2219 | dependencies: 2220 | '@babel/runtime': 7.26.0 2221 | 2222 | iconv-lite@0.6.3: 2223 | dependencies: 2224 | safer-buffer: 2.1.2 2225 | 2226 | indent-string@4.0.0: {} 2227 | 2228 | inherits@2.0.4: {} 2229 | 2230 | ini@1.3.8: {} 2231 | 2232 | is-arrayish@0.2.1: {} 2233 | 2234 | is-core-module@2.15.1: 2235 | dependencies: 2236 | hasown: 2.0.2 2237 | 2238 | is-fullwidth-code-point@3.0.0: {} 2239 | 2240 | is-obj@2.0.0: {} 2241 | 2242 | is-plain-obj@1.1.0: {} 2243 | 2244 | is-potential-custom-element-name@1.0.1: {} 2245 | 2246 | is-text-path@1.0.1: 2247 | dependencies: 2248 | text-extensions: 1.9.0 2249 | 2250 | isarray@1.0.0: {} 2251 | 2252 | js-tokens@4.0.0: {} 2253 | 2254 | jsdom@25.0.1: 2255 | dependencies: 2256 | cssstyle: 4.1.0 2257 | data-urls: 5.0.0 2258 | decimal.js: 10.4.3 2259 | form-data: 4.0.1 2260 | html-encoding-sniffer: 4.0.0 2261 | http-proxy-agent: 7.0.2 2262 | https-proxy-agent: 7.0.5 2263 | is-potential-custom-element-name: 1.0.1 2264 | nwsapi: 2.2.13 2265 | parse5: 7.2.0 2266 | rrweb-cssom: 0.7.1 2267 | saxes: 6.0.0 2268 | symbol-tree: 3.2.4 2269 | tough-cookie: 5.0.0 2270 | w3c-xmlserializer: 5.0.0 2271 | webidl-conversions: 7.0.0 2272 | whatwg-encoding: 3.1.1 2273 | whatwg-mimetype: 4.0.0 2274 | whatwg-url: 14.0.0 2275 | ws: 8.18.0 2276 | xml-name-validator: 5.0.0 2277 | transitivePeerDependencies: 2278 | - bufferutil 2279 | - supports-color 2280 | - utf-8-validate 2281 | 2282 | json-buffer@3.0.1: {} 2283 | 2284 | json-parse-better-errors@1.0.2: {} 2285 | 2286 | json-parse-even-better-errors@2.3.1: {} 2287 | 2288 | json-stringify-safe@5.0.1: {} 2289 | 2290 | jsonfile@4.0.0: 2291 | optionalDependencies: 2292 | graceful-fs: 4.2.11 2293 | 2294 | jsonparse@1.3.1: {} 2295 | 2296 | keyv@4.5.4: 2297 | dependencies: 2298 | json-buffer: 3.0.1 2299 | 2300 | kind-of@6.0.3: {} 2301 | 2302 | lines-and-columns@1.2.4: {} 2303 | 2304 | load-json-file@4.0.0: 2305 | dependencies: 2306 | graceful-fs: 4.2.11 2307 | parse-json: 4.0.0 2308 | pify: 3.0.0 2309 | strip-bom: 3.0.0 2310 | 2311 | locate-path@2.0.0: 2312 | dependencies: 2313 | p-locate: 2.0.0 2314 | path-exists: 3.0.0 2315 | 2316 | locate-path@3.0.0: 2317 | dependencies: 2318 | p-locate: 3.0.0 2319 | path-exists: 3.0.0 2320 | 2321 | locate-path@5.0.0: 2322 | dependencies: 2323 | p-locate: 4.1.0 2324 | 2325 | locate-path@6.0.0: 2326 | dependencies: 2327 | p-locate: 5.0.0 2328 | 2329 | lodash.ismatch@4.4.0: {} 2330 | 2331 | lowercase-keys@2.0.0: {} 2332 | 2333 | lru-cache@6.0.0: 2334 | dependencies: 2335 | yallist: 4.0.0 2336 | 2337 | map-obj@1.0.1: {} 2338 | 2339 | map-obj@4.3.0: {} 2340 | 2341 | matcher@3.0.0: 2342 | dependencies: 2343 | escape-string-regexp: 4.0.0 2344 | optional: true 2345 | 2346 | meow@8.1.2: 2347 | dependencies: 2348 | '@types/minimist': 1.2.5 2349 | camelcase-keys: 6.2.2 2350 | decamelize-keys: 1.1.1 2351 | hard-rejection: 2.1.0 2352 | minimist-options: 4.1.0 2353 | normalize-package-data: 3.0.3 2354 | read-pkg-up: 7.0.1 2355 | redent: 3.0.0 2356 | trim-newlines: 3.0.1 2357 | type-fest: 0.18.1 2358 | yargs-parser: 20.2.9 2359 | 2360 | mime-db@1.52.0: {} 2361 | 2362 | mime-types@2.1.35: 2363 | dependencies: 2364 | mime-db: 1.52.0 2365 | 2366 | mimic-response@1.0.1: {} 2367 | 2368 | mimic-response@3.1.0: {} 2369 | 2370 | min-indent@1.0.1: {} 2371 | 2372 | minimatch@3.1.2: 2373 | dependencies: 2374 | brace-expansion: 1.1.11 2375 | 2376 | minimist-options@4.1.0: 2377 | dependencies: 2378 | arrify: 1.0.1 2379 | is-plain-obj: 1.1.0 2380 | kind-of: 6.0.3 2381 | 2382 | minimist@1.2.8: {} 2383 | 2384 | modify-values@1.0.1: {} 2385 | 2386 | moment@2.29.4: {} 2387 | 2388 | monkey-around@3.0.0: {} 2389 | 2390 | ms@2.1.3: {} 2391 | 2392 | neo-async@2.6.2: {} 2393 | 2394 | normalize-package-data@2.5.0: 2395 | dependencies: 2396 | hosted-git-info: 2.8.9 2397 | resolve: 1.22.8 2398 | semver: 5.7.2 2399 | validate-npm-package-license: 3.0.4 2400 | 2401 | normalize-package-data@3.0.3: 2402 | dependencies: 2403 | hosted-git-info: 4.1.0 2404 | is-core-module: 2.15.1 2405 | semver: 7.6.3 2406 | validate-npm-package-license: 3.0.4 2407 | 2408 | normalize-url@6.1.0: {} 2409 | 2410 | nwsapi@2.2.13: {} 2411 | 2412 | object-keys@1.1.1: 2413 | optional: true 2414 | 2415 | obsidian-typings@2.2.0(@types/node@22.8.1)(electron@32.0.1)(obsidian@1.7.2(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)): 2416 | dependencies: 2417 | '@types/node': 22.8.1 2418 | electron: 32.0.1 2419 | obsidian: 1.7.2(@codemirror/state@6.4.1)(@codemirror/view@6.27.0) 2420 | 2421 | obsidian@1.7.2(@codemirror/state@6.4.1)(@codemirror/view@6.27.0): 2422 | dependencies: 2423 | '@codemirror/state': 6.4.1 2424 | '@codemirror/view': 6.27.0 2425 | '@types/codemirror': 5.60.8 2426 | moment: 2.29.4 2427 | 2428 | once@1.4.0: 2429 | dependencies: 2430 | wrappy: 1.0.2 2431 | 2432 | p-cancelable@2.1.1: {} 2433 | 2434 | p-limit@1.3.0: 2435 | dependencies: 2436 | p-try: 1.0.0 2437 | 2438 | p-limit@2.3.0: 2439 | dependencies: 2440 | p-try: 2.2.0 2441 | 2442 | p-limit@3.1.0: 2443 | dependencies: 2444 | yocto-queue: 0.1.0 2445 | 2446 | p-locate@2.0.0: 2447 | dependencies: 2448 | p-limit: 1.3.0 2449 | 2450 | p-locate@3.0.0: 2451 | dependencies: 2452 | p-limit: 2.3.0 2453 | 2454 | p-locate@4.1.0: 2455 | dependencies: 2456 | p-limit: 2.3.0 2457 | 2458 | p-locate@5.0.0: 2459 | dependencies: 2460 | p-limit: 3.1.0 2461 | 2462 | p-try@1.0.0: {} 2463 | 2464 | p-try@2.2.0: {} 2465 | 2466 | parse-json@4.0.0: 2467 | dependencies: 2468 | error-ex: 1.3.2 2469 | json-parse-better-errors: 1.0.2 2470 | 2471 | parse-json@5.2.0: 2472 | dependencies: 2473 | '@babel/code-frame': 7.26.0 2474 | error-ex: 1.3.2 2475 | json-parse-even-better-errors: 2.3.1 2476 | lines-and-columns: 1.2.4 2477 | 2478 | parse5@7.2.0: 2479 | dependencies: 2480 | entities: 4.5.0 2481 | 2482 | path-exists@3.0.0: {} 2483 | 2484 | path-exists@4.0.0: {} 2485 | 2486 | path-parse@1.0.7: {} 2487 | 2488 | path-type@3.0.0: 2489 | dependencies: 2490 | pify: 3.0.0 2491 | 2492 | pend@1.2.0: {} 2493 | 2494 | picocolors@1.1.1: {} 2495 | 2496 | pify@2.3.0: {} 2497 | 2498 | pify@3.0.0: {} 2499 | 2500 | process-nextick-args@2.0.1: {} 2501 | 2502 | progress@2.0.3: {} 2503 | 2504 | pump@3.0.2: 2505 | dependencies: 2506 | end-of-stream: 1.4.4 2507 | once: 1.4.0 2508 | 2509 | punycode@2.3.1: {} 2510 | 2511 | quick-lru@4.0.1: {} 2512 | 2513 | quick-lru@5.1.1: {} 2514 | 2515 | read-pkg-up@3.0.0: 2516 | dependencies: 2517 | find-up: 2.1.0 2518 | read-pkg: 3.0.0 2519 | 2520 | read-pkg-up@7.0.1: 2521 | dependencies: 2522 | find-up: 4.1.0 2523 | read-pkg: 5.2.0 2524 | type-fest: 0.8.1 2525 | 2526 | read-pkg@3.0.0: 2527 | dependencies: 2528 | load-json-file: 4.0.0 2529 | normalize-package-data: 2.5.0 2530 | path-type: 3.0.0 2531 | 2532 | read-pkg@5.2.0: 2533 | dependencies: 2534 | '@types/normalize-package-data': 2.4.4 2535 | normalize-package-data: 2.5.0 2536 | parse-json: 5.2.0 2537 | type-fest: 0.6.0 2538 | 2539 | readable-stream@2.3.8: 2540 | dependencies: 2541 | core-util-is: 1.0.3 2542 | inherits: 2.0.4 2543 | isarray: 1.0.0 2544 | process-nextick-args: 2.0.1 2545 | safe-buffer: 5.1.2 2546 | string_decoder: 1.1.1 2547 | util-deprecate: 1.0.2 2548 | 2549 | readable-stream@3.6.2: 2550 | dependencies: 2551 | inherits: 2.0.4 2552 | string_decoder: 1.3.0 2553 | util-deprecate: 1.0.2 2554 | 2555 | redent@3.0.0: 2556 | dependencies: 2557 | indent-string: 4.0.0 2558 | strip-indent: 3.0.0 2559 | 2560 | regenerator-runtime@0.14.1: {} 2561 | 2562 | require-directory@2.1.1: {} 2563 | 2564 | resolve-alpn@1.2.1: {} 2565 | 2566 | resolve@1.22.8: 2567 | dependencies: 2568 | is-core-module: 2.15.1 2569 | path-parse: 1.0.7 2570 | supports-preserve-symlinks-flag: 1.0.0 2571 | 2572 | responselike@2.0.1: 2573 | dependencies: 2574 | lowercase-keys: 2.0.0 2575 | 2576 | roarr@2.15.4: 2577 | dependencies: 2578 | boolean: 3.2.0 2579 | detect-node: 2.1.0 2580 | globalthis: 1.0.4 2581 | json-stringify-safe: 5.0.1 2582 | semver-compare: 1.0.0 2583 | sprintf-js: 1.1.3 2584 | optional: true 2585 | 2586 | rrweb-cssom@0.7.1: {} 2587 | 2588 | safe-buffer@5.1.2: {} 2589 | 2590 | safe-buffer@5.2.1: {} 2591 | 2592 | safer-buffer@2.1.2: {} 2593 | 2594 | saxes@6.0.0: 2595 | dependencies: 2596 | xmlchars: 2.2.0 2597 | 2598 | semver-compare@1.0.0: 2599 | optional: true 2600 | 2601 | semver@5.7.2: {} 2602 | 2603 | semver@6.3.1: {} 2604 | 2605 | semver@7.6.3: {} 2606 | 2607 | serialize-error@7.0.1: 2608 | dependencies: 2609 | type-fest: 0.13.1 2610 | optional: true 2611 | 2612 | sortablejs@1.15.3: {} 2613 | 2614 | source-map@0.6.1: {} 2615 | 2616 | spdx-correct@3.2.0: 2617 | dependencies: 2618 | spdx-expression-parse: 3.0.1 2619 | spdx-license-ids: 3.0.20 2620 | 2621 | spdx-exceptions@2.5.0: {} 2622 | 2623 | spdx-expression-parse@3.0.1: 2624 | dependencies: 2625 | spdx-exceptions: 2.5.0 2626 | spdx-license-ids: 3.0.20 2627 | 2628 | spdx-license-ids@3.0.20: {} 2629 | 2630 | split2@3.2.2: 2631 | dependencies: 2632 | readable-stream: 3.6.2 2633 | 2634 | split@1.0.1: 2635 | dependencies: 2636 | through: 2.3.8 2637 | 2638 | sprintf-js@1.1.3: 2639 | optional: true 2640 | 2641 | string-width@4.2.3: 2642 | dependencies: 2643 | emoji-regex: 8.0.0 2644 | is-fullwidth-code-point: 3.0.0 2645 | strip-ansi: 6.0.1 2646 | 2647 | string_decoder@1.1.1: 2648 | dependencies: 2649 | safe-buffer: 5.1.2 2650 | 2651 | string_decoder@1.3.0: 2652 | dependencies: 2653 | safe-buffer: 5.2.1 2654 | 2655 | strip-ansi@6.0.1: 2656 | dependencies: 2657 | ansi-regex: 5.0.1 2658 | 2659 | strip-bom@3.0.0: {} 2660 | 2661 | strip-indent@3.0.0: 2662 | dependencies: 2663 | min-indent: 1.0.1 2664 | 2665 | style-mod@4.1.2: {} 2666 | 2667 | sumchecker@3.0.1: 2668 | dependencies: 2669 | debug: 4.3.7 2670 | transitivePeerDependencies: 2671 | - supports-color 2672 | 2673 | supports-color@5.5.0: 2674 | dependencies: 2675 | has-flag: 3.0.0 2676 | 2677 | supports-preserve-symlinks-flag@1.0.0: {} 2678 | 2679 | symbol-tree@3.2.4: {} 2680 | 2681 | text-extensions@1.9.0: {} 2682 | 2683 | through2@2.0.5: 2684 | dependencies: 2685 | readable-stream: 2.3.8 2686 | xtend: 4.0.2 2687 | 2688 | through@2.3.8: {} 2689 | 2690 | tldts-core@6.1.55: {} 2691 | 2692 | tldts@6.1.55: 2693 | dependencies: 2694 | tldts-core: 6.1.55 2695 | 2696 | tough-cookie@5.0.0: 2697 | dependencies: 2698 | tldts: 6.1.55 2699 | 2700 | tr46@5.0.0: 2701 | dependencies: 2702 | punycode: 2.3.1 2703 | 2704 | trim-newlines@3.0.1: {} 2705 | 2706 | tslib@2.8.0: {} 2707 | 2708 | type-fest@0.13.1: 2709 | optional: true 2710 | 2711 | type-fest@0.18.1: {} 2712 | 2713 | type-fest@0.6.0: {} 2714 | 2715 | type-fest@0.8.1: {} 2716 | 2717 | typedarray@0.0.6: {} 2718 | 2719 | typescript@5.6.3: {} 2720 | 2721 | uglify-js@3.19.3: 2722 | optional: true 2723 | 2724 | undici-types@6.19.8: {} 2725 | 2726 | universalify@0.1.2: {} 2727 | 2728 | util-deprecate@1.0.2: {} 2729 | 2730 | validate-npm-package-license@3.0.4: 2731 | dependencies: 2732 | spdx-correct: 3.2.0 2733 | spdx-expression-parse: 3.0.1 2734 | 2735 | w3c-keyname@2.2.8: {} 2736 | 2737 | w3c-xmlserializer@5.0.0: 2738 | dependencies: 2739 | xml-name-validator: 5.0.0 2740 | 2741 | webidl-conversions@7.0.0: {} 2742 | 2743 | whatwg-encoding@3.1.1: 2744 | dependencies: 2745 | iconv-lite: 0.6.3 2746 | 2747 | whatwg-mimetype@4.0.0: {} 2748 | 2749 | whatwg-url@14.0.0: 2750 | dependencies: 2751 | tr46: 5.0.0 2752 | webidl-conversions: 7.0.0 2753 | 2754 | wordwrap@1.0.0: {} 2755 | 2756 | wrap-ansi@7.0.0: 2757 | dependencies: 2758 | ansi-styles: 4.3.0 2759 | string-width: 4.2.3 2760 | strip-ansi: 6.0.1 2761 | 2762 | wrappy@1.0.2: {} 2763 | 2764 | ws@8.18.0: {} 2765 | 2766 | xml-name-validator@5.0.0: {} 2767 | 2768 | xmlchars@2.2.0: {} 2769 | 2770 | xtend@4.0.2: {} 2771 | 2772 | y18n@5.0.8: {} 2773 | 2774 | yallist@4.0.0: {} 2775 | 2776 | yaml@2.6.0: {} 2777 | 2778 | yargs-parser@20.2.9: {} 2779 | 2780 | yargs-parser@21.1.1: {} 2781 | 2782 | yargs@16.2.0: 2783 | dependencies: 2784 | cliui: 7.0.4 2785 | escalade: 3.2.0 2786 | get-caller-file: 2.0.5 2787 | require-directory: 2.1.1 2788 | string-width: 4.2.3 2789 | y18n: 5.0.8 2790 | yargs-parser: 20.2.9 2791 | 2792 | yargs@17.7.2: 2793 | dependencies: 2794 | cliui: 8.0.1 2795 | escalade: 3.2.0 2796 | get-caller-file: 2.0.5 2797 | require-directory: 2.1.1 2798 | string-width: 4.2.3 2799 | y18n: 5.0.8 2800 | yargs-parser: 21.1.1 2801 | 2802 | yauzl@2.10.0: 2803 | dependencies: 2804 | buffer-crc32: 0.2.13 2805 | fd-slicer: 1.1.0 2806 | 2807 | yocto-queue@0.1.0: {} 2808 | --------------------------------------------------------------------------------