├── .gitignore ├── manifest.json ├── rollup.config.js ├── tsconfig.json ├── package.json ├── README.md ├── .github └── workflows │ └── main.yml ├── main.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | *.iml 3 | .idea 4 | 5 | # npm 6 | node_modules 7 | package-lock.json 8 | 9 | # build 10 | main.js 11 | *.js.map -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "mrj-crosslink-between-notes", 3 | "name": "Add links to current note", 4 | "version": "0.0.9", 5 | "description": "This plugin adds a command which allows to add a link to the current note at the bottom of selected notes", 6 | "author": "MrJackphil", 7 | "authorUrl": "https://mrjackphil.com", 8 | "isDesktopOnly": false 9 | } 10 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | import {nodeResolve} from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | 5 | export default { 6 | input: 'main.ts', 7 | output: { 8 | dir: '.', 9 | sourcemap: 'inline', 10 | format: 'cjs', 11 | exports: 'default' 12 | }, 13 | external: ['obsidian'], 14 | plugins: [ 15 | typescript(), 16 | nodeResolve({browser: true}), 17 | commonjs(), 18 | ] 19 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "es5", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "lib": [ 13 | "dom", 14 | "es5", 15 | "scripthost", 16 | "es2015", 17 | "es2019" 18 | ] 19 | }, 20 | "include": [ 21 | "**/*.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mrj-crosslink-between-notes", 3 | "version": "0.9.7", 4 | "description": "This plugin adds a command which allows to add a link to the current note at the bottom of the selected notes", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "rollup --config rollup.config.js -w", 8 | "build": "rollup --config rollup.config.js" 9 | }, 10 | "keywords": [], 11 | "author": "MrJackphil", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@rollup/plugin-commonjs": "^15.1.0", 15 | "@rollup/plugin-node-resolve": "^9.0.0", 16 | "@rollup/plugin-typescript": "^6.0.0", 17 | "@types/node": "^14.14.2", 18 | "obsidian": "https://github.com/obsidianmd/obsidian-api/tarball/master", 19 | "rollup": "^2.32.1", 20 | "tslib": "^2.0.3", 21 | "typescript": "^4.0.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Add links to current note 2 | This plugin adds a command which allows to add a link to the current note at the bottom of selected notes 3 | ## How to use 4 | - Put a cursor at a line with existed [[WikiLinks]] or select content with [[WikiLinks]]. 5 | - There is an option to add link to the any other file by using **add links to the current note from the quick switcher** option. 6 | - Open command palette (Ctrl+P) and find `Add links to current note: add links` command. 7 | - You can set hotkey in `Settings->Hotkey` section 8 | - Execute command. It will search for wikilinks and add a `[[CURRENT_OPENED_NOTE_NAME]]` at the bottom of the each note. 9 | ## Compatibility 10 | Tested on Obsidian 0.9.10 11 | ## How to install 12 | You can install the plugin via the Community Plugins tab within Obsidian. Just search for "Add links to current note." when it'll be available. 13 | ### Manual installation 14 | You can install the plugin manually by downloading files from [Latest Release](https://github.com/mrjackphil/obsidian-crosslink-between-notes/releases/latest). Unzip the contents into your `/.obsidian/plugins/mrj-crosslink-between-notes` directory. [More info](https://forum.obsidian.md/t/plugins-mini-faq/7737). 15 | ## Donation 16 | - [Patreon](https://patreon.com/mrjackphil) 17 | - [Paypal](https://www.paypal.com/paypalme/mrjackphil) 18 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build obsidian plugin 2 | 3 | on: 4 | push: 5 | # Sequence of patterns matched against refs/tags 6 | tags: 7 | - '*' # Push events to matching any tag format, i.e. 1.0, 20.15.10 8 | 9 | env: 10 | PLUGIN_NAME: mrj-crosslink-between-notes # Change this to the name of your plugin-id folder 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Use Node.js 20 | uses: actions/setup-node@v1 21 | with: 22 | node-version: '14.x' # You might need to adjust this value to your own version 23 | - name: Build 24 | id: build 25 | run: | 26 | npm install 27 | npm run build --if-present 28 | mkdir ${{ env.PLUGIN_NAME }} 29 | cp main.js manifest.json ${{ env.PLUGIN_NAME }} 30 | zip -r ${{ env.PLUGIN_NAME }}.zip ${{ env.PLUGIN_NAME }} 31 | ls 32 | echo "::set-output name=tag_name::$(git tag --sort version:refname | tail -n 1)" 33 | - name: Create Release 34 | id: create_release 35 | uses: actions/create-release@v1 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | VERSION: ${{ github.ref }} 39 | with: 40 | tag_name: ${{ github.ref }} 41 | release_name: ${{ github.ref }} 42 | draft: false 43 | prerelease: false 44 | - name: Upload zip file 45 | id: upload-zip 46 | uses: actions/upload-release-asset@v1 47 | env: 48 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 49 | with: 50 | upload_url: ${{ steps.create_release.outputs.upload_url }} 51 | asset_path: ./${{ env.PLUGIN_NAME }}.zip 52 | asset_name: ${{ env.PLUGIN_NAME }}-${{ steps.build.outputs.tag_name }}.zip 53 | asset_content_type: application/zip 54 | - name: Upload main.js 55 | id: upload-main 56 | uses: actions/upload-release-asset@v1 57 | env: 58 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 59 | with: 60 | upload_url: ${{ steps.create_release.outputs.upload_url }} 61 | asset_path: ./main.js 62 | asset_name: main.js 63 | asset_content_type: text/javascript 64 | - name: Upload manifest.json 65 | id: upload-manifest 66 | uses: actions/upload-release-asset@v1 67 | env: 68 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 69 | with: 70 | upload_url: ${{ steps.create_release.outputs.upload_url }} 71 | asset_path: ./manifest.json 72 | asset_name: manifest.json 73 | asset_content_type: application/json 74 | # - name: Upload styles.css 75 | # id: upload-css 76 | # uses: actions/upload-release-asset@v1 77 | # env: 78 | # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 79 | # with: 80 | # upload_url: ${{ steps.create_release.outputs.upload_url }} 81 | # asset_path: ./styles.css 82 | # asset_name: styles.css 83 | # asset_content_type: text/css 84 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | App, fuzzySearch, FuzzySuggestModal, MarkdownPreviewView, 3 | MarkdownView, 4 | Notice, 5 | Plugin, PluginSettingTab, Setting, 6 | TFile 7 | } from 'obsidian'; 8 | 9 | interface PluginSettings { 10 | template: string 11 | } 12 | 13 | const DEFAULT_SETTINGS: PluginSettings = { 14 | template: '- $link' 15 | } 16 | 17 | export default class AddLinkToCurrentNotePlugin extends Plugin { 18 | settings: PluginSettings; 19 | 20 | async onload() { 21 | console.log('loading plugin'); 22 | 23 | await this.loadSettings(); 24 | 25 | this.addSettingTab(new CrosslinkSettingsTab(this.app, this)); 26 | 27 | this.addCommand({ 28 | id: 'add-link-to-current', 29 | name: 'add links to the notes from the line or selection', 30 | callback: this.addBacklink.bind(this), 31 | hotkeys: [] 32 | }) 33 | 34 | this.addCommand({ 35 | id: 'add-link-from-quick-switcher', 36 | name: 'add links to the note from the quick switcher', 37 | callback: () => { 38 | const modal = new FilesModal(this.app, this) 39 | modal.open() 40 | }, 41 | hotkeys: [] 42 | }) 43 | 44 | // this.addCommand( 45 | // { 46 | // id: 'add-link-to-backlinks', 47 | // name: 'add links to the backlinks', 48 | // callback: this.addLinkToBacklinks.bind(this), 49 | // hotkeys: [] 50 | // } 51 | // ) 52 | } 53 | 54 | onunload() { 55 | console.log('unloading plugin'); 56 | } 57 | 58 | // addLinkToBacklinks() { 59 | // const currentView = this.app.workspace.activeLeaf.view 60 | // if (!(currentView instanceof MarkdownView)) { 61 | // return 62 | // } 63 | // 64 | // const currentFile = currentView.file 65 | // 66 | // // @ts-ignore 67 | // const backlinks = this.app.metadataCache.getBacklinksForFile(currentFile)?.data 68 | // const backlinkPaths = Object.keys(backlinks) 69 | // } 70 | 71 | addBacklink = async (files?: TFile[]) => { 72 | const currentView = this.app.workspace.activeLeaf.view 73 | 74 | const fileName = currentView.getDisplayText() 75 | 76 | let filesToProduce = files 77 | ? files 78 | : currentView instanceof MarkdownView 79 | ? this.getFilesFromLineOrSelection(currentView) 80 | : [] 81 | 82 | if (!(currentView instanceof MarkdownView)) { 83 | return 84 | } 85 | 86 | const currentFile = currentView.file 87 | 88 | const currentFileLink = this.app.fileManager.generateMarkdownLink(currentFile, currentFile.path) 89 | const lineToPaste = this.settings.template.replace('$link', currentFileLink) 90 | 91 | let succeed = [] as TFile[] 92 | 93 | await Promise.all(filesToProduce.map(async (file) => { 94 | if (file) { 95 | const {vault} = this.app 96 | 97 | const data = await vault.read(file) 98 | await vault.modify(file, data + `\n` + lineToPaste) 99 | succeed.push(file) 100 | } 101 | return Promise.resolve() 102 | })) 103 | new Notice(`Add link [[${fileName}]] to ${succeed.map(e => e.basename).join(',')}`) 104 | } 105 | 106 | getFilesFromLineOrSelection(view: MarkdownView): TFile[] { 107 | const cm = view.editor 108 | const cursor = cm.getCursor() 109 | const selectedRange = cm.getSelection() 110 | const line = selectedRange || cm.getLine(cursor.line) 111 | 112 | const regexpMD = /(\[.+?])\(.+?\)/gi 113 | const regexpWiki = /\[\[.+?]]/gi 114 | 115 | const linksWiki = line.match(regexpWiki) || [] 116 | const linksMD = line.match(regexpMD) || [] 117 | 118 | const ar = [linksWiki, linksMD].filter(e => e.length) 119 | 120 | return ar.flat().map((lnk) => { 121 | const wikiName = lnk 122 | .replace(/(\[\[|]])/g, '') 123 | .replace(/\|.+/, '') 124 | .replace(/#.+/, '') 125 | 126 | const mdName = decodeURI(lnk.match(/\(.+?\)/)?.[0] 127 | ?.replace('.md', '') 128 | ?.replace(/[()]/g, '')) 129 | 130 | return this.getFilesByName(wikiName) || this.getFilesByName(mdName) 131 | 132 | }) 133 | } 134 | 135 | getFilesByName(name: string | string[]) { 136 | const files = this.app.vault.getFiles() 137 | 138 | if (Array.isArray(name)) { 139 | return files.filter(e => name.includes(e.name) 140 | || name.includes((e.path)) 141 | || name.includes(e.basename) 142 | )[0] 143 | } 144 | 145 | return files.filter(e => e.name === name 146 | || e.path === name 147 | || e.basename === name 148 | )[0] 149 | } 150 | 151 | async loadSettings() { 152 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 153 | } 154 | 155 | async saveSettings() { 156 | await this.saveData(this.settings); 157 | } 158 | } 159 | 160 | class FilesModal extends FuzzySuggestModal { 161 | files: TFile[]; 162 | newNoteResult: HTMLDivElement; 163 | suggestionEmpty: HTMLDivElement; 164 | obsFile: any; 165 | noSuggestion: boolean; 166 | plugin: AddLinkToCurrentNotePlugin; 167 | 168 | EMPTY_TEXT = 'Files not found'; 169 | 170 | constructor(app: App, plugin: AddLinkToCurrentNotePlugin) { 171 | super(app); 172 | this.plugin = plugin; 173 | this.init(); 174 | } 175 | 176 | init() { 177 | this.files = this.app.vault.getMarkdownFiles(); 178 | this.emptyStateText = this.EMPTY_TEXT; 179 | // this.setPlaceholder(PLACEHOLDER_TEXT); 180 | this.setInstructions( 181 | [ 182 | {command: '↑↓', purpose: 'to navigate'}, 183 | {command: '↵', purpose: 'to append link to the file'}, 184 | {command: 'esc', purpose: 'to dismiss'} 185 | ] 186 | ); 187 | this.initNewNoteItem(); 188 | } 189 | 190 | getItems(): TFile[] { 191 | return this.files; 192 | } 193 | 194 | getItemText(item: TFile): string { 195 | this.noSuggestion = false; 196 | return item.basename; 197 | } 198 | 199 | onNoSuggestion() { 200 | this.noSuggestion = true; 201 | } 202 | 203 | onChooseItem(item: TFile, evt: MouseEvent | KeyboardEvent): void { 204 | if (this.noSuggestion) { 205 | // this.modalNoteCreation.create(this.inputEl.value); 206 | } else { 207 | this.plugin.addBacklink([item]) 208 | } 209 | } 210 | 211 | initNewNoteItem() { 212 | this.newNoteResult = document.createElement('div'); 213 | this.newNoteResult.addClasses(['suggestion-item', 'is-selected']); 214 | this.suggestionEmpty = document.createElement('div'); 215 | this.suggestionEmpty.addClass('suggestion-empty'); 216 | this.suggestionEmpty.innerText = this.EMPTY_TEXT; 217 | } 218 | 219 | itemInstructionMessage(resultEl: HTMLElement, message: string) { 220 | const el = document.createElement('kbd'); 221 | el.addClass('suggestion-hotkey'); 222 | el.innerText = message; 223 | resultEl.appendChild(el); 224 | } 225 | 226 | } 227 | 228 | class CrosslinkSettingsTab extends PluginSettingTab { 229 | plugin: AddLinkToCurrentNotePlugin; 230 | 231 | constructor(app: App, plugin: AddLinkToCurrentNotePlugin) { 232 | super(app, plugin); 233 | this.plugin = plugin; 234 | } 235 | 236 | display(): void { 237 | let {containerEl} = this; 238 | 239 | containerEl.empty(); 240 | 241 | containerEl.createEl('h2', {text: 'Settings for "Add links to the current note" plugin'}); 242 | 243 | new Setting(containerEl) 244 | .setName('Template') 245 | .setDesc('How the link will be pasted. `$link` will be replaced with link itself.') 246 | .addText(text => text 247 | .setValue(this.plugin.settings.template) 248 | .onChange(async (value) => { 249 | this.plugin.settings.template = value; 250 | await this.plugin.saveSettings(); 251 | })); 252 | } 253 | } 254 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@rollup/plugin-commonjs@^15.1.0": 6 | version "15.1.0" 7 | resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz#1e7d076c4f1b2abf7e65248570e555defc37c238" 8 | integrity sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ== 9 | dependencies: 10 | "@rollup/pluginutils" "^3.1.0" 11 | commondir "^1.0.1" 12 | estree-walker "^2.0.1" 13 | glob "^7.1.6" 14 | is-reference "^1.2.1" 15 | magic-string "^0.25.7" 16 | resolve "^1.17.0" 17 | 18 | "@rollup/plugin-node-resolve@^9.0.0": 19 | version "9.0.0" 20 | resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6" 21 | integrity sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg== 22 | dependencies: 23 | "@rollup/pluginutils" "^3.1.0" 24 | "@types/resolve" "1.17.1" 25 | builtin-modules "^3.1.0" 26 | deepmerge "^4.2.2" 27 | is-module "^1.0.0" 28 | resolve "^1.17.0" 29 | 30 | "@rollup/plugin-typescript@^6.0.0": 31 | version "6.1.0" 32 | resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz#289e7f0ea12fd659bd13ad59dda73b9055538b83" 33 | integrity sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ== 34 | dependencies: 35 | "@rollup/pluginutils" "^3.1.0" 36 | resolve "^1.17.0" 37 | 38 | "@rollup/pluginutils@^3.1.0": 39 | version "3.1.0" 40 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" 41 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== 42 | dependencies: 43 | "@types/estree" "0.0.39" 44 | estree-walker "^1.0.1" 45 | picomatch "^2.2.2" 46 | 47 | "@types/codemirror@0.0.98": 48 | version "0.0.98" 49 | resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.98.tgz#b35c7a4ab1fc1684b08a4e3eb65240020556ebfb" 50 | integrity sha512-cbty5LPayy2vNSeuUdjNA9tggG+go5vAxmnLDRWpiZI5a+RDBi9dlozy4/jW/7P/gletbBWbQREEa7A81YxstA== 51 | dependencies: 52 | "@types/tern" "*" 53 | 54 | "@types/estree@*": 55 | version "0.0.45" 56 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" 57 | integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== 58 | 59 | "@types/estree@0.0.39": 60 | version "0.0.39" 61 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 62 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== 63 | 64 | "@types/node@*", "@types/node@^14.14.2": 65 | version "14.14.6" 66 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" 67 | integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== 68 | 69 | "@types/resolve@1.17.1": 70 | version "1.17.1" 71 | resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" 72 | integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== 73 | dependencies: 74 | "@types/node" "*" 75 | 76 | "@types/tern@*": 77 | version "0.23.3" 78 | resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460" 79 | integrity sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w== 80 | dependencies: 81 | "@types/estree" "*" 82 | 83 | balanced-match@^1.0.0: 84 | version "1.0.0" 85 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 86 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 87 | 88 | brace-expansion@^1.1.7: 89 | version "1.1.11" 90 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 91 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 92 | dependencies: 93 | balanced-match "^1.0.0" 94 | concat-map "0.0.1" 95 | 96 | builtin-modules@^3.1.0: 97 | version "3.1.0" 98 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" 99 | integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== 100 | 101 | commondir@^1.0.1: 102 | version "1.0.1" 103 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 104 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 105 | 106 | concat-map@0.0.1: 107 | version "0.0.1" 108 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 109 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 110 | 111 | deepmerge@^4.2.2: 112 | version "4.2.2" 113 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 114 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 115 | 116 | estree-walker@^1.0.1: 117 | version "1.0.1" 118 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" 119 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== 120 | 121 | estree-walker@^2.0.1: 122 | version "2.0.1" 123 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" 124 | integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== 125 | 126 | fs.realpath@^1.0.0: 127 | version "1.0.0" 128 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 129 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 130 | 131 | fsevents@~2.1.2: 132 | version "2.1.3" 133 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 134 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 135 | 136 | function-bind@^1.1.1: 137 | version "1.1.1" 138 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 139 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 140 | 141 | glob@^7.1.6: 142 | version "7.1.6" 143 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 144 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 145 | dependencies: 146 | fs.realpath "^1.0.0" 147 | inflight "^1.0.4" 148 | inherits "2" 149 | minimatch "^3.0.4" 150 | once "^1.3.0" 151 | path-is-absolute "^1.0.0" 152 | 153 | has@^1.0.3: 154 | version "1.0.3" 155 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 156 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 157 | dependencies: 158 | function-bind "^1.1.1" 159 | 160 | inflight@^1.0.4: 161 | version "1.0.6" 162 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 163 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 164 | dependencies: 165 | once "^1.3.0" 166 | wrappy "1" 167 | 168 | inherits@2: 169 | version "2.0.4" 170 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 171 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 172 | 173 | is-core-module@^2.0.0: 174 | version "2.0.0" 175 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" 176 | integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== 177 | dependencies: 178 | has "^1.0.3" 179 | 180 | is-module@^1.0.0: 181 | version "1.0.0" 182 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 183 | integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= 184 | 185 | is-reference@^1.2.1: 186 | version "1.2.1" 187 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" 188 | integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== 189 | dependencies: 190 | "@types/estree" "*" 191 | 192 | magic-string@^0.25.7: 193 | version "0.25.7" 194 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 195 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 196 | dependencies: 197 | sourcemap-codec "^1.4.4" 198 | 199 | minimatch@^3.0.4: 200 | version "3.0.4" 201 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 202 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 203 | dependencies: 204 | brace-expansion "^1.1.7" 205 | 206 | "obsidian@https://github.com/obsidianmd/obsidian-api/tarball/master": 207 | version "0.9.7" 208 | resolved "https://github.com/obsidianmd/obsidian-api/tarball/master#8cbd761836526a23a1fcad9898f88bd337779bbe" 209 | dependencies: 210 | "@types/codemirror" "0.0.98" 211 | 212 | once@^1.3.0: 213 | version "1.4.0" 214 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 215 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 216 | dependencies: 217 | wrappy "1" 218 | 219 | path-is-absolute@^1.0.0: 220 | version "1.0.1" 221 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 222 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 223 | 224 | path-parse@^1.0.6: 225 | version "1.0.6" 226 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 227 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 228 | 229 | picomatch@^2.2.2: 230 | version "2.2.2" 231 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 232 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 233 | 234 | resolve@^1.17.0: 235 | version "1.18.1" 236 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" 237 | integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== 238 | dependencies: 239 | is-core-module "^2.0.0" 240 | path-parse "^1.0.6" 241 | 242 | rollup@^2.32.1: 243 | version "2.33.1" 244 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.33.1.tgz#802795164164ee63cd47769d8879c33ec8ae0c40" 245 | integrity sha512-uY4O/IoL9oNW8MMcbA5hcOaz6tZTMIh7qJHx/tzIJm+n1wLoY38BLn6fuy7DhR57oNFLMbDQtDeJoFURt5933w== 246 | optionalDependencies: 247 | fsevents "~2.1.2" 248 | 249 | sourcemap-codec@^1.4.4: 250 | version "1.4.8" 251 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 252 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 253 | 254 | tslib@^2.0.3: 255 | version "2.0.3" 256 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" 257 | integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== 258 | 259 | typescript@^4.0.3: 260 | version "4.0.5" 261 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" 262 | integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== 263 | 264 | wrappy@1: 265 | version "1.0.2" 266 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 267 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 268 | --------------------------------------------------------------------------------