├── .envrc ├── .eslintignore ├── .prettierrc ├── docs ├── conner.jpeg └── legendary.gif ├── .editorconfig ├── .gitignore ├── versions.json ├── manifest.json ├── tsconfig.json ├── .github ├── dependabot.yml ├── FUNDING.yml └── workflows │ └── main.yml ├── SECURITY.md ├── version-bump.mjs ├── .eslintrc ├── esbuild.config.mjs ├── LICENSE ├── package.json ├── flake.nix ├── flake.lock ├── CLAUDE.md ├── README.md ├── CONTRIBUTING.md ├── main.ts └── bun.lock /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | 3 | layout go 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | npm node_modules 2 | build -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false 4 | } 5 | -------------------------------------------------------------------------------- /docs/conner.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conneroisu/vim-toggle/HEAD/docs/conner.jpeg -------------------------------------------------------------------------------- /docs/legendary.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/conneroisu/vim-toggle/HEAD/docs/legendary.gif -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_style = tab 9 | indent_size = 4 10 | tab_width = 4 11 | max_line_length = 80 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # vscode 2 | .vscode 3 | 4 | # Intellij 5 | *.iml 6 | .idea 7 | 8 | # npm 9 | node_modules 10 | 11 | # Don't include the compiled main.js file in the repo. 12 | # They should be uploaded to GitHub releases instead. 13 | main.js 14 | 15 | # Exclude sourcemaps 16 | *.map 17 | 18 | # obsidian 19 | data.json 20 | 21 | # Exclude macOS Finder (System Explorer) View States 22 | .DS_Store 23 | .direnv 24 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "0.1.4": "0.15.0", 3 | "0.1.5": "0.15.0", 4 | "0.1.6": "0.15.0", 5 | "0.1.7": "0.15.0", 6 | "0.1.8": "0.15.0", 7 | "0.1.9": "0.15.0", 8 | "1.0.0": "0.15.0", 9 | "1.0.1": "0.15.0", 10 | "1.0.2": "0.15.0", 11 | "1.0.3": "0.15.0", 12 | "1.0.4": "0.15.0", 13 | "1.0.5": "0.15.0", 14 | "1.0.6": "0.15.0", 15 | "1.0.7": "0.15.0", 16 | "1.0.8": "0.15.0", 17 | "1.1.0": "0.15.0" 18 | } 19 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "vim-toggle", 3 | "name": "Vim Toggle", 4 | "version": "1.1.0", 5 | "minAppVersion": "0.15.0", 6 | "description": "A plugin for Obsidian that enables the toggling vim mode to on and off inside of the editor.", 7 | "author": "Conner Ohnesorge", 8 | "authorUrl": "https://connerohnesorge.mixa.site/", 9 | "fundingUrl": "https://ko-fi.com/connero", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": [ 15 | "DOM", 16 | "ES5", 17 | "ES6", 18 | "ES7" 19 | ] 20 | }, 21 | "include": [ 22 | "**/*.ts" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from "fs"; 2 | 3 | const targetVersion = process.env.npm_package_version; 4 | 5 | // read minAppVersion from manifest.json and bump version to target version 6 | let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 | const { minAppVersion } = manifest; 8 | manifest.version = targetVersion; 9 | writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 | 11 | // update versions.json with target version and minAppVersion from manifest.json 12 | let versions = JSON.parse(readFileSync("versions.json", "utf8")); 13 | versions[targetVersion] = minAppVersion; 14 | writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); 15 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "env": { "node": true }, 5 | "plugins": [ 6 | "@typescript-eslint" 7 | ], 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:@typescript-eslint/eslint-recommended", 11 | "plugin:@typescript-eslint/recommended" 12 | ], 13 | "parserOptions": { 14 | "sourceType": "module" 15 | }, 16 | "rules": { 17 | "no-unused-vars": "off", 18 | "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], 19 | "@typescript-eslint/ban-ts-comment": "off", 20 | "no-prototype-builtins": "off", 21 | "@typescript-eslint/no-empty-function": "off" 22 | } 23 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: conneroisu # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: connero 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from 'builtin-modules' 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === 'production'); 13 | 14 | esbuild.build({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ['main.ts'], 19 | bundle: true, 20 | external: [ 21 | 'obsidian', 22 | 'electron', 23 | '@codemirror/autocomplete', 24 | '@codemirror/collab', 25 | '@codemirror/commands', 26 | '@codemirror/language', 27 | '@codemirror/lint', 28 | '@codemirror/search', 29 | '@codemirror/state', 30 | '@codemirror/view', 31 | '@lezer/common', 32 | '@lezer/highlight', 33 | '@lezer/lr', 34 | ...builtins], 35 | format: 'cjs', 36 | target: 'es2018', 37 | logLevel: "info", 38 | sourcemap: prod ? false : 'inline', 39 | treeShaking: true, 40 | outfile: 'main.js', 41 | }).catch(() => process.exit(1)); 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Conner Ohnesorge 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vim-toggle", 3 | "version": "1.1.0", 4 | "description": "A plugin for Obsidian that allows you to toggle VimMode on and off.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && bun esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [ 12 | "obsidian", 13 | "plugin", 14 | "vim", 15 | "toggle" 16 | ], 17 | "author": "Conner Ohnesorge", 18 | "license": "MIT", 19 | "devDependencies": { 20 | "@types/node": "^24.3.0", 21 | "@typescript-eslint/eslint-plugin": "8.7.0", 22 | "@typescript-eslint/parser": "8.41.0", 23 | "builtin-modules": "4.0.0", 24 | "esbuild": "^0.25.9", 25 | "obsidian": "latest", 26 | "tslib": "^2.8.1", 27 | "typescript": "5.6.2" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "git+https://github.com/conneroisu/vim-toggle.git" 32 | }, 33 | "bugs": { 34 | "url": "https://github.com/conneroisu/Vim-Toggle-Obsidian/issues" 35 | }, 36 | "homepage": "https://github.com/conneroisu/Vim-Toggle-Obsidian#readme" 37 | } 38 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Dev Flake for Obsidian Vim Toggle Plugin Development"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 6 | flake-utils.url = "github:numtide/flake-utils"; 7 | treefmt-nix.url = "github:numtide/treefmt-nix"; 8 | treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; 9 | }; 10 | 11 | outputs = { 12 | nixpkgs, 13 | flake-utils, 14 | treefmt-nix, 15 | ... 16 | }: 17 | flake-utils.lib.eachDefaultSystem (system: let 18 | pkgs = import nixpkgs { 19 | inherit system; 20 | overlays = [ 21 | (final: prev: {}) 22 | ]; 23 | }; 24 | 25 | rooted = exec: 26 | builtins.concatStringsSep "\n" 27 | [ 28 | ''REPO_ROOT="$(git rev-parse --show-toplevel)"'' 29 | exec 30 | ]; 31 | 32 | scripts = { 33 | dx = { 34 | exec = rooted ''$EDITOR "$REPO_ROOT"/flake.nix''; 35 | description = "Edit flake.nix"; 36 | }; 37 | }; 38 | 39 | scriptPackages = 40 | pkgs.lib.mapAttrs 41 | ( 42 | name: script: 43 | pkgs.writeShellApplication { 44 | inherit name; 45 | text = script.exec; 46 | runtimeInputs = script.deps or []; 47 | } 48 | ) 49 | scripts; 50 | 51 | treefmtModule = { 52 | projectRootFile = "flake.nix"; 53 | programs = { 54 | alejandra.enable = true; # Nix formatter 55 | biome.enable = true; # Web formatter 56 | }; 57 | }; 58 | in { 59 | devShells.default = pkgs.mkShell { 60 | # Available packages on https://search.nixos.org/packages 61 | packages = with pkgs; 62 | [ 63 | alejandra # Nix 64 | nixd 65 | statix 66 | deadnix 67 | 68 | typescript-language-server 69 | vscode-langservers-extracted 70 | yaml-language-server 71 | bun 72 | biome 73 | oxlint 74 | ] 75 | ++ builtins.attrValues scriptPackages; 76 | }; 77 | 78 | formatter = treefmt-nix.lib.mkWrapper pkgs treefmtModule; 79 | }); 80 | } 81 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1755020227, 24 | "narHash": "sha256-gGmm+h0t6rY88RPTaIm3su95QvQIVjAJx558YUG4Id8=", 25 | "owner": "NixOS", 26 | "repo": "nixpkgs", 27 | "rev": "695d5db1b8b20b73292501683a524e0bd79074fb", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "NixOS", 32 | "ref": "nixpkgs-unstable", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs", 41 | "treefmt-nix": "treefmt-nix" 42 | } 43 | }, 44 | "systems": { 45 | "locked": { 46 | "lastModified": 1681028828, 47 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 48 | "owner": "nix-systems", 49 | "repo": "default", 50 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 51 | "type": "github" 52 | }, 53 | "original": { 54 | "owner": "nix-systems", 55 | "repo": "default", 56 | "type": "github" 57 | } 58 | }, 59 | "treefmt-nix": { 60 | "inputs": { 61 | "nixpkgs": [ 62 | "nixpkgs" 63 | ] 64 | }, 65 | "locked": { 66 | "lastModified": 1754847726, 67 | "narHash": "sha256-2vX8QjO5lRsDbNYvN9hVHXLU6oMl+V/PsmIiJREG4rE=", 68 | "owner": "numtide", 69 | "repo": "treefmt-nix", 70 | "rev": "7d81f6fb2e19bf84f1c65135d1060d829fae2408", 71 | "type": "github" 72 | }, 73 | "original": { 74 | "owner": "numtide", 75 | "repo": "treefmt-nix", 76 | "type": "github" 77 | } 78 | } 79 | }, 80 | "root": "root", 81 | "version": 7 82 | } 83 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build obsidian plugin 2 | 3 | on: 4 | push: 5 | # Sequence of patterns matched against refs/tags 6 | tags: 7 | - "*" # Push events to matching any tag format, i.e. 1.0, 20.15.10 8 | 9 | env: 10 | PLUGIN_NAME: vim-toggle # Change this to the name of your plugin-id folder 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v2 18 | - uses: oven-sh/setup-bun@v2 19 | - name: Build 20 | id: build 21 | run: | 22 | bun i 23 | bun run build 24 | mkdir ${{ env.PLUGIN_NAME }} 25 | cp main.js manifest.json ${{ env.PLUGIN_NAME }} 26 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 27 | ls 28 | echo "::set-output name=tag_name::$(git tag --sort version:refname | tail -n 1)" 29 | - name: Create Release 30 | id: create_release 31 | uses: actions/create-release@v1 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | VERSION: ${{ github.ref }} 35 | with: 36 | tag_name: ${{ github.ref }} 37 | release_name: ${{ github.ref }} 38 | draft: false 39 | prerelease: false 40 | - name: Upload zip file 41 | id: upload-zip 42 | uses: actions/upload-release-asset@v1 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | with: 46 | upload_url: ${{ steps.create_release.outputs.upload_url }} 47 | asset_path: ./${{ env.PLUGIN_NAME }}.zip 48 | asset_name: ${{ env.PLUGIN_NAME }}-${{ steps.build.outputs.tag_name }}.zip 49 | asset_content_type: application/zip 50 | - name: Upload main.js 51 | id: upload-main 52 | uses: actions/upload-release-asset@v1 53 | env: 54 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 55 | with: 56 | upload_url: ${{ steps.create_release.outputs.upload_url }} 57 | asset_path: ./main.js 58 | asset_name: main.js 59 | asset_content_type: text/javascript 60 | - name: Upload manifest.json 61 | id: upload-manifest 62 | uses: actions/upload-release-asset@v1 63 | env: 64 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 65 | with: 66 | upload_url: ${{ steps.create_release.outputs.upload_url }} 67 | asset_path: ./manifest.json 68 | asset_name: manifest.json 69 | asset_content_type: application/json 70 | # - name: Upload styles.css 71 | # id: upload-css 72 | # uses: actions/upload-release-asset@v1 73 | # env: 74 | # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 75 | # with: 76 | # upload_url: ${{ steps.create_release.outputs.upload_url }} 77 | # asset_path: ./styles.css 78 | # asset_name: styles.css 79 | # asset_content_type: text/css 80 | -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | # CLAUDE.md 2 | 3 | This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 | 5 | ## Project Overview 6 | 7 | This is an Obsidian plugin called "Vim Toggle" that allows users to toggle Vim mode on and off within Obsidian. The plugin is particularly useful when working with Canvas files where Vim mode can be cumbersome. 8 | 9 | ## Development Commands 10 | 11 | ### Build and Development 12 | - **Development build**: `npm run dev` or `bun run dev` - Uses esbuild with inline sourcemaps for development 13 | - **Production build**: `npm run build` or `bun run build` - TypeScript type checking + esbuild production build 14 | - **Version bump**: `npm run version` - Updates manifest.json and versions.json with new version 15 | 16 | ### Code Quality 17 | - **TypeScript checking**: `tsc -noEmit -skipLibCheck` - Run type checking without emitting files 18 | - **Linting**: Use ESLint configuration in `.eslintrc` - supports TypeScript with `@typescript-eslint` plugin 19 | - **Formatting**: Prettier is configured with 2-space tabs (no hard tabs) 20 | 21 | ### Development Environment 22 | - Uses Nix flake for development environment with `nix develop` 23 | - Includes TypeScript language server, Biome formatter, and other development tools 24 | - Alternative: Use Bun for package management and building 25 | 26 | ## Architecture and Structure 27 | 28 | ### Core Components 29 | - **main.ts**: Single source file containing the entire plugin implementation 30 | - **VimToggle class**: Main plugin class extending Obsidian's Plugin class 31 | - **VimToggleSettingsTab**: Settings interface for configuration options 32 | - **VimToggleSettings interface**: Type definitions for plugin settings 33 | 34 | ### Key Features 35 | 1. **Toggle Commands**: Three commands for toggling, turning on, and turning off Vim mode 36 | 2. **Ribbon Icon**: Quick access button in Obsidian's ribbon 37 | 3. **Canvas Integration**: Automatically turns off Vim mode when opening Canvas files (optional) 38 | 4. **Settings**: Notification preferences, debug mode, and Canvas behavior settings 39 | 5. **Cross-platform**: Works on both desktop and mobile with different implementation paths 40 | 41 | ### Plugin Settings 42 | - `notification`: Boolean for showing toggle notifications 43 | - `debug`: Boolean for console debug messages 44 | - `canvasVim`: Boolean for automatic Canvas file handling 45 | 46 | ### Build System 47 | - **esbuild**: Primary bundler configured in `esbuild.config.mjs` 48 | - **Target**: ES2018, CommonJS format 49 | - **Externals**: Obsidian API and CodeMirror packages are external dependencies 50 | - **Output**: Bundles to `main.js` for plugin distribution 51 | 52 | ### Release Process 53 | - GitHub Actions workflow in `.github/workflows/main.yml` 54 | - Triggered on git tags 55 | - Builds with Bun, creates release with assets (main.js, manifest.json, zip) 56 | - Uses `version-bump.mjs` to sync versions between package.json and manifest.json 57 | 58 | ## Mobile vs Desktop Implementation 59 | 60 | The plugin handles mobile and desktop differently: 61 | - **Desktop**: Uses `this.app.vault.setConfig("vimMode", boolean)` 62 | - **Mobile**: Uses localStorage with "vim" key and `this.app.workspace.updateOptions()` 63 | 64 | ## Development Notes 65 | 66 | - Uses `@ts-expect-error` comments for accessing private Obsidian API methods 67 | - Follows Obsidian plugin conventions with manifest.json and proper plugin lifecycle 68 | - Settings are persisted using Obsidian's plugin data storage system 69 | - Event registration for file-open events to handle Canvas integration -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build obsidian plugin](https://github.com/conneroisu/vim-toggle/actions/workflows/main.yml/badge.svg)](https://github.com/conneroisu/vim-toggle/actions/workflows/main.yml) 2 | [![codebeat badge](https://codebeat.co/badges/34efe3ca-2340-4b5c-bc9e-655ae5ffcd93)](https://codebeat.co/projects/github-com-conneroisu-vim-toggle-master) 3 | # Vim Toggle Plugin Obsidian 4 | made with 🤍 by Conner Ohnesorge 5 | >> Toggle the state of Vim inside of Obsidian, in response to Obsidian Canvas Core Plugin Functionality. 6 | ![A gif showing the pure basics of the plugin](docs/legendary.gif) 7 | The new Canvas Plugin has prompted me to make a small plugin to toggle the state of use of the vim editor in obsidian. 8 | # Wondering what vi/vim is? 9 | 10 | [ ### Vim in 100 Seconds - YouTube https://www.youtube.com › watch ](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjM4-3Es6v8AhW1KX0KHYH4Bs8QtwJ6BAgOEAI&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-txKSRn0qeA&usg=AOvVaw0opUAcd4wCUwrJmBWm0zox) 11 | 12 | [ ### Understanding Vi and Vim (Vi IMproved) in 10 Minutes https://www.youtube.com › watch ](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjM4-3Es6v8AhW1KX0KHYH4Bs8QtwJ6BAgQEAI&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dnbph7RYWhwM&usg=AOvVaw0WsJDH24HqQHumDJS09xYX) 13 | 14 | # The Basics 15 | This plugin is a simple plugin that allows for the toggling of vim mode in Obsidian with a command configurable to a hotkey. You can also turn off or on notifications for the plugin. That pretty much it for basic functionality. 16 | 17 | > [!important]+ Main Offerings 18 | >- Toggle Vim mode 19 | >- Optional Notification when toggling 20 | >- Community Avaliability 21 | # Usage 22 | Usage for this plugin is done through a settings tab accessible boolean variable and a command to run that toggles and untoggles vim inside of Obsidian. The command can be bound to a hotkey for quicker and more efficient use. 23 | 24 | To access the plugin settings, click on the settings cog in the top right corner of Obsidian or use a hotkey Ctrl+,From there, find the Vim Mode setting and toggle it to "On". This will enable Vim Toggle within the current instance of obsidian. 25 | 26 | ## Basic Usage 27 | Once installed, you can toggle vim mode on and off with a command. You can configure this command to a hotkey of your choice in the settings. You can also turn off or on notifications for when vim mode is turned on or off. 28 | 29 | ### Normal installation 30 | To install this plugin normally, you can navigate within the obsidian app to the community plugins to view and install this plugin without even exiting the app! Hopefully you can find some use for it yourself! (You will be able to do this soon). 31 | 32 | ### Manual Installation 33 | To install this plugin manually, you'll need to download the source code from the [GitHub repository](https://github.com/nkomarn/obsidian-vim-mode) and place it in the `plugins` folder in your Obsidian data directory. Once that is done, restart Obsidian and you should be good to go. 34 | 35 | ## Support 36 | 37 | If you have any questions or problems with this plugin, you can reach out through a github issue regarding issues, updates, features, and bug reports. We also have a support page that includes information about the plugin and how to use it within the wikipedia part of github. 38 | 39 | This project uses Typescript to provide type checking and documentation. The repo depends on the latest plugin API (obsidian.d.ts) in Typescript Definition format, which contains TSDoc comments describing what it does. 40 | 41 | Feel free to donate to my kofi and/or share this project! 42 | 43 | kofi: conneroisu 44 | # Use Case 45 | Writting inside of obsidian canvas mode can be alittle tedious using vim mode cause of the constant inserting, this plugin allows for the user to evade these difficulties by switching to regular typing from vim mode temporarily. 46 | 47 | # Contributions 48 | | Conner Ohnesorge | 49 | | ---------------- | 50 | | ![conner.jpeg](docs%2Fconner.jpeg) | 51 | | github username: [conneroisu](https://github.com/conneroisu) | 52 | | email: conneroisu@outlook.com | 53 | 54 | | Andrew Baxter | 55 | | ---------------- | 56 | | github username: [andrewbaxter439](https://github.com/andrewbaxter439) | 57 | | email: NA | 58 | 59 | | Matthew Turk | 60 | | ---------------- | 61 | | github username: [matthewturk](https://github.com/matthewturk) | 62 | | email: matthewturk@gmail.com | 63 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Vim Toggle 2 | 3 | Thank you for your interest in contributing to Vim Toggle! This document provides guidelines for contributing to this Obsidian plugin. 4 | 5 | ## Getting Started 6 | 7 | ### Prerequisites 8 | 9 | - Node.js (version 14 or higher) 10 | - Bun (package manager) 11 | - TypeScript knowledge 12 | - Basic understanding of Obsidian plugin development 13 | - Nix (optional, but recommended for consistent development environment) 14 | 15 | ### Development Setup 16 | 17 | #### Option 1: Using Nix Flake (Recommended) 18 | 19 | This project includes a `flake.nix` that provides a complete development environment with all necessary tools and dependencies. 20 | 21 | 1. **Fork and Clone** 22 | ```bash 23 | git clone https://github.com/your-username/vim-toggle.git 24 | cd vim-toggle 25 | ``` 26 | 27 | 2. **Enter Development Shell** 28 | ```bash 29 | nix develop 30 | ``` 31 | 32 | This automatically provides: 33 | - Bun package manager 34 | - TypeScript language server 35 | - Formatters (Alejandra for Nix, Biome for TypeScript/JavaScript) 36 | - Linters (oxlint, statix, deadnix) 37 | - Development scripts 38 | 39 | 3. **Available Scripts in Nix Shell** 40 | - `dx`: Edit the flake.nix file 41 | 42 | 4. **Format Code** 43 | ```bash 44 | nix fmt 45 | ``` 46 | 47 | #### Option 2: Manual Setup 48 | 49 | 1. **Fork and Clone** 50 | ```bash 51 | git clone https://github.com/your-username/vim-toggle.git 52 | cd vim-toggle 53 | ``` 54 | 55 | 2. **Install Dependencies** 56 | ```bash 57 | bun install 58 | ``` 59 | 60 | 3. **Development Build** 61 | ```bash 62 | bun run dev 63 | ``` 64 | 65 | 4. **Production Build** 66 | ```bash 67 | bun run build 68 | ``` 69 | 70 | ## Development Workflow 71 | 72 | ### Code Style 73 | 74 | - Use TypeScript for all new code 75 | - Follow the existing code formatting and style 76 | - Use descriptive variable and function names 77 | - Add JSDoc comments for public methods and interfaces 78 | - Maintain consistent indentation (tabs) 79 | 80 | #### With Nix 81 | If using the Nix development environment, code formatting is handled automatically: 82 | ```bash 83 | nix fmt # Formats all code (Nix, TypeScript, JavaScript) 84 | ``` 85 | 86 | #### Manual Formatting 87 | If not using Nix, ensure consistent formatting manually or set up the formatters specified in `flake.nix`: 88 | - Biome for TypeScript/JavaScript 89 | - Alejandra for Nix files 90 | 91 | ### File Structure 92 | 93 | ``` 94 | vim-toggle/ 95 | ├── main.ts # Main plugin code 96 | ├── manifest.json # Plugin manifest 97 | ├── package.json # Dependencies and scripts 98 | ├── tsconfig.json # TypeScript configuration 99 | ├── esbuild.config.mjs # Build configuration 100 | └── docs/ # Documentation assets 101 | ``` 102 | 103 | ### Making Changes 104 | 105 | 1. **Create a Feature Branch** 106 | ```bash 107 | git checkout -b feature/your-feature-name 108 | ``` 109 | 110 | 2. **Make Your Changes** 111 | - Follow the existing code patterns 112 | - Test your changes thoroughly 113 | - Update documentation if needed 114 | 115 | 3. **Build and Test** 116 | ```bash 117 | # With Nix (recommended) 118 | nix develop # Enter development shell if not already 119 | bun run build 120 | 121 | # Manual setup 122 | bun run build 123 | ``` 124 | 125 | 4. **Commit Your Changes** 126 | ```bash 127 | git add . 128 | git commit -m "feat: add your feature description" 129 | ``` 130 | 131 | ## Pull Request Process 132 | 133 | 1. **Before Submitting** 134 | - Ensure your code builds successfully 135 | - Test the plugin in Obsidian 136 | - Update documentation if necessary 137 | - Follow the commit message format 138 | 139 | 2. **Commit Message Format** 140 | Use conventional commits: 141 | - `feat:` for new features 142 | - `fix:` for bug fixes 143 | - `docs:` for documentation changes 144 | - `refactor:` for code refactoring 145 | - `test:` for test additions 146 | - `chore:` for maintenance tasks 147 | 148 | 3. **Submit Pull Request** 149 | - Provide a clear description of changes 150 | - Reference any related issues 151 | - Include screenshots for UI changes 152 | - Ensure all checks pass 153 | 154 | ## Code Guidelines 155 | 156 | ### TypeScript 157 | 158 | - Use explicit type annotations where helpful 159 | - Leverage Obsidian's type definitions 160 | - Handle errors appropriately 161 | - Use async/await for asynchronous operations 162 | 163 | ### Plugin Development 164 | 165 | - Follow Obsidian plugin best practices 166 | - Use the plugin lifecycle methods appropriately 167 | - Handle settings persistence correctly 168 | - Provide user feedback for actions 169 | - Ensure mobile compatibility when possible 170 | 171 | ### Example Code Pattern 172 | 173 | ```typescript 174 | /** 175 | * Description of what this function does 176 | */ 177 | async functionName(parameter: Type): Promise { 178 | try { 179 | // Implementation 180 | return result; 181 | } catch (error) { 182 | console.error('Error in functionName:', error); 183 | // Handle error appropriately 184 | } 185 | } 186 | ``` 187 | 188 | ## Testing 189 | 190 | ### Manual Testing 191 | 192 | 1. **Install in Obsidian** 193 | - Copy built files to `.obsidian/plugins/vim-toggle/` 194 | - Enable the plugin in Obsidian settings 195 | - Test all commands and settings 196 | 197 | 2. **Test Scenarios** 198 | - Toggle vim mode on/off 199 | - Test with canvas files 200 | - Verify settings persistence 201 | - Test notifications 202 | - Check mobile compatibility (if applicable) 203 | 204 | ### Key Testing Areas 205 | 206 | - Command functionality 207 | - Settings tab behavior 208 | - Canvas file handling 209 | - Notification system 210 | - Mobile vs desktop differences 211 | 212 | ## Reporting Issues 213 | 214 | ### Bug Reports 215 | 216 | Include: 217 | - Obsidian version 218 | - Plugin version 219 | - Operating system 220 | - Steps to reproduce 221 | - Expected vs actual behavior 222 | - Console errors (if any) 223 | 224 | ### Feature Requests 225 | 226 | Include: 227 | - Clear description of the feature 228 | - Use case or problem it solves 229 | - Possible implementation approach 230 | - Any relevant examples 231 | 232 | ## Code of Conduct 233 | 234 | - Be respectful and constructive 235 | - Focus on the code and ideas, not the person 236 | - Help create a welcoming environment 237 | - Follow GitHub's community guidelines 238 | 239 | ## Getting Help 240 | 241 | - Check existing issues and discussions 242 | - Review the Obsidian plugin development documentation 243 | - Ask questions in GitHub discussions 244 | - Join the Obsidian community forums 245 | 246 | ## Plugin Architecture 247 | 248 | ### Core Components 249 | 250 | - **VimToggle**: Main plugin class handling commands and lifecycle 251 | - **VimToggleSettings**: Interface defining plugin settings 252 | - **VimToggleSettingsTab**: Settings UI implementation 253 | 254 | ### Key Methods 255 | 256 | - `toggleVimMode()`: Toggles vim state 257 | - `turnOnVimMode()` / `turnOffVimMode()`: Explicit state changes 258 | - `getVimMode()`: Retrieves current vim state 259 | 260 | ### Settings 261 | 262 | - `notification`: Show toggle notifications 263 | - `debug`: Enable debug logging 264 | - `canvasVim`: Auto-disable vim in canvas files 265 | 266 | ## Resources 267 | 268 | - [Obsidian Plugin Developer Docs](https://docs.obsidian.md/Plugins/Getting+started/Build+a+plugin) 269 | - [Obsidian API Reference](https://docs.obsidian.md/Reference/TypeScript+API) 270 | - [TypeScript Documentation](https://www.typescriptlang.org/docs/) 271 | 272 | ## License 273 | 274 | By contributing to Vim Toggle, you agree that your contributions will be licensed under the MIT License. 275 | 276 | --- 277 | 278 | Thank you for contributing to Vim Toggle! Your efforts help make this plugin better for the entire Obsidian community. -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { App, ButtonComponent, Notice, Plugin, PluginSettingTab, Setting, ToggleComponent } from "obsidian"; 2 | 3 | /** 4 | * @author Conner Ohnesorge (@conneroisu) [connerohnesorge.mixa.site] 5 | * @summary This is the source code for the Vim Toggle plugin. 6 | * @version 1.0.0 7 | * @license MIT 8 | * Main class of the plugin, Vim Toggle.It allows for a user to toggle 9 | * the state of the vim editor inside obsidian with a single command 10 | * helpful for switching from the Vim Editor whilst working on a canvas file. 11 | */ 12 | 13 | /** 14 | * Interface for the settings of the Vim Toggle plugin. 15 | */ 16 | interface VimToggleSettings { 17 | /** 18 | * Boolean determining if a notice is sent when the Vim Mode is toggled. 19 | **/ 20 | notification: boolean; 21 | /** 22 | * Boolean determining if debug messages are shown in the console. 23 | **/ 24 | debug: boolean; 25 | 26 | /** 27 | * Boolean determining if Canvas files should have vim mode off by default 28 | */ 29 | canvasVim: boolean; 30 | } 31 | 32 | /** 33 | * This is the default settings for the Vim Toggle plugin. 34 | */ 35 | const DEFAULT_SETTINGS: VimToggleSettings = { 36 | /** 37 | * Default value for the notification setting, detailing the 38 | * condition for sending a notification. (By default, it is set to true). 39 | */ 40 | notification: true, 41 | /** 42 | * Default value for the debug setting, detailing the condition 43 | * for sending debug messages (By default, it is set to false). 44 | */ 45 | debug: false, 46 | 47 | /** 48 | * Default value for the canvasVim setting, detailing the condition 49 | * for setting vim mode off by default for canvas files (By default, it is set to false). 50 | */ 51 | canvasVim: false, 52 | }; 53 | 54 | /** 55 | * Main Plugin class for Vim Toggle. 56 | * @extends Plugin 57 | */ 58 | export default class VimToggle extends Plugin { 59 | /** 60 | * Settings variable for the Vim Toggle Plugin Settings. 61 | */ 62 | settings: VimToggleSettings; 63 | 64 | /** 65 | * On load method for the Vim Toggle plugin. Called when Vim Toggle is loaded. 66 | **/ 67 | async onload() { 68 | await this.loadSettings(); 69 | this.addCommand({ 70 | id: "toggle-vim", 71 | name: "Toggle Vim On/Off", 72 | callback: () => { 73 | this.toggleVimMode(); 74 | }, 75 | }); 76 | this.addCommand({ 77 | id: "turn-on-vim", 78 | name: "Turn On Vim Mode", 79 | callback: () => { 80 | this.turnOnVimMode(); 81 | }, 82 | }); 83 | this.addCommand({ 84 | id: "turn-off-vim", 85 | name: "Turn Off Vim Mode", 86 | callback: () => { 87 | this.turnOffVimMode(); 88 | }, 89 | }); 90 | this.addSettingTab(new VimToggleSettingsTab(this.app, this)); 91 | 92 | this.addRibbonIcon("text-cursor-input", "Toggle Vim Mode", () => { 93 | this.toggleVimMode(); 94 | }); 95 | 96 | this.registerEvent( 97 | this.app.workspace.on("file-open", (file) => { 98 | if (!file || !this.settings.canvasVim) return; 99 | if (file.extension == "canvas") { 100 | this.turnOffVimMode(); 101 | } 102 | else { 103 | this.turnOnVimMode(); 104 | } 105 | } 106 | )); 107 | } 108 | 109 | /** 110 | * Toggles the state of vim mode in the current instance of obsidian. 111 | **/ 112 | toggleVimMode() { 113 | if (this.getVimMode()) { 114 | this.turnOffVimMode(); 115 | } else { 116 | this.turnOnVimMode(); 117 | } 118 | if (this.settings.notification) { 119 | new Notice( 120 | "Vim mode toggled to " + 121 | this.getVimMode(), 122 | 2000 123 | ); 124 | } 125 | } 126 | 127 | /** 128 | * Turns off vim mode in the current instance of obsidian. 129 | **/ 130 | turnOffVimMode() { 131 | // @ts-expect-error 132 | if (this.app.isMobile) { 133 | localStorage.removeItem("vim"); 134 | this.app.workspace.updateOptions(); 135 | } else { 136 | // @ts-expect-error 137 | this.app.vault.setConfig("vimMode", false); 138 | } 139 | } 140 | 141 | /** 142 | * Turns on vim mode in the current instance of obsidian. 143 | **/ 144 | turnOnVimMode() { 145 | // @ts-expect-error 146 | if (this.app.isMobile) { 147 | localStorage.setItem("vim", "true"); 148 | this.app.workspace.updateOptions(); 149 | } else { 150 | // @ts-expect-error 151 | this.app.vault.setConfig("vimMode", true); 152 | } 153 | } 154 | 155 | /** 156 | * Returns the current state of vim mode in the current instance of obsidian. 157 | **/ 158 | getVimMode() { 159 | // @ts-expect-error 160 | return this.app.isVimEnabled(); 161 | } 162 | 163 | /** 164 | * Unload Method for unloading Vim Toggle.Called when the plugin is unloaded. 165 | **/ 166 | onunload() { 167 | console.log("unloading plugin: " + this.manifest.name); 168 | } 169 | 170 | /** 171 | * Loads the settings of the plugin, Vim Toggle, it is called in the onload function. 172 | **/ 173 | async loadSettings() { 174 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 175 | } 176 | 177 | /** 178 | * Saves the settings of the Vim Toggle plugin. 179 | */ 180 | async saveSettings() { 181 | await this.saveData(this.settings); 182 | } 183 | } 184 | 185 | /** 186 | * Settings tab for the Vim Toggle plugin.The Tab is responsible for displaying 187 | * the settings of the plugin, and allowing the user to change them. 188 | **/ 189 | class VimToggleSettingsTab extends PluginSettingTab { 190 | /** 191 | * The plugin for the settings tab of the Vim Toggle plugin. 192 | */ 193 | plugin: VimToggle; 194 | 195 | /** 196 | * Constructor for the settings tab of the Vim Toggle plugin. 197 | */ 198 | constructor(app: App, plugin: VimToggle) { 199 | super(app, plugin); 200 | this.plugin = plugin; 201 | } 202 | 203 | /** 204 | * This is the display method for the settings tab of the Vim Toggle Plugin.It is 205 | * responsible for displaying the settings of the plugin. 206 | */ 207 | display(): void { 208 | const { containerEl } = this; 209 | 210 | containerEl.empty(); 211 | 212 | containerEl.createEl("h2", { text: "Settings for Vim Toggle" }); 213 | 214 | /** 215 | * This is the notification setting for the Vim Toggle plugin allowing the user 216 | * to toggle the sending of a notification when toggling vim mode. 217 | */ 218 | new Setting(containerEl) 219 | .setName("Notification") 220 | .setDesc("Show notification when toggling vim mode.") 221 | .addToggle((toggle) => 222 | toggle 223 | .setValue(this.plugin.settings.notification) 224 | .onChange(async (value) => { 225 | this.plugin.settings.notification = value; 226 | await this.plugin.saveSettings(); 227 | }) 228 | ); 229 | 230 | /** 231 | * This is the debug setting for the Vim Toggle plugin. 232 | */ 233 | new Setting(containerEl) 234 | .setName("Debug") 235 | .setDesc( 236 | "Show debug messages in the console whilst performing operations with the plugin." 237 | ) 238 | .addToggle((toggle: ToggleComponent) => 239 | toggle 240 | .setValue(this.plugin.settings.debug) 241 | .onChange(async (value) => { 242 | this.plugin.settings.debug = value; 243 | await this.plugin.saveSettings(); 244 | }) 245 | ); 246 | 247 | 248 | /** 249 | * This is the canvas-always-off setting for Vim Toggle plugin. 250 | */ 251 | new Setting(containerEl) 252 | .setName("Canvas Off") 253 | .setDesc( 254 | "When switching to a Canvas, turn vim off, and when not in Canvas, turn vim on." 255 | ) 256 | .addToggle((toggle: ToggleComponent) => 257 | toggle 258 | .setValue(this.plugin.settings.canvasVim) 259 | .onChange(async (value) => { 260 | this.plugin.settings.canvasVim = value; 261 | await this.plugin.saveSettings(); 262 | }) 263 | ); 264 | 265 | 266 | 267 | 268 | /** 269 | * Creates a horizontal rule to separate the settings from the repository-related 270 | * information. 271 | */ 272 | containerEl.createEl("hr"); 273 | 274 | /** 275 | * Creates a button linking to the repository of the plugin, Vim Toggle. 276 | * This is used to allow the user to easily access the repository of the plugin. 277 | */ 278 | new Setting(containerEl) 279 | .setName("Repository") 280 | .setDesc("Link to the repository of the plugin.") 281 | .addButton((button: ButtonComponent) => 282 | button 283 | .setButtonText("Open Repository") 284 | .setCta() 285 | .onClick(() => { 286 | open("https://github.com/conneroisu/vim-toggle-obsidian"); 287 | }) 288 | ); 289 | 290 | /** 291 | * Setting for a button that to report an issue to the Vim Toggle Repo. 292 | */ 293 | new Setting(containerEl) 294 | .setName("Report Issue") 295 | .setDesc("Report an issue or wanted feature with the plugin.") 296 | .addButton((button: ButtonComponent) => 297 | button 298 | .setButtonText("Report Issue/Feature") 299 | .setCta() 300 | .onClick(() => { 301 | open("https://github.com/conneroisu/vim-toggle-obsidian/issues/new"); 302 | }) 303 | ); 304 | 305 | 306 | /** 307 | * Setting for button that to create a pull request to the Vim Toggle Repo. 308 | * Allows the user to submit a pull request to the repository of Vim Toggle. 309 | */ 310 | new Setting(containerEl) 311 | .setName("Create Pull Request") 312 | .setDesc("Developer? Create a pull request to the Vim Toggle.") 313 | .addButton((button) => 314 | button 315 | .setButtonText("Create Pull Request") 316 | .setCta() 317 | .onClick(() => { 318 | open("https://github.com/conneroisu/vim-toggle-obsidian/compare"); 319 | }) 320 | ); 321 | 322 | /** 323 | * Horizontal rule separating repository info from the about section. 324 | */ 325 | containerEl.createEl("hr"); 326 | /** 327 | * About section for the Vim Toggle plugin. 328 | */ 329 | containerEl.createEl("h2", { text: "About Vim Toggle" }); 330 | containerEl.createEl("p", { text: "This plugin was created by Conner Ohnesorge" }); 331 | /** 332 | * Portfolio button for Conner Ohnesorge 333 | */ 334 | new Setting(containerEl) 335 | .setName("Portfolio") 336 | .setDesc("Go to my portfolio website.") 337 | .addButton((button) => 338 | button 339 | .setButtonText("Go to Portfolio") 340 | .setCta() 341 | .onClick(() => { 342 | open("https://conneroh.com"); 343 | }) 344 | ); 345 | /** 346 | * Kofi button for Conner Ohnesorge 347 | */ 348 | new Setting(containerEl) 349 | .setName("Kofi") 350 | .setDesc("Buy me a coffee!") 351 | .addButton((button: ButtonComponent) => 352 | button 353 | .setButtonText("Buy Me A Coffee") 354 | .setCta() 355 | .onClick(() => { 356 | open("https://ko-fi.com/conneroisu"); 357 | }) 358 | ); 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /bun.lock: -------------------------------------------------------------------------------- 1 | { 2 | "lockfileVersion": 1, 3 | "workspaces": { 4 | "": { 5 | "name": "vim-toggle", 6 | "devDependencies": { 7 | "@types/node": "^22.17.2", 8 | "@typescript-eslint/eslint-plugin": "8.7.0", 9 | "@typescript-eslint/parser": "8.7.0", 10 | "builtin-modules": "4.0.0", 11 | "esbuild": "^0.25.9", 12 | "obsidian": "latest", 13 | "tslib": "^2.8.1", 14 | "typescript": "5.6.2", 15 | }, 16 | }, 17 | }, 18 | "packages": { 19 | "@codemirror/state": ["@codemirror/state@6.2.0", "", {}, "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA=="], 20 | 21 | "@codemirror/view": ["@codemirror/view@6.7.1", "", { "dependencies": { "@codemirror/state": "^6.1.4", "style-mod": "^4.0.0", "w3c-keyname": "^2.2.4" } }, "sha512-kYtS+uqYw/q/0ytYxpkqE1JVuK5NsbmBklWYhwLFTKO9gVuTdh/kDEeZPKorbqHcJ+P+ucrhcsS1czVweOpT2g=="], 22 | 23 | "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], 24 | 25 | "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], 26 | 27 | "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="], 28 | 29 | "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="], 30 | 31 | "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="], 32 | 33 | "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="], 34 | 35 | "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="], 36 | 37 | "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="], 38 | 39 | "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="], 40 | 41 | "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="], 42 | 43 | "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="], 44 | 45 | "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="], 46 | 47 | "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="], 48 | 49 | "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="], 50 | 51 | "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="], 52 | 53 | "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="], 54 | 55 | "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="], 56 | 57 | "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="], 58 | 59 | "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="], 60 | 61 | "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="], 62 | 63 | "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="], 64 | 65 | "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="], 66 | 67 | "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="], 68 | 69 | "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="], 70 | 71 | "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="], 72 | 73 | "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="], 74 | 75 | "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.0", "", { "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="], 76 | 77 | "@eslint-community/regexpp": ["@eslint-community/regexpp@4.11.0", "", {}, "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A=="], 78 | 79 | "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], 80 | 81 | "@eslint/js": ["@eslint/js@8.57.0", "", {}, "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g=="], 82 | 83 | "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.11.14", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="], 84 | 85 | "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], 86 | 87 | "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], 88 | 89 | "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 90 | 91 | "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 92 | 93 | "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 94 | 95 | "@types/codemirror": ["@types/codemirror@5.60.8", "", { "dependencies": { "@types/tern": "*" } }, "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw=="], 96 | 97 | "@types/estree": ["@types/estree@1.0.0", "", {}, "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ=="], 98 | 99 | "@types/node": ["@types/node@22.17.2", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w=="], 100 | 101 | "@types/tern": ["@types/tern@0.23.4", "", { "dependencies": { "@types/estree": "*" } }, "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg=="], 102 | 103 | "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.7.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.7.0", "@typescript-eslint/type-utils": "8.7.0", "@typescript-eslint/utils": "8.7.0", "@typescript-eslint/visitor-keys": "8.7.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A=="], 104 | 105 | "@typescript-eslint/parser": ["@typescript-eslint/parser@8.7.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.7.0", "@typescript-eslint/types": "8.7.0", "@typescript-eslint/typescript-estree": "8.7.0", "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ=="], 106 | 107 | "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.7.0", "", { "dependencies": { "@typescript-eslint/types": "8.7.0", "@typescript-eslint/visitor-keys": "8.7.0" } }, "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg=="], 108 | 109 | "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.7.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.7.0", "@typescript-eslint/utils": "8.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" } }, "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ=="], 110 | 111 | "@typescript-eslint/types": ["@typescript-eslint/types@8.7.0", "", {}, "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w=="], 112 | 113 | "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.7.0", "", { "dependencies": { "@typescript-eslint/types": "8.7.0", "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg=="], 114 | 115 | "@typescript-eslint/utils": ["@typescript-eslint/utils@8.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.7.0", "@typescript-eslint/types": "8.7.0", "@typescript-eslint/typescript-estree": "8.7.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw=="], 116 | 117 | "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.7.0", "", { "dependencies": { "@typescript-eslint/types": "8.7.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ=="], 118 | 119 | "@ungap/structured-clone": ["@ungap/structured-clone@1.2.0", "", {}, "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="], 120 | 121 | "acorn": ["acorn@8.12.1", "", { "bin": "bin/acorn" }, "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg=="], 122 | 123 | "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], 124 | 125 | "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], 126 | 127 | "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], 128 | 129 | "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], 130 | 131 | "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], 132 | 133 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], 134 | 135 | "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], 136 | 137 | "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], 138 | 139 | "builtin-modules": ["builtin-modules@4.0.0", "", {}, "sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA=="], 140 | 141 | "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], 142 | 143 | "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], 144 | 145 | "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], 146 | 147 | "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], 148 | 149 | "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], 150 | 151 | "cross-spawn": ["cross-spawn@7.0.3", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="], 152 | 153 | "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], 154 | 155 | "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], 156 | 157 | "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], 158 | 159 | "esbuild": ["esbuild@0.25.9", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], 160 | 161 | "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], 162 | 163 | "eslint": ["eslint@8.57.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": "bin/eslint.js" }, "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ=="], 164 | 165 | "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], 166 | 167 | "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], 168 | 169 | "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], 170 | 171 | "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], 172 | 173 | "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], 174 | 175 | "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], 176 | 177 | "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], 178 | 179 | "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], 180 | 181 | "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], 182 | 183 | "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], 184 | 185 | "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], 186 | 187 | "fastq": ["fastq@1.15.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw=="], 188 | 189 | "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], 190 | 191 | "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], 192 | 193 | "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], 194 | 195 | "flat-cache": ["flat-cache@3.0.4", "", { "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" } }, "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg=="], 196 | 197 | "flatted": ["flatted@3.2.7", "", {}, "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="], 198 | 199 | "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], 200 | 201 | "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], 202 | 203 | "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], 204 | 205 | "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], 206 | 207 | "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], 208 | 209 | "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], 210 | 211 | "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], 212 | 213 | "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], 214 | 215 | "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], 216 | 217 | "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], 218 | 219 | "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], 220 | 221 | "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], 222 | 223 | "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], 224 | 225 | "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], 226 | 227 | "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], 228 | 229 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], 230 | 231 | "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": "bin/js-yaml.js" }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], 232 | 233 | "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], 234 | 235 | "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], 236 | 237 | "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], 238 | 239 | "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], 240 | 241 | "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], 242 | 243 | "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], 244 | 245 | "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], 246 | 247 | "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], 248 | 249 | "moment": ["moment@2.29.4", "", {}, "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="], 250 | 251 | "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], 252 | 253 | "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], 254 | 255 | "obsidian": ["obsidian@1.8.7", "", { "dependencies": { "@types/codemirror": "5.60.8", "moment": "2.29.4" }, "peerDependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA=="], 256 | 257 | "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], 258 | 259 | "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], 260 | 261 | "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], 262 | 263 | "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], 264 | 265 | "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], 266 | 267 | "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], 268 | 269 | "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], 270 | 271 | "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], 272 | 273 | "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], 274 | 275 | "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], 276 | 277 | "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], 278 | 279 | "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], 280 | 281 | "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], 282 | 283 | "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], 284 | 285 | "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": "bin.js" }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], 286 | 287 | "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], 288 | 289 | "semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], 290 | 291 | "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], 292 | 293 | "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], 294 | 295 | "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], 296 | 297 | "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], 298 | 299 | "style-mod": ["style-mod@4.0.0", "", {}, "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw=="], 300 | 301 | "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], 302 | 303 | "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], 304 | 305 | "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], 306 | 307 | "ts-api-utils": ["ts-api-utils@1.3.0", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="], 308 | 309 | "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], 310 | 311 | "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], 312 | 313 | "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], 314 | 315 | "typescript": ["typescript@5.6.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw=="], 316 | 317 | "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], 318 | 319 | "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], 320 | 321 | "w3c-keyname": ["w3c-keyname@2.2.6", "", {}, "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg=="], 322 | 323 | "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], 324 | 325 | "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], 326 | 327 | "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], 328 | 329 | "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 330 | 331 | "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], 332 | 333 | "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], 334 | 335 | "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], 336 | } 337 | } 338 | --------------------------------------------------------------------------------