├── screenshots └── 2.gif ├── .gitignore ├── manifest.json ├── tsconfig.json ├── rollup.config.js ├── package.json ├── README.md ├── main.ts └── yarn.lock /screenshots/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nhaouari/searchpp/HEAD/screenshots/2.gif -------------------------------------------------------------------------------- /.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": "searchpp", 3 | "name": "Search++", 4 | "version": "0.0.1", 5 | "repo": "https://github.com/nhaouari/searchpp", 6 | "description": "Allow inserting text context search results on the active note, the plugin is based on the plugin mrj-text-expand-witb-text of MrJackphil.", 7 | "isDesktopOnly": false, 8 | "author": "Noureddine Haouari", 9 | "authorUrl": "https://haouari.com" 10 | } 11 | -------------------------------------------------------------------------------- /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 | ] 18 | }, 19 | "include": [ 20 | "**/*.ts" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /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 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mrj-text-expand", 3 | "version": "0.9.9", 4 | "description": "", 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 | "dependencies": { 24 | "remove-markdown": "^0.3.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Search++ 2 | ![](./screenshots/2.gif) 3 | 4 | This is plugin is based on the code of [mrj-text-expand](https://github.com/nhaouari/obsidian-text-expand), it inserts the found results on the note you're working on. 5 | 6 | ## Install 7 | - If you have previous versions of plugin - remove them 8 | - You need Obsidian v0.9.7+ 9 | - Get [Latest release]() 10 | - Extract files and place them to your vault's plugins folder: `/.obsidian/plugins/` 11 | - Reload Obsidian 12 | - If prompted about Safe Mode, you can disable safe mode and enable the plugin. Otherwise head to Settings, third-party plugins, make sure safe mode is off and enable the plugin from there. 13 | 14 | 15 | ## How to use 16 | 17 | - Type `{{SEARCH_TEXT/NUMBER_OF_CHARS}}` in your note where `SEARCH_TEXT` a text which you want to search, and NUMBER_OF_CHARS is the number of chars before and after the found text you want to extract. 18 | 19 | Examples: `{{My Note/300}}`, `{{tag:#tag/500}}`. 20 | - Put a cursor on that line 21 | - Open command palette and find `Search++:` commands (you can attach hotkeys in settings menu) 22 | 23 | It should wrap the `{{ }}` line and add notes which was found below. 24 | You can call command in a `{{ }}` line to update results. 25 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import {App, View, Plugin, PluginSettingTab, Setting, TFile, FileView, MarkdownView} from 'obsidian'; 2 | import removeMd from "remove-markdown"; 3 | 4 | 5 | interface Config { 6 | id: string; 7 | name: string; 8 | formatTitle: (e: any) => string; 9 | formatResults: (str: string,start:number,end:number) => string; 10 | formatContent: (str: string,start:number,end:number) => string; 11 | postResults: ()=>void; 12 | } 13 | 14 | interface Files { 15 | file: TFile 16 | } 17 | 18 | function inlineLog(str: string) { 19 | console.log(str) 20 | return str 21 | } 22 | 23 | export default class SearchPP extends Plugin { 24 | delay = 2000; 25 | textExtraction= "Activated"; 26 | defaultSize=30; 27 | onload() { 28 | this.addSettingTab(new SettingTab(this.app, this)); 29 | 30 | console.log('Loading insert search results plugin'); 31 | const config: Config[] = [ 32 | { 33 | id: 'editor:insertSearchResultsFormated', 34 | name: 'Insert search results Formated', 35 | formatTitle: ele => "# "+ele.file.name+" ("+ele.result.content.length+")"+"\n"+"[[" + ele.file.name + "]]"+"\n", 36 | formatResults:(str,start,end) => "## ..."+removeMd(str.substring(start,end).replace("\n"," "))+"...\n", 37 | formatContent:(str,start,end) => removeMd(str.substring(start,end).replace("\n"," ")), 38 | postResults:()=>{this.app.commands.commands["editor:fold-all"].checkCallback();} 39 | }, 40 | { 41 | id: 'editor:insertSearchResultsNotFormated', 42 | name: 'Insert search results not formated', 43 | formatTitle: ele => ele.file.name+" ("+ele.result.content.length+")"+"\n"+"[[" + ele.file.name + "]]"+"\n", 44 | formatResults:(str,start,end) => removeMd(str.substring(start,end).replace("\n"," "))+"...\n", 45 | formatContent:(str,start,end) => removeMd(str.substring(start,end).replace("\n"," ")), 46 | postResults:()=>{} 47 | }, 48 | { 49 | id: 'editor:insertSearchResultContent', 50 | name: 'Insert search results content', 51 | formatTitle: ele => "", 52 | formatResults:(str,start,end) => "", 53 | formatContent:(str,start,end) => removeMd(str.substring(start,end).replace("\n"," ")), 54 | postResults:()=>{} 55 | } 56 | 57 | ] 58 | 59 | const reformatLinks = (links: Files[], config:Config,size:number): string => { 60 | const currentView = this.app.workspace.activeLeaf.view 61 | const query:string= this.app.workspace.getLeavesOfType('search')[0].view.searchQuery.query.replace(/^"(.*)"$/, '$1'); 62 | links.sort((a,b)=>b.result.content.length-a.result.content.length); 63 | return links.filter(ele=>ele.file.name!==currentView.file.name).map((ele)=>{ 64 | 65 | const titleSize=20; 66 | 67 | let extractedText=""; 68 | if(this.textExtraction=="Activated"){ 69 | extractedText = config.formatTitle(ele); 70 | let minIndex= 9999999; 71 | let maxIndex= 0; 72 | 73 | ele.result.content.forEach(position => { 74 | const minTitle:number=Math.max(position[0]-titleSize,0); 75 | const maxTitle:number=Math.min(position[1]+titleSize,ele.content.length-1); 76 | const min:number=Math.max(position[0]-size,0); 77 | const max:number=Math.min(position[1]+size,ele.content.length-1); 78 | 79 | // console.log({min,max,minIndex,maxIndex}) 80 | if(!((min>=minIndex && min <= maxIndex) || (max>=minIndex && max <= maxIndex))){ 81 | minIndex=Math.min(minIndex,position[0]); 82 | maxIndex=Math.max(maxIndex,position[1]); 83 | 84 | extractedText+=config.formatResults(ele.content,minTitle,maxTitle); 85 | //console.log(ele.content.substring(min,max)); 86 | extractedText+=config.formatContent(ele.content,min,max); 87 | } 88 | }); 89 | } 90 | 91 | 92 | 93 | 94 | return extractedText; 95 | }).join('\n') 96 | 97 | } 98 | 99 | function getLastLineNum(doc: CodeMirror.Doc, line = 0): number { 100 | const lineNum = line === 0 101 | ? doc.getCursor().line 102 | : line 103 | 104 | if (doc.lineCount() === lineNum) { 105 | return doc.getCursor().line + 1 106 | } 107 | 108 | return doc.getLine(lineNum) === '---' 109 | ? lineNum 110 | : getLastLineNum(doc, lineNum + 1) 111 | } 112 | 113 | const initExpander = (config:Config)=> { 114 | // Search files 115 | let cmDoc = null as CodeMirror.Doc || null 116 | // @ts-ignore 117 | const globalSearchFn = this.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(this) 118 | 119 | 120 | const search = (query: string) => globalSearchFn(inlineLog(query)) 121 | 122 | const getFoundFilenames = (config:Config, callback: (s: string) => any,size:number) => { 123 | const searchLeaf = this.app.workspace.getLeavesOfType('search')[0] 124 | console.log("searchLeaf",searchLeaf); 125 | searchLeaf.open(searchLeaf.view) 126 | .then((view: View) => setTimeout(() => { 127 | // Using undocumented feature 128 | // @ts-ignore 129 | const result = reformatLinks(view.dom.resultDoms, config,size) 130 | callback(result) 131 | config.postResults(); 132 | }, this.delay)) 133 | } 134 | 135 | const currentView = this.app.workspace.activeLeaf.view 136 | 137 | if (currentView instanceof MarkdownView) { 138 | cmDoc = currentView.sourceMode.cmEditor 139 | } 140 | 141 | const hasFormulaRegexp = /^\{\{.+\}\}.*/ 142 | const curNum = cmDoc.getCursor().line 143 | const curText = cmDoc.getLine(curNum) 144 | if (!hasFormulaRegexp.test(curText)) { 145 | return 146 | } 147 | const isEmbed = cmDoc.getLine(curNum - 1) === '```expander' 148 | && cmDoc.getLine(curNum + 1) === '```' 149 | 150 | const fstLineNumToReplace = isEmbed 151 | ? curNum - 1 152 | : curNum 153 | const lstLineNumToReplace = isEmbed 154 | ? getLastLineNum(cmDoc) 155 | : curNum 156 | 157 | let searchQuery = curText.replace('{{', '').replace('}}', '') 158 | let size = this.defaultSize; 159 | if(searchQuery.indexOf("/") !== -1) { 160 | size = +searchQuery.split("/")[1]; 161 | searchQuery = searchQuery.split("/")[0]; 162 | } 163 | 164 | const embedFormula = '```expander\n' + 165 | '{{' + searchQuery + '}}\n' + 166 | '```\n' 167 | 168 | const replaceLine = (content: string) => cmDoc.replaceRange(embedFormula + content + '\n\n', 169 | {line: fstLineNumToReplace, ch: 0}, 170 | {line: lstLineNumToReplace, ch: cmDoc.getLine(lstLineNumToReplace).length} 171 | ) 172 | 173 | search(inlineLog(searchQuery)); 174 | getFoundFilenames(config, replaceLine,size); 175 | 176 | } 177 | 178 | config.forEach(e => { 179 | this.addCommand({ 180 | id: e.id, 181 | name: e.name, 182 | callback: () => initExpander(e), 183 | hotkeys: [] 184 | }) 185 | }) 186 | } 187 | 188 | onunload() { 189 | console.log('unloading plugin'); 190 | } 191 | } 192 | 193 | class SettingTab extends PluginSettingTab { 194 | plugin: SearchPP 195 | 196 | constructor(app: App, plugin: SearchPP) { 197 | super(app, plugin); 198 | 199 | this.app = app 200 | this.plugin = plugin 201 | } 202 | 203 | display(): void { 204 | let {containerEl} = this; 205 | 206 | containerEl.empty(); 207 | 208 | containerEl.createEl('h2', {text: 'Settings for Search++'}); 209 | 210 | new Setting(containerEl) 211 | .setName('Delay') 212 | .setDesc('Search++ don\' wait until search completed. It waits for a delay and paste result after that.') 213 | .addSlider(slider => { 214 | slider.setLimits(1000, 10000, 1000) 215 | slider.setValue(this.plugin.delay) 216 | slider.onChange(value => this.plugin.delay = value) 217 | slider.setDynamicTooltip() 218 | }) 219 | 220 | new Setting(containerEl) 221 | .setName('Text Extraction') 222 | .setDesc('Add extracted text to the found results.') 223 | .addDropdown((cb)=>{ 224 | cb.addOption("Activated","Activated"); 225 | cb.addOption("Disabled","Disabled"); 226 | cb.setValue(this.plugin.textExtraction); 227 | cb.onChange(value => this.plugin.textExtraction = value); 228 | }) 229 | 230 | new Setting(containerEl) 231 | .setName('Default Size') 232 | .setDesc('The number of the chars to extract before and after the found text') 233 | .addText((text)=>{ 234 | text.setValue(this.plugin.defaultSize.toString()); 235 | text.onChange(value => this.plugin.defaultSize = +value); 236 | }) 237 | } 238 | } 239 | -------------------------------------------------------------------------------- /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.5" 66 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.5.tgz#e92d3b8f76583efa26c1a63a21c9d3c1143daa29" 67 | integrity sha512-H5Wn24s/ZOukBmDn03nnGTp18A60ny9AmCwnEcgJiTgSGsCO7k+NWP7zjCCbhlcnVCoI+co52dUAt9GMhOSULw== 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.32.1" 244 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.32.1.tgz#625a92c54f5b4d28ada12d618641491d4dbb548c" 245 | integrity sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw== 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 | --------------------------------------------------------------------------------