├── .npmrc ├── .eslintignore ├── assets ├── renderedCustomCSS.png ├── renderedMergedCells.png ├── renderedCellCustomCSS.png ├── renderedTableCustomCSS.png ├── renderedHeaderCustomCSS.png └── renderedVerticalHeaders.png ├── .editorconfig ├── scripts └── pack.ps1 ├── manifest.json ├── .gitignore ├── versions.json ├── tsconfig.json ├── src ├── metaParser.ts ├── settings.ts ├── main.ts └── sheetElement.ts ├── package.json ├── .eslintrc.js ├── styles.css ├── esbuild.config.mjs ├── version-bump.mjs ├── README.md ├── LICENSE └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | 3 | main.js 4 | -------------------------------------------------------------------------------- /assets/renderedCustomCSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedCustomCSS.png -------------------------------------------------------------------------------- /assets/renderedMergedCells.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedMergedCells.png -------------------------------------------------------------------------------- /assets/renderedCellCustomCSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedCellCustomCSS.png -------------------------------------------------------------------------------- /assets/renderedTableCustomCSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedTableCustomCSS.png -------------------------------------------------------------------------------- /assets/renderedHeaderCustomCSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedHeaderCustomCSS.png -------------------------------------------------------------------------------- /assets/renderedVerticalHeaders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NicoNekoru/obsidan-advanced-table-xt/HEAD/assets/renderedVerticalHeaders.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = crlf 7 | insert_final_newline = true 8 | indent_style = tab 9 | indent_size = 4 10 | tab_width = 4 11 | -------------------------------------------------------------------------------- /scripts/pack.ps1: -------------------------------------------------------------------------------- 1 | Set-Location "$PSScriptRoot/.." 2 | if (-not (Test-Path 'dist' -PathType Container)) { New-Item 'dist' -ItemType Directory } 3 | Compress-Archive -Path 'manifest.json', 'main.js', 'styles.css' -DestinationPath './dist/dist.zip' -Force -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "sheets", 3 | "name": "Sheets Extended", 4 | "version": "1.2.10", 5 | "minAppVersion": "1.5.0", 6 | "description": "Vertical headers, merged cells, and custom css tables with advanced table compatibility", 7 | "author": "NicoNekoru", 8 | "authorUrl": "https://github.com/NicoNekoru", 9 | "fundingUrl": "https://www.buymeacoffee.com/niconekoru", 10 | "isDesktopOnly": false 11 | } -------------------------------------------------------------------------------- /.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 | dist 25 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "0.15.0", 3 | "1.0.1": "0.15.0", 4 | "1.0.2": "0.15.0", 5 | "1.0.3": "0.15.0", 6 | "1.0.4": "0.15.0", 7 | "1.0.5": "0.15.0", 8 | "1.1.0": "0.15.0", 9 | "1.1.1": "0.15.0", 10 | "1.1.2": "0.15.0", 11 | "1.2.0": "0.15.0", 12 | "1.2.1": "0.15.0", 13 | "1.2.2": "0.15.0", 14 | "1.2.3": "0.15.0", 15 | "1.2.4": "0.15.0", 16 | "1.2.5": "0.15.0", 17 | "1.2.6": "1.5.0", 18 | "1.2.7": "1.5.0", 19 | "1.2.8": "1.5.0", 20 | "1.2.9": "1.5.0", 21 | "1.2.10": "1.5.0" 22 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./src/", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "allowUnusedLabels": true, 15 | "lib": ["DOM", "ES5", "ES6", "ES7"], 16 | "jsx": "react" 17 | }, 18 | "include": ["**/*.ts", "src/main.ts"] 19 | } 20 | -------------------------------------------------------------------------------- /src/metaParser.ts: -------------------------------------------------------------------------------- 1 | import { ObsidianSpreadsheet } from 'main'; 2 | import { 3 | App, 4 | MarkdownPostProcessorContext, 5 | MarkdownRenderChild, 6 | MarkdownView, 7 | } from 'obsidian'; 8 | import * as JSON5 from 'json5'; 9 | import { ISheetMetaData } from 'sheetElement'; 10 | 11 | export class MetaParser extends MarkdownRenderChild 12 | { 13 | constructor( 14 | private readonly el: HTMLElement, 15 | private readonly source: string, 16 | private readonly ctx: MarkdownPostProcessorContext, 17 | private readonly app: App, 18 | private readonly plugin: ObsidianSpreadsheet, 19 | ) 20 | { 21 | super(el); 22 | } 23 | 24 | onload(): void 25 | { 26 | this.el.id = 'sheet-metadata'; 27 | JSON5.parse(this.source) as ISheetMetaData; 28 | } 29 | 30 | onunload(): void 31 | { 32 | 33 | } 34 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-sample-plugin", 3 | "version": "1.0.0", 4 | "description": "This is a sample plugin for Obsidian (https://obsidian.md)", 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 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@types/node": "^16.18.52", 16 | "@types/showdown": "^2.0.1", 17 | "@typescript-eslint/eslint-plugin": "6.3.0", 18 | "@typescript-eslint/parser": "6.3.0", 19 | "builtin-modules": "3.3.0", 20 | "csstype": "^3.1.2", 21 | "esbuild": "0.17.3", 22 | "eslint": "^8.49.0", 23 | "obsidian": "^1.4.11", 24 | "tslib": "2.4.0", 25 | "typescript": "4.7.4" 26 | }, 27 | "dependencies": { 28 | "json5": "^2.2.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'env': { 3 | 'browser': true, 4 | 'es2021': true 5 | }, 6 | 'extends': [ 7 | 'eslint:recommended', 8 | 'plugin:@typescript-eslint/recommended' 9 | ], 10 | 'overrides': [ 11 | { 12 | 'env': { 13 | 'node': true 14 | }, 15 | 'files': [ 16 | '.eslintrc.{js,cjs}' 17 | ], 18 | 'parserOptions': { 19 | 'sourceType': 'script' 20 | } 21 | } 22 | ], 23 | 'parser': '@typescript-eslint/parser', 24 | 'parserOptions': { 25 | 'ecmaVersion': 'latest', 26 | 'sourceType': 'module' 27 | }, 28 | 'plugins': [ 29 | '@typescript-eslint' 30 | ], 31 | 'rules': { 32 | 'indent': [ 33 | 'error', 34 | 'tab', 35 | { 'SwitchCase': 1 } 36 | ], 37 | 'linebreak-style': [ 38 | 'error', 39 | 'windows' 40 | ], 41 | 'quotes': [ 42 | 'error', 43 | 'single' 44 | ], 45 | 'semi': [ 46 | 'error', 47 | 'always' 48 | ], 49 | } 50 | }; 51 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | This CSS file will be included with your plugin, and 4 | available in the app when your plugin is enabled. 5 | 6 | If your plugin does not need CSS, delete this file. 7 | 8 | */ 9 | 10 | .obs-sheets_error { 11 | color: rgb(255, 100, 100); 12 | background-color: rgba(240, 128, 128, 20%); 13 | text-rendering: optimizeLegibility; 14 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 15 | color-scheme: dark; 16 | -webkit-user-select: text; 17 | white-space: break-spaces; 18 | word-break: break-word; 19 | overflow-wrap: anywhere; 20 | -webkit-user-modify: read-write-plaintext-only; 21 | tab-size: 4; 22 | box-sizing: border-box; 23 | font-size: var(--code-size); 24 | font-family: var(--font-monospace); 25 | clear: left; 26 | left: 0; 27 | right: 0; 28 | margin: 0 !important; 29 | display: block; 30 | position: relative; 31 | padding: 0; 32 | max-width: var(--file-line-width); 33 | padding-left: var(--size-4-4); 34 | text-align: center; 35 | } -------------------------------------------------------------------------------- /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 | const context = await esbuild.context({ 15 | banner: { 16 | js: banner, 17 | }, 18 | entryPoints: ['src/main.ts'], 19 | bundle: true, 20 | external: [ 21 | 'obsidian', 22 | 'electron', 23 | '@codemirror/autocomplete', 24 | '@codemirror/collab', 25 | '@codemirror/commands', 26 | '@codemirror/language', 27 | '@codemirror/lint', 28 | '@codemirror/search', 29 | '@codemirror/state', 30 | '@codemirror/view', 31 | '@lezer/common', 32 | '@lezer/highlight', 33 | '@lezer/lr', 34 | ...builtins], 35 | format: 'cjs', 36 | target: 'es2018', 37 | logLevel: 'info', 38 | sourcemap: prod ? false : 'inline', 39 | treeShaking: true, 40 | outfile: './main.js', 41 | }); 42 | 43 | if (prod) 44 | { 45 | await context.rebuild(); 46 | process.exit(0); 47 | } 48 | else await context.watch(); -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from 'fs'; 2 | import { execSync } from 'child_process'; 3 | 4 | let manifest = JSON.parse(readFileSync('manifest.json', 'utf8')); 5 | const { minAppVersion, version } = manifest; 6 | 7 | let targetVersion; 8 | 9 | // eslint-disable-next-line no-undef 10 | switch (process.argv[2]) 11 | { 12 | case '--major': 13 | targetVersion = version.replace(/(\d+)\.\d+\.\d+/, (version, major) => `${Number(major) + 1}.0.0`); 14 | break; 15 | case '--minor': 16 | targetVersion = version.replace(/(\d+)\.(\d+)\.\d+/, (version, major, minor) => `${major}.${Number(minor) + 1}.0`); 17 | break; 18 | default: 19 | targetVersion = version.replace(/(\d+)\.(\d+)\.(\d+)/, (version, major, minor, patch) => `${major}.${minor}.${Number(patch) + 1}`); 20 | } 21 | 22 | manifest.version = targetVersion; 23 | writeFileSync('manifest.json', JSON.stringify(manifest, null, '\t')); 24 | 25 | let versions = JSON.parse(readFileSync('versions.json', 'utf8')); 26 | versions[targetVersion] = minAppVersion; 27 | writeFileSync('versions.json', JSON.stringify(versions, null, '\t')); 28 | 29 | console.log('building'); 30 | execSync(String.raw`pnpm run build`); 31 | console.log('updating git'); 32 | execSync(String.raw`git commit -am 'version bump'; git push`, { 'shell': 'powershell.exe' }); 33 | execSync(String.raw`gh release create ${targetVersion} .\main.js .\styles.css .\manifest.json --generate-notes`); -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import { PluginSettingTab, Setting, App, MarkdownView } from 'obsidian'; 2 | import { ObsidianSpreadsheet } from './main'; 3 | 4 | export class SheetSettingsTab extends PluginSettingTab 5 | { 6 | plugin: ObsidianSpreadsheet; 7 | 8 | constructor(app: App, plugin: ObsidianSpreadsheet) 9 | { 10 | super(app, plugin); 11 | this.plugin = plugin; 12 | } 13 | 14 | display(): void 15 | { 16 | const { containerEl } = this; 17 | 18 | containerEl.empty(); 19 | 20 | new Setting(containerEl) 21 | .setName('Native table post processing') 22 | .setDesc('Enable this setting to use Obsidian Sheets\' renderer ') 23 | .addToggle((toggle) => 24 | toggle 25 | .setValue(this.plugin.settings.nativeProcessing) 26 | .onChange(async value => 27 | { 28 | this.plugin.settings.nativeProcessing = value; 29 | await this.plugin.saveSettings(); 30 | // @ts-expect-error workspace.activeLeaf is deprecated and the following 31 | // line is prefered but the following line does not actually work on my 32 | // machine so deprecated it is I guess 33 | this.app.workspace.activeLeaf?.rebuildView(); 34 | this.app.workspace.getActiveViewOfType(MarkdownView)?.previewMode.rerender(true); 35 | }) 36 | ); 37 | 38 | new Setting(containerEl) 39 | .setName('Use paragraphs in cells') 40 | .setDesc('Enable this setting to use paragraphs for table cells ') 41 | .addToggle((toggle) => 42 | toggle 43 | .setValue(this.plugin.settings.paragraphs) 44 | .onChange(async value => 45 | { 46 | this.plugin.settings.paragraphs = value; 47 | await this.plugin.saveSettings(); 48 | // @ts-expect-error workspace.activeLeaf is deprecated and the following 49 | // line is prefered but the following line does not actually work on my 50 | // machine so deprecated it is I guess 51 | this.app.workspace.activeLeaf?.rebuildView(); 52 | this.app.workspace.getActiveViewOfType(MarkdownView)?.previewMode.rerender(true); 53 | }) 54 | ); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Obsidian Sheets 2 | 3 | downloads 4 | Obsidian downloads 5 | 6 | 7 | This is a plugin for [Obsidian](https://obsidian.md) that brings greater functionality and usage of markdown tables. 8 | # Features 9 | - Cell Merging 10 | - Vertical Table Headings 11 | - Custom css cell styles 12 | - Advanced Tables compatibility 13 | # How to Use 14 | 15 | Create a normal markdown table and start using Obsidian Sheets features: 16 | 17 | The characters `<` and `^` in a cell will merge it with the cell to the left and above. Merged cells stack with each other, as seen below. 18 | ````md 19 | | Just | a | normal | table | 20 | | ---------------------------------- | --- | ------------ | ----- | 21 | | Use `<` to merge cells to the left | < | Merged cell! | < | 22 | | Use `^` to merge cells up | < | ^ | ^ | 23 | ```` 24 | ![Cell Merging Functionality](./assets/renderedMergedCells.png) 25 | 26 | Vertical Headers are created by making a column contain only dashes, much like how native horizontal headers are made with a row containing only dashes. 27 | ````md 28 | | I | - | have | horizontal | headers | 29 | | -------- | --- | ---- | ---------- | ------- | 30 | | also | - | foo | bar | < | 31 | | have | - | 1 | 2 | 3 | 32 | | vertical | - | A | B | C | 33 | | headers! | - | X | Y | Z | 34 | 35 | ```` 36 | ![Vertical Headers](./assets/renderedVerticalHeaders.png) 37 | 38 | And it works with Advanced Tables! 39 | 40 | Use the `sheet` language tag and start using Obsidian Sheets with custom CSS! Partition off the class names, prefixed with a `.` using a `~` as seen below and use CSS with said class names in metadata above the table. 41 | ````md 42 | ```sheet 43 | { 44 | classes: { 45 | class1: { 46 | "color": "cyan", 47 | }, 48 | class2: { 49 | backgroundColor: "#555", 50 | } 51 | }, 52 | } 53 | --- 54 | | I | - | have | meta | data | too! | 55 | | ----------------- | --- | ---- | --------------------- | ----------- | ---- | 56 | | group 1 | - | foo | bar ~ .class1 .class2 | baz | test | 57 | | group 2 ~ .class1 | - | 1 | ^ | 3 ~ .class2 | 4 | 58 | 59 | ``` 60 | ```` 61 | ![Custom CSS](./assets/renderedCustomCSS.png) 62 | 63 | Apply custom css to full rows and headers by applying custom classes to the row and column headers. Markdown table alignment with `:` is also allowed. 64 | ````md 65 | ```sheet 66 | { 67 |     classes: { 68 |         c1: { 69 |             "color": "cyan", 70 |         }, 71 |         c2: { 72 |             backgroundColor: "#555", 73 |         } 74 |     }, 75 | } 76 | 77 | --- 78 | 79 | | I           | ----   | have | meta       | data  | too! | 80 | | ----------- | ---- | -: ~ .c2 | ---------- | ----- | ---- | 81 | | group 1     | - ~.c1 | foo   | bar | baz   | test | 82 | | group 2 | ------ | 1     | ^         | 3 | 4    | 83 | 84 | ``` 85 | ```` 86 | ![Header Custom CSS](./assets/renderedHeaderCustomCSS.png) 87 | 88 | Apply custom styles to the entire table by using the custom styles/classes syntax on the metadata! 89 | ````md 90 | ```sheet 91 | 92 | { 93 |     classes: { 94 |         c1: { 95 |             "color": "cyan", 96 |         }, 97 |         c2: { 98 |             backgroundColor: "#555", 99 |         } 100 |     }, 101 | } 102 | 103 | --- ~ { color: 'red' } 104 | 105 | | I           | ----   | have | meta                  | data        | too! | 106 | | ------------| ------ | -: ~ .c2 | --------------------- | ----------- | ---- | 107 | | group 1     | ----   | ~~foo~~ | bar ~ .c1 .c2 | $baz$       | test | 108 | | group 2 | - ~.c1 | 1\. test | ^                     | 3 ~ .c2 | 4    | 109 | ``` 110 | ```` 111 | ![Table Custom CSS](./assets/renderedTableCustomCSS.png) 112 | 113 | You can also directly apply custom css to cells instead of defining a class 114 | ```md 115 | | Custom | css | cells | 116 | | ------- | ------------------------------- | ----- | 117 | | group 1 | foo ~ { "text-align": "right" } | < | 118 | ``` 119 | ![Cell Custom CSS](./assets/renderedCellCustomCSS.png) 120 | 121 | # Installation 122 | ## From within Obsidian 123 | This plugin is [now available](https://github.com/obsidianmd/obsidian-releases/pull/2281) on Obsidian community plugins under the name `Sheets Extended`. 124 | 125 | Go to `Settings -> Community plugins -> Browse`, search for `Sheets Extended`, click `install` then `enable`. 126 | 127 | ## Manual 128 | 1. Download `main.js`, `styles.css`, and `mainfest.json` from [releases](https://github.com/NicoNekoru/obsidan-advanced-table-xt/releases) 129 | 2. Place the installed files in `/.obsidian/plugins/sheets` 130 | 3. Reload Obsidian (Open command palette and `Reload without saving`) 131 | 4. Go to `Settings -> Options -> Community Plugins` and disable safe mode 132 | 5. Enable the plugin `Sheets Extended` under `Settings -> Options -> Community Plugins -> Installed plugins` 133 | 134 | # Future Functionality 135 | - [x] Merging Cells 136 | - [x] Vertical Headers 137 | - [x] Custom Cell Styles 138 | - [x] Custom row and column styles 139 | - [x] Inline custom styles 140 | - [x] Automatic `advanced-table`-like Formatting 141 | - [x] Custom css for `advanced-table` 142 | 143 | # Support me! 144 | Using this plugin is completely free, but if you would like to support me or think that I have contributed value to your days you can support me here: 145 | 146 | [PayPal](https://paypal.me/NicoNekoru) 147 | [BuyMeACoffee](https://www.buymeacoffee.com/niconekoru) -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | // import { MetaParser } from 'metaParser'; 2 | import { MarkdownPostProcessorContext, Plugin, htmlToMarkdown } from 'obsidian'; 3 | import { SheetSettingsTab } from './settings'; 4 | import { SheetElement } from './sheetElement'; 5 | import * as JSON5 from 'json5'; 6 | 7 | interface PluginSettings { 8 | nativeProcessing: boolean; 9 | paragraphs: boolean; 10 | } 11 | 12 | const DEFAULT_SETTINGS: PluginSettings = { 13 | nativeProcessing: true, 14 | paragraphs: true, 15 | }; 16 | 17 | export class ObsidianSpreadsheet extends Plugin { 18 | settings: PluginSettings; 19 | 20 | async onload() { 21 | this.loadSettings(); 22 | this.registerMarkdownCodeBlockProcessor( 23 | 'sheet', 24 | async ( 25 | source: string, 26 | el: HTMLTableElement, 27 | ctx: MarkdownPostProcessorContext 28 | ) => { 29 | source = source.trim(); 30 | ctx.addChild( 31 | new SheetElement( 32 | el, 33 | source, 34 | ctx, 35 | this.app, 36 | this 37 | ) 38 | ); 39 | } 40 | ); 41 | 42 | // this.registerMarkdownCodeBlockProcessor( 43 | // 'sheet_meta', 44 | // async ( 45 | // source: string, 46 | // el, 47 | // ctx 48 | // ) => 49 | // { 50 | // ctx.addChild(new MetaParser(el, source, ctx, this.app, this)); 51 | // } 52 | // ); 53 | 54 | this.registerMarkdownPostProcessor(async (el, ctx) => 55 | { 56 | if (!this.settings.nativeProcessing) return; 57 | if (ctx.frontmatter?.['disable-sheet'] === true) return; 58 | 59 | const tableEls = el.querySelectorAll('table'); 60 | if (tableEls.length) { 61 | 62 | for (const tableEl of Array.from(tableEls)) 63 | { 64 | if (!tableEl) return; 65 | if (tableEl?.id === 'obsidian-sheets-parsed') return; 66 | 67 | const sec = ctx.getSectionInfo(tableEl); 68 | let source: string = ''; 69 | if (!sec) 70 | { 71 | tableEl.querySelectorAll(':scope td').forEach(({ childNodes }) => childNodes.forEach(node => 72 | { 73 | if (node.nodeType == 3) // Text node type 74 | node.textContent = node.textContent?.replace(/[*_`[\]$()]|[~=]{2}/g, '\\$&') || ''; 75 | // See https://help.obsidian.md/Editing+and+formatting/Basic+formatting+syntax#Styling+text 76 | })); 77 | tableEl.querySelectorAll(':scope a.internal-link').forEach((link: HTMLAnchorElement) => 78 | { 79 | const parsedLink = document.createElement('span'); 80 | parsedLink.innerText = `[[${link.getAttr('href')}|${link.innerText}]]`; 81 | link.replaceWith(parsedLink); 82 | }); 83 | tableEl.querySelectorAll(':scope span.math').forEach((link: HTMLSpanElement) => 84 | link.textContent?.trim().length ? link.textContent = `$${link.textContent || ''}$` : null 85 | ); 86 | 87 | source = htmlToMarkdown(tableEl).trim().replace(/\\\\/g, '$&$&'); 88 | if (!source) return; 89 | } 90 | else 91 | { 92 | const {text, lineStart, lineEnd} = sec; 93 | let textContent = text 94 | .split('\n') 95 | .slice(lineStart, 1 + lineEnd) 96 | .map(line => line.replace(/^.*?(?=\|(?![^[]*]))/, '')); 97 | const endIndex = textContent.findIndex(line => /^(?!\|)/.test(line)); 98 | 99 | if (textContent[0].startsWith('```')) return; 100 | if (endIndex !== -1) textContent = textContent.slice(0, endIndex + 1); 101 | 102 | if ( 103 | !textContent 104 | .filter((row) => /(? row.split(/(? cell.trim())) 107 | .every( 108 | (row) => !row.pop()?.trim() && !row.shift()?.trim() 109 | ) 110 | ) return; // Need a better way to figure out if not randering a table; use test for validity on actual table function here since if get to here table is valid. 111 | source = textContent.join('\n'); 112 | } 113 | 114 | tableEl.empty(); 115 | ctx.addChild(new SheetElement(tableEl, source.trim(), ctx, this.app, this)); 116 | } 117 | return; 118 | } 119 | const tableEl = el.closest('table'); 120 | if (!tableEl) return; 121 | if (tableEl?.id === 'obsidian-sheets-parsed') return; 122 | 123 | const rawMarkdown = 124 | ctx.getSectionInfo(tableEl)?.text || htmlToMarkdown(tableEl); 125 | const rawMarkdownArray = 126 | rawMarkdown 127 | .replace(/\n\s*\|\s*-+.*?(?=\n)/g, '') // remove newlines and heading delim 128 | .replace(/^\||\|$/gm, '') 129 | .split(/\||\n/g); 130 | const toChange = rawMarkdownArray 131 | .reduce((cum, curr, i) => { 132 | /(? m.toString()) || []; 148 | 149 | let cellStyle = {}; 150 | 151 | const inlineStyle = cellStyles.match(/\{.*\}/)?.[0] || '{}'; 152 | try { 153 | cellStyle = { ...cellStyle, ...JSON5.parse(inlineStyle) }; 154 | } 155 | catch 156 | { 157 | console.error(`Invalid cell style \`${inlineStyle}\``); 158 | } 159 | 160 | const DOMContent: HTMLTableCellElement = DOMCellArray[index].querySelector('.table-cell-wrapper') || DOMCellArray[index]; 161 | Object.assign(DOMContent.style, cellStyle); 162 | DOMContent.classList.add(...classes); 163 | DOMContent.innerText = DOMContent.innerText.split(/(? 0) { 168 | if (!DOMCellArray[index - 1].colSpan) DOMCellArray[index - 1].colSpan = 1; 169 | DOMCellArray[index - 1].colSpan += 1; 170 | // .remove() does not work - table editor renders on top and rebuilds the cell 171 | DOMCellArray[index].style.display = 'none'; 172 | delete DOMCellArray[index]; 173 | DOMCellArray[index] = DOMCellArray[index - 1]; 174 | } 175 | // merge up 176 | else if (/^\s*\^\s*$/.test(cellContent) && row > 1) { 177 | if (!DOMCellArray[index - tableWidth].rowSpan) DOMCellArray[index - 1].rowSpan = 1; 178 | DOMCellArray[index - tableWidth].rowSpan += 1; 179 | DOMCellArray[index].style.display = 'none'; 180 | delete DOMCellArray[index]; 181 | DOMCellArray[index] = DOMCellArray[index - tableWidth]; 182 | } 183 | // TODO: row headers 184 | // else if (/^\s*-+\s*$/.test(cellContent)) { 185 | // } 186 | // classes and styling 187 | } 188 | 189 | return tableEl.id = 'obsidian-sheets-parsed'; 190 | 191 | }); 192 | 193 | this.addSettingTab(new SheetSettingsTab(this.app, this)); 194 | } 195 | 196 | onunload() { 197 | // console.log('unloading spreadsheet plugin'); 198 | } 199 | 200 | async loadSettings() { 201 | this.settings = Object.assign( 202 | {}, 203 | DEFAULT_SETTINGS, 204 | await this.loadData() 205 | ); 206 | } 207 | 208 | async saveSettings() { 209 | await this.saveData(this.settings); 210 | } 211 | } 212 | 213 | export default ObsidianSpreadsheet; 214 | -------------------------------------------------------------------------------- /src/sheetElement.ts: -------------------------------------------------------------------------------- 1 | import { ObsidianSpreadsheet } from 'main'; 2 | import { 3 | App, 4 | MarkdownPostProcessorContext, 5 | MarkdownRenderChild, 6 | MarkdownRenderer, 7 | } from 'obsidian'; 8 | import type { Properties } from 'csstype'; 9 | import * as JSON5 from 'json5'; 10 | 11 | // TODO: Move these to settings 12 | const MERGE_UP_SIGNIFIER = '^', 13 | MERGE_LEFT_SIGNIFIER = '<', 14 | HEADER_DELIMETER = '-', 15 | META_DELIMETER = '---'; 16 | 17 | export interface ISheetMetaData { 18 | classes: { [key: string]: Properties }; 19 | log: boolean; 20 | } 21 | 22 | type groupStyles = { 23 | classes: string[] 24 | styles: Properties 25 | } 26 | 27 | export class SheetElement extends MarkdownRenderChild { 28 | private newLineRE: RegExp; 29 | private cellBorderRE: RegExp; 30 | private metaRE: RegExp; 31 | private headerRE: RegExp; 32 | private contentGrid: string[][]; 33 | private metadata: Partial; 34 | private styles: Record; 35 | private globalStyle: Properties = {}; 36 | private cellMaxLength = 0; 37 | private rowMaxLength = 0; 38 | private headerRow: number; 39 | private headerCol: number; 40 | private rowStyles: groupStyles[] = []; 41 | private colStyles: groupStyles[] = []; 42 | private table: HTMLTableElement; 43 | private tableHead: HTMLTableSectionElement; 44 | private tableBody: HTMLTableSectionElement; 45 | private domGrid: HTMLTableCellElement[][] = []; 46 | 47 | constructor( 48 | private readonly el: HTMLTableElement, 49 | private readonly source: string, 50 | private readonly ctx: MarkdownPostProcessorContext, 51 | private readonly app: App, 52 | private readonly plugin: ObsidianSpreadsheet, 53 | ) { 54 | super(el); 55 | // TODO: Handle settings here -> move :11-12 56 | // console.log(this); 57 | } 58 | 59 | async onload() { 60 | this.metaRE = new RegExp(String.raw`^${META_DELIMETER}\s*?(?:~(.*?))?\s*?\n+`, 'mg'); 61 | this.newLineRE = new RegExp(String.raw`\n`); 62 | this.cellBorderRE = new RegExp(String.raw`(? this.cellBorderRE.test(row)) 106 | .map((row) => row.split(this.cellBorderRE) 107 | .map(cell => cell.trim())); 108 | 109 | const [meta, unparsedStyle, source] = this.source.split(this.metaRE); 110 | 111 | this.parseMetadata(meta); 112 | 113 | if (unparsedStyle) { 114 | let cellStyle: Properties = {}; 115 | const cls = unparsedStyle.match(/\.\S+/g) || []; 116 | cls.forEach(cssClass => { 117 | cellStyle = { ...cellStyle, ...(this.styles?.[cssClass.slice(1)] || {}) }; 118 | }); 119 | 120 | const inlineStyle = unparsedStyle.match(/\{.*\}/)?.[0] || '{}'; 121 | try { 122 | cellStyle = { ...cellStyle, ...JSON5.parse(inlineStyle) }; 123 | } 124 | catch 125 | { 126 | console.error(`Invalid cell style \`${inlineStyle}\``); 127 | } 128 | 129 | this.globalStyle = cellStyle; 130 | } 131 | 132 | return this.contentGrid = source.split(this.newLineRE) 133 | .map((row) => row.split(this.cellBorderRE) 134 | .map(cell => cell.trim())); 135 | } 136 | 137 | parseMetadata(meta: string) { 138 | let metadata: Partial; 139 | 140 | try { 141 | metadata = JSON5.parse(meta); 142 | } 143 | catch (error) { 144 | return this.displayError('Metadata is not proper JSON'); 145 | } 146 | 147 | this.metadata = metadata; 148 | 149 | // Separate this out when more metadata is introduced 150 | if (metadata.classes) { 151 | this.styles = metadata.classes; 152 | } 153 | // TODO: Add logging and debugging in metadata 154 | // if (metadata.log) this.logging = true 155 | } 156 | 157 | validateInput() { 158 | if ( 159 | !this.contentGrid.every( 160 | (row) => !row.pop()?.trim() && !row.shift()?.trim() 161 | ) 162 | ) return this.displayError('Malformed table'); 163 | } 164 | 165 | normalizeGrid() { 166 | for (let rowIndex = 0; rowIndex < this.contentGrid.length; rowIndex++) { 167 | const row = this.contentGrid[rowIndex]; 168 | if (this.rowMaxLength < row.length) this.rowMaxLength = row.length; 169 | 170 | for (let colIndex = 0; colIndex < row.length; colIndex++) 171 | if (this.cellMaxLength < row[colIndex].trim().length) 172 | this.cellMaxLength = row[colIndex].trim().length; 173 | } 174 | 175 | this.contentGrid = this.contentGrid.map((line) => 176 | Array.from( 177 | { ...line, length: this.rowMaxLength }, 178 | (cell) => cell || '' 179 | ) 180 | ); 181 | } 182 | 183 | getHeaderBoundaries() { 184 | this.headerRow = this.contentGrid.findIndex( 185 | (headerRow) => 186 | headerRow.every((headerCol) => this.headerRE.test(headerCol)) 187 | ); 188 | 189 | // transpose grid 190 | this.headerCol = this.contentGrid[0].map((_, i) => 191 | this.contentGrid.map(row => row[i]) 192 | ) 193 | .findIndex( 194 | (headerCol) => 195 | headerCol.every((headerCol) => this.headerRE.test(headerCol)) 196 | ); 197 | } 198 | 199 | getHeaderStyles() { 200 | // TODO: Add same syntax of custom styling as cells 201 | if (this.headerRow !== -1) this.colStyles = this.contentGrid[this.headerRow].map(rowHead => { 202 | let styles: Properties = {}; 203 | 204 | const alignment = rowHead.match(this.headerRE); 205 | if (!alignment) return { classes: [], styles }; 206 | else if (alignment[1] && alignment[2]) styles['textAlign'] = 'center'; 207 | else if (alignment[1]) styles['textAlign'] = 'left'; 208 | else if (alignment[2]) styles['textAlign'] = 'right'; 209 | 210 | // Parse ~ 211 | const classes = alignment[3]?.match(/\.\S+/g)?.map(String) || []; 212 | classes.forEach(cssClass => 213 | styles = { 214 | ...styles, 215 | ...(this.styles?.[cssClass.slice(1)] 216 | || {} 217 | ) 218 | } 219 | ); 220 | return { classes, styles }; 221 | }); 222 | 223 | if (this.headerCol !== -1) this.rowStyles = this.contentGrid[0].map((_, i) => 224 | this.contentGrid.map(row => row[i]) 225 | )[this.headerCol].map(rowHead => { 226 | let styles: Properties = {}; 227 | 228 | const alignment = rowHead.match(this.headerRE); 229 | if (!alignment) return { classes: [], styles }; 230 | else if (alignment[1] && alignment[2]) styles['textAlign'] = 'center'; 231 | else if (alignment[1]) styles['textAlign'] = 'left'; 232 | else if (alignment[2]) styles['textAlign'] = 'right'; 233 | 234 | // Parse ~ 235 | const classes = alignment[3]?.match(/\.\S+/g)?.map(String) || []; 236 | classes.forEach(cssClass => 237 | styles = { 238 | ...styles, 239 | ...(this.styles?.[cssClass.slice(1)] 240 | || {} 241 | ) 242 | } 243 | ); 244 | return { classes, styles }; 245 | }); 246 | } 247 | 248 | buildDomTable() { 249 | for ( 250 | let rowIndex = 0; 251 | rowIndex < this.contentGrid.length; 252 | rowIndex++ 253 | ) this.buildDomRow(rowIndex); 254 | } 255 | 256 | buildDomRow(rowIndex: number) { 257 | const rowContents = this.contentGrid[rowIndex]; 258 | let rowNode = this.tableBody.createEl('tr'); 259 | 260 | if (rowIndex < this.headerRow) rowNode = this.tableHead.createEl('tr'); 261 | else if (rowIndex === this.headerRow) return; 262 | 263 | this.domGrid[rowIndex] = []; 264 | 265 | for ( 266 | let columnIndex = 0; 267 | columnIndex < rowContents.length; 268 | columnIndex++ 269 | ) this.buildDomCell(rowIndex, columnIndex, rowNode); 270 | } 271 | 272 | async buildDomCell(rowIndex: number, columnIndex: number, rowNode: HTMLElement) { 273 | const [ 274 | cellContent, 275 | cellStyles 276 | ] = this.contentGrid[rowIndex][columnIndex].split(/(? { 293 | cellStyle = { ...cellStyle, ...(this.styles?.[cssClass] || {}) }; 294 | }); 295 | 296 | const inlineStyle = cellStyles.match(/\{.*\}/)?.[0] || '{}'; 297 | try { 298 | cellStyle = { ...cellStyle, ...JSON5.parse(inlineStyle) }; 299 | } 300 | catch 301 | { 302 | console.error(`Invalid cell style \`${inlineStyle}\``); 303 | } 304 | } 305 | 306 | let cellTag: keyof HTMLElementTagNameMap = 'td'; 307 | let cell: HTMLTableCellElement; 308 | 309 | if (columnIndex === this.headerCol || rowIndex === this.headerRow) return; 310 | else if (columnIndex < this.headerCol || rowIndex < this.headerRow) cellTag = 'th'; 311 | 312 | if (cellContent == MERGE_LEFT_SIGNIFIER && this.domGrid?.[rowIndex]?.[columnIndex - 1]) { 313 | cell = this.domGrid[rowIndex][columnIndex - 1]; 314 | cell?.colSpan || Object.assign(cell, { colSpan: 1 }); 315 | cell.colSpan = columnIndex - parseInt(cell.getAttribute('col-index') || columnIndex.toString()) + 1; 316 | } 317 | else if (cellContent == MERGE_UP_SIGNIFIER && this.domGrid?.[rowIndex - 1]?.[columnIndex]) { 318 | cell = this.domGrid[rowIndex - 1][columnIndex]; 319 | cell?.rowSpan || Object.assign(cell, { rowSpan: 1 }); 320 | cell.rowSpan = rowIndex - parseInt(cell.getAttribute('row-index') || '0') + 1; 321 | } 322 | else if ( 323 | this.domGrid?.[rowIndex - 1]?.[columnIndex] && this.domGrid?.[rowIndex]?.[columnIndex - 1] && 324 | this.domGrid[rowIndex][columnIndex - 1] === this.domGrid[rowIndex - 1][columnIndex] 325 | ) cell = this.domGrid[rowIndex][columnIndex - 1]; 326 | else { 327 | // const contentCell = document.createElement('div'); 328 | // contentCell.classList.add('table-cell-wrapper'); 329 | 330 | cell = rowNode.createEl(cellTag, { cls }); 331 | cell.setAttribute('row-index', rowIndex.toString()); 332 | cell.setAttribute('col-index', columnIndex.toString()); 333 | 334 | MarkdownRenderer.render( 335 | this.app, 336 | '\u200B ' + (cellContent || '\u200B'), // Make sure markdown that requires to be at the start of a line is not rendered 337 | cell, 338 | '', 339 | this 340 | ).then(() => { 341 | cell.innerHTML = 342 | cell 343 | .children[0] 344 | .innerHTML 345 | .replace(/^\u200B /g, ''); 346 | // cell.append(contentCell); 347 | }); 348 | Object.assign(cell.style, cellStyle); 349 | } 350 | 351 | return this.domGrid[rowIndex][columnIndex] = cell; 352 | } 353 | } 354 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | json5: 9 | specifier: ^2.2.3 10 | version: 2.2.3 11 | 12 | devDependencies: 13 | '@types/node': 14 | specifier: ^16.18.52 15 | version: 16.18.52 16 | '@types/showdown': 17 | specifier: ^2.0.1 18 | version: 2.0.1 19 | '@typescript-eslint/eslint-plugin': 20 | specifier: 6.3.0 21 | version: 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.49.0)(typescript@4.7.4) 22 | '@typescript-eslint/parser': 23 | specifier: 6.3.0 24 | version: 6.3.0(eslint@8.49.0)(typescript@4.7.4) 25 | builtin-modules: 26 | specifier: 3.3.0 27 | version: 3.3.0 28 | csstype: 29 | specifier: ^3.1.2 30 | version: 3.1.2 31 | esbuild: 32 | specifier: 0.17.3 33 | version: 0.17.3 34 | eslint: 35 | specifier: ^8.49.0 36 | version: 8.49.0 37 | obsidian: 38 | specifier: ^1.4.11 39 | version: 1.4.11(@codemirror/state@6.2.1)(@codemirror/view@6.19.0) 40 | tslib: 41 | specifier: 2.4.0 42 | version: 2.4.0 43 | typescript: 44 | specifier: 4.7.4 45 | version: 4.7.4 46 | 47 | packages: 48 | 49 | /@aashutoshrathi/word-wrap@1.2.6: 50 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 51 | engines: {node: '>=0.10.0'} 52 | dev: true 53 | 54 | /@codemirror/state@6.2.1: 55 | resolution: {integrity: sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==} 56 | dev: true 57 | 58 | /@codemirror/view@6.19.0: 59 | resolution: {integrity: sha512-XqNIfW/3GaaF+T7Q1jBcRLCPm1NbrR2DBxrXacSt1FG+rNsdsNn3/azAfgpUoJ7yy4xgd8xTPa3AlL+y0lMizQ==} 60 | dependencies: 61 | '@codemirror/state': 6.2.1 62 | style-mod: 4.1.0 63 | w3c-keyname: 2.2.8 64 | dev: true 65 | 66 | /@esbuild/android-arm64@0.17.3: 67 | resolution: {integrity: sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==} 68 | engines: {node: '>=12'} 69 | cpu: [arm64] 70 | os: [android] 71 | requiresBuild: true 72 | dev: true 73 | optional: true 74 | 75 | /@esbuild/android-arm@0.17.3: 76 | resolution: {integrity: sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==} 77 | engines: {node: '>=12'} 78 | cpu: [arm] 79 | os: [android] 80 | requiresBuild: true 81 | dev: true 82 | optional: true 83 | 84 | /@esbuild/android-x64@0.17.3: 85 | resolution: {integrity: sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==} 86 | engines: {node: '>=12'} 87 | cpu: [x64] 88 | os: [android] 89 | requiresBuild: true 90 | dev: true 91 | optional: true 92 | 93 | /@esbuild/darwin-arm64@0.17.3: 94 | resolution: {integrity: sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==} 95 | engines: {node: '>=12'} 96 | cpu: [arm64] 97 | os: [darwin] 98 | requiresBuild: true 99 | dev: true 100 | optional: true 101 | 102 | /@esbuild/darwin-x64@0.17.3: 103 | resolution: {integrity: sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==} 104 | engines: {node: '>=12'} 105 | cpu: [x64] 106 | os: [darwin] 107 | requiresBuild: true 108 | dev: true 109 | optional: true 110 | 111 | /@esbuild/freebsd-arm64@0.17.3: 112 | resolution: {integrity: sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==} 113 | engines: {node: '>=12'} 114 | cpu: [arm64] 115 | os: [freebsd] 116 | requiresBuild: true 117 | dev: true 118 | optional: true 119 | 120 | /@esbuild/freebsd-x64@0.17.3: 121 | resolution: {integrity: sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==} 122 | engines: {node: '>=12'} 123 | cpu: [x64] 124 | os: [freebsd] 125 | requiresBuild: true 126 | dev: true 127 | optional: true 128 | 129 | /@esbuild/linux-arm64@0.17.3: 130 | resolution: {integrity: sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==} 131 | engines: {node: '>=12'} 132 | cpu: [arm64] 133 | os: [linux] 134 | requiresBuild: true 135 | dev: true 136 | optional: true 137 | 138 | /@esbuild/linux-arm@0.17.3: 139 | resolution: {integrity: sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==} 140 | engines: {node: '>=12'} 141 | cpu: [arm] 142 | os: [linux] 143 | requiresBuild: true 144 | dev: true 145 | optional: true 146 | 147 | /@esbuild/linux-ia32@0.17.3: 148 | resolution: {integrity: sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==} 149 | engines: {node: '>=12'} 150 | cpu: [ia32] 151 | os: [linux] 152 | requiresBuild: true 153 | dev: true 154 | optional: true 155 | 156 | /@esbuild/linux-loong64@0.17.3: 157 | resolution: {integrity: sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==} 158 | engines: {node: '>=12'} 159 | cpu: [loong64] 160 | os: [linux] 161 | requiresBuild: true 162 | dev: true 163 | optional: true 164 | 165 | /@esbuild/linux-mips64el@0.17.3: 166 | resolution: {integrity: sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==} 167 | engines: {node: '>=12'} 168 | cpu: [mips64el] 169 | os: [linux] 170 | requiresBuild: true 171 | dev: true 172 | optional: true 173 | 174 | /@esbuild/linux-ppc64@0.17.3: 175 | resolution: {integrity: sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==} 176 | engines: {node: '>=12'} 177 | cpu: [ppc64] 178 | os: [linux] 179 | requiresBuild: true 180 | dev: true 181 | optional: true 182 | 183 | /@esbuild/linux-riscv64@0.17.3: 184 | resolution: {integrity: sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==} 185 | engines: {node: '>=12'} 186 | cpu: [riscv64] 187 | os: [linux] 188 | requiresBuild: true 189 | dev: true 190 | optional: true 191 | 192 | /@esbuild/linux-s390x@0.17.3: 193 | resolution: {integrity: sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==} 194 | engines: {node: '>=12'} 195 | cpu: [s390x] 196 | os: [linux] 197 | requiresBuild: true 198 | dev: true 199 | optional: true 200 | 201 | /@esbuild/linux-x64@0.17.3: 202 | resolution: {integrity: sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==} 203 | engines: {node: '>=12'} 204 | cpu: [x64] 205 | os: [linux] 206 | requiresBuild: true 207 | dev: true 208 | optional: true 209 | 210 | /@esbuild/netbsd-x64@0.17.3: 211 | resolution: {integrity: sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==} 212 | engines: {node: '>=12'} 213 | cpu: [x64] 214 | os: [netbsd] 215 | requiresBuild: true 216 | dev: true 217 | optional: true 218 | 219 | /@esbuild/openbsd-x64@0.17.3: 220 | resolution: {integrity: sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==} 221 | engines: {node: '>=12'} 222 | cpu: [x64] 223 | os: [openbsd] 224 | requiresBuild: true 225 | dev: true 226 | optional: true 227 | 228 | /@esbuild/sunos-x64@0.17.3: 229 | resolution: {integrity: sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==} 230 | engines: {node: '>=12'} 231 | cpu: [x64] 232 | os: [sunos] 233 | requiresBuild: true 234 | dev: true 235 | optional: true 236 | 237 | /@esbuild/win32-arm64@0.17.3: 238 | resolution: {integrity: sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==} 239 | engines: {node: '>=12'} 240 | cpu: [arm64] 241 | os: [win32] 242 | requiresBuild: true 243 | dev: true 244 | optional: true 245 | 246 | /@esbuild/win32-ia32@0.17.3: 247 | resolution: {integrity: sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==} 248 | engines: {node: '>=12'} 249 | cpu: [ia32] 250 | os: [win32] 251 | requiresBuild: true 252 | dev: true 253 | optional: true 254 | 255 | /@esbuild/win32-x64@0.17.3: 256 | resolution: {integrity: sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==} 257 | engines: {node: '>=12'} 258 | cpu: [x64] 259 | os: [win32] 260 | requiresBuild: true 261 | dev: true 262 | optional: true 263 | 264 | /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): 265 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 266 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 267 | peerDependencies: 268 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 269 | dependencies: 270 | eslint: 8.49.0 271 | eslint-visitor-keys: 3.4.3 272 | dev: true 273 | 274 | /@eslint-community/regexpp@4.8.1: 275 | resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==} 276 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 277 | dev: true 278 | 279 | /@eslint/eslintrc@2.1.2: 280 | resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} 281 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 282 | dependencies: 283 | ajv: 6.12.6 284 | debug: 4.3.4 285 | espree: 9.6.1 286 | globals: 13.21.0 287 | ignore: 5.2.4 288 | import-fresh: 3.3.0 289 | js-yaml: 4.1.0 290 | minimatch: 3.1.2 291 | strip-json-comments: 3.1.1 292 | transitivePeerDependencies: 293 | - supports-color 294 | dev: true 295 | 296 | /@eslint/js@8.49.0: 297 | resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} 298 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 299 | dev: true 300 | 301 | /@humanwhocodes/config-array@0.11.11: 302 | resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} 303 | engines: {node: '>=10.10.0'} 304 | dependencies: 305 | '@humanwhocodes/object-schema': 1.2.1 306 | debug: 4.3.4 307 | minimatch: 3.1.2 308 | transitivePeerDependencies: 309 | - supports-color 310 | dev: true 311 | 312 | /@humanwhocodes/module-importer@1.0.1: 313 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 314 | engines: {node: '>=12.22'} 315 | dev: true 316 | 317 | /@humanwhocodes/object-schema@1.2.1: 318 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 319 | dev: true 320 | 321 | /@nodelib/fs.scandir@2.1.5: 322 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 323 | engines: {node: '>= 8'} 324 | dependencies: 325 | '@nodelib/fs.stat': 2.0.5 326 | run-parallel: 1.2.0 327 | dev: true 328 | 329 | /@nodelib/fs.stat@2.0.5: 330 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 331 | engines: {node: '>= 8'} 332 | dev: true 333 | 334 | /@nodelib/fs.walk@1.2.8: 335 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 336 | engines: {node: '>= 8'} 337 | dependencies: 338 | '@nodelib/fs.scandir': 2.1.5 339 | fastq: 1.15.0 340 | dev: true 341 | 342 | /@types/codemirror@5.60.8: 343 | resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} 344 | dependencies: 345 | '@types/tern': 0.23.5 346 | dev: true 347 | 348 | /@types/estree@1.0.1: 349 | resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} 350 | dev: true 351 | 352 | /@types/json-schema@7.0.13: 353 | resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} 354 | dev: true 355 | 356 | /@types/node@16.18.52: 357 | resolution: {integrity: sha512-sm2aph6cRSsTMFYFgI+RpPLunXO9ClJkpizUVdT7KmGeyfQ14xnjTMT/f3MHcfKqevXqGT6BgVFzW8wcEoDUtA==} 358 | dev: true 359 | 360 | /@types/semver@7.5.2: 361 | resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} 362 | dev: true 363 | 364 | /@types/showdown@2.0.1: 365 | resolution: {integrity: sha512-xdnAw2nFqomkaL0QdtEk0t7yz26UkaVPl4v1pYJvtE1T0fmfQEH3JaxErEhGByEAl3zUZrkNBlneuJp0WJGqEA==} 366 | dev: true 367 | 368 | /@types/tern@0.23.5: 369 | resolution: {integrity: sha512-POau56wDk3TQ0mQ0qG7XDzv96U5whSENZ9lC0htDvEH+9YUREo+J2U+apWcVRgR2UydEE70JXZo44goG+akTNQ==} 370 | dependencies: 371 | '@types/estree': 1.0.1 372 | dev: true 373 | 374 | /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.49.0)(typescript@4.7.4): 375 | resolution: {integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==} 376 | engines: {node: ^16.0.0 || >=18.0.0} 377 | peerDependencies: 378 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha 379 | eslint: ^7.0.0 || ^8.0.0 380 | typescript: '*' 381 | peerDependenciesMeta: 382 | typescript: 383 | optional: true 384 | dependencies: 385 | '@eslint-community/regexpp': 4.8.1 386 | '@typescript-eslint/parser': 6.3.0(eslint@8.49.0)(typescript@4.7.4) 387 | '@typescript-eslint/scope-manager': 6.3.0 388 | '@typescript-eslint/type-utils': 6.3.0(eslint@8.49.0)(typescript@4.7.4) 389 | '@typescript-eslint/utils': 6.3.0(eslint@8.49.0)(typescript@4.7.4) 390 | '@typescript-eslint/visitor-keys': 6.3.0 391 | debug: 4.3.4 392 | eslint: 8.49.0 393 | graphemer: 1.4.0 394 | ignore: 5.2.4 395 | natural-compare: 1.4.0 396 | natural-compare-lite: 1.4.0 397 | semver: 7.5.4 398 | ts-api-utils: 1.0.3(typescript@4.7.4) 399 | typescript: 4.7.4 400 | transitivePeerDependencies: 401 | - supports-color 402 | dev: true 403 | 404 | /@typescript-eslint/parser@6.3.0(eslint@8.49.0)(typescript@4.7.4): 405 | resolution: {integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==} 406 | engines: {node: ^16.0.0 || >=18.0.0} 407 | peerDependencies: 408 | eslint: ^7.0.0 || ^8.0.0 409 | typescript: '*' 410 | peerDependenciesMeta: 411 | typescript: 412 | optional: true 413 | dependencies: 414 | '@typescript-eslint/scope-manager': 6.3.0 415 | '@typescript-eslint/types': 6.3.0 416 | '@typescript-eslint/typescript-estree': 6.3.0(typescript@4.7.4) 417 | '@typescript-eslint/visitor-keys': 6.3.0 418 | debug: 4.3.4 419 | eslint: 8.49.0 420 | typescript: 4.7.4 421 | transitivePeerDependencies: 422 | - supports-color 423 | dev: true 424 | 425 | /@typescript-eslint/scope-manager@6.3.0: 426 | resolution: {integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==} 427 | engines: {node: ^16.0.0 || >=18.0.0} 428 | dependencies: 429 | '@typescript-eslint/types': 6.3.0 430 | '@typescript-eslint/visitor-keys': 6.3.0 431 | dev: true 432 | 433 | /@typescript-eslint/type-utils@6.3.0(eslint@8.49.0)(typescript@4.7.4): 434 | resolution: {integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==} 435 | engines: {node: ^16.0.0 || >=18.0.0} 436 | peerDependencies: 437 | eslint: ^7.0.0 || ^8.0.0 438 | typescript: '*' 439 | peerDependenciesMeta: 440 | typescript: 441 | optional: true 442 | dependencies: 443 | '@typescript-eslint/typescript-estree': 6.3.0(typescript@4.7.4) 444 | '@typescript-eslint/utils': 6.3.0(eslint@8.49.0)(typescript@4.7.4) 445 | debug: 4.3.4 446 | eslint: 8.49.0 447 | ts-api-utils: 1.0.3(typescript@4.7.4) 448 | typescript: 4.7.4 449 | transitivePeerDependencies: 450 | - supports-color 451 | dev: true 452 | 453 | /@typescript-eslint/types@6.3.0: 454 | resolution: {integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==} 455 | engines: {node: ^16.0.0 || >=18.0.0} 456 | dev: true 457 | 458 | /@typescript-eslint/typescript-estree@6.3.0(typescript@4.7.4): 459 | resolution: {integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==} 460 | engines: {node: ^16.0.0 || >=18.0.0} 461 | peerDependencies: 462 | typescript: '*' 463 | peerDependenciesMeta: 464 | typescript: 465 | optional: true 466 | dependencies: 467 | '@typescript-eslint/types': 6.3.0 468 | '@typescript-eslint/visitor-keys': 6.3.0 469 | debug: 4.3.4 470 | globby: 11.1.0 471 | is-glob: 4.0.3 472 | semver: 7.5.4 473 | ts-api-utils: 1.0.3(typescript@4.7.4) 474 | typescript: 4.7.4 475 | transitivePeerDependencies: 476 | - supports-color 477 | dev: true 478 | 479 | /@typescript-eslint/utils@6.3.0(eslint@8.49.0)(typescript@4.7.4): 480 | resolution: {integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==} 481 | engines: {node: ^16.0.0 || >=18.0.0} 482 | peerDependencies: 483 | eslint: ^7.0.0 || ^8.0.0 484 | dependencies: 485 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) 486 | '@types/json-schema': 7.0.13 487 | '@types/semver': 7.5.2 488 | '@typescript-eslint/scope-manager': 6.3.0 489 | '@typescript-eslint/types': 6.3.0 490 | '@typescript-eslint/typescript-estree': 6.3.0(typescript@4.7.4) 491 | eslint: 8.49.0 492 | semver: 7.5.4 493 | transitivePeerDependencies: 494 | - supports-color 495 | - typescript 496 | dev: true 497 | 498 | /@typescript-eslint/visitor-keys@6.3.0: 499 | resolution: {integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==} 500 | engines: {node: ^16.0.0 || >=18.0.0} 501 | dependencies: 502 | '@typescript-eslint/types': 6.3.0 503 | eslint-visitor-keys: 3.4.3 504 | dev: true 505 | 506 | /acorn-jsx@5.3.2(acorn@8.10.0): 507 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 508 | peerDependencies: 509 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 510 | dependencies: 511 | acorn: 8.10.0 512 | dev: true 513 | 514 | /acorn@8.10.0: 515 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 516 | engines: {node: '>=0.4.0'} 517 | dev: true 518 | 519 | /ajv@6.12.6: 520 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 521 | dependencies: 522 | fast-deep-equal: 3.1.3 523 | fast-json-stable-stringify: 2.1.0 524 | json-schema-traverse: 0.4.1 525 | uri-js: 4.4.1 526 | dev: true 527 | 528 | /ansi-regex@5.0.1: 529 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 530 | engines: {node: '>=8'} 531 | dev: true 532 | 533 | /ansi-styles@4.3.0: 534 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 535 | engines: {node: '>=8'} 536 | dependencies: 537 | color-convert: 2.0.1 538 | dev: true 539 | 540 | /argparse@2.0.1: 541 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 542 | dev: true 543 | 544 | /array-union@2.1.0: 545 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 546 | engines: {node: '>=8'} 547 | dev: true 548 | 549 | /balanced-match@1.0.2: 550 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 551 | dev: true 552 | 553 | /brace-expansion@1.1.11: 554 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 555 | dependencies: 556 | balanced-match: 1.0.2 557 | concat-map: 0.0.1 558 | dev: true 559 | 560 | /braces@3.0.2: 561 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 562 | engines: {node: '>=8'} 563 | dependencies: 564 | fill-range: 7.0.1 565 | dev: true 566 | 567 | /builtin-modules@3.3.0: 568 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 569 | engines: {node: '>=6'} 570 | dev: true 571 | 572 | /callsites@3.1.0: 573 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 574 | engines: {node: '>=6'} 575 | dev: true 576 | 577 | /chalk@4.1.2: 578 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 579 | engines: {node: '>=10'} 580 | dependencies: 581 | ansi-styles: 4.3.0 582 | supports-color: 7.2.0 583 | dev: true 584 | 585 | /color-convert@2.0.1: 586 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 587 | engines: {node: '>=7.0.0'} 588 | dependencies: 589 | color-name: 1.1.4 590 | dev: true 591 | 592 | /color-name@1.1.4: 593 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 594 | dev: true 595 | 596 | /concat-map@0.0.1: 597 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 598 | dev: true 599 | 600 | /cross-spawn@7.0.3: 601 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 602 | engines: {node: '>= 8'} 603 | dependencies: 604 | path-key: 3.1.1 605 | shebang-command: 2.0.0 606 | which: 2.0.2 607 | dev: true 608 | 609 | /csstype@3.1.2: 610 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 611 | dev: true 612 | 613 | /debug@4.3.4: 614 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 615 | engines: {node: '>=6.0'} 616 | peerDependencies: 617 | supports-color: '*' 618 | peerDependenciesMeta: 619 | supports-color: 620 | optional: true 621 | dependencies: 622 | ms: 2.1.2 623 | dev: true 624 | 625 | /deep-is@0.1.4: 626 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 627 | dev: true 628 | 629 | /dir-glob@3.0.1: 630 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 631 | engines: {node: '>=8'} 632 | dependencies: 633 | path-type: 4.0.0 634 | dev: true 635 | 636 | /doctrine@3.0.0: 637 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 638 | engines: {node: '>=6.0.0'} 639 | dependencies: 640 | esutils: 2.0.3 641 | dev: true 642 | 643 | /esbuild@0.17.3: 644 | resolution: {integrity: sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==} 645 | engines: {node: '>=12'} 646 | requiresBuild: true 647 | optionalDependencies: 648 | '@esbuild/android-arm': 0.17.3 649 | '@esbuild/android-arm64': 0.17.3 650 | '@esbuild/android-x64': 0.17.3 651 | '@esbuild/darwin-arm64': 0.17.3 652 | '@esbuild/darwin-x64': 0.17.3 653 | '@esbuild/freebsd-arm64': 0.17.3 654 | '@esbuild/freebsd-x64': 0.17.3 655 | '@esbuild/linux-arm': 0.17.3 656 | '@esbuild/linux-arm64': 0.17.3 657 | '@esbuild/linux-ia32': 0.17.3 658 | '@esbuild/linux-loong64': 0.17.3 659 | '@esbuild/linux-mips64el': 0.17.3 660 | '@esbuild/linux-ppc64': 0.17.3 661 | '@esbuild/linux-riscv64': 0.17.3 662 | '@esbuild/linux-s390x': 0.17.3 663 | '@esbuild/linux-x64': 0.17.3 664 | '@esbuild/netbsd-x64': 0.17.3 665 | '@esbuild/openbsd-x64': 0.17.3 666 | '@esbuild/sunos-x64': 0.17.3 667 | '@esbuild/win32-arm64': 0.17.3 668 | '@esbuild/win32-ia32': 0.17.3 669 | '@esbuild/win32-x64': 0.17.3 670 | dev: true 671 | 672 | /escape-string-regexp@4.0.0: 673 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 674 | engines: {node: '>=10'} 675 | dev: true 676 | 677 | /eslint-scope@7.2.2: 678 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 679 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 680 | dependencies: 681 | esrecurse: 4.3.0 682 | estraverse: 5.3.0 683 | dev: true 684 | 685 | /eslint-visitor-keys@3.4.3: 686 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 687 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 688 | dev: true 689 | 690 | /eslint@8.49.0: 691 | resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} 692 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 693 | dependencies: 694 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) 695 | '@eslint-community/regexpp': 4.8.1 696 | '@eslint/eslintrc': 2.1.2 697 | '@eslint/js': 8.49.0 698 | '@humanwhocodes/config-array': 0.11.11 699 | '@humanwhocodes/module-importer': 1.0.1 700 | '@nodelib/fs.walk': 1.2.8 701 | ajv: 6.12.6 702 | chalk: 4.1.2 703 | cross-spawn: 7.0.3 704 | debug: 4.3.4 705 | doctrine: 3.0.0 706 | escape-string-regexp: 4.0.0 707 | eslint-scope: 7.2.2 708 | eslint-visitor-keys: 3.4.3 709 | espree: 9.6.1 710 | esquery: 1.5.0 711 | esutils: 2.0.3 712 | fast-deep-equal: 3.1.3 713 | file-entry-cache: 6.0.1 714 | find-up: 5.0.0 715 | glob-parent: 6.0.2 716 | globals: 13.21.0 717 | graphemer: 1.4.0 718 | ignore: 5.2.4 719 | imurmurhash: 0.1.4 720 | is-glob: 4.0.3 721 | is-path-inside: 3.0.3 722 | js-yaml: 4.1.0 723 | json-stable-stringify-without-jsonify: 1.0.1 724 | levn: 0.4.1 725 | lodash.merge: 4.6.2 726 | minimatch: 3.1.2 727 | natural-compare: 1.4.0 728 | optionator: 0.9.3 729 | strip-ansi: 6.0.1 730 | text-table: 0.2.0 731 | transitivePeerDependencies: 732 | - supports-color 733 | dev: true 734 | 735 | /espree@9.6.1: 736 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 737 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 738 | dependencies: 739 | acorn: 8.10.0 740 | acorn-jsx: 5.3.2(acorn@8.10.0) 741 | eslint-visitor-keys: 3.4.3 742 | dev: true 743 | 744 | /esquery@1.5.0: 745 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 746 | engines: {node: '>=0.10'} 747 | dependencies: 748 | estraverse: 5.3.0 749 | dev: true 750 | 751 | /esrecurse@4.3.0: 752 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 753 | engines: {node: '>=4.0'} 754 | dependencies: 755 | estraverse: 5.3.0 756 | dev: true 757 | 758 | /estraverse@5.3.0: 759 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 760 | engines: {node: '>=4.0'} 761 | dev: true 762 | 763 | /esutils@2.0.3: 764 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 765 | engines: {node: '>=0.10.0'} 766 | dev: true 767 | 768 | /fast-deep-equal@3.1.3: 769 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 770 | dev: true 771 | 772 | /fast-glob@3.3.1: 773 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 774 | engines: {node: '>=8.6.0'} 775 | dependencies: 776 | '@nodelib/fs.stat': 2.0.5 777 | '@nodelib/fs.walk': 1.2.8 778 | glob-parent: 5.1.2 779 | merge2: 1.4.1 780 | micromatch: 4.0.5 781 | dev: true 782 | 783 | /fast-json-stable-stringify@2.1.0: 784 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 785 | dev: true 786 | 787 | /fast-levenshtein@2.0.6: 788 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 789 | dev: true 790 | 791 | /fastq@1.15.0: 792 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 793 | dependencies: 794 | reusify: 1.0.4 795 | dev: true 796 | 797 | /file-entry-cache@6.0.1: 798 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 799 | engines: {node: ^10.12.0 || >=12.0.0} 800 | dependencies: 801 | flat-cache: 3.1.0 802 | dev: true 803 | 804 | /fill-range@7.0.1: 805 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 806 | engines: {node: '>=8'} 807 | dependencies: 808 | to-regex-range: 5.0.1 809 | dev: true 810 | 811 | /find-up@5.0.0: 812 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 813 | engines: {node: '>=10'} 814 | dependencies: 815 | locate-path: 6.0.0 816 | path-exists: 4.0.0 817 | dev: true 818 | 819 | /flat-cache@3.1.0: 820 | resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} 821 | engines: {node: '>=12.0.0'} 822 | dependencies: 823 | flatted: 3.2.9 824 | keyv: 4.5.3 825 | rimraf: 3.0.2 826 | dev: true 827 | 828 | /flatted@3.2.9: 829 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 830 | dev: true 831 | 832 | /fs.realpath@1.0.0: 833 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 834 | dev: true 835 | 836 | /glob-parent@5.1.2: 837 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 838 | engines: {node: '>= 6'} 839 | dependencies: 840 | is-glob: 4.0.3 841 | dev: true 842 | 843 | /glob-parent@6.0.2: 844 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 845 | engines: {node: '>=10.13.0'} 846 | dependencies: 847 | is-glob: 4.0.3 848 | dev: true 849 | 850 | /glob@7.2.3: 851 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 852 | dependencies: 853 | fs.realpath: 1.0.0 854 | inflight: 1.0.6 855 | inherits: 2.0.4 856 | minimatch: 3.1.2 857 | once: 1.4.0 858 | path-is-absolute: 1.0.1 859 | dev: true 860 | 861 | /globals@13.21.0: 862 | resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} 863 | engines: {node: '>=8'} 864 | dependencies: 865 | type-fest: 0.20.2 866 | dev: true 867 | 868 | /globby@11.1.0: 869 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 870 | engines: {node: '>=10'} 871 | dependencies: 872 | array-union: 2.1.0 873 | dir-glob: 3.0.1 874 | fast-glob: 3.3.1 875 | ignore: 5.2.4 876 | merge2: 1.4.1 877 | slash: 3.0.0 878 | dev: true 879 | 880 | /graphemer@1.4.0: 881 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 882 | dev: true 883 | 884 | /has-flag@4.0.0: 885 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 886 | engines: {node: '>=8'} 887 | dev: true 888 | 889 | /ignore@5.2.4: 890 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 891 | engines: {node: '>= 4'} 892 | dev: true 893 | 894 | /import-fresh@3.3.0: 895 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 896 | engines: {node: '>=6'} 897 | dependencies: 898 | parent-module: 1.0.1 899 | resolve-from: 4.0.0 900 | dev: true 901 | 902 | /imurmurhash@0.1.4: 903 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 904 | engines: {node: '>=0.8.19'} 905 | dev: true 906 | 907 | /inflight@1.0.6: 908 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 909 | dependencies: 910 | once: 1.4.0 911 | wrappy: 1.0.2 912 | dev: true 913 | 914 | /inherits@2.0.4: 915 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 916 | dev: true 917 | 918 | /is-extglob@2.1.1: 919 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 920 | engines: {node: '>=0.10.0'} 921 | dev: true 922 | 923 | /is-glob@4.0.3: 924 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 925 | engines: {node: '>=0.10.0'} 926 | dependencies: 927 | is-extglob: 2.1.1 928 | dev: true 929 | 930 | /is-number@7.0.0: 931 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 932 | engines: {node: '>=0.12.0'} 933 | dev: true 934 | 935 | /is-path-inside@3.0.3: 936 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 937 | engines: {node: '>=8'} 938 | dev: true 939 | 940 | /isexe@2.0.0: 941 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 942 | dev: true 943 | 944 | /js-yaml@4.1.0: 945 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 946 | dependencies: 947 | argparse: 2.0.1 948 | dev: true 949 | 950 | /json-buffer@3.0.1: 951 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 952 | dev: true 953 | 954 | /json-schema-traverse@0.4.1: 955 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 956 | dev: true 957 | 958 | /json-stable-stringify-without-jsonify@1.0.1: 959 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 960 | dev: true 961 | 962 | /json5@2.2.3: 963 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 964 | engines: {node: '>=6'} 965 | dev: false 966 | 967 | /keyv@4.5.3: 968 | resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} 969 | dependencies: 970 | json-buffer: 3.0.1 971 | dev: true 972 | 973 | /levn@0.4.1: 974 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 975 | engines: {node: '>= 0.8.0'} 976 | dependencies: 977 | prelude-ls: 1.2.1 978 | type-check: 0.4.0 979 | dev: true 980 | 981 | /locate-path@6.0.0: 982 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 983 | engines: {node: '>=10'} 984 | dependencies: 985 | p-locate: 5.0.0 986 | dev: true 987 | 988 | /lodash.merge@4.6.2: 989 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 990 | dev: true 991 | 992 | /lru-cache@6.0.0: 993 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 994 | engines: {node: '>=10'} 995 | dependencies: 996 | yallist: 4.0.0 997 | dev: true 998 | 999 | /merge2@1.4.1: 1000 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1001 | engines: {node: '>= 8'} 1002 | dev: true 1003 | 1004 | /micromatch@4.0.5: 1005 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1006 | engines: {node: '>=8.6'} 1007 | dependencies: 1008 | braces: 3.0.2 1009 | picomatch: 2.3.1 1010 | dev: true 1011 | 1012 | /minimatch@3.1.2: 1013 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1014 | dependencies: 1015 | brace-expansion: 1.1.11 1016 | dev: true 1017 | 1018 | /moment@2.29.4: 1019 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 1020 | dev: true 1021 | 1022 | /ms@2.1.2: 1023 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1024 | dev: true 1025 | 1026 | /natural-compare-lite@1.4.0: 1027 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 1028 | dev: true 1029 | 1030 | /natural-compare@1.4.0: 1031 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1032 | dev: true 1033 | 1034 | /obsidian@1.4.11(@codemirror/state@6.2.1)(@codemirror/view@6.19.0): 1035 | resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==} 1036 | peerDependencies: 1037 | '@codemirror/state': ^6.0.0 1038 | '@codemirror/view': ^6.0.0 1039 | dependencies: 1040 | '@codemirror/state': 6.2.1 1041 | '@codemirror/view': 6.19.0 1042 | '@types/codemirror': 5.60.8 1043 | moment: 2.29.4 1044 | dev: true 1045 | 1046 | /once@1.4.0: 1047 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1048 | dependencies: 1049 | wrappy: 1.0.2 1050 | dev: true 1051 | 1052 | /optionator@0.9.3: 1053 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1054 | engines: {node: '>= 0.8.0'} 1055 | dependencies: 1056 | '@aashutoshrathi/word-wrap': 1.2.6 1057 | deep-is: 0.1.4 1058 | fast-levenshtein: 2.0.6 1059 | levn: 0.4.1 1060 | prelude-ls: 1.2.1 1061 | type-check: 0.4.0 1062 | dev: true 1063 | 1064 | /p-limit@3.1.0: 1065 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1066 | engines: {node: '>=10'} 1067 | dependencies: 1068 | yocto-queue: 0.1.0 1069 | dev: true 1070 | 1071 | /p-locate@5.0.0: 1072 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1073 | engines: {node: '>=10'} 1074 | dependencies: 1075 | p-limit: 3.1.0 1076 | dev: true 1077 | 1078 | /parent-module@1.0.1: 1079 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1080 | engines: {node: '>=6'} 1081 | dependencies: 1082 | callsites: 3.1.0 1083 | dev: true 1084 | 1085 | /path-exists@4.0.0: 1086 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1087 | engines: {node: '>=8'} 1088 | dev: true 1089 | 1090 | /path-is-absolute@1.0.1: 1091 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1092 | engines: {node: '>=0.10.0'} 1093 | dev: true 1094 | 1095 | /path-key@3.1.1: 1096 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1097 | engines: {node: '>=8'} 1098 | dev: true 1099 | 1100 | /path-type@4.0.0: 1101 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1102 | engines: {node: '>=8'} 1103 | dev: true 1104 | 1105 | /picomatch@2.3.1: 1106 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1107 | engines: {node: '>=8.6'} 1108 | dev: true 1109 | 1110 | /prelude-ls@1.2.1: 1111 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1112 | engines: {node: '>= 0.8.0'} 1113 | dev: true 1114 | 1115 | /punycode@2.3.0: 1116 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1117 | engines: {node: '>=6'} 1118 | dev: true 1119 | 1120 | /queue-microtask@1.2.3: 1121 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1122 | dev: true 1123 | 1124 | /resolve-from@4.0.0: 1125 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1126 | engines: {node: '>=4'} 1127 | dev: true 1128 | 1129 | /reusify@1.0.4: 1130 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1131 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1132 | dev: true 1133 | 1134 | /rimraf@3.0.2: 1135 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1136 | dependencies: 1137 | glob: 7.2.3 1138 | dev: true 1139 | 1140 | /run-parallel@1.2.0: 1141 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1142 | dependencies: 1143 | queue-microtask: 1.2.3 1144 | dev: true 1145 | 1146 | /semver@7.5.4: 1147 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1148 | engines: {node: '>=10'} 1149 | dependencies: 1150 | lru-cache: 6.0.0 1151 | dev: true 1152 | 1153 | /shebang-command@2.0.0: 1154 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1155 | engines: {node: '>=8'} 1156 | dependencies: 1157 | shebang-regex: 3.0.0 1158 | dev: true 1159 | 1160 | /shebang-regex@3.0.0: 1161 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1162 | engines: {node: '>=8'} 1163 | dev: true 1164 | 1165 | /slash@3.0.0: 1166 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1167 | engines: {node: '>=8'} 1168 | dev: true 1169 | 1170 | /strip-ansi@6.0.1: 1171 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1172 | engines: {node: '>=8'} 1173 | dependencies: 1174 | ansi-regex: 5.0.1 1175 | dev: true 1176 | 1177 | /strip-json-comments@3.1.1: 1178 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1179 | engines: {node: '>=8'} 1180 | dev: true 1181 | 1182 | /style-mod@4.1.0: 1183 | resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} 1184 | dev: true 1185 | 1186 | /supports-color@7.2.0: 1187 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1188 | engines: {node: '>=8'} 1189 | dependencies: 1190 | has-flag: 4.0.0 1191 | dev: true 1192 | 1193 | /text-table@0.2.0: 1194 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1195 | dev: true 1196 | 1197 | /to-regex-range@5.0.1: 1198 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1199 | engines: {node: '>=8.0'} 1200 | dependencies: 1201 | is-number: 7.0.0 1202 | dev: true 1203 | 1204 | /ts-api-utils@1.0.3(typescript@4.7.4): 1205 | resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} 1206 | engines: {node: '>=16.13.0'} 1207 | peerDependencies: 1208 | typescript: '>=4.2.0' 1209 | dependencies: 1210 | typescript: 4.7.4 1211 | dev: true 1212 | 1213 | /tslib@2.4.0: 1214 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 1215 | dev: true 1216 | 1217 | /type-check@0.4.0: 1218 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1219 | engines: {node: '>= 0.8.0'} 1220 | dependencies: 1221 | prelude-ls: 1.2.1 1222 | dev: true 1223 | 1224 | /type-fest@0.20.2: 1225 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1226 | engines: {node: '>=10'} 1227 | dev: true 1228 | 1229 | /typescript@4.7.4: 1230 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 1231 | engines: {node: '>=4.2.0'} 1232 | dev: true 1233 | 1234 | /uri-js@4.4.1: 1235 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1236 | dependencies: 1237 | punycode: 2.3.0 1238 | dev: true 1239 | 1240 | /w3c-keyname@2.2.8: 1241 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 1242 | dev: true 1243 | 1244 | /which@2.0.2: 1245 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1246 | engines: {node: '>= 8'} 1247 | dependencies: 1248 | isexe: 2.0.0 1249 | dev: true 1250 | 1251 | /wrappy@1.0.2: 1252 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1253 | dev: true 1254 | 1255 | /yallist@4.0.0: 1256 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1257 | dev: true 1258 | 1259 | /yocto-queue@0.1.0: 1260 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1261 | engines: {node: '>=10'} 1262 | dev: true 1263 | --------------------------------------------------------------------------------