├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml └── workflows │ └── release.yml ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── dblClickTabIndex.ts ├── esbuild.config.mjs ├── manifest.json ├── package.json ├── pnpm-lock.yaml ├── styles.css ├── tsconfig.json ├── version-bump.mjs └── versions.json /.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 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | npm node_modules 2 | build -------------------------------------------------------------------------------- /.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/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: [ "bug" ] 5 | body: 6 | - type: textarea 7 | id: bug-description 8 | attributes: 9 | label: Bug Description 10 | description: A clear and concise description of the bug. 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: screenshot 15 | attributes: 16 | label: Relevant Screenshot 17 | description: If applicable, add screenshots or a screen recording to help explain your problem. 18 | - type: textarea 19 | id: reproduction-steps 20 | attributes: 21 | label: To Reproduce 22 | description: Steps to reproduce the problem 23 | placeholder: | 24 | For example: 25 | 1. Go to '...' 26 | 2. Click on '...' 27 | 3. Scroll down to '...' 28 | - type: input 29 | id: obsi-version 30 | attributes: 31 | label: Obsidian Version 32 | description: You can find the version in the *About* Tab of the settings. 33 | placeholder: 0.13.19 34 | validations: 35 | required: true 36 | - type: checkboxes 37 | id: editor 38 | attributes: 39 | label: Which editor are you using? 40 | options: 41 | - label: New Editor 42 | - label: Legacy Editor 43 | - type: checkboxes 44 | id: checklist 45 | attributes: 46 | label: Checklist 47 | options: 48 | - label: I updated to the latest version of the plugin. 49 | required: true 50 | 51 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Suggest an idea 3 | title: "Feature Request: " 4 | labels: [ "feature request" ] 5 | body: 6 | - type: textarea 7 | id: feature-requested 8 | attributes: 9 | label: Feature Requested 10 | description: A clear and concise description of the feature. 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: screenshot 15 | attributes: 16 | label: Relevant Screenshot 17 | description: If applicable, add screenshots or a screen recording to help explain the request. 18 | - type: checkboxes 19 | id: checklist 20 | attributes: 21 | label: Checklist 22 | options: 23 | - label: The feature would be useful to more users than just me. 24 | required: true 25 | 26 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Obsidian plugin 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | env: 8 | PLUGIN_NAME: obsidian-double-click-tab 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Use Node.js 16 | uses: actions/setup-node@v3 17 | with: 18 | node-version: 16 19 | - name: Build 20 | id: build 21 | run: | 22 | npm install 23 | npm run build 24 | mkdir ${{ env.PLUGIN_NAME }} 25 | cp main.js manifest.json styles.css ${{ 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: Upload zip file 30 | id: upload-zip 31 | uses: actions/upload-release-asset@v1 32 | env: 33 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | with: 35 | upload_url: ${{ github.event.release.upload_url }} 36 | asset_path: ./${{ env.PLUGIN_NAME }}.zip 37 | asset_name: ${{ env.PLUGIN_NAME }}-${{ steps.build.outputs.tag_name }}.zip 38 | asset_content_type: application/zip 39 | 40 | - name: Upload main.js 41 | id: upload-main 42 | uses: actions/upload-release-asset@v1 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | with: 46 | upload_url: ${{ github.event.release.upload_url }} 47 | asset_path: ./main.js 48 | asset_name: main.js 49 | asset_content_type: text/javascript 50 | 51 | - name: Upload manifest.json 52 | id: upload-manifest 53 | uses: actions/upload-release-asset@v1 54 | env: 55 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 56 | with: 57 | upload_url: ${{ github.event.release.upload_url }} 58 | asset_path: ./manifest.json 59 | asset_name: manifest.json 60 | asset_content_type: application/json 61 | 62 | - name: Upload styles.css 63 | id: upload-css 64 | uses: actions/upload-release-asset@v1 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | with: 68 | upload_url: ${{ github.event.release.upload_url }} 69 | asset_path: ./styles.css 70 | asset_name: styles.css 71 | asset_content_type: text/css 72 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Boninall 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Double Click Tab 2 | 3 | A plugin to modify the default behavior when you double click on the tab title, like close tab. 4 | 5 | ## Features 6 | 7 | You can set the default behavior in plugin settings. 8 | 9 | - Close Tab: Close tab when double click on the tab title. 10 | - Smart Tab: Open the file in new pane when double click on the tab title. 11 | - Shift + Double Click = Open the file in New Window. 12 | - Ctrl + Double Click = Open the file in New Pane Vertically. 13 | - Alt + Double Click = Open the file in New Pane Horizontally. 14 | - If you don't hold any key, it will close the tab. 15 | - Rename File: Rename current file when double click on the tab title. 16 | 17 | # How to Install 18 | 19 | ## From Plugin Market in Obsidian [Not Yet] 20 | 21 | 💜: Directly install from Obsidian Market. 22 | 23 | ## From BRAT 24 | 25 | 🚗: Add `Quorafind/obsidian-double-click-tab` to BRAT. 26 | 27 | ## Download Manually 28 | 29 | 🚚: Download the latest release. Extract and put the three files (main.js, manifest.json, styles.css) to 30 | folder `{{obsidian_vault}}/.obsidian/plugins/obsidian-double-click-tab`. 31 | 32 | # Say Thank You 33 | 34 | If you are enjoying this plugin then please support my work and enthusiasm by buying me a coffee 35 | on [https://www.buymeacoffee.com/boninall](https://www.buymeacoffee.com/boninall). 36 | . 37 | 38 | 39 | -------------------------------------------------------------------------------- /dblClickTabIndex.ts: -------------------------------------------------------------------------------- 1 | import { 2 | addIcon, 3 | App, 4 | ButtonComponent, 5 | DropdownComponent, 6 | MarkdownView, 7 | Plugin, 8 | PluginSettingTab, 9 | setIcon, 10 | Setting, 11 | WorkspaceLeaf 12 | } from 'obsidian'; 13 | 14 | interface DblClickTabPluginSettings { 15 | defaultDblClickTabBehavior: string; 16 | defaultDblClickTabOnNoTabsAreaBehavior: string; 17 | supportNoTabsArea: boolean; 18 | } 19 | 20 | const DEFAULT_SETTINGS: DblClickTabPluginSettings = { 21 | defaultDblClickTabBehavior: 'closeTab', 22 | defaultDblClickTabOnNoTabsAreaBehavior: 'createNewTab', 23 | supportNoTabsArea: false, 24 | } 25 | 26 | export default class DblClickTabPlugin extends Plugin { 27 | settings: DblClickTabPluginSettings; 28 | hovering: boolean; 29 | toolbarContainer: HTMLElement | null; 30 | 31 | async onload() { 32 | await this.loadSettings(); 33 | 34 | this.registerIconList(); 35 | 36 | this.addSettingTab(new DblClickTabSettingTab(this.app, this)); 37 | this.registerDomEvent(document, 'dblclick', this.dblClickTabBehavior.bind(this)); 38 | 39 | // Because the plugin only works above 0.16.0 so I think don't need check api version anymore 40 | this.app.workspace.on('window-open', (leaf) => { 41 | this.registerDomEvent(leaf.doc, 'dblclick', this.dblClickTabBehavior.bind(this)); 42 | }); 43 | } 44 | 45 | async dblClickTabBehavior(evt: MouseEvent) { 46 | if (!app.workspace.activeLeaf) return; 47 | 48 | const activeLeaf = app.workspace.activeLeaf; 49 | 50 | if (!(evt.target as HTMLElement).classList.contains("workspace-tab-header-inner-title") || !activeLeaf) return; 51 | // @ts-ignore 52 | const side = activeLeaf.getRoot().side; 53 | 54 | switch (this.settings.defaultDblClickTabBehavior) { 55 | case 'closeTab': 56 | if (!side) this.closeTab(activeLeaf); 57 | break; 58 | case 'smartTab': 59 | const state = activeLeaf.getViewState(); 60 | if (state.type === "empty") { 61 | break; 62 | } 63 | if (!side && (evt.ctrlKey || evt.metaKey)) { 64 | const leaf = await app.workspace.duplicateLeaf(activeLeaf, "vertical"); 65 | leaf.setEphemeralState({ 66 | focus: true 67 | }); 68 | break; 69 | } 70 | if (!side && (evt.altKey)) { 71 | const leaf = await app.workspace.duplicateLeaf(activeLeaf, "horizontal"); 72 | leaf.setEphemeralState({ 73 | focus: true 74 | }); 75 | break; 76 | } 77 | if (evt.shiftKey && state.type == "markdown") { 78 | app.workspace.openPopoutLeaf().setViewState(state); 79 | activeLeaf.detach(); 80 | break; 81 | } 82 | if (!side) this.closeTab(activeLeaf); 83 | break; 84 | case 'renameTabFile': 85 | if (activeLeaf.view instanceof MarkdownView) activeLeaf.setEphemeralState({ rename: "all" }) 86 | break; 87 | default: 88 | break; 89 | } 90 | } 91 | 92 | closeTab(activeLeaf: WorkspaceLeaf) { 93 | const leaves: WorkspaceLeaf[] = []; 94 | 95 | app.workspace.iterateRootLeaves((leaf) => { 96 | if (leaf) leaves.push(leaf); 97 | }); 98 | 99 | if (leaves.length > 1) activeLeaf.detach(); 100 | else if (leaves.length === 1) { 101 | const state = activeLeaf.getViewState(); 102 | if (!(state.type === "empty")) { 103 | activeLeaf.detach(); 104 | } 105 | } 106 | } 107 | 108 | registerIconList() { 109 | addIcon('alipay', ``); 110 | addIcon('wechat', ``) 111 | } 112 | 113 | onunload() { 114 | 115 | } 116 | 117 | async loadSettings() { 118 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 119 | } 120 | 121 | async saveSettings() { 122 | await this.saveData(this.settings); 123 | } 124 | } 125 | 126 | class DblClickTabSettingTab extends PluginSettingTab { 127 | plugin: DblClickTabPlugin; 128 | private applyDebounceTimer: number = 0; 129 | 130 | constructor(app: App, plugin: DblClickTabPlugin) { 131 | super(app, plugin); 132 | this.plugin = plugin; 133 | } 134 | 135 | applySettingsUpdate() { 136 | clearTimeout(this.applyDebounceTimer); 137 | const plugin = this.plugin; 138 | this.applyDebounceTimer = window.setTimeout(() => { 139 | plugin.saveSettings(); 140 | }, 100); 141 | } 142 | 143 | display(): void { 144 | const { containerEl } = this; 145 | 146 | containerEl.empty(); 147 | 148 | containerEl.createEl('h2', { text: 'Double Click Tab' }); 149 | 150 | this.displayClickTabBehavior(); 151 | 152 | this.containerEl.createEl('h2', { text: 'Say Thank You' }); 153 | 154 | new Setting(containerEl) 155 | .setName('Donate') 156 | .setDesc('If you like this plugin, consider donating to support continued development:') 157 | .addButton((bt) => { 158 | this.addImageToButton(bt, 'https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E5%BE%AE%E4%BF%A1%E4%BB%98%E6%AC%BE%E7%A0%81.jpg', 'wechat'); 159 | }) 160 | .addButton((bt) => { 161 | this.addImageToButton(bt, 'https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg', 'alipay'); 162 | }) 163 | .addButton((bt) => { 164 | this.addImageToButton(bt, "https://www.buymeacoffee.com/Quorafind", "bmc", "https://img.buymeacoffee.com/button-api/?text=Coffee&emoji=&slug=boninall&button_colour=886ce4&font_colour=ffffff&font_family=Comic&outline_colour=000000&coffee_colour=FFDD00"); 165 | }); 166 | } 167 | 168 | displayClickTabBehavior(): void { 169 | new Setting(this.containerEl) 170 | .setName('Default behavior when double clicking a tab') 171 | .setDesc("When you double click a tab title, it will trigger different behavior. You can change that behavior here.") 172 | .addDropdown(async (drowdown: DropdownComponent) => { 173 | drowdown 174 | .addOption('closeTab', 'Close Tab') 175 | .addOption('renameTabFile', 'Rename File') 176 | .addOption('smartTab', 'Smart Tab') 177 | .setValue(this.plugin.settings.defaultDblClickTabBehavior).onChange(async (value) => { 178 | this.plugin.settings.defaultDblClickTabBehavior = value; 179 | this.applySettingsUpdate(); 180 | }); 181 | }); 182 | 183 | new Setting(this.containerEl) 184 | .setName("Enable Click On No Tabs Area") 185 | .setDesc("Support click on no tabs area to create new tab or notes.") 186 | .addToggle((toggle) => { 187 | toggle 188 | .setValue(this.plugin.settings.supportNoTabsArea) 189 | .onChange((t) => { 190 | this.plugin.settings.supportNoTabsArea = t; 191 | this.applySettingsUpdate(); 192 | // Force refresh 193 | this.display(); 194 | }); 195 | }); 196 | 197 | if (!this.plugin.settings.supportNoTabsArea) return; 198 | 199 | new Setting(this.containerEl) 200 | .setName('Default behavior when double clicking no tabs area') 201 | .setDesc("When you double click no tabs area, it will trigger behavior. You can change that behavior here.") 202 | .addDropdown(async (drowdown: DropdownComponent) => { 203 | drowdown 204 | .addOption('createNewTab', 'New Tab') 205 | .addOption('createNewTabWithNote', 'New Tab With Note') 206 | .setValue(this.plugin.settings.defaultDblClickTabOnNoTabsAreaBehavior).onChange(async (value) => { 207 | this.plugin.settings.defaultDblClickTabOnNoTabsAreaBehavior = value; 208 | this.applySettingsUpdate(); 209 | }); 210 | }); 211 | } 212 | 213 | addImageToButton(button: ButtonComponent, url: string, imageType: string, imageUrl?: string): void { 214 | const aTagEL = button.buttonEl.createEl('a', { 215 | href: url 216 | }) 217 | button.buttonEl.addClass("dbl-donate-button"); 218 | 219 | switch (imageType) { 220 | case "alipay": 221 | setIcon(aTagEL, "alipay", 16); 222 | break; 223 | case "wechat": 224 | setIcon(aTagEL, "wechat", 16); 225 | break; 226 | case "bmc": 227 | const favicon = document.createElement("img") as HTMLImageElement; 228 | if (imageUrl) favicon.src = imageUrl; 229 | aTagEL.appendChild(favicon); 230 | break; 231 | default: 232 | break; 233 | } 234 | 235 | } 236 | } 237 | -------------------------------------------------------------------------------- /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: ['dblClickTabIndex.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 | watch: !prod, 37 | target: 'es2018', 38 | logLevel: "info", 39 | sourcemap: prod ? false : 'inline', 40 | treeShaking: true, 41 | outfile: 'main.js', 42 | }).catch(() => process.exit(1)); 43 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "double-click-tab", 3 | "name": "Double Click Tab", 4 | "version": "1.1.3", 5 | "minAppVersion": "0.16.0", 6 | "description": "A plugin to modify the default behavior when you double click on the tab title, like close tab.", 7 | "author": "Boninall", 8 | "authorUrl": "https://github.com/Quorafind", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "double-click-tab", 3 | "version": "1.1.3", 4 | "description": "A plugin to modify the default behavior when you double click on the tab title, like close tab.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "bumpversion": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [], 12 | "author": "Boninall", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@types/node": "^16.11.6", 16 | "@typescript-eslint/eslint-plugin": "5.29.0", 17 | "@typescript-eslint/parser": "5.29.0", 18 | "builtin-modules": "3.3.0", 19 | "esbuild": "0.14.47", 20 | "obsidian": "latest", 21 | "tslib": "2.4.0", 22 | "typescript": "4.7.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/node': ^16.11.65 5 | '@typescript-eslint/eslint-plugin': 5.29.0 6 | '@typescript-eslint/parser': 5.29.0 7 | builtin-modules: 3.3.0 8 | esbuild: 0.14.47 9 | obsidian: latest 10 | tslib: 2.4.0 11 | typescript: 4.7.4 12 | 13 | devDependencies: 14 | '@types/node': 16.11.65 15 | '@typescript-eslint/eslint-plugin': 5.29.0_treee22277sh3yq6pnqeflwlmi 16 | '@typescript-eslint/parser': 5.29.0_typescript@4.7.4 17 | builtin-modules: 3.3.0 18 | esbuild: 0.14.47 19 | obsidian: 0.16.3 20 | tslib: 2.4.0 21 | typescript: 4.7.4 22 | 23 | packages: 24 | 25 | /@nodelib/fs.scandir/2.1.5: 26 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 27 | engines: {node: '>= 8'} 28 | dependencies: 29 | '@nodelib/fs.stat': 2.0.5 30 | run-parallel: 1.2.0 31 | dev: true 32 | 33 | /@nodelib/fs.stat/2.0.5: 34 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 35 | engines: {node: '>= 8'} 36 | dev: true 37 | 38 | /@nodelib/fs.walk/1.2.8: 39 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 40 | engines: {node: '>= 8'} 41 | dependencies: 42 | '@nodelib/fs.scandir': 2.1.5 43 | fastq: 1.13.0 44 | dev: true 45 | 46 | /@types/codemirror/0.0.108: 47 | resolution: {integrity: sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==} 48 | dependencies: 49 | '@types/tern': 0.23.4 50 | dev: true 51 | 52 | /@types/estree/1.0.0: 53 | resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} 54 | dev: true 55 | 56 | /@types/json-schema/7.0.11: 57 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 58 | dev: true 59 | 60 | /@types/node/16.11.65: 61 | resolution: {integrity: sha512-Vfz7wGMOr4jbQGiQHVJm8VjeQwM9Ya7mHe9LtQ264/Epf5n1KiZShOFqk++nBzw6a/ubgYdB9Od7P+MH/LjoWw==} 62 | dev: true 63 | 64 | /@types/tern/0.23.4: 65 | resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} 66 | dependencies: 67 | '@types/estree': 1.0.0 68 | dev: true 69 | 70 | /@typescript-eslint/eslint-plugin/5.29.0_treee22277sh3yq6pnqeflwlmi: 71 | resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} 72 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 73 | peerDependencies: 74 | '@typescript-eslint/parser': ^5.0.0 75 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 76 | typescript: '*' 77 | peerDependenciesMeta: 78 | typescript: 79 | optional: true 80 | dependencies: 81 | '@typescript-eslint/parser': 5.29.0_typescript@4.7.4 82 | '@typescript-eslint/scope-manager': 5.29.0 83 | '@typescript-eslint/type-utils': 5.29.0_typescript@4.7.4 84 | '@typescript-eslint/utils': 5.29.0_typescript@4.7.4 85 | debug: 4.3.4 86 | functional-red-black-tree: 1.0.1 87 | ignore: 5.2.0 88 | regexpp: 3.2.0 89 | semver: 7.3.8 90 | tsutils: 3.21.0_typescript@4.7.4 91 | typescript: 4.7.4 92 | transitivePeerDependencies: 93 | - supports-color 94 | dev: true 95 | 96 | /@typescript-eslint/parser/5.29.0_typescript@4.7.4: 97 | resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} 98 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 99 | peerDependencies: 100 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 101 | typescript: '*' 102 | peerDependenciesMeta: 103 | typescript: 104 | optional: true 105 | dependencies: 106 | '@typescript-eslint/scope-manager': 5.29.0 107 | '@typescript-eslint/types': 5.29.0 108 | '@typescript-eslint/typescript-estree': 5.29.0_typescript@4.7.4 109 | debug: 4.3.4 110 | typescript: 4.7.4 111 | transitivePeerDependencies: 112 | - supports-color 113 | dev: true 114 | 115 | /@typescript-eslint/scope-manager/5.29.0: 116 | resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} 117 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 118 | dependencies: 119 | '@typescript-eslint/types': 5.29.0 120 | '@typescript-eslint/visitor-keys': 5.29.0 121 | dev: true 122 | 123 | /@typescript-eslint/type-utils/5.29.0_typescript@4.7.4: 124 | resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} 125 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 126 | peerDependencies: 127 | eslint: '*' 128 | typescript: '*' 129 | peerDependenciesMeta: 130 | typescript: 131 | optional: true 132 | dependencies: 133 | '@typescript-eslint/utils': 5.29.0_typescript@4.7.4 134 | debug: 4.3.4 135 | tsutils: 3.21.0_typescript@4.7.4 136 | typescript: 4.7.4 137 | transitivePeerDependencies: 138 | - supports-color 139 | dev: true 140 | 141 | /@typescript-eslint/types/5.29.0: 142 | resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} 143 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 144 | dev: true 145 | 146 | /@typescript-eslint/typescript-estree/5.29.0_typescript@4.7.4: 147 | resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} 148 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 149 | peerDependencies: 150 | typescript: '*' 151 | peerDependenciesMeta: 152 | typescript: 153 | optional: true 154 | dependencies: 155 | '@typescript-eslint/types': 5.29.0 156 | '@typescript-eslint/visitor-keys': 5.29.0 157 | debug: 4.3.4 158 | globby: 11.1.0 159 | is-glob: 4.0.3 160 | semver: 7.3.8 161 | tsutils: 3.21.0_typescript@4.7.4 162 | typescript: 4.7.4 163 | transitivePeerDependencies: 164 | - supports-color 165 | dev: true 166 | 167 | /@typescript-eslint/utils/5.29.0_typescript@4.7.4: 168 | resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} 169 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 170 | peerDependencies: 171 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 172 | dependencies: 173 | '@types/json-schema': 7.0.11 174 | '@typescript-eslint/scope-manager': 5.29.0 175 | '@typescript-eslint/types': 5.29.0 176 | '@typescript-eslint/typescript-estree': 5.29.0_typescript@4.7.4 177 | eslint-scope: 5.1.1 178 | eslint-utils: 3.0.0 179 | transitivePeerDependencies: 180 | - supports-color 181 | - typescript 182 | dev: true 183 | 184 | /@typescript-eslint/visitor-keys/5.29.0: 185 | resolution: {integrity: sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==} 186 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 187 | dependencies: 188 | '@typescript-eslint/types': 5.29.0 189 | eslint-visitor-keys: 3.3.0 190 | dev: true 191 | 192 | /array-union/2.1.0: 193 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 194 | engines: {node: '>=8'} 195 | dev: true 196 | 197 | /braces/3.0.2: 198 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 199 | engines: {node: '>=8'} 200 | dependencies: 201 | fill-range: 7.0.1 202 | dev: true 203 | 204 | /builtin-modules/3.3.0: 205 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 206 | engines: {node: '>=6'} 207 | dev: true 208 | 209 | /debug/4.3.4: 210 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 211 | engines: {node: '>=6.0'} 212 | peerDependencies: 213 | supports-color: '*' 214 | peerDependenciesMeta: 215 | supports-color: 216 | optional: true 217 | dependencies: 218 | ms: 2.1.2 219 | dev: true 220 | 221 | /dir-glob/3.0.1: 222 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 223 | engines: {node: '>=8'} 224 | dependencies: 225 | path-type: 4.0.0 226 | dev: true 227 | 228 | /esbuild-android-64/0.14.47: 229 | resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} 230 | engines: {node: '>=12'} 231 | cpu: [x64] 232 | os: [android] 233 | requiresBuild: true 234 | dev: true 235 | optional: true 236 | 237 | /esbuild-android-arm64/0.14.47: 238 | resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} 239 | engines: {node: '>=12'} 240 | cpu: [arm64] 241 | os: [android] 242 | requiresBuild: true 243 | dev: true 244 | optional: true 245 | 246 | /esbuild-darwin-64/0.14.47: 247 | resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} 248 | engines: {node: '>=12'} 249 | cpu: [x64] 250 | os: [darwin] 251 | requiresBuild: true 252 | dev: true 253 | optional: true 254 | 255 | /esbuild-darwin-arm64/0.14.47: 256 | resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} 257 | engines: {node: '>=12'} 258 | cpu: [arm64] 259 | os: [darwin] 260 | requiresBuild: true 261 | dev: true 262 | optional: true 263 | 264 | /esbuild-freebsd-64/0.14.47: 265 | resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} 266 | engines: {node: '>=12'} 267 | cpu: [x64] 268 | os: [freebsd] 269 | requiresBuild: true 270 | dev: true 271 | optional: true 272 | 273 | /esbuild-freebsd-arm64/0.14.47: 274 | resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} 275 | engines: {node: '>=12'} 276 | cpu: [arm64] 277 | os: [freebsd] 278 | requiresBuild: true 279 | dev: true 280 | optional: true 281 | 282 | /esbuild-linux-32/0.14.47: 283 | resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} 284 | engines: {node: '>=12'} 285 | cpu: [ia32] 286 | os: [linux] 287 | requiresBuild: true 288 | dev: true 289 | optional: true 290 | 291 | /esbuild-linux-64/0.14.47: 292 | resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} 293 | engines: {node: '>=12'} 294 | cpu: [x64] 295 | os: [linux] 296 | requiresBuild: true 297 | dev: true 298 | optional: true 299 | 300 | /esbuild-linux-arm/0.14.47: 301 | resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} 302 | engines: {node: '>=12'} 303 | cpu: [arm] 304 | os: [linux] 305 | requiresBuild: true 306 | dev: true 307 | optional: true 308 | 309 | /esbuild-linux-arm64/0.14.47: 310 | resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} 311 | engines: {node: '>=12'} 312 | cpu: [arm64] 313 | os: [linux] 314 | requiresBuild: true 315 | dev: true 316 | optional: true 317 | 318 | /esbuild-linux-mips64le/0.14.47: 319 | resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} 320 | engines: {node: '>=12'} 321 | cpu: [mips64el] 322 | os: [linux] 323 | requiresBuild: true 324 | dev: true 325 | optional: true 326 | 327 | /esbuild-linux-ppc64le/0.14.47: 328 | resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} 329 | engines: {node: '>=12'} 330 | cpu: [ppc64] 331 | os: [linux] 332 | requiresBuild: true 333 | dev: true 334 | optional: true 335 | 336 | /esbuild-linux-riscv64/0.14.47: 337 | resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} 338 | engines: {node: '>=12'} 339 | cpu: [riscv64] 340 | os: [linux] 341 | requiresBuild: true 342 | dev: true 343 | optional: true 344 | 345 | /esbuild-linux-s390x/0.14.47: 346 | resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} 347 | engines: {node: '>=12'} 348 | cpu: [s390x] 349 | os: [linux] 350 | requiresBuild: true 351 | dev: true 352 | optional: true 353 | 354 | /esbuild-netbsd-64/0.14.47: 355 | resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} 356 | engines: {node: '>=12'} 357 | cpu: [x64] 358 | os: [netbsd] 359 | requiresBuild: true 360 | dev: true 361 | optional: true 362 | 363 | /esbuild-openbsd-64/0.14.47: 364 | resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} 365 | engines: {node: '>=12'} 366 | cpu: [x64] 367 | os: [openbsd] 368 | requiresBuild: true 369 | dev: true 370 | optional: true 371 | 372 | /esbuild-sunos-64/0.14.47: 373 | resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} 374 | engines: {node: '>=12'} 375 | cpu: [x64] 376 | os: [sunos] 377 | requiresBuild: true 378 | dev: true 379 | optional: true 380 | 381 | /esbuild-windows-32/0.14.47: 382 | resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} 383 | engines: {node: '>=12'} 384 | cpu: [ia32] 385 | os: [win32] 386 | requiresBuild: true 387 | dev: true 388 | optional: true 389 | 390 | /esbuild-windows-64/0.14.47: 391 | resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} 392 | engines: {node: '>=12'} 393 | cpu: [x64] 394 | os: [win32] 395 | requiresBuild: true 396 | dev: true 397 | optional: true 398 | 399 | /esbuild-windows-arm64/0.14.47: 400 | resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} 401 | engines: {node: '>=12'} 402 | cpu: [arm64] 403 | os: [win32] 404 | requiresBuild: true 405 | dev: true 406 | optional: true 407 | 408 | /esbuild/0.14.47: 409 | resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} 410 | engines: {node: '>=12'} 411 | hasBin: true 412 | requiresBuild: true 413 | optionalDependencies: 414 | esbuild-android-64: 0.14.47 415 | esbuild-android-arm64: 0.14.47 416 | esbuild-darwin-64: 0.14.47 417 | esbuild-darwin-arm64: 0.14.47 418 | esbuild-freebsd-64: 0.14.47 419 | esbuild-freebsd-arm64: 0.14.47 420 | esbuild-linux-32: 0.14.47 421 | esbuild-linux-64: 0.14.47 422 | esbuild-linux-arm: 0.14.47 423 | esbuild-linux-arm64: 0.14.47 424 | esbuild-linux-mips64le: 0.14.47 425 | esbuild-linux-ppc64le: 0.14.47 426 | esbuild-linux-riscv64: 0.14.47 427 | esbuild-linux-s390x: 0.14.47 428 | esbuild-netbsd-64: 0.14.47 429 | esbuild-openbsd-64: 0.14.47 430 | esbuild-sunos-64: 0.14.47 431 | esbuild-windows-32: 0.14.47 432 | esbuild-windows-64: 0.14.47 433 | esbuild-windows-arm64: 0.14.47 434 | dev: true 435 | 436 | /eslint-scope/5.1.1: 437 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 438 | engines: {node: '>=8.0.0'} 439 | dependencies: 440 | esrecurse: 4.3.0 441 | estraverse: 4.3.0 442 | dev: true 443 | 444 | /eslint-utils/3.0.0: 445 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 446 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 447 | peerDependencies: 448 | eslint: '>=5' 449 | dependencies: 450 | eslint-visitor-keys: 2.1.0 451 | dev: true 452 | 453 | /eslint-visitor-keys/2.1.0: 454 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 455 | engines: {node: '>=10'} 456 | dev: true 457 | 458 | /eslint-visitor-keys/3.3.0: 459 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 460 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 461 | dev: true 462 | 463 | /esrecurse/4.3.0: 464 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 465 | engines: {node: '>=4.0'} 466 | dependencies: 467 | estraverse: 5.3.0 468 | dev: true 469 | 470 | /estraverse/4.3.0: 471 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 472 | engines: {node: '>=4.0'} 473 | dev: true 474 | 475 | /estraverse/5.3.0: 476 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 477 | engines: {node: '>=4.0'} 478 | dev: true 479 | 480 | /fast-glob/3.2.12: 481 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 482 | engines: {node: '>=8.6.0'} 483 | dependencies: 484 | '@nodelib/fs.stat': 2.0.5 485 | '@nodelib/fs.walk': 1.2.8 486 | glob-parent: 5.1.2 487 | merge2: 1.4.1 488 | micromatch: 4.0.5 489 | dev: true 490 | 491 | /fastq/1.13.0: 492 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 493 | dependencies: 494 | reusify: 1.0.4 495 | dev: true 496 | 497 | /fill-range/7.0.1: 498 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 499 | engines: {node: '>=8'} 500 | dependencies: 501 | to-regex-range: 5.0.1 502 | dev: true 503 | 504 | /functional-red-black-tree/1.0.1: 505 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 506 | dev: true 507 | 508 | /glob-parent/5.1.2: 509 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 510 | engines: {node: '>= 6'} 511 | dependencies: 512 | is-glob: 4.0.3 513 | dev: true 514 | 515 | /globby/11.1.0: 516 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 517 | engines: {node: '>=10'} 518 | dependencies: 519 | array-union: 2.1.0 520 | dir-glob: 3.0.1 521 | fast-glob: 3.2.12 522 | ignore: 5.2.0 523 | merge2: 1.4.1 524 | slash: 3.0.0 525 | dev: true 526 | 527 | /ignore/5.2.0: 528 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 529 | engines: {node: '>= 4'} 530 | dev: true 531 | 532 | /is-extglob/2.1.1: 533 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 534 | engines: {node: '>=0.10.0'} 535 | dev: true 536 | 537 | /is-glob/4.0.3: 538 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 539 | engines: {node: '>=0.10.0'} 540 | dependencies: 541 | is-extglob: 2.1.1 542 | dev: true 543 | 544 | /is-number/7.0.0: 545 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 546 | engines: {node: '>=0.12.0'} 547 | dev: true 548 | 549 | /lru-cache/6.0.0: 550 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 551 | engines: {node: '>=10'} 552 | dependencies: 553 | yallist: 4.0.0 554 | dev: true 555 | 556 | /merge2/1.4.1: 557 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 558 | engines: {node: '>= 8'} 559 | dev: true 560 | 561 | /micromatch/4.0.5: 562 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 563 | engines: {node: '>=8.6'} 564 | dependencies: 565 | braces: 3.0.2 566 | picomatch: 2.3.1 567 | dev: true 568 | 569 | /moment/2.29.4: 570 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 571 | dev: true 572 | 573 | /ms/2.1.2: 574 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 575 | dev: true 576 | 577 | /obsidian/0.16.3: 578 | resolution: {integrity: sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==} 579 | peerDependencies: 580 | '@codemirror/state': ^6.0.0 581 | '@codemirror/view': ^6.0.0 582 | dependencies: 583 | '@types/codemirror': 0.0.108 584 | moment: 2.29.4 585 | dev: true 586 | 587 | /path-type/4.0.0: 588 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 589 | engines: {node: '>=8'} 590 | dev: true 591 | 592 | /picomatch/2.3.1: 593 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 594 | engines: {node: '>=8.6'} 595 | dev: true 596 | 597 | /queue-microtask/1.2.3: 598 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 599 | dev: true 600 | 601 | /regexpp/3.2.0: 602 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 603 | engines: {node: '>=8'} 604 | dev: true 605 | 606 | /reusify/1.0.4: 607 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 608 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 609 | dev: true 610 | 611 | /run-parallel/1.2.0: 612 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 613 | dependencies: 614 | queue-microtask: 1.2.3 615 | dev: true 616 | 617 | /semver/7.3.8: 618 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 619 | engines: {node: '>=10'} 620 | hasBin: true 621 | dependencies: 622 | lru-cache: 6.0.0 623 | dev: true 624 | 625 | /slash/3.0.0: 626 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 627 | engines: {node: '>=8'} 628 | dev: true 629 | 630 | /to-regex-range/5.0.1: 631 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 632 | engines: {node: '>=8.0'} 633 | dependencies: 634 | is-number: 7.0.0 635 | dev: true 636 | 637 | /tslib/1.14.1: 638 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 639 | dev: true 640 | 641 | /tslib/2.4.0: 642 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 643 | dev: true 644 | 645 | /tsutils/3.21.0_typescript@4.7.4: 646 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 647 | engines: {node: '>= 6'} 648 | peerDependencies: 649 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 650 | dependencies: 651 | tslib: 1.14.1 652 | typescript: 4.7.4 653 | dev: true 654 | 655 | /typescript/4.7.4: 656 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 657 | engines: {node: '>=4.2.0'} 658 | hasBin: true 659 | dev: true 660 | 661 | /yallist/4.0.0: 662 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 663 | dev: true 664 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | This CSS file will be included with your plugin, and 4 | available in the app when your plugin is enabled. 5 | 6 | If your plugin does not need CSS, delete this file. 7 | 8 | */ 9 | 10 | .show-title-bar-button .titlebar-button-container.mod-right { 11 | width: var(--frame-right-space); 12 | transition: width 275ms var(--anim-motion-swing); 13 | } 14 | 15 | .titlebar-button-container.mod-right { 16 | width: var(--size-4-2); 17 | transition: width 275ms var(--anim-motion-swing); 18 | } 19 | 20 | .is-hidden-frameless:not(.is-fullscreen) .workspace-tabs.mod-top-right-space .workspace-tab-header-container { 21 | padding-right: var(--size-4-2); 22 | } 23 | 24 | .show-title-bar-button.is-hidden-frameless:not(.is-fullscreen) .workspace-tabs.mod-top-right-space .workspace-tab-header-container { 25 | padding-right: var(--frame-right-space); 26 | } 27 | 28 | .dbl-donate-button { 29 | height: auto; 30 | width: auto; 31 | padding: 0; 32 | } 33 | 34 | .dbl-donate-button a { 35 | height: 50px; 36 | width: auto; 37 | padding: 0; 38 | } 39 | 40 | svg.svg-icon.alipay { 41 | height: 50px; 42 | width: 50px; 43 | padding: 0; 44 | } 45 | 46 | svg.svg-icon.wechat { 47 | height: 50px; 48 | width: 50px; 49 | padding: 3px; 50 | } 51 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "0.16.0", 3 | "1.1.0": "0.16.0", 4 | "1.1.1": "0.16.0", 5 | "1.1.2": "0.16.0" 6 | } --------------------------------------------------------------------------------