├── .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 |
4 |
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 | 
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 | 
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 | 
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 | 
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 | 
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 | 
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 | [
](https://paypal.me/NicoNekoru)
147 | [
](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 |
--------------------------------------------------------------------------------