From 7e2fd3a3a36f7e79a76a8c97e37ab0b105ddbd75 Mon Sep 17 00:00:00 2001 From: Alan Grainger Date: Thu, 7 Sep 2023 12:07:54 +0200 Subject: [PATCH] Rebuilt the codebase as a plugin --- .eslintignore | 3 + .eslintrc | 25 + .gitignore | 23 +- .hotreload | 0 .npmrc | 1 + README.md | 39 +- esbuild.config.mjs | 48 + favicon/android-chrome-192x192.png | Bin 10855 -> 0 bytes favicon/android-chrome-512x512.png | Bin 35550 -> 0 bytes favicon/apple-touch-icon.png | Bin 9820 -> 0 bytes favicon/favicon-16x16.png | Bin 545 -> 0 bytes favicon/favicon-32x32.png | Bin 1191 -> 0 bytes favicon/favicon.ico | Bin 15406 -> 0 bytes favicon/site.webmanifest | 1 - manifest.json | 11 + obsidian-share-public.js | 193 -- obsidian-share.js | 205 -- package-lock.json | 3520 ++++++++++++++++++++++++++++ package.json | 25 + src/api.ts | 42 + src/crypto.ts | 152 ++ src/main.ts | 38 + src/note.ts | 220 ++ src/settings.ts | 100 + src/template.ts | 130 + tsconfig.json | 25 + update-example.php | 21 - version-bump.mjs | 14 + versions.json | 3 + 29 files changed, 4386 insertions(+), 453 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .hotreload create mode 100644 .npmrc create mode 100644 esbuild.config.mjs delete mode 100644 favicon/android-chrome-192x192.png delete mode 100644 favicon/android-chrome-512x512.png delete mode 100644 favicon/apple-touch-icon.png delete mode 100644 favicon/favicon-16x16.png delete mode 100644 favicon/favicon-32x32.png delete mode 100644 favicon/favicon.ico delete mode 100644 favicon/site.webmanifest create mode 100644 manifest.json delete mode 100644 obsidian-share-public.js delete mode 100644 obsidian-share.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/api.ts create mode 100644 src/crypto.ts create mode 100644 src/main.ts create mode 100644 src/note.ts create mode 100644 src/settings.ts create mode 100644 src/template.ts create mode 100644 tsconfig.json delete mode 100644 update-example.php create mode 100644 version-bump.mjs create mode 100644 versions.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e019f3c --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +node_modules/ + +main.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..9ba7573 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,25 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "env": { "node": true }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "standard", + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-new": 0, + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], + "@typescript-eslint/ban-ts-comment": "off", + "no-prototype-builtins": "off", + "@typescript-eslint/no-empty-function": "off" + } + } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 847bdb3..386ac2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,22 @@ -.idea/ +# vscode +.vscode + +# Intellij +*.iml +.idea + +# npm +node_modules + +# Don't include the compiled main.js file in the repo. +# They should be uploaded to GitHub releases instead. +main.js + +# Exclude sourcemaps +*.map + +# obsidian +data.json + +# Exclude macOS Finder (System Explorer) View States +.DS_Store diff --git a/.hotreload b/.hotreload new file mode 100644 index 0000000..e69de29 diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b973752 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +tag-version-prefix="" \ No newline at end of file diff --git a/README.md b/README.md index dae079a..63ca241 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,12 @@ # Obsidian Share -There are times I want to create a public link to one of my notes, without having an entire "digital garden" through Obsidian Publish. - -Enter **Obsidian Share**. To share a page, just run a single Templater script. Templater is also optional - it's plain Javascript so you can launch it from anywhere. - -[See it live in action here](https://file.obsidianshare.com/572e1ae4a0aeadf5943862d1deaf8fe6.html), along with installation instructions and usage. - -For any feedback or issues [post those in the forum thread](https://forum.obsidian.md/t/42788/). - -You can also host your own private version, [see details here](https://file.obsidianshare.com/5d9dadb08ee4ec00323c694930722702.html). +Free, encrypted public note sharing for Obsidian. ## Features -🔹 Uploads using your current theme. - -🔹 Local and remote image support. - -🔹 Supports anything that Obsidian Preview mode does, like rendered Dataview queries and any custom CSS you might have enabled. - -🔹 Supports callouts with full styling: - -🔹 Filenames are anonymised through hashing so people can't discover your other shared notes. - -🔹 If your shared note links to another note which is also shared, that link will also function on the shared webpage. - -🔹 Frontmatter is stripped on upload to avoid leaking unwanted data. - -## Installation - -There are two options to running Obsidian Share: - -1. No setup required, just use my public share server. [See the instructions here](https://file.obsidianshare.com/572e1ae4a0aeadf5943862d1deaf8fe6.html). - -or - -2. Set up your own private server. [See the instructions here](https://file.obsidianshare.com/5d9dadb08ee4ec00323c694930722702.html). +- Uploads using your current theme. +- Local and remote image support. +- Supports anything that Obsidian Preview mode does, like rendered Dataview queries and any custom CSS you might have enabled. +- Supports callouts with full styling. +- If your shared note links to another note which is also shared, that link will also function on the public page. +- Frontmatter is stripped on upload by default to avoid leaking unwanted data. diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 0000000..b13282b --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,48 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from "builtin-modules"; + +const banner = +`/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const prod = (process.argv[2] === "production"); + +const context = await esbuild.context({ + banner: { + js: banner, + }, + entryPoints: ["main.ts"], + bundle: true, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtins], + format: "cjs", + target: "es2018", + logLevel: "info", + sourcemap: prod ? false : "inline", + treeShaking: true, + outfile: "main.js", +}); + +if (prod) { + await context.rebuild(); + process.exit(0); +} else { + await context.watch(); +} \ No newline at end of file diff --git a/favicon/android-chrome-192x192.png b/favicon/android-chrome-192x192.png deleted file mode 100644 index db0914f674b3c8b75ac125cb999bba79cd77b7dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10855 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 diff --git a/favicon/android-chrome-512x512.png b/favicon/android-chrome-512x512.png deleted file mode 100644 index 831d8664b8897857d97864178a02d84acbec5725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35550 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

