├── .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 | }
--------------------------------------------------------------------------------