├── .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 | [](https://github.com/conneroisu/vim-toggle/actions/workflows/main.yml)
2 | [](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 | 
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 | |  |
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 |
--------------------------------------------------------------------------------