├── .npmrc ├── versions.json ├── hero.png ├── manifest.json ├── .editorconfig ├── tsconfig.json ├── biome.json ├── README.md ├── version-bump.mjs ├── .github └── workflows │ └── release.yml ├── src ├── types.ts ├── main.ts ├── css.ts ├── import.ts ├── settings.ts └── modal.ts ├── package.json ├── LICENSE ├── esbuild.config.mjs ├── .gitignore └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="" 2 | -------------------------------------------------------------------------------- /versions.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.0": "1.5.0" 3 | } 4 | -------------------------------------------------------------------------------- /hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fontsource/obsidian-fontsource/HEAD/hero.png -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "fontsource", 3 | "name": "Fontsource", 4 | "version": "1.0.0", 5 | "minAppVersion": "1.5.0", 6 | "description": "Load custom fonts from Fontsource into your notes.", 7 | "author": "Ayuhito", 8 | "authorUrl": "https://github.com/ayuhito", 9 | "fundingUrl": "https://github.com/sponsors/ayuhito", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_size = 2 6 | indent_style = tab 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | max_line_length = 80 11 | 12 | [*.{js,cjs,ts,tsx}] 13 | quote_type = single 14 | 15 | [*.{md, mdx}] 16 | trim_trailing_whitespace = false 17 | indent_style = space 18 | indent_size = 4 19 | 20 | [*.{yml,yaml,toml}] 21 | indent_style = space 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "inlineSourceMap": true, 5 | "inlineSources": true, 6 | "module": "ESNext", 7 | "target": "ES6", 8 | "allowJs": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "importHelpers": true, 12 | "isolatedModules": true, 13 | "strictNullChecks": true, 14 | "lib": ["DOM", "ES5", "ES6", "ES7"] 15 | }, 16 | "include": ["**/*.ts"] 17 | } 18 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "linter": { 7 | "enabled": true, 8 | "rules": { 9 | "recommended": true, 10 | "correctness": { 11 | "noUnusedImports": "warn" 12 | } 13 | } 14 | }, 15 | "javascript": { 16 | "formatter": { 17 | "quoteStyle": "single" 18 | } 19 | }, 20 | "files": { 21 | "ignore": ["node_modules/**/*"] 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fontsource for Obsidian 2 | 3 | ![Hero Image](./hero.png) 4 | 5 | This is a simple plugin to import [Fontsource](https://fontsource.org/) custom fonts into Obsidian. 6 | 7 | ## Contribution 8 | 9 | Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. 10 | 11 | Releasing a new version is done by creating a new tag and pushing it to the repository. The GitHub Actions workflow will build and release the necessary files. 12 | 13 | ## License 14 | 15 | [MIT](LICENSE) 16 | -------------------------------------------------------------------------------- /version-bump.mjs: -------------------------------------------------------------------------------- 1 | import { readFileSync, writeFileSync } from "node:fs"; 2 | 3 | const targetVersion = process.env.npm_package_version; 4 | 5 | // read minAppVersion from manifest.json and bump version to target version 6 | const manifest = JSON.parse(readFileSync("manifest.json", "utf8")); 7 | const { minAppVersion } = manifest; 8 | manifest.version = targetVersion; 9 | writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); 10 | 11 | // update versions.json with target version and minAppVersion from manifest.json 12 | const versions = JSON.parse(readFileSync("versions.json", "utf8")); 13 | versions[targetVersion] = minAppVersion; 14 | writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); 15 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Version 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - name: Setup Node.js 16 | uses: actions/setup-node@v2 17 | with: 18 | node-version: 20 19 | 20 | - uses: pnpm/action-setup@v3 21 | with: 22 | version: 8 23 | run_install: true 24 | 25 | - name: Build 26 | run: pnpm build 27 | 28 | - name: Release 29 | uses: softprops/action-gh-release@v2 30 | with: 31 | files: | 32 | main.js 33 | manifest.json 34 | LICENSE 35 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | interface BaseMetadata { 2 | id: string; 3 | family: string; 4 | subsets: string[]; 5 | styles: string[]; 6 | weights: number[]; 7 | variable?: { 8 | wght?: { min: number; max: number }; 9 | stretch?: { min: number; max: number }; 10 | slnt?: { min: number; max: number }; 11 | }; 12 | } 13 | 14 | interface SettingsMetadata extends BaseMetadata { 15 | isActive: boolean; 16 | } 17 | 18 | interface SettingsPrecedence { 19 | family: string; 20 | id: string; 21 | precedence: number; 22 | } 23 | 24 | interface FontMetadata extends BaseMetadata { 25 | // subset-weight-style -> base64 26 | base64: Record; 27 | // subset -> unicode range 28 | unicodeRange: Record; 29 | } 30 | 31 | type FontType = 'interface' | 'text' | 'monospace'; 32 | 33 | export type { SettingsMetadata, SettingsPrecedence, FontMetadata, FontType }; 34 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "obsidian-fontsource-plugin", 3 | "version": "1.0.0", 4 | "description": "This is a plugin to load custom fonts from Fontsource in Obsidian.", 5 | "main": "main.js", 6 | "scripts": { 7 | "dev": "node esbuild.config.mjs", 8 | "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", 9 | "version": "node version-bump.mjs && git add manifest.json versions.json" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "@biomejs/biome": "^1.6.4", 16 | "@types/node": "^16.11.6", 17 | "@typescript-eslint/eslint-plugin": "5.29.0", 18 | "@typescript-eslint/parser": "5.29.0", 19 | "builtin-modules": "3.3.0", 20 | "esbuild": "0.17.3", 21 | "esbuild-plugin-copy": "^2.1.1", 22 | "obsidian": "latest", 23 | "tslib": "2.4.0", 24 | "typescript": "4.7.4" 25 | }, 26 | "dependencies": { 27 | "@fontsource-utils/generate": "^0.4.0", 28 | "p-queue": "^8.0.1" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 fontsource 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /esbuild.config.mjs: -------------------------------------------------------------------------------- 1 | import esbuild from "esbuild"; 2 | import process from "node:process"; 3 | import builtins from "builtin-modules"; 4 | 5 | const banner = `/* 6 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 7 | if you want to view the source, please visit the github repository of this plugin 8 | */ 9 | `; 10 | 11 | const prod = process.argv[2] === "production"; 12 | 13 | const context = await esbuild.context({ 14 | banner: { 15 | js: banner, 16 | }, 17 | entryPoints: ["src/main.ts"], 18 | bundle: true, 19 | external: [ 20 | "obsidian", 21 | "electron", 22 | "@codemirror/autocomplete", 23 | "@codemirror/collab", 24 | "@codemirror/commands", 25 | "@codemirror/language", 26 | "@codemirror/lint", 27 | "@codemirror/search", 28 | "@codemirror/state", 29 | "@codemirror/view", 30 | "@lezer/common", 31 | "@lezer/highlight", 32 | "@lezer/lr", 33 | ...builtins, 34 | ], 35 | format: "cjs", 36 | target: "es2018", 37 | logLevel: "info", 38 | sourcemap: prod ? false : "inline", 39 | treeShaking: true, 40 | outfile: prod ? "main.js" : "test-vault/.obsidian/plugins/fontsource/main.js", 41 | }); 42 | 43 | if (prod) { 44 | await context.rebuild(); 45 | process.exit(0); 46 | } else { 47 | await context.watch(); 48 | } 49 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { Plugin } from 'obsidian'; 2 | import FontsourceSettingsTab from './settings'; 3 | import type { SettingsMetadata, SettingsPrecedence } from './types'; 4 | import { applyCss, updateCssVariables } from './css'; 5 | 6 | interface PluginSettings { 7 | fonts: SettingsMetadata[]; 8 | interfaceFonts: SettingsPrecedence[]; 9 | textFonts: SettingsPrecedence[]; 10 | monospaceFonts: SettingsPrecedence[]; 11 | } 12 | 13 | const DEFAULT_SETTINGS: PluginSettings = { 14 | fonts: [], 15 | interfaceFonts: [], 16 | textFonts: [], 17 | monospaceFonts: [], 18 | }; 19 | 20 | export default class FontsourcePlugin extends Plugin { 21 | settings: PluginSettings; 22 | 23 | async onload() { 24 | await this.loadSettings(); 25 | this.addSettingTab(new FontsourceSettingsTab(this.app, this)); 26 | 27 | // Apply CSS for all active fonts 28 | for (const font of this.settings.fonts) { 29 | if (font.isActive) { 30 | applyCss(font.id, this); 31 | } 32 | } 33 | updateCssVariables(this); 34 | } 35 | 36 | async loadSettings() { 37 | this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); 38 | } 39 | 40 | async saveSettings() { 41 | await this.saveData(this.settings); 42 | } 43 | 44 | async onunload() { 45 | // Remove CSS variables 46 | const existing = document.getElementById('fontsource-css-variables'); 47 | if (existing) { 48 | existing.remove(); 49 | } 50 | 51 | // Remove loaded base64 fonts 52 | for (const font of this.settings.fonts) { 53 | const existing = document.getElementById(`fontsource-${font.id}`); 54 | if (existing) { 55 | existing.remove(); 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | # build 133 | main.js 134 | test-vault/ 135 | -------------------------------------------------------------------------------- /src/css.ts: -------------------------------------------------------------------------------- 1 | import { type FontObject, generateFontFace } from '@fontsource-utils/generate'; 2 | import type { FontMetadata, SettingsPrecedence } from './types'; 3 | import type FontsourcePlugin from './main'; 4 | 5 | const generateCss = (metadata: FontMetadata): string => { 6 | let css = ''; 7 | 8 | // Non-Google fonts don't have unicode ranges 9 | let subsets = Object.keys(metadata.unicodeRange); 10 | if (subsets.length === 0) { 11 | subsets = metadata.subsets; 12 | } 13 | 14 | if (metadata.variable) { 15 | // Generate font-face rules 16 | for (const style of metadata.styles) { 17 | for (const subset of subsets) { 18 | const font: FontObject = { 19 | family: metadata.family, 20 | style, 21 | weight: 400, 22 | display: 'auto', 23 | src: [ 24 | { 25 | url: `data:font/woff2;base64,${ 26 | metadata.base64[`${subset}-${style}`] 27 | }`, 28 | format: 'woff2-variations', 29 | }, 30 | ], 31 | unicodeRange: metadata.unicodeRange[subset], 32 | variable: { 33 | wght: metadata.variable.wght, 34 | stretch: metadata.variable.stretch, 35 | slnt: metadata.variable.slnt, 36 | }, 37 | comment: `${metadata.id}-variable-${style}`, 38 | }; 39 | css += generateFontFace(font); 40 | } 41 | } 42 | } else { 43 | for (const style of metadata.styles) { 44 | for (const weight of metadata.weights) { 45 | for (const subset of subsets) { 46 | const font: FontObject = { 47 | family: metadata.family, 48 | style, 49 | display: 'auto', 50 | weight, 51 | src: [ 52 | { 53 | url: `data:font/woff2;base64,${ 54 | metadata.base64[`${subset}-${weight}-${style}`] 55 | }`, 56 | format: 'woff2', 57 | }, 58 | ], 59 | unicodeRange: metadata.unicodeRange[subset], 60 | comment: `${metadata.id}-${weight}-${style}`, 61 | }; 62 | 63 | css += generateFontFace(font); 64 | } 65 | } 66 | } 67 | } 68 | return css; 69 | }; 70 | 71 | const applyCss = async (id: string, plugin: FontsourcePlugin) => { 72 | // Check if stylesheet exists in DOM 73 | const existing = document.getElementById(`fontsource-${id}`); 74 | 75 | // If found, replace with new stylesheet, else append new stylesheet 76 | const css = await plugin.app.vault.adapter.read( 77 | `${plugin.app.vault.configDir}/fonts/${id}.css`, 78 | ); 79 | if (existing) { 80 | existing.replaceWith(css); 81 | } else { 82 | const style = document.createElement('style'); 83 | style.id = `fontsource-${id}`; 84 | style.textContent = css; 85 | document.head.appendChild(style); 86 | } 87 | }; 88 | 89 | const removeCss = (id: string) => { 90 | const existing = document.getElementById(`fontsource-${id}`); 91 | if (existing) { 92 | existing.remove(); 93 | } 94 | }; 95 | 96 | // Extract font families into a string for CSS 97 | const extractFontFamilies = (fonts: SettingsPrecedence[]) => 98 | fonts 99 | // Sort by precedence then family name 100 | .sort((a, b) => { 101 | if (a.precedence === b.precedence) { 102 | return a.family.localeCompare(b.family); 103 | } 104 | 105 | return a.precedence - b.precedence; 106 | }) 107 | .map((font) => `'${font.family}'`) 108 | .join(', '); 109 | 110 | const updateCssVariables = (plugin: FontsourcePlugin) => { 111 | const id = 'fontsource-css-variables'; 112 | const { interfaceFonts, textFonts, monospaceFonts } = plugin.settings; 113 | 114 | // Generate CSS variables 115 | const interfaceFont = extractFontFamilies(interfaceFonts); 116 | const textFont = extractFontFamilies(textFonts); 117 | const monospaceFont = extractFontFamilies(monospaceFonts); 118 | 119 | // Generate CSS text 120 | const cssText = ` 121 | ${interfaceFont ? `--font-interface-override: ${interfaceFont};` : ''} 122 | ${textFont ? `--font-text-override: ${textFont};` : ''} 123 | ${textFont ? `--font-print-override: ${textFont};` : ''} 124 | ${monospaceFont ? `--font-monospace-override: ${monospaceFont};` : ''} 125 | `; 126 | 127 | // Create or update style element 128 | let style = document.getElementById(id); 129 | 130 | // If CSS variables are empty, remove style element or do not apply 131 | if (cssText.trim() === '') { 132 | if (style) { 133 | style.remove(); 134 | } 135 | return; 136 | } 137 | 138 | // Apply variables 139 | if (!style) { 140 | style = document.createElement('style'); 141 | style.id = id; 142 | document.head.appendChild(style); 143 | } 144 | style.textContent = `body { ${cssText} }`; 145 | }; 146 | 147 | export { applyCss, removeCss, generateCss, updateCssVariables }; 148 | -------------------------------------------------------------------------------- /src/import.ts: -------------------------------------------------------------------------------- 1 | import { arrayBufferToBase64, requestUrl } from 'obsidian'; 2 | import type { FontMetadata, SettingsMetadata } from './types'; 3 | import { generateCss } from './css'; 4 | import type FontsourcePlugin from './main'; 5 | import PQueue from 'p-queue'; 6 | 7 | const fetchMetadata = async (id: string): Promise => { 8 | const metadata = await requestUrl(`https://api.fontsource.org/v1/fonts/${id}`) 9 | .json; 10 | 11 | let variable: FontMetadata['variable']; 12 | if (metadata.variable) { 13 | const variableResponse = await requestUrl( 14 | `https://api.fontsource.org/v1/variable/${id}`, 15 | ).json; 16 | variable = variableResponse.axes; 17 | } 18 | 19 | const font: FontMetadata = { 20 | id: metadata.id, 21 | family: metadata.family, 22 | subsets: metadata.subsets, 23 | styles: metadata.styles, 24 | weights: metadata.weights, 25 | variable, 26 | base64: {}, 27 | unicodeRange: metadata.unicodeRange, 28 | }; 29 | 30 | return font; 31 | }; 32 | 33 | // Return the axes with the most available options 34 | const getAxes = (variable: NonNullable): string => { 35 | const axes = Object.keys(variable).filter((axis) => axis !== 'ital'); 36 | 37 | if (axes.length === 1 && variable?.wght) { 38 | return 'wght'; 39 | } 40 | 41 | if (axes.length === 2 && variable?.wght) { 42 | return axes.find((axis) => axis !== 'wght') ?? 'wght'; 43 | } 44 | 45 | const isStandard = axes.every((axis) => 46 | ['wght', 'wdth', 'slnt', 'opsz'].includes(axis), 47 | ); 48 | if (isStandard) { 49 | return 'standard'; 50 | } 51 | 52 | return 'full'; 53 | }; 54 | 55 | // Make downloads concurrent for better performance 56 | const queue = new PQueue({ concurrency: 12 }); 57 | 58 | const downloadFileToBase64 = async (url: string): Promise => { 59 | const response = await requestUrl(url).arrayBuffer; 60 | return arrayBufferToBase64(response); 61 | }; 62 | 63 | const populateBase64 = async ( 64 | metadata: FontMetadata, 65 | ): Promise => { 66 | let subsets = Object.keys(metadata.unicodeRange); 67 | if (subsets.length === 0) { 68 | subsets = metadata.subsets; 69 | } 70 | 71 | // Generate a download key based on variable or non-variable fonts 72 | const generateKey = (oldSubset: string, style: string, weight?: number) => { 73 | // Subset may have square brackets if a unicode key 74 | const subset = oldSubset.replace(/\[|\]/g, ''); 75 | 76 | if (metadata.variable) { 77 | const axesKey = getAxes(metadata.variable); 78 | return `${subset}-${axesKey}-${style}`; 79 | } 80 | 81 | return `${subset}-${weight}-${style}`; 82 | }; 83 | 84 | // Wrap all queued downloads into a promise that updates the base64 map 85 | // when resolved 86 | const promises = []; 87 | 88 | for (const style of metadata.styles) { 89 | if (metadata.variable) { 90 | for (const subset of subsets) { 91 | const key = generateKey(subset, style); 92 | const url = `https://cdn.jsdelivr.net/fontsource/fonts/${metadata.id}:vf@latest/${key}.woff2`; 93 | promises.push( 94 | queue.add(() => 95 | downloadFileToBase64(url).then((base64) => { 96 | metadata.base64[`${subset}-${style}`] = base64; 97 | }), 98 | ), 99 | ); 100 | } 101 | } else { 102 | for (const weight of metadata.weights) { 103 | for (const subset of subsets) { 104 | const key = generateKey(subset, style, weight); 105 | const url = `https://cdn.jsdelivr.net/fontsource/fonts/${metadata.id}@latest/${key}.woff2`; 106 | promises.push( 107 | queue.add(() => 108 | downloadFileToBase64(url).then((base64) => { 109 | metadata.base64[key] = base64; 110 | }), 111 | ), 112 | ); 113 | } 114 | } 115 | } 116 | } 117 | 118 | await Promise.all(promises); 119 | 120 | return metadata; 121 | }; 122 | 123 | queue.on('error', () => { 124 | queue.clear(); 125 | }); 126 | 127 | const importFont = async ( 128 | id: string, 129 | plugin: FontsourcePlugin, 130 | ): Promise => { 131 | // Fetch metadata 132 | const metadata = await fetchMetadata(id); 133 | 134 | // Download font files 135 | const metadataWithBase64 = await populateBase64(metadata); 136 | 137 | // Generate CSS 138 | const css = generateCss(metadataWithBase64); 139 | 140 | // Save CSS 141 | const vault = plugin.app.vault; 142 | const path = `${vault.configDir}/fonts/${id}.css`; 143 | await vault.adapter.mkdir(`${vault.configDir}/fonts`); 144 | await vault.adapter.write(path, css); 145 | 146 | return { 147 | id: metadata.id, 148 | family: metadata.family, 149 | subsets: metadata.subsets, 150 | styles: metadata.styles, 151 | weights: metadata.weights, 152 | variable: metadata.variable, 153 | isActive: false, 154 | }; 155 | }; 156 | 157 | export { importFont }; 158 | -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type App, 3 | PluginSettingTab, 4 | Setting, 5 | type ButtonComponent, 6 | Notice, 7 | type ToggleComponent, 8 | } from 'obsidian'; 9 | import type FontsourcePlugin from 'src/main'; 10 | import { SearchModal, SelectModal } from './modal'; 11 | import { applyCss, removeCss, updateCssVariables } from './css'; 12 | import type { FontType } from './types'; 13 | 14 | export default class FontsourceSettingsTab extends PluginSettingTab { 15 | constructor( 16 | app: App, 17 | private plugin: FontsourcePlugin, 18 | ) { 19 | super(app, plugin); 20 | } 21 | 22 | display(): void { 23 | const { containerEl } = this; 24 | containerEl.empty(); 25 | 26 | // Select where to apply imported fonts 27 | const addFontSetting = (name: string, desc: string, type: FontType) => { 28 | new Setting(containerEl) 29 | .setName(name) 30 | .setDesc(desc) 31 | .addButton((button: ButtonComponent) => { 32 | button.setButtonText('Manage'); 33 | button.onClick(() => { 34 | new SelectModal(this.app, this.plugin, type, () => { 35 | this.display(); 36 | updateCssVariables(this.plugin); 37 | }).open(); 38 | }); 39 | }); 40 | }; 41 | 42 | addFontSetting( 43 | 'Interface font', 44 | 'Set base font for all of Obsidian.', 45 | 'interface', 46 | ); 47 | addFontSetting( 48 | 'Text font', 49 | 'Set font for editing and reading views.', 50 | 'text', 51 | ); 52 | addFontSetting( 53 | 'Monospace font', 54 | 'Set font for places like code blocks and frontmatter.', 55 | 'monospace', 56 | ); 57 | 58 | new Setting(containerEl).setName('Imported fonts').setHeading(); 59 | 60 | // Remove font from settings 61 | const removeFromSettings = ( 62 | settings: T[], 63 | id: string, 64 | ): T[] => { 65 | return settings.filter((f) => f.id !== id); 66 | }; 67 | 68 | const removeFromAppliedFonts = (id: string): void => { 69 | this.plugin.settings.interfaceFonts = removeFromSettings( 70 | this.plugin.settings.interfaceFonts, 71 | id, 72 | ); 73 | this.plugin.settings.textFonts = removeFromSettings( 74 | this.plugin.settings.textFonts, 75 | id, 76 | ); 77 | this.plugin.settings.monospaceFonts = removeFromSettings( 78 | this.plugin.settings.monospaceFonts, 79 | id, 80 | ); 81 | 82 | updateCssVariables(this.plugin); 83 | }; 84 | 85 | new Setting(containerEl) 86 | .setName('Select fonts') 87 | .setDesc('Add a font from the Fontsource directory.') 88 | .addButton((button: ButtonComponent) => { 89 | button.setIcon('plus'); 90 | button.setTooltip('Import font'); 91 | button.onClick(() => { 92 | new SearchModal(this.app, this.plugin, () => this.display()).open(); 93 | }); 94 | }); 95 | 96 | // Display all imported fonts in alphabetical order 97 | const fonts = this.plugin.settings.fonts.sort((a, b) => 98 | a.family.localeCompare(b.family), 99 | ); 100 | for (const font of fonts) { 101 | // Create description fragment 102 | const desc = new DocumentFragment(); 103 | desc.createSpan({ 104 | text: `Weights: ${font.weights.join(', ')}`, 105 | }); 106 | desc.createEl('br'); 107 | desc.createSpan({ 108 | text: `Styles: ${font.styles.join(', ')}`, 109 | }); 110 | desc.createEl('br'); 111 | desc.createSpan({ 112 | text: `Subsets: ${font.subsets.join(', ')}`, 113 | }); 114 | 115 | new Setting(containerEl) 116 | .setName(font.family) 117 | .setDesc(desc) 118 | // Toggle to add/remove @font-face fragment to document 119 | .addToggle((toggle: ToggleComponent) => { 120 | toggle.setValue(font.isActive).onChange((value) => { 121 | if (value) { 122 | applyCss(font.id, this.plugin); 123 | } else { 124 | removeCss(font.id); 125 | removeFromAppliedFonts(font.id); 126 | } 127 | 128 | font.isActive = value; 129 | this.plugin.saveSettings(); 130 | }); 131 | }) 132 | .addButton((button: ButtonComponent) => { 133 | button.setIcon('trash-2'); 134 | button.setTooltip('Remove font'); 135 | button.onClick(async () => { 136 | const vault = this.plugin.app.vault; 137 | try { 138 | await vault.adapter.remove( 139 | `${vault.configDir}/fonts/${font.id}.css`, 140 | ); 141 | removeCss(font.id); 142 | this.plugin.settings.fonts = removeFromSettings( 143 | this.plugin.settings.fonts, 144 | font.id, 145 | ); 146 | removeFromAppliedFonts(font.id); 147 | 148 | this.plugin.saveSettings(); 149 | new Notice(`Deleted ${font.family}.`); 150 | this.display(); 151 | } catch (error) { 152 | console.error('Error deleting font:', error); 153 | new Notice(`Unable to delete ${font.id}.css from Vault.`); 154 | } 155 | }); 156 | }); 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/modal.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type App, 3 | Notice, 4 | requestUrl, 5 | SuggestModal, 6 | Modal, 7 | Setting, 8 | } from 'obsidian'; 9 | import type FontsourcePlugin from './main'; 10 | import { importFont } from './import'; 11 | import type { FontType, SettingsPrecedence } from './types'; 12 | 13 | interface Font { 14 | id: string; 15 | family: string; 16 | } 17 | 18 | type FontlistResponse = Record; 19 | 20 | const getFontlist = async (): Promise => { 21 | const response = (await requestUrl( 22 | 'https://api.fontsource.org/fontlist?family', 23 | ).json) as FontlistResponse; 24 | 25 | return Object.entries(response).map(([id, family]) => ({ id, family })); 26 | }; 27 | 28 | export class SearchModal extends SuggestModal { 29 | private plugin: FontsourcePlugin; 30 | // Cache the list of fonts to avoid fetching it multiple times 31 | private listCache: Font[]; 32 | private refresh: () => void; 33 | 34 | constructor(app: App, plugin: FontsourcePlugin, refresh: () => void) { 35 | super(app); 36 | this.plugin = plugin; 37 | this.refresh = refresh; 38 | 39 | this.inputEl.placeholder = 'Select to import a font...'; 40 | this.emptyStateText = 'No fonts found.'; 41 | this.limit = 2500; 42 | } 43 | 44 | private filterFonts(query: string): Font[] { 45 | return this.listCache.filter((font) => 46 | font.family.toLowerCase().includes(query.toLowerCase()), 47 | ); 48 | } 49 | 50 | async getSuggestions(query: string): Promise { 51 | if (!this.listCache) { 52 | const fonts = await getFontlist(); 53 | this.listCache = fonts; 54 | return this.filterFonts(query); 55 | } 56 | 57 | return this.filterFonts(query); 58 | } 59 | 60 | renderSuggestion(item: Font, el: HTMLElement): void { 61 | el.setText(item.family); 62 | } 63 | 64 | async onChooseSuggestion(font: Font, _evt: MouseEvent | KeyboardEvent) { 65 | new Notice(`Importing ${font.family}...`); 66 | 67 | try { 68 | const metadata = await importFont(font.id, this.plugin); 69 | 70 | // Add the font to the settings 71 | const fonts = this.plugin.settings.fonts 72 | .filter((f) => f.id !== metadata.id) 73 | .concat(metadata); 74 | this.plugin.settings.fonts = fonts; 75 | await this.plugin.saveSettings(); 76 | 77 | this.refresh(); 78 | new Notice(`Imported ${font.family}.`); 79 | } catch (error) { 80 | console.error('Error importing font:', error); 81 | new Notice(`Unable to import ${font.family}.`); 82 | } 83 | } 84 | } 85 | 86 | export class SearchActiveModal extends SuggestModal { 87 | private plugin: FontsourcePlugin; 88 | private type: FontType; 89 | private refresh: () => void; 90 | 91 | constructor( 92 | app: App, 93 | plugin: FontsourcePlugin, 94 | type: FontType, 95 | refresh: () => void, 96 | ) { 97 | super(app); 98 | this.plugin = plugin; 99 | this.type = type; 100 | this.refresh = refresh; 101 | 102 | this.inputEl.placeholder = 'Select a font...'; 103 | this.emptyStateText = 'No fonts found.'; 104 | this.limit = 2000; 105 | } 106 | 107 | getSuggestions(query: string): Font[] { 108 | return this.plugin.settings.fonts.filter( 109 | (font) => 110 | font.family.toLowerCase().includes(query.toLowerCase()) && 111 | font.isActive, 112 | ); 113 | } 114 | 115 | renderSuggestion(item: Font, el: HTMLElement): void { 116 | el.setText(item.family); 117 | } 118 | 119 | private checkExists = (id: string, fonts: SettingsPrecedence[]): boolean => { 120 | return fonts.some((font) => font.id === id); 121 | }; 122 | 123 | private addFontToSettings = ( 124 | fonts: SettingsPrecedence[], 125 | font: Font, 126 | ): boolean => { 127 | if (!this.checkExists(font.id, fonts)) { 128 | fonts.push({ 129 | id: font.id, 130 | family: font.family, 131 | precedence: 0, 132 | }); 133 | 134 | return true; 135 | } 136 | 137 | return false; 138 | }; 139 | 140 | onChooseSuggestion(font: Font, _evt: MouseEvent | KeyboardEvent) { 141 | let changed = false; 142 | switch (this.type) { 143 | case 'interface': 144 | changed = this.addFontToSettings( 145 | this.plugin.settings.interfaceFonts, 146 | font, 147 | ); 148 | break; 149 | case 'text': 150 | changed = this.addFontToSettings(this.plugin.settings.textFonts, font); 151 | break; 152 | case 'monospace': 153 | changed = this.addFontToSettings( 154 | this.plugin.settings.monospaceFonts, 155 | font, 156 | ); 157 | break; 158 | } 159 | 160 | this.plugin.saveSettings(); 161 | this.refresh(); 162 | this.close(); 163 | if (changed) { 164 | new Notice(`Selected ${font.family}.`); 165 | } else { 166 | new Notice(`${font.family} is already selected.`); 167 | } 168 | } 169 | } 170 | 171 | export class SelectModal extends Modal { 172 | private plugin: FontsourcePlugin; 173 | private type: FontType; 174 | private refresh: () => void; 175 | 176 | constructor( 177 | app: App, 178 | plugin: FontsourcePlugin, 179 | type: FontType, 180 | refresh: () => void, 181 | ) { 182 | super(app); 183 | this.plugin = plugin; 184 | this.type = type; 185 | this.refresh = refresh; 186 | } 187 | 188 | rerender(): void { 189 | this.refresh(); 190 | this.contentEl.empty(); 191 | this.onOpen(); 192 | } 193 | 194 | onOpen(): void { 195 | const { contentEl } = this; 196 | // Make first letter uppercase 197 | const typeTitle = this.type.charAt(0).toUpperCase() + this.type.slice(1); 198 | contentEl.createEl('h1', { text: `${typeTitle} font` }); 199 | 200 | // Add a font to type 201 | new Setting(contentEl) 202 | .setName('Add font') 203 | .setDesc( 204 | 'To support additional languages, you can select multiple fonts in order of precedence.', 205 | ) 206 | .addButton((button) => { 207 | button.setIcon('plus'); 208 | button.setTooltip('Select font'); 209 | button.onClick(() => { 210 | new SearchActiveModal(this.app, this.plugin, this.type, () => { 211 | this.rerender(); 212 | }).open(); 213 | }); 214 | }); 215 | 216 | contentEl.createEl('h3', { text: 'Selected fonts' }); 217 | 218 | // Display selected fonts 219 | let fonts = this.plugin.settings.interfaceFonts; 220 | switch (this.type) { 221 | case 'text': 222 | fonts = this.plugin.settings.textFonts; 223 | break; 224 | case 'monospace': 225 | fonts = this.plugin.settings.monospaceFonts; 226 | break; 227 | } 228 | 229 | if (fonts.length === 0) { 230 | contentEl.createEl('p', { text: 'No fonts selected.' }); 231 | } 232 | 233 | // Sort by precedence, else by family 234 | fonts.sort((a, b) => { 235 | if (a.precedence === b.precedence) { 236 | return a.family.localeCompare(b.family); 237 | } 238 | return a.precedence - b.precedence; 239 | }); 240 | for (const font of fonts) { 241 | new Setting(contentEl) 242 | .setName(font.family) 243 | // Number input to set precedence 244 | .addText((text) => { 245 | text.setValue(String(font.precedence)); 246 | text.setPlaceholder('Precedence'); 247 | text.onChange((value) => { 248 | if (/^\d+$/.test(value)) { 249 | font.precedence = Number.parseInt(value); 250 | // Sort by precedence 251 | fonts.sort((a, b) => a.precedence - b.precedence); 252 | this.plugin.saveSettings(); 253 | this.rerender(); 254 | } else { 255 | text.setValue('0'); 256 | } 257 | }); 258 | }) 259 | .addButton((button) => { 260 | button.setIcon('x'); 261 | button.setTooltip('Remove font'); 262 | button.onClick(() => { 263 | const index = fonts.findIndex((f) => f.id === font.id); 264 | fonts.splice(index, 1); 265 | this.plugin.saveSettings(); 266 | this.rerender(); 267 | }); 268 | }); 269 | } 270 | } 271 | } 272 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@fontsource-utils/generate': 9 | specifier: ^0.4.0 10 | version: 0.4.0 11 | p-queue: 12 | specifier: ^8.0.1 13 | version: 8.0.1 14 | 15 | devDependencies: 16 | '@biomejs/biome': 17 | specifier: ^1.6.4 18 | version: 1.6.4 19 | '@types/node': 20 | specifier: ^16.11.6 21 | version: 16.18.95 22 | '@typescript-eslint/eslint-plugin': 23 | specifier: 5.29.0 24 | version: 5.29.0(@typescript-eslint/parser@5.29.0)(eslint@8.57.0)(typescript@4.7.4) 25 | '@typescript-eslint/parser': 26 | specifier: 5.29.0 27 | version: 5.29.0(eslint@8.57.0)(typescript@4.7.4) 28 | builtin-modules: 29 | specifier: 3.3.0 30 | version: 3.3.0 31 | esbuild: 32 | specifier: 0.17.3 33 | version: 0.17.3 34 | esbuild-plugin-copy: 35 | specifier: ^2.1.1 36 | version: 2.1.1(esbuild@0.17.3) 37 | obsidian: 38 | specifier: latest 39 | version: 1.5.7-1(@codemirror/state@6.4.1)(@codemirror/view@6.26.1) 40 | tslib: 41 | specifier: 2.4.0 42 | version: 2.4.0 43 | typescript: 44 | specifier: 4.7.4 45 | version: 4.7.4 46 | 47 | packages: 48 | 49 | /@aashutoshrathi/word-wrap@1.2.6: 50 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 51 | engines: {node: '>=0.10.0'} 52 | dev: true 53 | 54 | /@biomejs/biome@1.6.4: 55 | resolution: {integrity: sha512-3groVd2oWsLC0ZU+XXgHSNbq31lUcOCBkCcA7sAQGBopHcmL+jmmdoWlY3S61zIh+f2mqQTQte1g6PZKb3JJjA==} 56 | engines: {node: '>=14.21.3'} 57 | hasBin: true 58 | requiresBuild: true 59 | optionalDependencies: 60 | '@biomejs/cli-darwin-arm64': 1.6.4 61 | '@biomejs/cli-darwin-x64': 1.6.4 62 | '@biomejs/cli-linux-arm64': 1.6.4 63 | '@biomejs/cli-linux-arm64-musl': 1.6.4 64 | '@biomejs/cli-linux-x64': 1.6.4 65 | '@biomejs/cli-linux-x64-musl': 1.6.4 66 | '@biomejs/cli-win32-arm64': 1.6.4 67 | '@biomejs/cli-win32-x64': 1.6.4 68 | dev: true 69 | 70 | /@biomejs/cli-darwin-arm64@1.6.4: 71 | resolution: {integrity: sha512-2WZef8byI9NRzGajGj5RTrroW9BxtfbP9etigW1QGAtwu/6+cLkdPOWRAs7uFtaxBNiKFYA8j/BxV5zeAo5QOQ==} 72 | engines: {node: '>=14.21.3'} 73 | cpu: [arm64] 74 | os: [darwin] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@biomejs/cli-darwin-x64@1.6.4: 80 | resolution: {integrity: sha512-uo1zgM7jvzcoDpF6dbGizejDLCqNpUIRkCj/oEK0PB0NUw8re/cn1EnxuOLZqDpn+8G75COLQTOx8UQIBBN/Kg==} 81 | engines: {node: '>=14.21.3'} 82 | cpu: [x64] 83 | os: [darwin] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@biomejs/cli-linux-arm64-musl@1.6.4: 89 | resolution: {integrity: sha512-Hp8Jwt6rjj0wCcYAEN6/cfwrrPLLlGOXZ56Lei4Pt4jy39+UuPeAVFPeclrrCfxyL1wQ2xPrhd/saTHSL6DoJg==} 90 | engines: {node: '>=14.21.3'} 91 | cpu: [arm64] 92 | os: [linux] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@biomejs/cli-linux-arm64@1.6.4: 98 | resolution: {integrity: sha512-wAOieaMNIpLrxGc2/xNvM//CIZg7ueWy3V5A4T7gDZ3OL/Go27EKE59a+vMKsBCYmTt7jFl4yHz0TUkUbodA/w==} 99 | engines: {node: '>=14.21.3'} 100 | cpu: [arm64] 101 | os: [linux] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@biomejs/cli-linux-x64-musl@1.6.4: 107 | resolution: {integrity: sha512-wqi0hr8KAx5kBO0B+m5u8QqiYFFBJOSJVSuRqTeGWW+GYLVUtXNidykNqf1JsW6jJDpbkSp2xHKE/bTlVaG2Kg==} 108 | engines: {node: '>=14.21.3'} 109 | cpu: [x64] 110 | os: [linux] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@biomejs/cli-linux-x64@1.6.4: 116 | resolution: {integrity: sha512-qTWhuIw+/ePvOkjE9Zxf5OqSCYxtAvcTJtVmZT8YQnmY2I62JKNV2m7tf6O5ViKZUOP0mOQ6NgqHKcHH1eT8jw==} 117 | engines: {node: '>=14.21.3'} 118 | cpu: [x64] 119 | os: [linux] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@biomejs/cli-win32-arm64@1.6.4: 125 | resolution: {integrity: sha512-Wp3FiEeF6v6C5qMfLkHwf4YsoNHr/n0efvoC8jCKO/kX05OXaVExj+1uVQ1eGT7Pvx0XVm/TLprRO0vq/V6UzA==} 126 | engines: {node: '>=14.21.3'} 127 | cpu: [arm64] 128 | os: [win32] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@biomejs/cli-win32-x64@1.6.4: 134 | resolution: {integrity: sha512-mz183Di5hTSGP7KjNWEhivcP1wnHLGmOxEROvoFsIxMYtDhzJDad4k5gI/1JbmA0xe4n52vsgqo09tBhrMT/Zg==} 135 | engines: {node: '>=14.21.3'} 136 | cpu: [x64] 137 | os: [win32] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@codemirror/state@6.4.1: 143 | resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} 144 | dev: true 145 | 146 | /@codemirror/view@6.26.1: 147 | resolution: {integrity: sha512-wLw0t3R9AwOSQThdZ5Onw8QQtem5asE7+bPlnzc57eubPqiuJKIzwjMZ+C42vQett+iva+J8VgFV4RYWDBh5FA==} 148 | dependencies: 149 | '@codemirror/state': 6.4.1 150 | style-mod: 4.1.2 151 | w3c-keyname: 2.2.8 152 | dev: true 153 | 154 | /@esbuild/android-arm64@0.17.3: 155 | resolution: {integrity: sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==} 156 | engines: {node: '>=12'} 157 | cpu: [arm64] 158 | os: [android] 159 | requiresBuild: true 160 | dev: true 161 | optional: true 162 | 163 | /@esbuild/android-arm@0.17.3: 164 | resolution: {integrity: sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==} 165 | engines: {node: '>=12'} 166 | cpu: [arm] 167 | os: [android] 168 | requiresBuild: true 169 | dev: true 170 | optional: true 171 | 172 | /@esbuild/android-x64@0.17.3: 173 | resolution: {integrity: sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==} 174 | engines: {node: '>=12'} 175 | cpu: [x64] 176 | os: [android] 177 | requiresBuild: true 178 | dev: true 179 | optional: true 180 | 181 | /@esbuild/darwin-arm64@0.17.3: 182 | resolution: {integrity: sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==} 183 | engines: {node: '>=12'} 184 | cpu: [arm64] 185 | os: [darwin] 186 | requiresBuild: true 187 | dev: true 188 | optional: true 189 | 190 | /@esbuild/darwin-x64@0.17.3: 191 | resolution: {integrity: sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==} 192 | engines: {node: '>=12'} 193 | cpu: [x64] 194 | os: [darwin] 195 | requiresBuild: true 196 | dev: true 197 | optional: true 198 | 199 | /@esbuild/freebsd-arm64@0.17.3: 200 | resolution: {integrity: sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==} 201 | engines: {node: '>=12'} 202 | cpu: [arm64] 203 | os: [freebsd] 204 | requiresBuild: true 205 | dev: true 206 | optional: true 207 | 208 | /@esbuild/freebsd-x64@0.17.3: 209 | resolution: {integrity: sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==} 210 | engines: {node: '>=12'} 211 | cpu: [x64] 212 | os: [freebsd] 213 | requiresBuild: true 214 | dev: true 215 | optional: true 216 | 217 | /@esbuild/linux-arm64@0.17.3: 218 | resolution: {integrity: sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==} 219 | engines: {node: '>=12'} 220 | cpu: [arm64] 221 | os: [linux] 222 | requiresBuild: true 223 | dev: true 224 | optional: true 225 | 226 | /@esbuild/linux-arm@0.17.3: 227 | resolution: {integrity: sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==} 228 | engines: {node: '>=12'} 229 | cpu: [arm] 230 | os: [linux] 231 | requiresBuild: true 232 | dev: true 233 | optional: true 234 | 235 | /@esbuild/linux-ia32@0.17.3: 236 | resolution: {integrity: sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==} 237 | engines: {node: '>=12'} 238 | cpu: [ia32] 239 | os: [linux] 240 | requiresBuild: true 241 | dev: true 242 | optional: true 243 | 244 | /@esbuild/linux-loong64@0.17.3: 245 | resolution: {integrity: sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==} 246 | engines: {node: '>=12'} 247 | cpu: [loong64] 248 | os: [linux] 249 | requiresBuild: true 250 | dev: true 251 | optional: true 252 | 253 | /@esbuild/linux-mips64el@0.17.3: 254 | resolution: {integrity: sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==} 255 | engines: {node: '>=12'} 256 | cpu: [mips64el] 257 | os: [linux] 258 | requiresBuild: true 259 | dev: true 260 | optional: true 261 | 262 | /@esbuild/linux-ppc64@0.17.3: 263 | resolution: {integrity: sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==} 264 | engines: {node: '>=12'} 265 | cpu: [ppc64] 266 | os: [linux] 267 | requiresBuild: true 268 | dev: true 269 | optional: true 270 | 271 | /@esbuild/linux-riscv64@0.17.3: 272 | resolution: {integrity: sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==} 273 | engines: {node: '>=12'} 274 | cpu: [riscv64] 275 | os: [linux] 276 | requiresBuild: true 277 | dev: true 278 | optional: true 279 | 280 | /@esbuild/linux-s390x@0.17.3: 281 | resolution: {integrity: sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==} 282 | engines: {node: '>=12'} 283 | cpu: [s390x] 284 | os: [linux] 285 | requiresBuild: true 286 | dev: true 287 | optional: true 288 | 289 | /@esbuild/linux-x64@0.17.3: 290 | resolution: {integrity: sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==} 291 | engines: {node: '>=12'} 292 | cpu: [x64] 293 | os: [linux] 294 | requiresBuild: true 295 | dev: true 296 | optional: true 297 | 298 | /@esbuild/netbsd-x64@0.17.3: 299 | resolution: {integrity: sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==} 300 | engines: {node: '>=12'} 301 | cpu: [x64] 302 | os: [netbsd] 303 | requiresBuild: true 304 | dev: true 305 | optional: true 306 | 307 | /@esbuild/openbsd-x64@0.17.3: 308 | resolution: {integrity: sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==} 309 | engines: {node: '>=12'} 310 | cpu: [x64] 311 | os: [openbsd] 312 | requiresBuild: true 313 | dev: true 314 | optional: true 315 | 316 | /@esbuild/sunos-x64@0.17.3: 317 | resolution: {integrity: sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==} 318 | engines: {node: '>=12'} 319 | cpu: [x64] 320 | os: [sunos] 321 | requiresBuild: true 322 | dev: true 323 | optional: true 324 | 325 | /@esbuild/win32-arm64@0.17.3: 326 | resolution: {integrity: sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==} 327 | engines: {node: '>=12'} 328 | cpu: [arm64] 329 | os: [win32] 330 | requiresBuild: true 331 | dev: true 332 | optional: true 333 | 334 | /@esbuild/win32-ia32@0.17.3: 335 | resolution: {integrity: sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==} 336 | engines: {node: '>=12'} 337 | cpu: [ia32] 338 | os: [win32] 339 | requiresBuild: true 340 | dev: true 341 | optional: true 342 | 343 | /@esbuild/win32-x64@0.17.3: 344 | resolution: {integrity: sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==} 345 | engines: {node: '>=12'} 346 | cpu: [x64] 347 | os: [win32] 348 | requiresBuild: true 349 | dev: true 350 | optional: true 351 | 352 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): 353 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 354 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 355 | peerDependencies: 356 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 357 | dependencies: 358 | eslint: 8.57.0 359 | eslint-visitor-keys: 3.4.3 360 | dev: true 361 | 362 | /@eslint-community/regexpp@4.10.0: 363 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 364 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 365 | dev: true 366 | 367 | /@eslint/eslintrc@2.1.4: 368 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 369 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 370 | dependencies: 371 | ajv: 6.12.6 372 | debug: 4.3.4 373 | espree: 9.6.1 374 | globals: 13.24.0 375 | ignore: 5.3.1 376 | import-fresh: 3.3.0 377 | js-yaml: 4.1.0 378 | minimatch: 3.1.2 379 | strip-json-comments: 3.1.1 380 | transitivePeerDependencies: 381 | - supports-color 382 | dev: true 383 | 384 | /@eslint/js@8.57.0: 385 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 386 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 387 | dev: true 388 | 389 | /@fontsource-utils/generate@0.4.0: 390 | resolution: {integrity: sha512-+PWkHQK1vFlM+I9LVfE/yOt8T3s0GsZhRNKu89cH/Zg1/G7esgIyyQA2FKnFn16DVhD7f1PkCjZu4VtgiL98dw==} 391 | dev: false 392 | 393 | /@humanwhocodes/config-array@0.11.14: 394 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 395 | engines: {node: '>=10.10.0'} 396 | dependencies: 397 | '@humanwhocodes/object-schema': 2.0.3 398 | debug: 4.3.4 399 | minimatch: 3.1.2 400 | transitivePeerDependencies: 401 | - supports-color 402 | dev: true 403 | 404 | /@humanwhocodes/module-importer@1.0.1: 405 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 406 | engines: {node: '>=12.22'} 407 | dev: true 408 | 409 | /@humanwhocodes/object-schema@2.0.3: 410 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 411 | dev: true 412 | 413 | /@nodelib/fs.scandir@2.1.5: 414 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 415 | engines: {node: '>= 8'} 416 | dependencies: 417 | '@nodelib/fs.stat': 2.0.5 418 | run-parallel: 1.2.0 419 | dev: true 420 | 421 | /@nodelib/fs.stat@2.0.5: 422 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 423 | engines: {node: '>= 8'} 424 | dev: true 425 | 426 | /@nodelib/fs.walk@1.2.8: 427 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 428 | engines: {node: '>= 8'} 429 | dependencies: 430 | '@nodelib/fs.scandir': 2.1.5 431 | fastq: 1.17.1 432 | dev: true 433 | 434 | /@types/codemirror@5.60.8: 435 | resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} 436 | dependencies: 437 | '@types/tern': 0.23.9 438 | dev: true 439 | 440 | /@types/estree@1.0.5: 441 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 442 | dev: true 443 | 444 | /@types/json-schema@7.0.15: 445 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 446 | dev: true 447 | 448 | /@types/node@16.18.95: 449 | resolution: {integrity: sha512-z9w+CcR7ahc7UhsKe+PGB25nmPmCERQBAdLdFHhoZ6+FfgSr7gUvdQI0eLH2t7ue8u5wKsLdde6cHKPjhC8vGg==} 450 | dev: true 451 | 452 | /@types/tern@0.23.9: 453 | resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} 454 | dependencies: 455 | '@types/estree': 1.0.5 456 | dev: true 457 | 458 | /@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0)(eslint@8.57.0)(typescript@4.7.4): 459 | resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} 460 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 461 | peerDependencies: 462 | '@typescript-eslint/parser': ^5.0.0 463 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 464 | typescript: '*' 465 | peerDependenciesMeta: 466 | typescript: 467 | optional: true 468 | dependencies: 469 | '@typescript-eslint/parser': 5.29.0(eslint@8.57.0)(typescript@4.7.4) 470 | '@typescript-eslint/scope-manager': 5.29.0 471 | '@typescript-eslint/type-utils': 5.29.0(eslint@8.57.0)(typescript@4.7.4) 472 | '@typescript-eslint/utils': 5.29.0(eslint@8.57.0)(typescript@4.7.4) 473 | debug: 4.3.4 474 | eslint: 8.57.0 475 | functional-red-black-tree: 1.0.1 476 | ignore: 5.3.1 477 | regexpp: 3.2.0 478 | semver: 7.6.0 479 | tsutils: 3.21.0(typescript@4.7.4) 480 | typescript: 4.7.4 481 | transitivePeerDependencies: 482 | - supports-color 483 | dev: true 484 | 485 | /@typescript-eslint/parser@5.29.0(eslint@8.57.0)(typescript@4.7.4): 486 | resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} 487 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 488 | peerDependencies: 489 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 490 | typescript: '*' 491 | peerDependenciesMeta: 492 | typescript: 493 | optional: true 494 | dependencies: 495 | '@typescript-eslint/scope-manager': 5.29.0 496 | '@typescript-eslint/types': 5.29.0 497 | '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) 498 | debug: 4.3.4 499 | eslint: 8.57.0 500 | typescript: 4.7.4 501 | transitivePeerDependencies: 502 | - supports-color 503 | dev: true 504 | 505 | /@typescript-eslint/scope-manager@5.29.0: 506 | resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} 507 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 508 | dependencies: 509 | '@typescript-eslint/types': 5.29.0 510 | '@typescript-eslint/visitor-keys': 5.29.0 511 | dev: true 512 | 513 | /@typescript-eslint/type-utils@5.29.0(eslint@8.57.0)(typescript@4.7.4): 514 | resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} 515 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 516 | peerDependencies: 517 | eslint: '*' 518 | typescript: '*' 519 | peerDependenciesMeta: 520 | typescript: 521 | optional: true 522 | dependencies: 523 | '@typescript-eslint/utils': 5.29.0(eslint@8.57.0)(typescript@4.7.4) 524 | debug: 4.3.4 525 | eslint: 8.57.0 526 | tsutils: 3.21.0(typescript@4.7.4) 527 | typescript: 4.7.4 528 | transitivePeerDependencies: 529 | - supports-color 530 | dev: true 531 | 532 | /@typescript-eslint/types@5.29.0: 533 | resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} 534 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 535 | dev: true 536 | 537 | /@typescript-eslint/typescript-estree@5.29.0(typescript@4.7.4): 538 | resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} 539 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 540 | peerDependencies: 541 | typescript: '*' 542 | peerDependenciesMeta: 543 | typescript: 544 | optional: true 545 | dependencies: 546 | '@typescript-eslint/types': 5.29.0 547 | '@typescript-eslint/visitor-keys': 5.29.0 548 | debug: 4.3.4 549 | globby: 11.1.0 550 | is-glob: 4.0.3 551 | semver: 7.6.0 552 | tsutils: 3.21.0(typescript@4.7.4) 553 | typescript: 4.7.4 554 | transitivePeerDependencies: 555 | - supports-color 556 | dev: true 557 | 558 | /@typescript-eslint/utils@5.29.0(eslint@8.57.0)(typescript@4.7.4): 559 | resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} 560 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 561 | peerDependencies: 562 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 563 | dependencies: 564 | '@types/json-schema': 7.0.15 565 | '@typescript-eslint/scope-manager': 5.29.0 566 | '@typescript-eslint/types': 5.29.0 567 | '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) 568 | eslint: 8.57.0 569 | eslint-scope: 5.1.1 570 | eslint-utils: 3.0.0(eslint@8.57.0) 571 | transitivePeerDependencies: 572 | - supports-color 573 | - typescript 574 | dev: true 575 | 576 | /@typescript-eslint/visitor-keys@5.29.0: 577 | resolution: {integrity: sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==} 578 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 579 | dependencies: 580 | '@typescript-eslint/types': 5.29.0 581 | eslint-visitor-keys: 3.4.3 582 | dev: true 583 | 584 | /@ungap/structured-clone@1.2.0: 585 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 586 | dev: true 587 | 588 | /acorn-jsx@5.3.2(acorn@8.11.3): 589 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 590 | peerDependencies: 591 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 592 | dependencies: 593 | acorn: 8.11.3 594 | dev: true 595 | 596 | /acorn@8.11.3: 597 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 598 | engines: {node: '>=0.4.0'} 599 | hasBin: true 600 | dev: true 601 | 602 | /ajv@6.12.6: 603 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 604 | dependencies: 605 | fast-deep-equal: 3.1.3 606 | fast-json-stable-stringify: 2.1.0 607 | json-schema-traverse: 0.4.1 608 | uri-js: 4.4.1 609 | dev: true 610 | 611 | /ansi-regex@5.0.1: 612 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 613 | engines: {node: '>=8'} 614 | dev: true 615 | 616 | /ansi-styles@4.3.0: 617 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 618 | engines: {node: '>=8'} 619 | dependencies: 620 | color-convert: 2.0.1 621 | dev: true 622 | 623 | /anymatch@3.1.3: 624 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 625 | engines: {node: '>= 8'} 626 | dependencies: 627 | normalize-path: 3.0.0 628 | picomatch: 2.3.1 629 | dev: true 630 | 631 | /argparse@2.0.1: 632 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 633 | dev: true 634 | 635 | /array-union@2.1.0: 636 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 637 | engines: {node: '>=8'} 638 | dev: true 639 | 640 | /balanced-match@1.0.2: 641 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 642 | dev: true 643 | 644 | /binary-extensions@2.3.0: 645 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 646 | engines: {node: '>=8'} 647 | dev: true 648 | 649 | /brace-expansion@1.1.11: 650 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 651 | dependencies: 652 | balanced-match: 1.0.2 653 | concat-map: 0.0.1 654 | dev: true 655 | 656 | /braces@3.0.2: 657 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 658 | engines: {node: '>=8'} 659 | dependencies: 660 | fill-range: 7.0.1 661 | dev: true 662 | 663 | /builtin-modules@3.3.0: 664 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 665 | engines: {node: '>=6'} 666 | dev: true 667 | 668 | /callsites@3.1.0: 669 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 670 | engines: {node: '>=6'} 671 | dev: true 672 | 673 | /chalk@4.1.2: 674 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 675 | engines: {node: '>=10'} 676 | dependencies: 677 | ansi-styles: 4.3.0 678 | supports-color: 7.2.0 679 | dev: true 680 | 681 | /chokidar@3.6.0: 682 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 683 | engines: {node: '>= 8.10.0'} 684 | dependencies: 685 | anymatch: 3.1.3 686 | braces: 3.0.2 687 | glob-parent: 5.1.2 688 | is-binary-path: 2.1.0 689 | is-glob: 4.0.3 690 | normalize-path: 3.0.0 691 | readdirp: 3.6.0 692 | optionalDependencies: 693 | fsevents: 2.3.3 694 | dev: true 695 | 696 | /color-convert@2.0.1: 697 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 698 | engines: {node: '>=7.0.0'} 699 | dependencies: 700 | color-name: 1.1.4 701 | dev: true 702 | 703 | /color-name@1.1.4: 704 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 705 | dev: true 706 | 707 | /concat-map@0.0.1: 708 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 709 | dev: true 710 | 711 | /cross-spawn@7.0.3: 712 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 713 | engines: {node: '>= 8'} 714 | dependencies: 715 | path-key: 3.1.1 716 | shebang-command: 2.0.0 717 | which: 2.0.2 718 | dev: true 719 | 720 | /debug@4.3.4: 721 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 722 | engines: {node: '>=6.0'} 723 | peerDependencies: 724 | supports-color: '*' 725 | peerDependenciesMeta: 726 | supports-color: 727 | optional: true 728 | dependencies: 729 | ms: 2.1.2 730 | dev: true 731 | 732 | /deep-is@0.1.4: 733 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 734 | dev: true 735 | 736 | /dir-glob@3.0.1: 737 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 738 | engines: {node: '>=8'} 739 | dependencies: 740 | path-type: 4.0.0 741 | dev: true 742 | 743 | /doctrine@3.0.0: 744 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 745 | engines: {node: '>=6.0.0'} 746 | dependencies: 747 | esutils: 2.0.3 748 | dev: true 749 | 750 | /esbuild-plugin-copy@2.1.1(esbuild@0.17.3): 751 | resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} 752 | peerDependencies: 753 | esbuild: '>= 0.14.0' 754 | dependencies: 755 | chalk: 4.1.2 756 | chokidar: 3.6.0 757 | esbuild: 0.17.3 758 | fs-extra: 10.1.0 759 | globby: 11.1.0 760 | dev: true 761 | 762 | /esbuild@0.17.3: 763 | resolution: {integrity: sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==} 764 | engines: {node: '>=12'} 765 | hasBin: true 766 | requiresBuild: true 767 | optionalDependencies: 768 | '@esbuild/android-arm': 0.17.3 769 | '@esbuild/android-arm64': 0.17.3 770 | '@esbuild/android-x64': 0.17.3 771 | '@esbuild/darwin-arm64': 0.17.3 772 | '@esbuild/darwin-x64': 0.17.3 773 | '@esbuild/freebsd-arm64': 0.17.3 774 | '@esbuild/freebsd-x64': 0.17.3 775 | '@esbuild/linux-arm': 0.17.3 776 | '@esbuild/linux-arm64': 0.17.3 777 | '@esbuild/linux-ia32': 0.17.3 778 | '@esbuild/linux-loong64': 0.17.3 779 | '@esbuild/linux-mips64el': 0.17.3 780 | '@esbuild/linux-ppc64': 0.17.3 781 | '@esbuild/linux-riscv64': 0.17.3 782 | '@esbuild/linux-s390x': 0.17.3 783 | '@esbuild/linux-x64': 0.17.3 784 | '@esbuild/netbsd-x64': 0.17.3 785 | '@esbuild/openbsd-x64': 0.17.3 786 | '@esbuild/sunos-x64': 0.17.3 787 | '@esbuild/win32-arm64': 0.17.3 788 | '@esbuild/win32-ia32': 0.17.3 789 | '@esbuild/win32-x64': 0.17.3 790 | dev: true 791 | 792 | /escape-string-regexp@4.0.0: 793 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 794 | engines: {node: '>=10'} 795 | dev: true 796 | 797 | /eslint-scope@5.1.1: 798 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 799 | engines: {node: '>=8.0.0'} 800 | dependencies: 801 | esrecurse: 4.3.0 802 | estraverse: 4.3.0 803 | dev: true 804 | 805 | /eslint-scope@7.2.2: 806 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 807 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 808 | dependencies: 809 | esrecurse: 4.3.0 810 | estraverse: 5.3.0 811 | dev: true 812 | 813 | /eslint-utils@3.0.0(eslint@8.57.0): 814 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 815 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 816 | peerDependencies: 817 | eslint: '>=5' 818 | dependencies: 819 | eslint: 8.57.0 820 | eslint-visitor-keys: 2.1.0 821 | dev: true 822 | 823 | /eslint-visitor-keys@2.1.0: 824 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 825 | engines: {node: '>=10'} 826 | dev: true 827 | 828 | /eslint-visitor-keys@3.4.3: 829 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 830 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 831 | dev: true 832 | 833 | /eslint@8.57.0: 834 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 835 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 836 | hasBin: true 837 | dependencies: 838 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 839 | '@eslint-community/regexpp': 4.10.0 840 | '@eslint/eslintrc': 2.1.4 841 | '@eslint/js': 8.57.0 842 | '@humanwhocodes/config-array': 0.11.14 843 | '@humanwhocodes/module-importer': 1.0.1 844 | '@nodelib/fs.walk': 1.2.8 845 | '@ungap/structured-clone': 1.2.0 846 | ajv: 6.12.6 847 | chalk: 4.1.2 848 | cross-spawn: 7.0.3 849 | debug: 4.3.4 850 | doctrine: 3.0.0 851 | escape-string-regexp: 4.0.0 852 | eslint-scope: 7.2.2 853 | eslint-visitor-keys: 3.4.3 854 | espree: 9.6.1 855 | esquery: 1.5.0 856 | esutils: 2.0.3 857 | fast-deep-equal: 3.1.3 858 | file-entry-cache: 6.0.1 859 | find-up: 5.0.0 860 | glob-parent: 6.0.2 861 | globals: 13.24.0 862 | graphemer: 1.4.0 863 | ignore: 5.3.1 864 | imurmurhash: 0.1.4 865 | is-glob: 4.0.3 866 | is-path-inside: 3.0.3 867 | js-yaml: 4.1.0 868 | json-stable-stringify-without-jsonify: 1.0.1 869 | levn: 0.4.1 870 | lodash.merge: 4.6.2 871 | minimatch: 3.1.2 872 | natural-compare: 1.4.0 873 | optionator: 0.9.3 874 | strip-ansi: 6.0.1 875 | text-table: 0.2.0 876 | transitivePeerDependencies: 877 | - supports-color 878 | dev: true 879 | 880 | /espree@9.6.1: 881 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 882 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 883 | dependencies: 884 | acorn: 8.11.3 885 | acorn-jsx: 5.3.2(acorn@8.11.3) 886 | eslint-visitor-keys: 3.4.3 887 | dev: true 888 | 889 | /esquery@1.5.0: 890 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 891 | engines: {node: '>=0.10'} 892 | dependencies: 893 | estraverse: 5.3.0 894 | dev: true 895 | 896 | /esrecurse@4.3.0: 897 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 898 | engines: {node: '>=4.0'} 899 | dependencies: 900 | estraverse: 5.3.0 901 | dev: true 902 | 903 | /estraverse@4.3.0: 904 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 905 | engines: {node: '>=4.0'} 906 | dev: true 907 | 908 | /estraverse@5.3.0: 909 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 910 | engines: {node: '>=4.0'} 911 | dev: true 912 | 913 | /esutils@2.0.3: 914 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 915 | engines: {node: '>=0.10.0'} 916 | dev: true 917 | 918 | /eventemitter3@5.0.1: 919 | resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 920 | dev: false 921 | 922 | /fast-deep-equal@3.1.3: 923 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 924 | dev: true 925 | 926 | /fast-glob@3.3.2: 927 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 928 | engines: {node: '>=8.6.0'} 929 | dependencies: 930 | '@nodelib/fs.stat': 2.0.5 931 | '@nodelib/fs.walk': 1.2.8 932 | glob-parent: 5.1.2 933 | merge2: 1.4.1 934 | micromatch: 4.0.5 935 | dev: true 936 | 937 | /fast-json-stable-stringify@2.1.0: 938 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 939 | dev: true 940 | 941 | /fast-levenshtein@2.0.6: 942 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 943 | dev: true 944 | 945 | /fastq@1.17.1: 946 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 947 | dependencies: 948 | reusify: 1.0.4 949 | dev: true 950 | 951 | /file-entry-cache@6.0.1: 952 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 953 | engines: {node: ^10.12.0 || >=12.0.0} 954 | dependencies: 955 | flat-cache: 3.2.0 956 | dev: true 957 | 958 | /fill-range@7.0.1: 959 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 960 | engines: {node: '>=8'} 961 | dependencies: 962 | to-regex-range: 5.0.1 963 | dev: true 964 | 965 | /find-up@5.0.0: 966 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 967 | engines: {node: '>=10'} 968 | dependencies: 969 | locate-path: 6.0.0 970 | path-exists: 4.0.0 971 | dev: true 972 | 973 | /flat-cache@3.2.0: 974 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 975 | engines: {node: ^10.12.0 || >=12.0.0} 976 | dependencies: 977 | flatted: 3.3.1 978 | keyv: 4.5.4 979 | rimraf: 3.0.2 980 | dev: true 981 | 982 | /flatted@3.3.1: 983 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 984 | dev: true 985 | 986 | /fs-extra@10.1.0: 987 | resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} 988 | engines: {node: '>=12'} 989 | dependencies: 990 | graceful-fs: 4.2.11 991 | jsonfile: 6.1.0 992 | universalify: 2.0.1 993 | dev: true 994 | 995 | /fs.realpath@1.0.0: 996 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 997 | dev: true 998 | 999 | /fsevents@2.3.3: 1000 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1001 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1002 | os: [darwin] 1003 | requiresBuild: true 1004 | dev: true 1005 | optional: true 1006 | 1007 | /functional-red-black-tree@1.0.1: 1008 | resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} 1009 | dev: true 1010 | 1011 | /glob-parent@5.1.2: 1012 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1013 | engines: {node: '>= 6'} 1014 | dependencies: 1015 | is-glob: 4.0.3 1016 | dev: true 1017 | 1018 | /glob-parent@6.0.2: 1019 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1020 | engines: {node: '>=10.13.0'} 1021 | dependencies: 1022 | is-glob: 4.0.3 1023 | dev: true 1024 | 1025 | /glob@7.2.3: 1026 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1027 | dependencies: 1028 | fs.realpath: 1.0.0 1029 | inflight: 1.0.6 1030 | inherits: 2.0.4 1031 | minimatch: 3.1.2 1032 | once: 1.4.0 1033 | path-is-absolute: 1.0.1 1034 | dev: true 1035 | 1036 | /globals@13.24.0: 1037 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1038 | engines: {node: '>=8'} 1039 | dependencies: 1040 | type-fest: 0.20.2 1041 | dev: true 1042 | 1043 | /globby@11.1.0: 1044 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1045 | engines: {node: '>=10'} 1046 | dependencies: 1047 | array-union: 2.1.0 1048 | dir-glob: 3.0.1 1049 | fast-glob: 3.3.2 1050 | ignore: 5.3.1 1051 | merge2: 1.4.1 1052 | slash: 3.0.0 1053 | dev: true 1054 | 1055 | /graceful-fs@4.2.11: 1056 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1057 | dev: true 1058 | 1059 | /graphemer@1.4.0: 1060 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1061 | dev: true 1062 | 1063 | /has-flag@4.0.0: 1064 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1065 | engines: {node: '>=8'} 1066 | dev: true 1067 | 1068 | /ignore@5.3.1: 1069 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1070 | engines: {node: '>= 4'} 1071 | dev: true 1072 | 1073 | /import-fresh@3.3.0: 1074 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1075 | engines: {node: '>=6'} 1076 | dependencies: 1077 | parent-module: 1.0.1 1078 | resolve-from: 4.0.0 1079 | dev: true 1080 | 1081 | /imurmurhash@0.1.4: 1082 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1083 | engines: {node: '>=0.8.19'} 1084 | dev: true 1085 | 1086 | /inflight@1.0.6: 1087 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1088 | dependencies: 1089 | once: 1.4.0 1090 | wrappy: 1.0.2 1091 | dev: true 1092 | 1093 | /inherits@2.0.4: 1094 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1095 | dev: true 1096 | 1097 | /is-binary-path@2.1.0: 1098 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1099 | engines: {node: '>=8'} 1100 | dependencies: 1101 | binary-extensions: 2.3.0 1102 | dev: true 1103 | 1104 | /is-extglob@2.1.1: 1105 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1106 | engines: {node: '>=0.10.0'} 1107 | dev: true 1108 | 1109 | /is-glob@4.0.3: 1110 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1111 | engines: {node: '>=0.10.0'} 1112 | dependencies: 1113 | is-extglob: 2.1.1 1114 | dev: true 1115 | 1116 | /is-number@7.0.0: 1117 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1118 | engines: {node: '>=0.12.0'} 1119 | dev: true 1120 | 1121 | /is-path-inside@3.0.3: 1122 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1123 | engines: {node: '>=8'} 1124 | dev: true 1125 | 1126 | /isexe@2.0.0: 1127 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1128 | dev: true 1129 | 1130 | /js-yaml@4.1.0: 1131 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1132 | hasBin: true 1133 | dependencies: 1134 | argparse: 2.0.1 1135 | dev: true 1136 | 1137 | /json-buffer@3.0.1: 1138 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1139 | dev: true 1140 | 1141 | /json-schema-traverse@0.4.1: 1142 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1143 | dev: true 1144 | 1145 | /json-stable-stringify-without-jsonify@1.0.1: 1146 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1147 | dev: true 1148 | 1149 | /jsonfile@6.1.0: 1150 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1151 | dependencies: 1152 | universalify: 2.0.1 1153 | optionalDependencies: 1154 | graceful-fs: 4.2.11 1155 | dev: true 1156 | 1157 | /keyv@4.5.4: 1158 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1159 | dependencies: 1160 | json-buffer: 3.0.1 1161 | dev: true 1162 | 1163 | /levn@0.4.1: 1164 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1165 | engines: {node: '>= 0.8.0'} 1166 | dependencies: 1167 | prelude-ls: 1.2.1 1168 | type-check: 0.4.0 1169 | dev: true 1170 | 1171 | /locate-path@6.0.0: 1172 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1173 | engines: {node: '>=10'} 1174 | dependencies: 1175 | p-locate: 5.0.0 1176 | dev: true 1177 | 1178 | /lodash.merge@4.6.2: 1179 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1180 | dev: true 1181 | 1182 | /lru-cache@6.0.0: 1183 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1184 | engines: {node: '>=10'} 1185 | dependencies: 1186 | yallist: 4.0.0 1187 | dev: true 1188 | 1189 | /merge2@1.4.1: 1190 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1191 | engines: {node: '>= 8'} 1192 | dev: true 1193 | 1194 | /micromatch@4.0.5: 1195 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1196 | engines: {node: '>=8.6'} 1197 | dependencies: 1198 | braces: 3.0.2 1199 | picomatch: 2.3.1 1200 | dev: true 1201 | 1202 | /minimatch@3.1.2: 1203 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1204 | dependencies: 1205 | brace-expansion: 1.1.11 1206 | dev: true 1207 | 1208 | /moment@2.29.4: 1209 | resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} 1210 | dev: true 1211 | 1212 | /ms@2.1.2: 1213 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1214 | dev: true 1215 | 1216 | /natural-compare@1.4.0: 1217 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1218 | dev: true 1219 | 1220 | /normalize-path@3.0.0: 1221 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1222 | engines: {node: '>=0.10.0'} 1223 | dev: true 1224 | 1225 | /obsidian@1.5.7-1(@codemirror/state@6.4.1)(@codemirror/view@6.26.1): 1226 | resolution: {integrity: sha512-T5ZRuQ1FnfXqEoakTTHVDYvzUEEoT8zSPnQCW31PVgYwG4D4tZCQfKHN2hTz1ifnCe8upvwa6mBTAP2WUA5Vng==} 1227 | peerDependencies: 1228 | '@codemirror/state': ^6.0.0 1229 | '@codemirror/view': ^6.0.0 1230 | dependencies: 1231 | '@codemirror/state': 6.4.1 1232 | '@codemirror/view': 6.26.1 1233 | '@types/codemirror': 5.60.8 1234 | moment: 2.29.4 1235 | dev: true 1236 | 1237 | /once@1.4.0: 1238 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1239 | dependencies: 1240 | wrappy: 1.0.2 1241 | dev: true 1242 | 1243 | /optionator@0.9.3: 1244 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1245 | engines: {node: '>= 0.8.0'} 1246 | dependencies: 1247 | '@aashutoshrathi/word-wrap': 1.2.6 1248 | deep-is: 0.1.4 1249 | fast-levenshtein: 2.0.6 1250 | levn: 0.4.1 1251 | prelude-ls: 1.2.1 1252 | type-check: 0.4.0 1253 | dev: true 1254 | 1255 | /p-limit@3.1.0: 1256 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1257 | engines: {node: '>=10'} 1258 | dependencies: 1259 | yocto-queue: 0.1.0 1260 | dev: true 1261 | 1262 | /p-locate@5.0.0: 1263 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1264 | engines: {node: '>=10'} 1265 | dependencies: 1266 | p-limit: 3.1.0 1267 | dev: true 1268 | 1269 | /p-queue@8.0.1: 1270 | resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} 1271 | engines: {node: '>=18'} 1272 | dependencies: 1273 | eventemitter3: 5.0.1 1274 | p-timeout: 6.1.2 1275 | dev: false 1276 | 1277 | /p-timeout@6.1.2: 1278 | resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} 1279 | engines: {node: '>=14.16'} 1280 | dev: false 1281 | 1282 | /parent-module@1.0.1: 1283 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1284 | engines: {node: '>=6'} 1285 | dependencies: 1286 | callsites: 3.1.0 1287 | dev: true 1288 | 1289 | /path-exists@4.0.0: 1290 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1291 | engines: {node: '>=8'} 1292 | dev: true 1293 | 1294 | /path-is-absolute@1.0.1: 1295 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1296 | engines: {node: '>=0.10.0'} 1297 | dev: true 1298 | 1299 | /path-key@3.1.1: 1300 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1301 | engines: {node: '>=8'} 1302 | dev: true 1303 | 1304 | /path-type@4.0.0: 1305 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1306 | engines: {node: '>=8'} 1307 | dev: true 1308 | 1309 | /picomatch@2.3.1: 1310 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1311 | engines: {node: '>=8.6'} 1312 | dev: true 1313 | 1314 | /prelude-ls@1.2.1: 1315 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1316 | engines: {node: '>= 0.8.0'} 1317 | dev: true 1318 | 1319 | /punycode@2.3.1: 1320 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1321 | engines: {node: '>=6'} 1322 | dev: true 1323 | 1324 | /queue-microtask@1.2.3: 1325 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1326 | dev: true 1327 | 1328 | /readdirp@3.6.0: 1329 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1330 | engines: {node: '>=8.10.0'} 1331 | dependencies: 1332 | picomatch: 2.3.1 1333 | dev: true 1334 | 1335 | /regexpp@3.2.0: 1336 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1337 | engines: {node: '>=8'} 1338 | dev: true 1339 | 1340 | /resolve-from@4.0.0: 1341 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1342 | engines: {node: '>=4'} 1343 | dev: true 1344 | 1345 | /reusify@1.0.4: 1346 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1347 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1348 | dev: true 1349 | 1350 | /rimraf@3.0.2: 1351 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1352 | hasBin: true 1353 | dependencies: 1354 | glob: 7.2.3 1355 | dev: true 1356 | 1357 | /run-parallel@1.2.0: 1358 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1359 | dependencies: 1360 | queue-microtask: 1.2.3 1361 | dev: true 1362 | 1363 | /semver@7.6.0: 1364 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1365 | engines: {node: '>=10'} 1366 | hasBin: true 1367 | dependencies: 1368 | lru-cache: 6.0.0 1369 | dev: true 1370 | 1371 | /shebang-command@2.0.0: 1372 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1373 | engines: {node: '>=8'} 1374 | dependencies: 1375 | shebang-regex: 3.0.0 1376 | dev: true 1377 | 1378 | /shebang-regex@3.0.0: 1379 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1380 | engines: {node: '>=8'} 1381 | dev: true 1382 | 1383 | /slash@3.0.0: 1384 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1385 | engines: {node: '>=8'} 1386 | dev: true 1387 | 1388 | /strip-ansi@6.0.1: 1389 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1390 | engines: {node: '>=8'} 1391 | dependencies: 1392 | ansi-regex: 5.0.1 1393 | dev: true 1394 | 1395 | /strip-json-comments@3.1.1: 1396 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1397 | engines: {node: '>=8'} 1398 | dev: true 1399 | 1400 | /style-mod@4.1.2: 1401 | resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} 1402 | dev: true 1403 | 1404 | /supports-color@7.2.0: 1405 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1406 | engines: {node: '>=8'} 1407 | dependencies: 1408 | has-flag: 4.0.0 1409 | dev: true 1410 | 1411 | /text-table@0.2.0: 1412 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1413 | dev: true 1414 | 1415 | /to-regex-range@5.0.1: 1416 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1417 | engines: {node: '>=8.0'} 1418 | dependencies: 1419 | is-number: 7.0.0 1420 | dev: true 1421 | 1422 | /tslib@1.14.1: 1423 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1424 | dev: true 1425 | 1426 | /tslib@2.4.0: 1427 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 1428 | dev: true 1429 | 1430 | /tsutils@3.21.0(typescript@4.7.4): 1431 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1432 | engines: {node: '>= 6'} 1433 | peerDependencies: 1434 | 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' 1435 | dependencies: 1436 | tslib: 1.14.1 1437 | typescript: 4.7.4 1438 | dev: true 1439 | 1440 | /type-check@0.4.0: 1441 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1442 | engines: {node: '>= 0.8.0'} 1443 | dependencies: 1444 | prelude-ls: 1.2.1 1445 | dev: true 1446 | 1447 | /type-fest@0.20.2: 1448 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1449 | engines: {node: '>=10'} 1450 | dev: true 1451 | 1452 | /typescript@4.7.4: 1453 | resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} 1454 | engines: {node: '>=4.2.0'} 1455 | hasBin: true 1456 | dev: true 1457 | 1458 | /universalify@2.0.1: 1459 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1460 | engines: {node: '>= 10.0.0'} 1461 | dev: true 1462 | 1463 | /uri-js@4.4.1: 1464 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1465 | dependencies: 1466 | punycode: 2.3.1 1467 | dev: true 1468 | 1469 | /w3c-keyname@2.2.8: 1470 | resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} 1471 | dev: true 1472 | 1473 | /which@2.0.2: 1474 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1475 | engines: {node: '>= 8'} 1476 | hasBin: true 1477 | dependencies: 1478 | isexe: 2.0.0 1479 | dev: true 1480 | 1481 | /wrappy@1.0.2: 1482 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1483 | dev: true 1484 | 1485 | /yallist@4.0.0: 1486 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1487 | dev: true 1488 | 1489 | /yocto-queue@0.1.0: 1490 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1491 | engines: {node: '>=10'} 1492 | dev: true 1493 | --------------------------------------------------------------------------------