9SfUyz+MxC6{Ddasb5d#jO20s_X&O1 z8DRn)NS?&vSpRhV#ctfO+vz*jL((kLhd#-n*@cVWu+asUN zFsr$np8}z-Um8dnf?5}*U*gVBaex70#q!Z=N^X9LS@L%Y`?i@<0B$f6$v*$Lo5%*Xc6jdjdp|Ju0tra2rSd3R_wa zocTZD%$w;38NYP@$J2y{&8k|XgdT4bwp$MkTpl;SLt6fjs9-Go?Q5BJ)E!3pF)+?J zGn`ux2Z}V-m?s9xPZRzua!vN$^tZWJ21cQ>4s>}El9^m4BfeHP7}dVSzRirPAp z&X~k^<2|5wKxa9I;?>1|GCaHCs~QDk^Wul7tj@t@Z27AXKlMsCZceaArF_3|>^AP; z!XbUX{OtbSoOE@tNscNz!5WpO`1%EUVx-cW9EYEu&uO2EyS!-^UjHLLk;h?~Sm)0O z7F-si5v{VM=Rq>zkM%#ZDj;qc!5Cp=MW?y2pUbthuv=W#+iVmaBp=vqx@g{|a`8LO zhddavhQZ_o)*0l4!|}ZG`a~RyH)(+{Nlx*$pyK#P9bS)Mpf|rkh__Kfnt~7W=O6KVkbE%`rPr?xs2KIpYS0Q5_T{8ui zT0v($Jl)2ZL*(~WSldW)*-0(B1UE9bkJXbYe~gK>65ctN2zB%h_nVXzCTy7f2-6xv_u?P|YAi=3Ky=eMTciWZu)63cmN>aEHizrO}k21E7;w7J1M1j2BR zdwe)zjj~N=8|%p*ACOUxJGk1MC{RDL?f2EIv7F{^qxao@3P&}`;Q9PR2lIcPwibi* ztjN3~%Ch&yIfO_}x9LA&n+qvX_id9ZRV!SktdN8;sf0sf#q*bB^Qjc9K~| zsxm~gWj&kABvXv_ASRZTor?R}f#O1U=aA2<4Kf2T$q!Fj>{vAnZk8-PYBw!ByH*v5q=A0+|w* zH|!9)XVv}8)4(R5Q1zN5e#ZyhbbJXNc9(^z6YUruscHzi^dx^<)wi*z18*|Di;IrU=Y!o(*+X&rl zIH<=!w-v;}Mi08j1Ix_JPhBtdXbpF45VOcHl@i=CDB$hrsDpP(h#deG7*CtPa3Oh# zxc)u?biuC2f{+!tL!&W1pht#@E6*FMt&Znetr%z;@F+3X!J}~Z`cZU_SA28llGTb{ z@u!w=Yma0Vk|U2cOB?Ye@nG{tISZ8Nb+#w=D~*mA4AR=^A&VeyoO)@FDZ4<&=hvXX zRakZXUOSE1>UF00&Jlu$6leXmS8h<@tg4&Il<_X;FeuYJ^)eEMY~hLc<_bJ-CP-_W~W=%U3pu+MGz zInT0nbetzn{m-!+W$dbM4Z|YI9mX1cK7u@&%=c7f_vH*CLl>H^w3DCTyjQxoS_Zw& zXeFG0mZ2L&=m{H9tLmD$U7z1xtX;8G;MQS!{}+mX*L2K3rPcK7SE-LigZ5p)@{$tQ zPb`$j!!fK_?VE5xQgw;+0N6CpB<7<{eA;%wG1IDLO#ej~s z-AgF!=gdj^ZfW;5wvta9L%Y|YzyRBfejZFj;Chc-{DozfiR>Hl8@rM?!j7^s0p7=f z9gq8f8Z{lC=LS3SgqXjwK}bKH_c1yuXjM>!$G5gcU0NiforR%yaoVLE@`O1hB$RCQ zCoYMtg5qae3J`jF6x@22_XA(_gb8H2LI1H8`8=DK`$%6pWu2V0Tg+Zq^kfxeEdJw?-e7k^`A;{tcUc+8upV2uCtnE%?Mc`gf6kL9pNkS_Lsye8B<Ikwdf%49SS1Sss3fjWF4rCAGm@zZ$SQE@w=h?0d;|TZ85#No9w>8Dk`>@ve z$*)REe6Gs#pxO0afYjZCE)roa!j_^aS*-3wB57IoutNpRF<{i|ykpIIw;I?FGIyYy ziU2C1Ah_^nl^Y~pqFkkoL)-zaPbfrY`X4n+#+pGm~pGkkW0#(g}d68MT(d#pZpyTwO6dDWoUQnyviX&SQr$5J!@^iL<|&`NMgu+_N= z1eSV}zoZ~()lrNfCzSec$vv@yAS-_BLWa5eeTPcu7W@mYvEkvpM{V$RCmzE37Q z%DL1l*xx9zDq^sK48alEYA-M2*Wm!NG!r!19TC#gcR3<+pG)mk7%g~-ESeN`GY0TU zNDAQI39k^b)6q~tw*2+)2WL?{Y92V-K_zPpQjM^ON_3Fiw1V>~WrgNwdS#E|{kl&B zi=iYR>!n7!LY(-u@itAWl}Ec4?Q4{2TKQ`vBK(cC3mRL08CI3t%?&fhQhRbov%I-^ r5qrw|3)A+*fU#X8pRxO6-5U%XHo@zWG1W#0_$M!|ELA9B`0oD$$J&tZ diff --git a/favicon/apple-touch-icon.png b/favicon/apple-touch-icon.png deleted file mode 100644 index 1c3b11cd99f87810efe778e2968c0270bc822cf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9820 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 diff --git a/favicon/favicon-32x32.png b/favicon/favicon-32x32.png deleted file mode 100644 index 69cd068f7369a79cfafbd5cdb879a1f1be1c9601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1191 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 diff --git a/favicon/site.webmanifest b/favicon/site.webmanifest deleted file mode 100644 index 45dc8a2..0000000 --- a/favicon/site.webmanifest +++ /dev/null @@ -1 +0,0 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..1c634d8 --- /dev/null +++ b/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "share-note", + "name": "Share Note", + "version": "0.1.0", + "minAppVersion": "0.15.0", + "description": "Share a note publicly with full styling. Data is stored encrypted on the server and only you have the key.", + "author": "Alan Grainger", + "authorUrl": "https://github.com/alangrainger", + "fundingUrl": "https://ko-fi.com/alan_", + "isDesktopOnly": false +} diff --git a/obsidian-share-public.js b/obsidian-share-public.js deleted file mode 100644 index 65bbf1a..0000000 --- a/obsidian-share-public.js +++ /dev/null @@ -1,193 +0,0 @@ -// Add a unique identifier for yourself. At some point in the future I might add user accounts, so it would be a good -// idea to use your email address. **This will not be sent to the server!** Privacy first. -const ACCOUNT_ID = 'A unique ID' -const YAML_FIELD = 'share' -const WIDTH = 700 -const SHOW_FOOTER = true - -/* - * Obsidian Share Public - * - * Created by Alan Grainger - * https://github.com/alangrainger/obsidian-share/ - * - * v1.2.0 - */ - -const fs = require('fs') -const leaf = app.workspace.activeLeaf -const startMode = leaf.getViewState() -const previewMode = leaf.getViewState() -previewMode.state.mode = 'preview' -leaf.setViewState(previewMode) -await new Promise(resolve => { setTimeout(() => { resolve() }, 200) }) -// Parse the current document -let content, body, previewView, css -try { - content = leaf.view.modes.preview.renderer.sections.reduce((p, c) => p + c.el.innerHTML, '') - body = document.getElementsByTagName('body')[0] - previewView = document.getElementsByClassName('markdown-preview-view markdown-rendered')[0] - css = [...document.styleSheets].map(x => { - try { return [...x.cssRules].map(x => x.cssText).join('') } - catch (e) { } - }).filter(Boolean).join('').replace(/\n/g, '') -} catch (e) { - console.log(e) - new Notice('Failed to parse current note, check console for details', 5000) -} -// Revert to the original view mode -setTimeout(() => { leaf.setViewState(startMode) }, 200) -if (!previewView) return // Failed to parse current note -const status = new Notice('Sharing note...', 60000) - -async function sha256(text) { - const encoder = new TextEncoder(); - const data = encoder.encode(text) - const hash = await crypto.subtle.digest('SHA-256', data) - return Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, '0')).join('') -} -const getHash = async (path) => { return (await sha256(path)).slice(0, 32) } -const id = await getHash(ACCOUNT_ID) - -function updateFrontmatter(contents, field, value) { - const f = contents.match(/^---\r?\n(.*?)\n---\r?\n(.*)$/s), - v = `${field}: ${value}`, - x = new RegExp(`^${field}:.*$`, 'm'), - [s, e] = f ? [`${f[1]}\n`, f[2]] : ['', contents] - return f && f[1].match(x) ? contents.replace(x, v) : `---\n${s}${v}\n---\n${e}` -} - -async function upload(data) { - data.id = id - status.setMessage(`Uploading ${data.filename}...`) - return requestUrl({ - url: 'https://file.obsidianshare.com/sharefile.php', - method: 'POST', - timeout: 1000, - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(data) - }) -} - -function extension(mimeType) { - const mimes = { - ttf: ['font/ttf', 'application/x-font-ttf', 'application/x-font-truetype', 'font/truetype'], - otf: ['font/otf', 'application/x-font-opentype'], - woff: ['font/woff', 'application/font-woff', 'application/x-font-woff'], - woff2: ['font/woff2', 'application/font-woff2', 'application/x-font-woff2'], - } - return Object.keys(mimes).find(x => mimes[x].includes((mimeType || '').toLowerCase())) -} - - -const file = app.workspace.getActiveFile() -const footer = '
Published with Obsidian Share
' -let html = ` - - - - - - ${file.basename} - - - - - - - - -
-
-
-
-
-
-
-
-
-
-${content} -
${SHOW_FOOTER ? footer : ''}
` - -try { - // Generate the HTML file for uploading - const dom = new DOMParser().parseFromString(html, 'text/html') - // Remove frontmatter to avoid sharing unwanted data - dom.querySelector('pre.frontmatter')?.remove() - dom.querySelector('div.frontmatter-container')?.remove() - // Set the meta description and OG description - const meta = app.metadataCache.getFileCache(file) - try { - const desc = Array.from(dom.querySelectorAll("p")).map(x => x.innerText).filter(x => !!x).join(' ').slice(0, 200) + '...' - dom.querySelector('#head-description').content = desc - dom.querySelector('#head-og-description').content = desc - } catch (e) { } - // Replace links - for (const el of dom.querySelectorAll("a.internal-link")) { - if (href = el.getAttribute('href').match(/^([^#]+)/)) { - const file = app.metadataCache.getFirstLinkpathDest(href[1], '') - if (meta?.frontmatter?.[YAML_FIELD + '_link']) { - // This file is shared, so update the link with the share URL - el.setAttribute('href', meta.frontmatter[YAML_FIELD + '_link']) - el.removeAttribute('target') - continue - } - } - // This file is not shared, so remove the link and replace with plain-text - el.replaceWith(el.innerText) - } - // Upload local images - for (const el of dom.querySelectorAll('img')) { - const src = el.getAttribute('src') - if (!src.startsWith('app://')) continue - try { - const localFile = window.decodeURIComponent(src.match(/app:\/\/\w+\/([^?#]+)/)[1]) - const url = (await getHash(id + localFile)) + '.' + localFile.split('.').pop() - el.setAttribute('src', url) - el.removeAttribute('alt') - await upload({ filename: url, content: fs.readFileSync(localFile, { encoding: 'base64' }), encoding: 'base64' }) - } catch (e) { - console.log(e) - } - } - // Share the file - const shareName = meta?.frontmatter?.[YAML_FIELD + '_hash'] || await getHash(id + file.path) - const shareFile = shareName + '.html' - await upload({ filename: shareFile, content: dom.documentElement.innerHTML }) - // Upload theme CSS, unless this file has previously been shared - // To force a CSS re-upload, just remove the `share_link` frontmatter field - if (!meta?.frontmatter?.[YAML_FIELD + '_link']) { - await upload({ filename: id + '.css', content: css }) - // Extract any base64 encoded attachments from the CSS. - // Will use the mime-type list above to determine which attachments to extract. - const regex = /url\s*\(\W*data:([^;,]+)[^)]*?base64\s*,\s*([A-Za-z0-9/=+]+).?\)/ - for (const attachment of css.match(new RegExp(regex, 'g')) || []) { - if (match = attachment.match(new RegExp(regex))) { - if (extension(match[1])) { - const filename = (await getHash(match[2])) + `.${extension(match[1])}` - css = css.replace(match[0], `url("${filename}")`) - await upload({ filename: filename, content: match[2], encoding: 'base64' }) - } - } - } - } - // Update the frontmatter in the current note - let contents = await app.vault.read(file) - contents = updateFrontmatter(contents, YAML_FIELD + '_updated', moment().format()) - contents = updateFrontmatter(contents, YAML_FIELD + '_link', 'https://file.obsidianshare.com/' + shareFile) - app.vault.modify(file, contents) - status.hide() - new Notice('File has been shared', 4000) -} catch (e) { - console.log(e) - status.hide() - new Notice('Failed to share file', 4000) -} diff --git a/obsidian-share.js b/obsidian-share.js deleted file mode 100644 index caa4ed5..0000000 --- a/obsidian-share.js +++ /dev/null @@ -1,205 +0,0 @@ -const UPLOAD_LOCATION = 'https://example.com/somepath/' // the web root where the files will be uploaded. End in a trailing slash. -const UPLOAD_ENDPOINT = 'upload.php' // path to the upload endpoint, relative to UPLOAD_LOCATION -const YAML_FIELD = 'share' -const SECRET = 'some_fancy_secret' -const WIDTH = 700 -const SHOW_FOOTER = true - -/* - * Obsidian Share - * - * Created by Alan Grainger - * https://github.com/alangrainger/obsidian-share/ - * - * v1.2.0 - */ - -const fs = require('fs') -const leaf = app.workspace.activeLeaf -const startMode = leaf.getViewState() - -// Switch to Preview mode -const previewMode = leaf.getViewState() -previewMode.state.mode = 'preview' -leaf.setViewState(previewMode) -await new Promise(resolve => { setTimeout(() => { resolve() }, 200) }) - -// Parse the current document -let content, body, previewView, css -try { - content = leaf.view.modes.preview.renderer.sections.reduce((p, c) => p + c.el.innerHTML, '') - body = document.getElementsByTagName('body')[0] - previewView = document.getElementsByClassName('markdown-preview-view markdown-rendered')[0] - css = [...document.styleSheets].map(x => { - try { return [...x.cssRules].map(x => x.cssText).join('') } - catch (e) { } - }).filter(Boolean).join('').replace(/\n/g, '') -} catch (e) { - console.log(e) - new Notice('Failed to parse current note, check console for details', 5000) -} -// Revert to the original view mode -setTimeout(() => { leaf.setViewState(startMode) }, 200) -if (!previewView) return // Failed to parse current note -const status = new Notice('Sharing note...', 60000) - -async function sha256(text) { - const encoder = new TextEncoder(); - const data = encoder.encode(text) - const hash = await crypto.subtle.digest('SHA-256', data) - return Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, '0')).join('') -} -const getHash = async (path) => { return (await sha256(path)).slice(0, 32) } - -function updateFrontmatter(contents, field, value) { - const f = contents.match(/^---\r?\n(.*?)\n---\r?\n(.*)$/s), - v = `${field}: ${value}`, - x = new RegExp(`^${field}:.*$`, 'm'), - [s, e] = f ? [`${f[1]}\n`, f[2]] : ['', contents] - return f && f[1].match(x) ? contents.replace(x, v) : `---\n${s}${v}\n---\n${e}` -} - -/** - * Upload to web server - * Will add two additional properties to the POST data: - * 'nonce' - here using millisecond timestamp - * 'auth' - SHA256 of nonce + SECRET - * @param {Object} data - An object with the following properties: - * @param {string} data.filename - Filename for the destination file - * @param {string} data.content - File content - * @param {string} [data.encoding] - Optional encoding type, accepts only 'base64' - */ -async function upload(data) { - data.nonce = Date.now().toString() - data.auth = await sha256(data.nonce + SECRET) - status.setMessage(`Uploading ${data.filename}...`) - return requestUrl({ url: UPLOAD_LOCATION + UPLOAD_ENDPOINT, method: 'POST', body: JSON.stringify(data) }) -} - -/** - * Convert mime-type to file extension - * If you want any additional base64 encoded files to be extracted from your CSS, - * add the extension and mime-type(s) here. - * @param {string} mimeType - * @returns {string} File extension - */ -function extension(mimeType) { - const mimes = { - ttf: ['font/ttf', 'application/x-font-ttf', 'application/x-font-truetype', 'font/truetype'], - otf: ['font/otf', 'application/x-font-opentype'], - woff: ['font/woff', 'application/font-woff', 'application/x-font-woff'], - woff2: ['font/woff2', 'application/font-woff2', 'application/x-font-woff2'], - } - return Object.keys(mimes).find(x => mimes[x].includes((mimeType || '').toLowerCase())) -} - -const file = app.workspace.getActiveFile() -const footer = '
Published with Obsidian Share
' -let html = ` - - - - ${file.basename} - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-${content} -
${SHOW_FOOTER ? footer : ''}
` - -try { - // Generate the HTML file for uploading - const dom = new DOMParser().parseFromString(html, 'text/html') - // Remove frontmatter to avoid sharing unwanted data - dom.querySelector('pre.frontmatter')?.remove() - dom.querySelector('div.frontmatter-container')?.remove() - // Set the meta description and OG description - const meta = app.metadataCache.getFileCache(file) - try { - const desc = Array.from(dom.querySelectorAll("p")).map(x => x.innerText).filter(x => !!x).join(' ').slice(0, 200) + '...' - dom.querySelector('#head-description').content = desc - dom.querySelector('#head-og-description').content = desc - } catch (e) { } - // Replace links - for (const el of dom.querySelectorAll("a.internal-link")) { - if (href = el.getAttribute('href').match(/^([^#]+)/)) { - const file = app.metadataCache.getFirstLinkpathDest(href[1], '') - if (meta?.frontmatter?.[YAML_FIELD + '_link']) { - // This file is shared, so update the link with the share URL - el.setAttribute('href', meta.frontmatter[YAML_FIELD + '_link']) - el.removeAttribute('target') - continue - } - } - // This file is not shared, so remove the link and replace with plain-text - el.replaceWith(el.innerText) - } - // Upload local images - for (const el of dom.querySelectorAll('img')) { - const src = el.getAttribute('src') - if (!src.startsWith('app://')) continue - try { - const localFile = window.decodeURIComponent(src.match(/app:\/\/\w+\/([^?#]+)/)[1]) - const url = (await getHash(localFile)) + '.' + localFile.split('.').pop() - el.setAttribute('src', url) - el.removeAttribute('alt') - await upload({ filename: url, content: fs.readFileSync(localFile, { encoding: 'base64' }), encoding: 'base64' }) - } catch (e) { - console.log(e) - } - } - // Share the file - const shareName = meta?.frontmatter?.[YAML_FIELD + '_hash'] || await getHash(file.path) - const shareFile = shareName + '.html' - await upload({ filename: shareFile, content: dom.documentElement.innerHTML }) - // Upload theme CSS, unless this file has previously been shared - // To force a CSS re-upload, just remove the `share_link` frontmatter field - if (!meta?.frontmatter?.[YAML_FIELD + '_link']) { - await upload({ filename: 'style.css', content: css }) - // Extract any base64 encoded attachments from the CSS. - // Will use the mime-type list above to determine which attachments to extract. - const regex = /url\s*\(\W*data:([^;,]+)[^)]*?base64\s*,\s*([A-Za-z0-9/=+]+).?\)/ - for (const attachment of css.match(new RegExp(regex, 'g')) || []) { - if (match = attachment.match(new RegExp(regex))) { - if (extension(match[1])) { - const filename = (await getHash(match[2])) + `.${extension(match[1])}` - css = css.replace(match[0], `url("${filename}")`) - await upload({ filename: filename, content: match[2], encoding: 'base64' }) - } - } - } - } - // Update the frontmatter in the current note - let contents = await app.vault.read(file) - contents = updateFrontmatter(contents, YAML_FIELD + '_updated', moment().format()) - contents = updateFrontmatter(contents, YAML_FIELD + '_link', `${UPLOAD_LOCATION}${shareFile}`) - app.vault.modify(file, contents) - status.hide() - new Notice('File has been shared', 4000) -} catch (e) { - console.log(e) - status.hide() - new Notice('Failed to share file', 4000) -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1fae8ea --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3520 @@ +{ + "name": "obsidian-sample-plugin", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "obsidian-sample-plugin", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.17.3", + "eslint-config-standard": "^17.1.0", + "obsidian": "latest", + "tslib": "2.4.0", + "typescript": "4.7.4" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==", + "dev": true, + "peer": true + }, + "node_modules/@codemirror/view": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.16.0.tgz", + "integrity": "sha512-1Z2HkvkC3KR/oEZVuW9Ivmp8TWLzGEd8T8TA04TTwPvqogfkHBdYSlflytDOqmkUxM2d1ywTg7X2dU5mC+SXvg==", + "dev": true, + "peer": true, + "dependencies": { + "@codemirror/state": "^6.1.4", + "style-mod": "^4.0.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", + "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "peer": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.8", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", + "dev": true, + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "16.18.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz", + "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==", + "dev": true + }, + "node_modules/@types/tern": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", + "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/type-utils": "5.29.0", + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", + "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", + "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", + "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", + "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", + "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", + "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", + "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "peer": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "peer": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "peer": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "peer": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "peer": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", + "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.3", + "@esbuild/android-arm64": "0.17.3", + "@esbuild/android-x64": "0.17.3", + "@esbuild/darwin-arm64": "0.17.3", + "@esbuild/darwin-x64": "0.17.3", + "@esbuild/freebsd-arm64": "0.17.3", + "@esbuild/freebsd-x64": "0.17.3", + "@esbuild/linux-arm": "0.17.3", + "@esbuild/linux-arm64": "0.17.3", + "@esbuild/linux-ia32": "0.17.3", + "@esbuild/linux-loong64": "0.17.3", + "@esbuild/linux-mips64el": "0.17.3", + "@esbuild/linux-ppc64": "0.17.3", + "@esbuild/linux-riscv64": "0.17.3", + "@esbuild/linux-s390x": "0.17.3", + "@esbuild/linux-x64": "0.17.3", + "@esbuild/netbsd-x64": "0.17.3", + "@esbuild/openbsd-x64": "0.17.3", + "@esbuild/sunos-x64": "0.17.3", + "@esbuild/win32-arm64": "0.17.3", + "@esbuild/win32-ia32": "0.17.3", + "@esbuild/win32-x64": "0.17.3" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "peer": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true, + "peer": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "peer": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "peer": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "peer": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "peer": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "peer": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "peer": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "peer": true + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obsidian": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.4.4.tgz", + "integrity": "sha512-q2V5GNT/M40uYOENdVw5kovPSoaO6vppiiyBCkIqWgKp4oN654jA/GQ0OaNBA7p5NdfS245QCeRgCFQ42wOZiw==", + "dev": true, + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "peer": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz", + "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==", + "dev": true, + "peer": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "peer": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "peer": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "peer": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..284469c --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "share-note", + "version": "0.1.0", + "description": "Share a note publicly with full styling. Data is stored encrypted on the server and only you have the key.", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "version": "node version-bump.mjs && git add manifest.json versions.json" + }, + "keywords": [], + "author": "Alan Grainger", + "license": "MIT", + "devDependencies": { + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.17.3", + "eslint-config-standard": "^17.1.0", + "obsidian": "latest", + "tslib": "2.4.0", + "typescript": "4.7.4" + } +} diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..5fb3533 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,42 @@ +import { requestUrl } from 'obsidian' +import SharePlugin from './main' + +const BASEURL = 'https://api.obsidianshare.com' + +export interface UploadData { + filename: string; + content: string; + encoding?: string; +} + +export default class API { + plugin: SharePlugin + + constructor (plugin: SharePlugin) { + this.plugin = plugin + } + + async post (endpoint: string, data: object) { + Object.assign(data, { + id: this.plugin.settings.uid, + key: this.plugin.settings.apiKey + }) + return requestUrl({ + url: BASEURL + endpoint, + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + } + + async upload (data: UploadData) { + const res = await this.post('/upload', data) + if (res.status === 200) { + return 'https://file.obsidianshare.com/' + data.filename + } else { + return '' + } + } +} diff --git a/src/crypto.ts b/src/crypto.ts new file mode 100644 index 0000000..98a57e1 --- /dev/null +++ b/src/crypto.ts @@ -0,0 +1,152 @@ +// Copied with thanks from https://github.com/mcndt/obsidian-quickshare + +interface EncryptedData { + ciphertext: string; + iv: string; +} + +export interface EncryptedString { + ciphertext: string; + key: string; + iv: string; +} + +/** + * Generates a 256-bit key from a seed. + * + * @param seed passphrase-like data to generate the key from. + */ +export async function generateKey (seed: string): Promise { + const _seed = new TextEncoder().encode(seed) + return _generateKey(_seed) +} + +/** + * Generates a random 256-bit key using crypto.getRandomValues. + */ +export async function generateRandomKey (): Promise { + const seed = window.crypto.getRandomValues(new Uint8Array(64)) + return _generateKey(seed) +} + +async function _generateKey (seed: ArrayBuffer) { + const keyMaterial = await window.crypto.subtle.importKey( + 'raw', + seed, + { name: 'PBKDF2' }, + false, + ['deriveBits'] + ) + + const masterKey = await window.crypto.subtle.deriveBits( + { + name: 'PBKDF2', + salt: new Uint8Array(16), + iterations: 100000, + hash: 'SHA-256' + }, + keyMaterial, + 256 + ) + + return new Uint8Array(masterKey) +} + +export function masterKeyToString (masterKey: ArrayBuffer): string { + return arrayBufferToBase64(masterKey) +} + +export async function _encryptString ( + md: string, + secret: ArrayBuffer +): Promise { + const plaintext = new TextEncoder().encode(md) + const iv = window.crypto.getRandomValues(new Uint8Array(16)) + const bufCiphertext: ArrayBuffer = await window.crypto.subtle.encrypt( + { name: 'AES-GCM', iv }, + await _getAesGcmKey(secret), + plaintext + ) + + const ciphertext = arrayBufferToBase64(bufCiphertext) + + return { ciphertext, iv: arrayBufferToBase64(iv) } +} + +export async function decryptString ( + { ciphertext, iv }: EncryptedData, + secret: string +): Promise { + const ciphertextBuf = base64ToArrayBuffer(ciphertext) + const ivBuf = base64ToArrayBuffer(iv) + const plaintext = await window.crypto.subtle + .decrypt( + { name: 'AES-GCM', iv: ivBuf }, + await _getAesGcmKey(base64ToArrayBuffer(secret)), + ciphertextBuf + ) + .catch(() => { + throw new Error('Cannot decrypt ciphertext with this key.') + }) + return new TextDecoder().decode(plaintext) +} + +export function arrayBufferToBase64 (buffer: ArrayBuffer): string { + return window.btoa(String.fromCharCode(...new Uint8Array(buffer))) +} + +export function base64ToArrayBuffer (base64: string): ArrayBuffer { + return Uint8Array.from(window.atob(base64), (c) => c.charCodeAt(0)) +} + +function _getAesGcmKey (secret: ArrayBuffer): Promise { + return window.crypto.subtle.importKey( + 'raw', + secret, + { name: 'AES-GCM', length: 256 }, + false, + ['encrypt', 'decrypt'] + ) +} + +/** + * Encrypt a plaintext string with AES 256 + * + * @param {string} plaintext + * @param {string} [existingKey] - Optional + * @return {EncryptedString} + */ +export async function encryptString (plaintext: string, existingKey?: string): Promise { + let key + if (existingKey) { + key = base64ToArrayBuffer(existingKey) + } else { + key = await _generateKey(window.crypto.getRandomValues(new Uint8Array(64))) + } + + const encodedText = new TextEncoder().encode(plaintext) + const iv = window.crypto.getRandomValues(new Uint8Array(16)) + const bufCiphertext: ArrayBuffer = await window.crypto.subtle.encrypt( + { name: 'AES-GCM', iv }, + await _getAesGcmKey(key), + encodedText + ) + const ciphertext = arrayBufferToBase64(bufCiphertext) + + return { + ciphertext, + iv: arrayBufferToBase64(iv), + key: masterKeyToString(key).slice(0, 43) + } +} + +async function sha256 (text: string) { + const encoder = new TextEncoder() + const data = encoder.encode(text) + const hash = await crypto.subtle.digest('SHA-256', data) + return Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, '0')).join('') +} + +export async function hash (path: string) { + return (await sha256(path)).slice(0, 32) +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..ef813a8 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,38 @@ +import { Plugin } from 'obsidian' +import { ShareSettings, ShareSettingsTab, DEFAULT_SETTINGS } from './settings' +import Note from './note' +import API from './api' + +export default class SharePlugin extends Plugin { + settings: ShareSettings + api: API + + async onload () { + await this.loadSettings() + this.api = new API(this) + + // This adds an editor command that can perform some operation on the current editor instance + this.addCommand({ + id: 'share', + name: 'Share current note', + callback: () => { + const note = new Note(this) + note.parse() + } + }) + + this.addSettingTab(new ShareSettingsTab(this.app, this)) + } + + onunload () { + + } + + async loadSettings () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()) + } + + async saveSettings () { + await this.saveData(this.settings) + } +} diff --git a/src/note.ts b/src/note.ts new file mode 100644 index 0000000..c37278c --- /dev/null +++ b/src/note.ts @@ -0,0 +1,220 @@ +import { CachedMetadata, moment, Notice, TFile, WorkspaceLeaf } from 'obsidian' +import Template, { Placeholder, defaultFooter } from './template' +import { encryptString, hash } from './crypto' +import SharePlugin from './main' +import { UploadData } from './api' +import * as fs from 'fs' + +export default class Note { + plugin: SharePlugin + leaf: WorkspaceLeaf + status: Notice + content: string + previewViewEl: Element + css: string + dom: Document + meta: CachedMetadata | null + + constructor (plugin: SharePlugin) { + this.plugin = plugin + this.leaf = this.plugin.app.workspace.getLeaf() + } + + async parse () { + const startMode = this.leaf.getViewState() + const previewMode = this.leaf.getViewState() + previewMode.state.mode = 'preview' + await this.leaf.setViewState(previewMode) + // Even though we 'await', sometimes the view isn't ready. This helps reduce no-content errors + await new Promise(resolve => setTimeout(resolve, 200)) + try { + // @ts-ignore // 'view.modes' + this.content = this.leaf.view.modes.preview.renderer.sections.reduce((p, c) => p + c.el.innerHTML, '') + // Fetch the preview view classes + this.previewViewEl = document.getElementsByClassName('markdown-preview-view markdown-rendered')[0] + this.css = [...Array.from(document.styleSheets)].map(x => { + try { + return [...Array.from(x.cssRules)].map(x => x.cssText).join('') + } catch (e) { + return '' + } + }).filter(Boolean).join('').replace(/\n/g, '') + } catch (e) { + console.log(e) + new Notice('Failed to parse current note, check console for details', 5000) + return + } + if (!this.content) { + new Notice('Failed to read current note, please try again.', 5000) + return + } + + // Reset the view to the original mode + // The timeout is required, even though we 'await' the preview mode setting earlier + setTimeout(() => { this.leaf.setViewState(startMode) }, 200) + + this.status = new Notice('Sharing note...', 60000) + + const file = this.plugin.app.workspace.getActiveFile() + if (!(file instanceof TFile)) { + // No active file + return + } + this.meta = this.plugin.app.metadataCache.getFileCache(file) + const outputFile = new Template() + + // Make template value replacements + outputFile.set(Placeholder.css, `${this.plugin.settings.uid}.css`) + outputFile.set(Placeholder.noteWidth, this.plugin.settings.noteWidth) + outputFile.set(Placeholder.previewViewClass, this.previewViewEl.className || '') + outputFile.set(Placeholder.bodyClass, document.body.className) + outputFile.set(Placeholder.bodyStyle, document.body.style.cssText.replace(/"/g, '\'')) + outputFile.set(Placeholder.footer, this.plugin.settings.showFooter ? defaultFooter : '') + + // Generate the HTML file for uploading + this.dom = new DOMParser().parseFromString(this.content, 'text/html') + if (this.plugin.settings.removeYaml) { + // Remove frontmatter to avoid sharing unwanted data + this.dom.querySelector('div.metadata-container')?.remove() + this.dom.querySelector('pre.frontmatter')?.remove() + this.dom.querySelector('div.frontmatter-container')?.remove() + } + + // Replace links + for (const el of this.dom.querySelectorAll('a.internal-link')) { + const hrefEl = el.getAttribute('href') + const href = hrefEl ? hrefEl.match(/^([^#]+)/) : null + if (href) { + const linkedFile = this.plugin.app.metadataCache.getFirstLinkpathDest(href[1], '') + if (linkedFile instanceof TFile) { + const linkedMeta = this.plugin.app.metadataCache.getFileCache(linkedFile) + if (linkedMeta?.frontmatter?.[this.plugin.settings.yamlField + '_link']) { + // This file is shared, so update the link with the share URL + el.setAttribute('href', linkedMeta.frontmatter[this.plugin.settings.yamlField + '_link']) + el.removeAttribute('target') + continue + } + } + } + // This file is not shared, so remove the link and replace with the non-link content + el.replaceWith(el.innerHTML) + } + + // Upload local images + await this.processImages() + + // Encrypt the note content + + // Use previous key if it exists, so that links will stay consistent across updates + let existingKey + if (this.meta?.frontmatter?.[this.plugin.settings.yamlField + '_link']) { + const key = this.meta.frontmatter[this.plugin.settings.yamlField + '_link'].match(/#(.+)$/) + if (key) { + existingKey = key[1] + } + } + const plaintext = JSON.stringify({ + content: this.dom.body.innerHTML, + basename: file.basename + }) + const encryptedData = await encryptString(plaintext, existingKey) + outputFile.set(Placeholder.payload, JSON.stringify({ + ciphertext: encryptedData.ciphertext, + iv: encryptedData.iv + })) + + // Share the file + const shareName = this.meta?.frontmatter?.[this.plugin.settings.yamlField + '_hash'] || await hash(this.plugin.settings.uid + file.path) + const shareFile = shareName + '.html' + + const baseRes = await this.upload({ + filename: shareFile, + content: outputFile.html + }) + await this.uploadCss() + + if (baseRes) { + await this.plugin.app.fileManager.processFrontMatter(file, (frontmatter) => { + frontmatter[this.plugin.settings.yamlField + '_updated'] = moment().format() + frontmatter[this.plugin.settings.yamlField + '_link'] = baseRes + '#' + encryptedData.key + }) + } + + this.status.hide() + new Notice('File has been shared', 4000) + } + + async upload (data: UploadData) { + this.status.setMessage(`Uploading ${data.filename}...`) + return this.plugin.api.upload(data) + } + + /** + * Upload local images, encoded as base64 + */ + async processImages () { + for (const el of this.dom.querySelectorAll('img')) { + const src = el.getAttribute('src') + if (!src || !src.startsWith('app://')) continue + try { + const srcMatch = src.match(/app:\/\/\w+\/([^?#]+)/) + if (!srcMatch) continue + const localFile = window.decodeURIComponent(srcMatch[1]) + const url = (await hash(this.plugin.settings.uid + localFile)) + '.' + localFile.split('.').pop() + el.setAttribute('src', url) + el.removeAttribute('alt') + await this.upload({ + filename: url, + content: fs.readFileSync(localFile, { + encoding: 'base64' + }), + encoding: 'base64' + }) + } catch (e) { + console.log(e) + } + } + } + + async uploadCss () { + // Upload theme CSS, unless this file has previously been shared + // To force a CSS re-upload, just remove the `share_link` frontmatter field + if (!this.meta?.frontmatter?.[this.plugin.settings.yamlField + '_link']) { + await this.upload({ filename: this.plugin.settings.uid + '.css', content: this.css }) + // Extract any base64 encoded attachments from the CSS. + // Will use the mime-type list above to determine which attachments to extract. + const regex = /url\s*\(\W*data:([^;,]+)[^)]*?base64\s*,\s*([A-Za-z0-9/=+]+).?\)/ + for (const attachment of this.css.match(new RegExp(regex, 'g')) || []) { + const match = attachment.match(new RegExp(regex)) + if (match) { + // ALlow whitelisted mime-types/extensions only + const extension = this.extensionFromMime(match[1]) + if (extension) { + const filename = (await hash(match[2])) + '.' + extension + this.css = this.css.replace(match[0], `url("${filename}")`) + await this.upload({ + filename, + content: match[2], + encoding: 'base64' + }) + } + } + } + } + } + + /** + * Turn a mime-type into an extension. This is also a whitelist of allowed filetypes. + * @param {string} mimeType + * @return {string|undefined} + */ + extensionFromMime (mimeType: string) { + const mimes: { [key: string]: string[] } = { + ttf: ['font/ttf', 'application/x-font-ttf', 'application/x-font-truetype', 'font/truetype'], + otf: ['font/otf', 'application/x-font-opentype'], + woff: ['font/woff', 'application/font-woff', 'application/x-font-woff'], + woff2: ['font/woff2', 'application/font-woff2', 'application/x-font-woff2'] + } + return Object.keys(mimes).find(x => mimes[x].includes((mimeType || '').toLowerCase())) + } +} diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..0834778 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,100 @@ +import { App, Notice, PluginSettingTab, requestUrl, Setting } from 'obsidian' +import SharePlugin from './main' +import { hash } from './crypto' + +export interface ShareSettings { + uid: string; + email: string; + apiKey: string; + yamlField: string; + noteWidth: string; + showFooter: boolean; + removeYaml: boolean; +} + +export const DEFAULT_SETTINGS: ShareSettings = { + uid: '', + email: '', + apiKey: '', + yamlField: 'share', + noteWidth: '700px', + showFooter: true, + removeYaml: true +} + +export class ShareSettingsTab extends PluginSettingTab { + plugin: SharePlugin + + constructor (app: App, plugin: SharePlugin) { + super(app, plugin) + this.plugin = plugin + } + + display (): void { + const { containerEl } = this + + containerEl.empty() + + // Email address + new Setting(containerEl) + .setName('Email address') + .setDesc('This is not stored on the Share server, it is solely used to send you an API key.') + .addText(text => text + .setValue(this.plugin.settings.email) + .onChange(async (value) => { + this.plugin.settings.email = value + // Store a hashed value of the email. This is what we use to communicate with the server. + this.plugin.settings.uid = await hash(value) + await this.plugin.saveSettings() + })) + .addButton(btn => btn + .setButtonText('Request API key') + .setCta() + .onClick(async () => { + if (this.plugin.settings.email) { + new Notice('An API key has been sent to ' + this.plugin.settings.email, 3000) + await this.plugin.api.post('/signup', { + email: this.plugin.settings.email + }) + } + })) + + // API key + new Setting(containerEl) + .setName('API key') + .setDesc('Enter the key which was sent to you via email.') + .addText(text => text + .setValue(this.plugin.settings.apiKey) + .onChange(async (value) => { + this.plugin.settings.apiKey = value + await this.plugin.saveSettings() + })) + + // Strip frontmatter + new Setting(containerEl) + .setName('Remove frontmatter/YAML') + .setDesc('Remove frontmatter/YAML/properties from the shared note') + .addToggle(toggle => { + toggle + .setValue(this.plugin.settings.removeYaml) + .onChange(async (value) => { + this.plugin.settings.removeYaml = value + await this.plugin.saveSettings() + this.display() + }) + }) + + // Show/hide the footer + new Setting(containerEl) + .setName('Show the footer') + .addToggle(toggle => { + toggle + .setValue(this.plugin.settings.showFooter) + .onChange(async (value) => { + this.plugin.settings.showFooter = value + await this.plugin.saveSettings() + this.display() + }) + }) + } +} diff --git a/src/template.ts b/src/template.ts new file mode 100644 index 0000000..4e50412 --- /dev/null +++ b/src/template.ts @@ -0,0 +1,130 @@ +export const Placeholder = { + title: 'TEMPLATE_TITLE', + css: 'TEMPLATE_STYLESHEET', + noteWidth: 'TEMPLATE_WIDTH', + bodyClass: 'TEMPLATE_BODY_CLASS', + bodyStyle: 'TEMPLATE_BODY_STYLE', + previewViewClass: 'TEMPLATE_PREVIEW_VIEW_CLASS', + payload: 'TEMPLATE_ENCRYPTED_DATA', + footer: 'TEMPLATE_FOOTER' +} + +const html = ` + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+ + Encrypted note +
+
+
+
+
+
+
+
+
+ TEMPLATE_FOOTER +
+ + + + +` + +export const defaultFooter = ` +` + +export default class Template { + html: string + footer: string + + constructor () { + this.html = html + } + + set (key: string, value: string) { + this.html = this.html.replace(new RegExp(key, 'g'), value) + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4089e1d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "strictNullChecks": true, + "lib": [ + "DOM", + "dom.iterable", + "ES5", + "ES6", + "ES7" + ] + }, + "include": [ + "**/*.ts" + ] +} diff --git a/update-example.php b/update-example.php deleted file mode 100644 index c49783b..0000000 --- a/update-example.php +++ /dev/null @@ -1,21 +0,0 @@ -auth, hash('sha256', $data->nonce . $secret))) { - http_response_code(404); - exit(); -} - -$file = explode('.', $data->filename); -$file[0] = preg_replace("/[^a-z0-9]/", '', $file[0]); -if (count($file) === 2 && in_array($file[1], $whitelist) && ! empty($file[0])) { - if ($data->encoding === 'base64') { - // Decode uploaded images - $data->content = base64_decode($data->content); - } - file_put_contents(__DIR__ . "/$file[0].$file[1]", $data->content); -} diff --git a/version-bump.mjs b/version-bump.mjs new file mode 100644 index 0000000..d409fa0 --- /dev/null +++ b/version-bump.mjs @@ -0,0 +1,14 @@ +import { readFileSync, writeFileSync } from "fs"; + +const targetVersion = process.env.npm_package_version; + +// read minAppVersion from manifest.json and bump version to target version +let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); +const { minAppVersion } = manifest; +manifest.version = targetVersion; +writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); + +// update versions.json with target version and minAppVersion from manifest.json +let versions = JSON.parse(readFileSync("versions.json", "utf8")); +versions[targetVersion] = minAppVersion; +writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); diff --git a/versions.json b/versions.json new file mode 100644 index 0000000..9be1f3d --- /dev/null +++ b/versions.json @@ -0,0 +1,3 @@ +{ + "0.1.0": "0.15.0" +}