├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── esbuild.config.mjs ├── main.ts ├── manifest.json ├── package.json ├── styles.css ├── tsconfig.json ├── version-bump.mjs ├── versions.json └── yarn.lock /.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 | } -------------------------------------------------------------------------------- /.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 | 24 | .hotreload 25 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2022 Jacob Levernier 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 10 | 11 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Obsidian Boost Link Suggestions 2 | 3 | An [Obsidian](https://obsidian.md) plugin for suggesting inline links ordered by link count and manual boosts. 4 | 5 | ## Motivation 6 | 7 | Obsidian provides a built-in interface for suggesting files to link to (when typing `[[`, for example). Links in this interface are [currently based solely on search match](https://discord.com/channels/686053708261228577/716028884885307432/1053860523646656563). If some files are frequently linked to but are lower in the alphabet than other, less-frequently-linked-to files, this can lead to situations in which a higher-up file are mistakenly chosen over the more-frequently-linked-to file from the list of suggestions when writing quickly. This plugin addresses this situation by suggesting files in order of their incoming links, and further by allowing "boosting" specific files manually. 8 | 9 | ## Usage 10 | 11 | ### Linking to files 12 | 13 | While typing in a markdown note, typing `b[` will bring up a searchable suggestion interface that lists files. This is equivalent to the file-linking interface built into Obsidian core, except that it uses a modifiable sorting approach. Specifically, files are listed by: 14 | 15 | 1. How many times the file is linked to in the Obisidian vault, _plus:_ 16 | 2. A "boost" score from that file's YAML front-matter (by default, using the key "`boost`"): 17 | ```md 18 | --- 19 | aliases: 20 | - Example 1 21 | - Example 2 22 | 23 | boost: 100 24 | --- 25 | 26 | # Example file 1 27 | 28 | ... 29 | ``` 30 | 31 | Within a file, suggestions are listed by aliases in order in which they are listed in the YAML front-matter, followed by the filename. 32 | 33 | This allows "boosting" certain files such that they will always be at or near the top of the suggestions list. 34 | 35 | Boost score calculations can optionally be shown in the suggestion interface by enabling the "Show scores" setting. 36 | 37 | ## Installation 38 | 39 | ### Manually installing the plugin 40 | 41 | - Copy over `main.js`, `styles.css`, `manifest.json` to your vault `VaultFolder/.obsidian/plugins/obsidian-boost-link-suggestions/`. 42 | 43 | ### From the Community Plugins list 44 | 45 | 1. Search for "Boost Link Suggestions" in Obsidian's community plugins browser 46 | 2. Enable the plugin in your Obsidian settings (find "Boost Link Suggestions" under "Community plugins"). 47 | 3. Check the "Boost Link Suggestions" settings tab. Add one or more patterns. 48 | 49 | ## Development 50 | 51 | Clone the repository, run `yarn` to install the dependencies, and run `yarn dev` to compile the plugin and watch file changes. 52 | 53 | See https://github.com/obsidianmd/obsidian-api for Obsidian's API documentation. 54 | 55 | ## License 56 | 57 | This plugin's code and documentation is released under the [BSD 3-Clause License](./LICENSE). 58 | 59 | # Todo 60 | 61 | Automated tests are not currently included in this code for this repository. Assistance in this, particularly using the [Obsidian End-to-End testing approach](https://github.com/trashhalo/obsidian-plugin-e2e-test), is especially welcome! 62 | 63 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "process"; 3 | import builtins from 'builtin-modules' 4 | 5 | const banner = 6 | `/* 7 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 8 | if you want to view the source, please visit the github repository of this plugin 9 | */ 10 | `; 11 | 12 | const prod = (process.argv[2] === 'production'); 13 | 14 | esbuild.build({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ['main.ts'], 19 | bundle: true, 20 | external: [ 21 | 'obsidian', 22 | 'electron', 23 | '@codemirror/autocomplete', 24 | '@codemirror/closebrackets', 25 | '@codemirror/collab', 26 | '@codemirror/commands', 27 | '@codemirror/comment', 28 | '@codemirror/fold', 29 | '@codemirror/gutter', 30 | '@codemirror/highlight', 31 | '@codemirror/history', 32 | '@codemirror/language', 33 | '@codemirror/lint', 34 | '@codemirror/matchbrackets', 35 | '@codemirror/panel', 36 | '@codemirror/rangeset', 37 | '@codemirror/rectangular-selection', 38 | '@codemirror/search', 39 | '@codemirror/state', 40 | '@codemirror/stream-parser', 41 | '@codemirror/text', 42 | '@codemirror/tooltip', 43 | '@codemirror/view', 44 | ...builtins], 45 | format: 'cjs', 46 | watch: !prod, 47 | target: 'es2016', 48 | logLevel: "info", 49 | sourcemap: prod ? false : 'inline', 50 | treeShaking: true, 51 | outfile: 'main.js', 52 | }).catch(() => process.exit(1)); 53 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | App, 3 | Editor, 4 | EditorPosition, 5 | EditorSuggest, 6 | EditorSuggestContext, 7 | EditorSuggestTriggerInfo, 8 | MarkdownView, 9 | Plugin, 10 | PluginSettingTab, 11 | prepareFuzzySearch, 12 | Setting, 13 | TFile, 14 | } from "obsidian"; 15 | 16 | type SuggestionObject = { 17 | alias: string; 18 | path: string; 19 | originTFile: TFile; 20 | isAlias: boolean; 21 | extension: string; 22 | linkCount: number | null; 23 | linkCountDescription: string; 24 | }; 25 | 26 | type SavedAliasObject = { 27 | alias: string; 28 | path: string; 29 | } 30 | 31 | interface BoostLinkPluginSettings { 32 | triggerString: string; 33 | yamlFrontMatterBoostTag: string; 34 | showScores: boolean; 35 | useObsidianFuzzyMatching: boolean; 36 | saveMostRecentSelections: boolean; 37 | mostRecentSelections: SavedAliasObject[]; 38 | apiVersion: number; 39 | } 40 | 41 | const DEFAULT_SETTINGS: BoostLinkPluginSettings = { 42 | triggerString: "b[", 43 | yamlFrontMatterBoostTag: 'boost', 44 | showScores: true, 45 | useObsidianFuzzyMatching: false, 46 | saveMostRecentSelections: true, 47 | mostRecentSelections: [], 48 | apiVersion: 2, 49 | }; 50 | 51 | const deduplicateLinks = (links: SuggestionObject[]) => { 52 | return links.reduce((deduplicatedLinks, current) => { 53 | if (!deduplicatedLinks.some(x => x.alias == current.alias && x.path == current.path)) { 54 | deduplicatedLinks.push(current); 55 | } 56 | return deduplicatedLinks; 57 | }, []) 58 | } 59 | 60 | const getBoostedSuggestions = ( 61 | plugin: BoostLinkPlugin, 62 | files: TFile[], 63 | filterString?: string 64 | ) => { 65 | const searchCallback = prepareFuzzySearch(filterString); 66 | const queryWords = filterString.toLowerCase().split(/\s{1,}/); 67 | 68 | const resolvedLinks = Object.values(plugin.app.metadataCache.resolvedLinks); 69 | const backlinkCounts = getBackLinkCounts(resolvedLinks); 70 | 71 | let boostlinksGathered = files 72 | .map((file) => { 73 | const frontMatter = 74 | plugin.app.metadataCache.getFileCache(file)?.frontmatter; 75 | 76 | const boost = (frontMatter?.boost && Number.isInteger(frontMatter.boost)) ? frontMatter.boost : 0; 77 | 78 | const linkCount = backlinkCounts[file.path] || 0; 79 | 80 | const finalLinkCount = linkCount + boost; 81 | 82 | let aliases = frontMatter?.alias || frontMatter?.aliases || []; 83 | 84 | if (!Array.isArray(aliases)) { 85 | aliases = aliases != null ? [aliases] : []; 86 | } 87 | 88 | aliases = aliases.filter( 89 | (a: String) => a 90 | ); 91 | 92 | let output = [ 93 | ...(Array.isArray(aliases) ? aliases : [aliases]), 94 | file.basename, 95 | ] 96 | .map((alias: string) => { 97 | if (alias === undefined || alias === null) { 98 | return null 99 | } 100 | 101 | let componentMatchScore = null; 102 | let finalMatchScore = 0; 103 | 104 | if (plugin.settings.useObsidianFuzzyMatching) { 105 | 106 | const fuzzyMatchOutput = searchCallback(alias); 107 | 108 | if (!fuzzyMatchOutput) { 109 | return null 110 | } 111 | 112 | componentMatchScore = (-1 * Math.round(fuzzyMatchOutput.score * 100) / 100); 113 | 114 | finalMatchScore = (-1 * fuzzyMatchOutput.score) * finalLinkCount; 115 | } else { 116 | if (filterString) { 117 | const isMatch = queryWords.every((word) => { 118 | return ( 119 | alias.toLowerCase().contains(word) || file.path.toLowerCase().contains(word) 120 | ); 121 | }); 122 | 123 | if (!isMatch) { 124 | return null 125 | } 126 | 127 | finalMatchScore = linkCount + boost; 128 | } 129 | } 130 | 131 | return { 132 | alias: `${alias}`, 133 | matchScore: finalMatchScore, 134 | path: `${file.path}`, 135 | originTFile: file, 136 | isAlias: alias !== file.basename, 137 | extension: file.path.split(".").pop(), 138 | linkCount: finalLinkCount, 139 | linkCountDescription: `${Math.round(finalMatchScore * 100) / 100}: ${componentMatchScore ? 'Search score of ' + componentMatchScore + ' * ' : ''}${componentMatchScore ? '(' : ''}${linkCount} links + ${boost ? 'boost of ' + boost : 'no boost'}${componentMatchScore ? ')' : ''}` 140 | }; 141 | 142 | }) 143 | .flat(); 144 | 145 | return output; 146 | }) 147 | .filter((a) => a.length) 148 | .flat() 149 | .filter((r) => r !== undefined && r !== null) 150 | 151 | // Deduplicate the gathered links: 152 | boostlinksGathered = deduplicateLinks(boostlinksGathered); 153 | 154 | return boostlinksGathered.sort((a, b) => b.matchScore - a.matchScore); 155 | }; 156 | 157 | const renderSuggestionObject = ( 158 | suggestion: SuggestionObject, 159 | el: HTMLElement, 160 | showScores: boolean, 161 | ): void => { 162 | const suggesterEl = el.createDiv({ cls: "boostlink-suggester-el" }); 163 | if (suggestion.isAlias) { 164 | const aliasEl = suggesterEl.createSpan(); 165 | aliasEl.setText("⤿"); 166 | aliasEl.addClass("boostlink-is-alias"); 167 | } 168 | const suggestionTextEl = suggesterEl.createDiv({ 169 | cls: "boostlink-suggestion-text", 170 | }); 171 | suggestionTextEl 172 | .createDiv({ cls: "boostlink-alias" }) 173 | .setText(suggestion.alias); 174 | suggestionTextEl 175 | .createDiv({ cls: "boostlink-item" }) 176 | .setText(suggestion.path); 177 | if (showScores) { 178 | suggestionTextEl 179 | .createDiv({ cls: "boostlink-count" }) 180 | .setText(`${suggestion.linkCount !== null ? 'Score: ' : ''}${suggestion.linkCountDescription}`); 181 | } 182 | }; 183 | 184 | const getBackLinkCounts = (cachedLinkCounts: { [key: string]: number }[]) => 185 | cachedLinkCounts.reduce((result, fileLinkCounts) => { 186 | for (const key in fileLinkCounts) { 187 | result[key] = (result[key] || 0) + fileLinkCounts[key]; 188 | } 189 | return result; 190 | }, {}); 191 | 192 | 193 | export default class BoostLinkPlugin extends Plugin { 194 | settings: BoostLinkPluginSettings; 195 | 196 | async onload() { 197 | await this.loadSettings(); 198 | 199 | this.registerEditorSuggest( 200 | new BoostLinkEditorSuggester(this, this.settings) 201 | ); 202 | 203 | this.addCommand({ 204 | id: "add-file-link", 205 | icon: "link", 206 | name: "Trigger link", 207 | editorCallback: (editor: Editor, view: MarkdownView) => { 208 | editor.replaceSelection(this.settings.triggerString); 209 | }, 210 | }); 211 | 212 | // This adds a settings tab so the user can configure various aspects of the plugin 213 | this.addSettingTab(new BoostLinkSettingsTab(this.app, this)); 214 | } 215 | 216 | onunload() { } 217 | 218 | async loadSettings() { 219 | this.settings = Object.assign( 220 | {}, 221 | DEFAULT_SETTINGS, 222 | await this.loadData() 223 | ); 224 | } 225 | 226 | async saveSettings() { 227 | await this.saveData(this.settings); 228 | } 229 | } 230 | 231 | const escapeRegExp = (str: string) => { 232 | return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& = the whole matched string 233 | }; 234 | 235 | class BoostLinkEditorSuggester extends EditorSuggest<{ 236 | alias: string; 237 | path: string; 238 | }> { 239 | plugin: BoostLinkPlugin; 240 | settings: BoostLinkPluginSettings; 241 | triggerString: string; 242 | 243 | constructor(plugin: BoostLinkPlugin, settings: BoostLinkPluginSettings) { 244 | super(plugin.app); 245 | this.plugin = plugin; 246 | this.settings = settings; 247 | this.triggerString = this.plugin.settings.triggerString; 248 | } 249 | 250 | onTrigger( 251 | cursor: EditorPosition, 252 | editor: Editor, 253 | file: TFile 254 | ): EditorSuggestTriggerInfo | null { 255 | const line = editor.getLine(cursor.line); 256 | const subString = line.substring(0, cursor.ch); 257 | const match = subString 258 | .match(new RegExp(escapeRegExp(this.triggerString))) 259 | ?.first(); 260 | 261 | const triggerStringClosingBrackets = this.triggerString 262 | .match(/\[{1,}$/) 263 | ?.first(); 264 | 265 | if (match) { 266 | return { 267 | start: { 268 | ch: subString.lastIndexOf(match), 269 | line: cursor.line, 270 | }, 271 | end: { 272 | line: cursor.line, 273 | ch: 274 | triggerStringClosingBrackets && 275 | editor.getLine(cursor.line).length > cursor.ch && 276 | editor.getRange(cursor, { 277 | line: cursor.line, 278 | ch: cursor.ch + 1, 279 | }) === "]".repeat(triggerStringClosingBrackets.length) 280 | ? cursor.ch + 1 281 | : cursor.ch, 282 | }, 283 | query: subString.substring( 284 | subString.lastIndexOf(match) + this.triggerString.length, 285 | subString.length 286 | ), 287 | }; 288 | } 289 | } 290 | 291 | getSuggestions(context: EditorSuggestContext): SuggestionObject[] { 292 | if (context.query === '' && this.plugin.settings?.mostRecentSelections.length > 0) { 293 | const recentLinks = this.plugin.settings.mostRecentSelections.map(selection => { 294 | if (!selection.path || !selection.alias || !this.plugin.app.vault.adapter.exists(selection.path)) { 295 | return null 296 | } 297 | 298 | const tfile = this.plugin.app.metadataCache.getFirstLinkpathDest(selection.path, ''); 299 | if (!tfile) { 300 | return null 301 | } 302 | 303 | return { 304 | alias: `${selection.alias}`, 305 | path: `${selection.path}`, 306 | originTFile: tfile, 307 | isAlias: true, 308 | extension: selection.path.split(".").pop(), 309 | linkCount: null, 310 | linkCountDescription: `(Recently used)` 311 | }; 312 | }).filter(e => e !== null); 313 | 314 | return deduplicateLinks(recentLinks) 315 | } 316 | 317 | return getBoostedSuggestions( 318 | this.plugin, 319 | this.plugin.app.vault.getFiles(), 320 | context.query 321 | ); 322 | } 323 | 324 | renderSuggestion(suggestion: SuggestionObject, el: HTMLElement): void { 325 | renderSuggestionObject(suggestion, el, this.plugin.settings.showScores); 326 | } 327 | 328 | async selectSuggestion(suggestion: SuggestionObject): Promise { 329 | if (this.context) { 330 | const file = this.plugin.app.metadataCache.getFirstLinkpathDest( 331 | suggestion.path, 332 | suggestion.originTFile.path 333 | ); 334 | if (file) { 335 | const markdownLink = this.plugin.app.fileManager 336 | .generateMarkdownLink( 337 | file, 338 | this.context.file.path, 339 | "", 340 | suggestion.alias 341 | ) 342 | .replace(/^\!/, ""); 343 | 344 | const editor: Editor = this.context.editor as Editor; 345 | editor.replaceRange( 346 | markdownLink, 347 | this.context.start, 348 | this.context.end 349 | ); 350 | 351 | const { ch, line } = this.context.start; 352 | editor.setCursor({ line, ch: ch + markdownLink.length }); 353 | 354 | if (this.plugin?.settings.saveMostRecentSelections) { 355 | this.plugin.settings.mostRecentSelections = [{ alias: suggestion.alias, path: suggestion.path }, ...(this.plugin.settings.mostRecentSelections || []).slice(0, 10)] 356 | await this.plugin.saveSettings(); 357 | } 358 | } 359 | } 360 | } 361 | } 362 | 363 | class BoostLinkSettingsTab extends PluginSettingTab { 364 | plugin: BoostLinkPlugin; 365 | 366 | constructor(app: App, plugin: BoostLinkPlugin) { 367 | super(app, plugin); 368 | this.plugin = plugin; 369 | } 370 | 371 | display(): void { 372 | let { containerEl } = this; 373 | 374 | containerEl.empty(); 375 | 376 | containerEl.createEl("h2", { text: "Boost Link Suggestions" }); 377 | 378 | new Setting(containerEl) 379 | .setName("Trigger string") 380 | .setDesc( 381 | 'The string to trigger suggestions. Changing this setting requires reloading Obsidian. Triggering may not work if this string conflicts with an existing trigger (e.g., "[[").' 382 | ) 383 | .addText((text) => 384 | text 385 | .setValue( 386 | this.plugin.settings.triggerString || 387 | DEFAULT_SETTINGS.triggerString 388 | ) 389 | .setPlaceholder(DEFAULT_SETTINGS.triggerString) 390 | .onChange(async (value) => { 391 | this.plugin.settings.triggerString = 392 | value || DEFAULT_SETTINGS.triggerString; 393 | await this.plugin.saveSettings(); 394 | }) 395 | ); 396 | 397 | new Setting(containerEl) 398 | .setName("YAML front-matter boost tag") 399 | .setDesc( 400 | 'The YAML front-matter tag used to indicate link boost values.' 401 | ) 402 | .addText((text) => 403 | text 404 | .setValue( 405 | this.plugin.settings.yamlFrontMatterBoostTag || 406 | DEFAULT_SETTINGS.yamlFrontMatterBoostTag 407 | ) 408 | .setPlaceholder(DEFAULT_SETTINGS.yamlFrontMatterBoostTag) 409 | .onChange(async (value) => { 410 | this.plugin.settings.yamlFrontMatterBoostTag = 411 | value || DEFAULT_SETTINGS.yamlFrontMatterBoostTag; 412 | await this.plugin.saveSettings(); 413 | }) 414 | ); 415 | 416 | new Setting(containerEl) 417 | .setName("Show scores") 418 | .setDesc("Show scores when displaying suggestions.") 419 | .addToggle((toggle) => 420 | toggle 421 | .setValue(this.plugin.settings.showScores) 422 | .onChange(async (value) => { 423 | this.plugin.settings.showScores = value; 424 | await this.plugin.saveSettings(); 425 | }) 426 | ); 427 | 428 | new Setting(containerEl) 429 | .setName("Use Obsidian fuzzy matching") 430 | .setDesc("When searching for suggestions, use Obsidian's built-in fuzzy matching. (If turned off, searching is less fuzzy.)") 431 | .addToggle((toggle) => 432 | toggle 433 | .setValue(this.plugin.settings.useObsidianFuzzyMatching) 434 | .onChange(async (value) => { 435 | this.plugin.settings.useObsidianFuzzyMatching = value; 436 | await this.plugin.saveSettings(); 437 | }) 438 | ); 439 | 440 | new Setting(containerEl) 441 | .setName("Save most recent selections") 442 | .setDesc("When enabled, display the ten most recent selections first by default.") 443 | .addToggle((toggle) => 444 | toggle 445 | .setValue(this.plugin.settings.saveMostRecentSelections) 446 | .onChange(async (value) => { 447 | this.plugin.settings.saveMostRecentSelections = value; 448 | await this.plugin.saveSettings(); 449 | }) 450 | ); 451 | 452 | } 453 | } 454 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "boost-link-suggestions", 3 | "name": "Boost Link Suggestions", 4 | "version": "1.1.0", 5 | "minAppVersion": "1.0.0", 6 | "description": "An Obsidian (https://obsidian.md) plugin offering an llternative inline link suggester that orders results by link count and manual boosts.", 7 | "author": "Jacob Levernier", 8 | "authorUrl": "https://github.com/jglev", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "boost-link-suggestions", 3 | "version": "1.1.0", 4 | "description": "An Obsidian (https://obsidian.md) plugin offering an llternative inline link suggester that orders results by link count and manual boosts.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [ 12 | "obsidian", 13 | "links" 14 | ], 15 | "author": "Jacob Levernier", 16 | "license": "BSD-3-Clause", 17 | "devDependencies": { 18 | "@types/node": "^16.11.6", 19 | "@typescript-eslint/eslint-plugin": "^5.2.0", 20 | "@typescript-eslint/parser": "^5.2.0", 21 | "builtin-modules": "^3.2.0", 22 | "esbuild": "0.13.12", 23 | "obsidian": "0.15.0", 24 | "tslib": "2.3.1", 25 | "typescript": "4.4.4" 26 | }, 27 | "dependencies": { 28 | "@types/js-yaml": "^4.0.5", 29 | "front-matter": "^4.0.2", 30 | "js-yaml": "^4.1.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | .boostlink-suggester-el { 2 | position: relative; 3 | margin-left: 0.5em; 4 | } 5 | 6 | .boostlink-suggester-el * { 7 | display: inline-block; 8 | overflow: clip; 9 | } 10 | 11 | .suggestion { 12 | overflow-x: clip; 13 | } 14 | .boostlink-suggestion-text { 15 | margin-right: 3em; 16 | width: 100%; 17 | } 18 | 19 | .boostlink-item, 20 | .boostlink-count { 21 | font-size: 0.8em; 22 | color: var(--text-muted); 23 | } 24 | .boostlink-item { 25 | clear: left; 26 | display: block; 27 | color: var(--text-muted); 28 | width: 100%; 29 | } 30 | 31 | .boostlink-is-alias { 32 | color: var(--text-muted); 33 | font-weight: bold; 34 | /* margin-left: -1em; 35 | margin-right: 1em; 36 | */ 37 | position: absolute; 38 | right: 1em; 39 | transform: scale(1, -1); 40 | font-size: larger; 41 | } 42 | 43 | .boostlink-alias { 44 | font-size: var(--font-ui-medium); 45 | float: left; 46 | } 47 | 48 | .boostlink-count { 49 | font-style: italic; 50 | float: left; 51 | margin-right: 1em; 52 | clear: both; 53 | } 54 | 55 | .is-mobile .boostlink-is-alias { 56 | position: unset; 57 | } 58 | -------------------------------------------------------------------------------- /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 | "lib": [ 14 | "DOM", 15 | "ES5", 16 | "ES6", 17 | "ES7" 18 | ] 19 | }, 20 | "include": [ 21 | "**/*.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /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 | "0.1.0": "1.0.0", 3 | "0.1.1": "1.0.0", 4 | "0.1.2": "1.0.0", 5 | "1.0.0": "1.0.0", 6 | "1.0.1": "1.0.0", 7 | "1.0.2": "1.0.0", 8 | "1.1.0": "1.0.0" 9 | } 10 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@nodelib/fs.scandir@2.1.5": 6 | version "2.1.5" 7 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 8 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 9 | dependencies: 10 | "@nodelib/fs.stat" "2.0.5" 11 | run-parallel "^1.1.9" 12 | 13 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 14 | version "2.0.5" 15 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 16 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 17 | 18 | "@nodelib/fs.walk@^1.2.3": 19 | version "1.2.8" 20 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 21 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 22 | dependencies: 23 | "@nodelib/fs.scandir" "2.1.5" 24 | fastq "^1.6.0" 25 | 26 | "@types/codemirror@0.0.108": 27 | version "0.0.108" 28 | resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde" 29 | integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw== 30 | dependencies: 31 | "@types/tern" "*" 32 | 33 | "@types/estree@*": 34 | version "0.0.51" 35 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" 36 | integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== 37 | 38 | "@types/js-yaml@^4.0.5": 39 | version "4.0.5" 40 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" 41 | integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== 42 | 43 | "@types/json-schema@^7.0.9": 44 | version "7.0.11" 45 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 46 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 47 | 48 | "@types/node@^16.11.6": 49 | version "16.11.41" 50 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" 51 | integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== 52 | 53 | "@types/tern@*": 54 | version "0.23.4" 55 | resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" 56 | integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== 57 | dependencies: 58 | "@types/estree" "*" 59 | 60 | "@typescript-eslint/eslint-plugin@^5.2.0": 61 | version "5.28.0" 62 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.28.0.tgz#6204ac33bdd05ab27c7f77960f1023951115d403" 63 | integrity sha512-DXVU6Cg29H2M6EybqSg2A+x8DgO9TCUBRp4QEXQHJceLS7ogVDP0g3Lkg/SZCqcvkAP/RruuQqK0gdlkgmhSUA== 64 | dependencies: 65 | "@typescript-eslint/scope-manager" "5.28.0" 66 | "@typescript-eslint/type-utils" "5.28.0" 67 | "@typescript-eslint/utils" "5.28.0" 68 | debug "^4.3.4" 69 | functional-red-black-tree "^1.0.1" 70 | ignore "^5.2.0" 71 | regexpp "^3.2.0" 72 | semver "^7.3.7" 73 | tsutils "^3.21.0" 74 | 75 | "@typescript-eslint/parser@^5.2.0": 76 | version "5.28.0" 77 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.28.0.tgz#639b101cad2bfb7ae16e69710ac95c42bd4eae33" 78 | integrity sha512-ekqoNRNK1lAcKhZESN/PdpVsWbP9jtiNqzFWkp/yAUdZvJalw2heCYuqRmM5eUJSIYEkgq5sGOjq+ZqsLMjtRA== 79 | dependencies: 80 | "@typescript-eslint/scope-manager" "5.28.0" 81 | "@typescript-eslint/types" "5.28.0" 82 | "@typescript-eslint/typescript-estree" "5.28.0" 83 | debug "^4.3.4" 84 | 85 | "@typescript-eslint/scope-manager@5.28.0": 86 | version "5.28.0" 87 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.28.0.tgz#ef9a5c68fecde72fd2ff8a84b9c120324826c1b9" 88 | integrity sha512-LeBLTqF/he1Z+boRhSqnso6YrzcKMTQ8bO/YKEe+6+O/JGof9M0g3IJlIsqfrK/6K03MlFIlycbf1uQR1IjE+w== 89 | dependencies: 90 | "@typescript-eslint/types" "5.28.0" 91 | "@typescript-eslint/visitor-keys" "5.28.0" 92 | 93 | "@typescript-eslint/type-utils@5.28.0": 94 | version "5.28.0" 95 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.28.0.tgz#53ccc78fdcf0205ef544d843b84104c0e9c7ca8e" 96 | integrity sha512-SyKjKh4CXPglueyC6ceAFytjYWMoPHMswPQae236zqe1YbhvCVQyIawesYywGiu98L9DwrxsBN69vGIVxJ4mQQ== 97 | dependencies: 98 | "@typescript-eslint/utils" "5.28.0" 99 | debug "^4.3.4" 100 | tsutils "^3.21.0" 101 | 102 | "@typescript-eslint/types@5.28.0": 103 | version "5.28.0" 104 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.28.0.tgz#cffd9bcdce28db6daaa146e48a0be4387a6f4e9d" 105 | integrity sha512-2OOm8ZTOQxqkPbf+DAo8oc16sDlVR5owgJfKheBkxBKg1vAfw2JsSofH9+16VPlN9PWtv8Wzhklkqw3k/zCVxA== 106 | 107 | "@typescript-eslint/typescript-estree@5.28.0": 108 | version "5.28.0" 109 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.28.0.tgz#3487d158d091ca2772b285e67412ff6d9797d863" 110 | integrity sha512-9GX+GfpV+F4hdTtYc6OV9ZkyYilGXPmQpm6AThInpBmKJEyRSIjORJd1G9+bknb7OTFYL+Vd4FBJAO6T78OVqA== 111 | dependencies: 112 | "@typescript-eslint/types" "5.28.0" 113 | "@typescript-eslint/visitor-keys" "5.28.0" 114 | debug "^4.3.4" 115 | globby "^11.1.0" 116 | is-glob "^4.0.3" 117 | semver "^7.3.7" 118 | tsutils "^3.21.0" 119 | 120 | "@typescript-eslint/utils@5.28.0": 121 | version "5.28.0" 122 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.28.0.tgz#b27a136eac300a48160b36d2aad0da44a1341b99" 123 | integrity sha512-E60N5L0fjv7iPJV3UGc4EC+A3Lcj4jle9zzR0gW7vXhflO7/J29kwiTGITA2RlrmPokKiZbBy2DgaclCaEUs6g== 124 | dependencies: 125 | "@types/json-schema" "^7.0.9" 126 | "@typescript-eslint/scope-manager" "5.28.0" 127 | "@typescript-eslint/types" "5.28.0" 128 | "@typescript-eslint/typescript-estree" "5.28.0" 129 | eslint-scope "^5.1.1" 130 | eslint-utils "^3.0.0" 131 | 132 | "@typescript-eslint/visitor-keys@5.28.0": 133 | version "5.28.0" 134 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.28.0.tgz#982bb226b763c48fc1859a60de33fbf939d40a0f" 135 | integrity sha512-BtfP1vCor8cWacovzzPFOoeW4kBQxzmhxGoOpt0v1SFvG+nJ0cWaVdJk7cky1ArTcFHHKNIxyo2LLr3oNkSuXA== 136 | dependencies: 137 | "@typescript-eslint/types" "5.28.0" 138 | eslint-visitor-keys "^3.3.0" 139 | 140 | argparse@^1.0.7: 141 | version "1.0.10" 142 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 143 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 144 | dependencies: 145 | sprintf-js "~1.0.2" 146 | 147 | argparse@^2.0.1: 148 | version "2.0.1" 149 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 150 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 151 | 152 | array-union@^2.1.0: 153 | version "2.1.0" 154 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 155 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 156 | 157 | braces@^3.0.2: 158 | version "3.0.2" 159 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 160 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 161 | dependencies: 162 | fill-range "^7.0.1" 163 | 164 | builtin-modules@^3.2.0: 165 | version "3.3.0" 166 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" 167 | integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== 168 | 169 | debug@^4.3.4: 170 | version "4.3.4" 171 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 172 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 173 | dependencies: 174 | ms "2.1.2" 175 | 176 | dir-glob@^3.0.1: 177 | version "3.0.1" 178 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 179 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 180 | dependencies: 181 | path-type "^4.0.0" 182 | 183 | esbuild-android-arm64@0.13.12: 184 | version "0.13.12" 185 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz#e1f199dc05405cdc6670c00fb6c793822bf8ae4c" 186 | integrity sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw== 187 | 188 | esbuild-darwin-64@0.13.12: 189 | version "0.13.12" 190 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz#f5c59e622955c01f050e5a7ac9c1d41db714b94d" 191 | integrity sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw== 192 | 193 | esbuild-darwin-arm64@0.13.12: 194 | version "0.13.12" 195 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz#8abae74c2956a8aa568fc52c78829338c4a4b988" 196 | integrity sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ== 197 | 198 | esbuild-freebsd-64@0.13.12: 199 | version "0.13.12" 200 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz#6ad2ab8c0364ee7dd2d6e324d876a8e60ae75d12" 201 | integrity sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA== 202 | 203 | esbuild-freebsd-arm64@0.13.12: 204 | version "0.13.12" 205 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz#6f38155f4c300ac4c8adde1fde3cc6a4440a8294" 206 | integrity sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw== 207 | 208 | esbuild-linux-32@0.13.12: 209 | version "0.13.12" 210 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz#b1d15e330188a8c21de75c3f0058628a3eefade7" 211 | integrity sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ== 212 | 213 | esbuild-linux-64@0.13.12: 214 | version "0.13.12" 215 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz#25bd64b66162b02348e32d8f12e4c9ee61f1d070" 216 | integrity sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q== 217 | 218 | esbuild-linux-arm64@0.13.12: 219 | version "0.13.12" 220 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz#ba582298457cc5c9ac823a275de117620c06537f" 221 | integrity sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA== 222 | 223 | esbuild-linux-arm@0.13.12: 224 | version "0.13.12" 225 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz#6bc81c957bff22725688cc6359c29a25765be09b" 226 | integrity sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw== 227 | 228 | esbuild-linux-mips64le@0.13.12: 229 | version "0.13.12" 230 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz#ef3c4aba3e585d847cbade5945a8b4a5c62c7ce2" 231 | integrity sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g== 232 | 233 | esbuild-linux-ppc64le@0.13.12: 234 | version "0.13.12" 235 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz#a21fb64e80c38bef06122e48283990fc6db578e1" 236 | integrity sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw== 237 | 238 | esbuild-netbsd-64@0.13.12: 239 | version "0.13.12" 240 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz#1ea7fc8cfce88a20a4047b867ef184049a6641ae" 241 | integrity sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA== 242 | 243 | esbuild-openbsd-64@0.13.12: 244 | version "0.13.12" 245 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz#adde32f2f1b05dc4bd4fc544d6ea5a4379f9ca4d" 246 | integrity sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ== 247 | 248 | esbuild-sunos-64@0.13.12: 249 | version "0.13.12" 250 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz#a7ecaf52b7364fbee76dc8aa707fa3e1cff3342c" 251 | integrity sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw== 252 | 253 | esbuild-windows-32@0.13.12: 254 | version "0.13.12" 255 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz#a8756033dc905c4b7bea19be69f7ee68809f8770" 256 | integrity sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ== 257 | 258 | esbuild-windows-64@0.13.12: 259 | version "0.13.12" 260 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz#ae694aa66ca078acb8509b2da31197ed1f40f798" 261 | integrity sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ== 262 | 263 | esbuild-windows-arm64@0.13.12: 264 | version "0.13.12" 265 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz#782c5a8bd6d717ea55aaafe648f9926ca36a4a88" 266 | integrity sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ== 267 | 268 | esbuild@0.13.12: 269 | version "0.13.12" 270 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.12.tgz#9cac641594bf03cf34145258c093d743ebbde7ca" 271 | integrity sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow== 272 | optionalDependencies: 273 | esbuild-android-arm64 "0.13.12" 274 | esbuild-darwin-64 "0.13.12" 275 | esbuild-darwin-arm64 "0.13.12" 276 | esbuild-freebsd-64 "0.13.12" 277 | esbuild-freebsd-arm64 "0.13.12" 278 | esbuild-linux-32 "0.13.12" 279 | esbuild-linux-64 "0.13.12" 280 | esbuild-linux-arm "0.13.12" 281 | esbuild-linux-arm64 "0.13.12" 282 | esbuild-linux-mips64le "0.13.12" 283 | esbuild-linux-ppc64le "0.13.12" 284 | esbuild-netbsd-64 "0.13.12" 285 | esbuild-openbsd-64 "0.13.12" 286 | esbuild-sunos-64 "0.13.12" 287 | esbuild-windows-32 "0.13.12" 288 | esbuild-windows-64 "0.13.12" 289 | esbuild-windows-arm64 "0.13.12" 290 | 291 | eslint-scope@^5.1.1: 292 | version "5.1.1" 293 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 294 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 295 | dependencies: 296 | esrecurse "^4.3.0" 297 | estraverse "^4.1.1" 298 | 299 | eslint-utils@^3.0.0: 300 | version "3.0.0" 301 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 302 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 303 | dependencies: 304 | eslint-visitor-keys "^2.0.0" 305 | 306 | eslint-visitor-keys@^2.0.0: 307 | version "2.1.0" 308 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 309 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 310 | 311 | eslint-visitor-keys@^3.3.0: 312 | version "3.3.0" 313 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 314 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 315 | 316 | esprima@^4.0.0: 317 | version "4.0.1" 318 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 319 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 320 | 321 | esrecurse@^4.3.0: 322 | version "4.3.0" 323 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 324 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 325 | dependencies: 326 | estraverse "^5.2.0" 327 | 328 | estraverse@^4.1.1: 329 | version "4.3.0" 330 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 331 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 332 | 333 | estraverse@^5.2.0: 334 | version "5.3.0" 335 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 336 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 337 | 338 | fast-glob@^3.2.9: 339 | version "3.2.11" 340 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 341 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 342 | dependencies: 343 | "@nodelib/fs.stat" "^2.0.2" 344 | "@nodelib/fs.walk" "^1.2.3" 345 | glob-parent "^5.1.2" 346 | merge2 "^1.3.0" 347 | micromatch "^4.0.4" 348 | 349 | fastq@^1.6.0: 350 | version "1.13.0" 351 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 352 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 353 | dependencies: 354 | reusify "^1.0.4" 355 | 356 | fill-range@^7.0.1: 357 | version "7.0.1" 358 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 359 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 360 | dependencies: 361 | to-regex-range "^5.0.1" 362 | 363 | front-matter@^4.0.2: 364 | version "4.0.2" 365 | resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" 366 | integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== 367 | dependencies: 368 | js-yaml "^3.13.1" 369 | 370 | functional-red-black-tree@^1.0.1: 371 | version "1.0.1" 372 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 373 | integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== 374 | 375 | glob-parent@^5.1.2: 376 | version "5.1.2" 377 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 378 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 379 | dependencies: 380 | is-glob "^4.0.1" 381 | 382 | globby@^11.1.0: 383 | version "11.1.0" 384 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 385 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 386 | dependencies: 387 | array-union "^2.1.0" 388 | dir-glob "^3.0.1" 389 | fast-glob "^3.2.9" 390 | ignore "^5.2.0" 391 | merge2 "^1.4.1" 392 | slash "^3.0.0" 393 | 394 | ignore@^5.2.0: 395 | version "5.2.0" 396 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 397 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 398 | 399 | is-extglob@^2.1.1: 400 | version "2.1.1" 401 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 402 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 403 | 404 | is-glob@^4.0.1, is-glob@^4.0.3: 405 | version "4.0.3" 406 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 407 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 408 | dependencies: 409 | is-extglob "^2.1.1" 410 | 411 | is-number@^7.0.0: 412 | version "7.0.0" 413 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 414 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 415 | 416 | js-yaml@^3.13.1: 417 | version "3.14.1" 418 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 419 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 420 | dependencies: 421 | argparse "^1.0.7" 422 | esprima "^4.0.0" 423 | 424 | js-yaml@^4.1.0: 425 | version "4.1.0" 426 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 427 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 428 | dependencies: 429 | argparse "^2.0.1" 430 | 431 | lru-cache@^6.0.0: 432 | version "6.0.0" 433 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 434 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 435 | dependencies: 436 | yallist "^4.0.0" 437 | 438 | merge2@^1.3.0, merge2@^1.4.1: 439 | version "1.4.1" 440 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 441 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 442 | 443 | micromatch@^4.0.4: 444 | version "4.0.5" 445 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 446 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 447 | dependencies: 448 | braces "^3.0.2" 449 | picomatch "^2.3.1" 450 | 451 | moment@2.29.3: 452 | version "2.29.3" 453 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" 454 | integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== 455 | 456 | ms@2.1.2: 457 | version "2.1.2" 458 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 459 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 460 | 461 | obsidian@0.15.0: 462 | version "0.15.0" 463 | resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-0.15.0.tgz#ba69f5ee472988e1431389615223120d9c9be9de" 464 | integrity sha512-yzWR92kQkZm9iRsfKP8fD4rquwHMpFzdLqY/nGMdE4h1UiRJ/8wmgRrXglxsO5cjnD07En1wtZYMdiGy/Blhng== 465 | dependencies: 466 | "@types/codemirror" "0.0.108" 467 | moment "2.29.3" 468 | 469 | path-type@^4.0.0: 470 | version "4.0.0" 471 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 472 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 473 | 474 | picomatch@^2.3.1: 475 | version "2.3.1" 476 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 477 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 478 | 479 | queue-microtask@^1.2.2: 480 | version "1.2.3" 481 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 482 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 483 | 484 | regexpp@^3.2.0: 485 | version "3.2.0" 486 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 487 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 488 | 489 | reusify@^1.0.4: 490 | version "1.0.4" 491 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 492 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 493 | 494 | run-parallel@^1.1.9: 495 | version "1.2.0" 496 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 497 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 498 | dependencies: 499 | queue-microtask "^1.2.2" 500 | 501 | semver@^7.3.7: 502 | version "7.3.7" 503 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 504 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 505 | dependencies: 506 | lru-cache "^6.0.0" 507 | 508 | slash@^3.0.0: 509 | version "3.0.0" 510 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 511 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 512 | 513 | sprintf-js@~1.0.2: 514 | version "1.0.3" 515 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 516 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 517 | 518 | to-regex-range@^5.0.1: 519 | version "5.0.1" 520 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 521 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 522 | dependencies: 523 | is-number "^7.0.0" 524 | 525 | tslib@2.3.1: 526 | version "2.3.1" 527 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 528 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 529 | 530 | tslib@^1.8.1: 531 | version "1.14.1" 532 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 533 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 534 | 535 | tsutils@^3.21.0: 536 | version "3.21.0" 537 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 538 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 539 | dependencies: 540 | tslib "^1.8.1" 541 | 542 | typescript@4.4.4: 543 | version "4.4.4" 544 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" 545 | integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== 546 | 547 | yallist@^4.0.0: 548 | version "4.0.0" 549 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 550 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 551 | --------------------------------------------------------------------------------