diff --git a/package-lock.json b/package-lock.json index fa6866e..dc79529 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@codemirror/language": "github:codemirror/language", "axios": "^1.7.2", "cheerio": "^1.0.0-rc.12", "fetch-jsonp": "^1.3.0", @@ -35,19 +36,28 @@ "node": ">=0.10.0" } }, + "node_modules/@codemirror/language": { + "version": "6.10.3", + "resolved": "git+ssh://git@github.com/codemirror/language.git#308d5f4cfba541c19f4cb345a2a46bd4386519d1", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, "node_modules/@codemirror/state": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz", - "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==", - "dev": true, - "peer": true + "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" }, "node_modules/@codemirror/view": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz", "integrity": "sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==", - "dev": true, - "peer": true, "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", @@ -502,6 +512,27 @@ "dev": true, "peer": true }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -852,9 +883,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -898,12 +929,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1601,9 +1632,9 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2106,12 +2137,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2641,9 +2672,7 @@ "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 + "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" }, "node_modules/superagent": { "version": "3.7.0", @@ -2790,9 +2819,7 @@ "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 + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" }, "node_modules/which": { "version": "2.0.2", diff --git a/package.json b/package.json index 7efc4a0..b8c3c93 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "typescript": "4.7.4" }, "dependencies": { + "@codemirror/language": "github:codemirror/language", "axios": "^1.7.2", "cheerio": "^1.0.0-rc.12", "fetch-jsonp": "^1.3.0", diff --git a/src/law-editor-processor.ts b/src/law-editor-processor.ts index 2107571..afe9f65 100644 --- a/src/law-editor-processor.ts +++ b/src/law-editor-processor.ts @@ -7,15 +7,25 @@ import { ViewPlugin, ViewUpdate, WidgetType, + MatchDecorator } from '@codemirror/view'; import { -/** EditorState, - StateField **/ - RangeSetBuilder + EditorState, + StateField, + RangeSetBuilder, + StateEffect } from '@codemirror/state'; import { syntaxTree } from '@codemirror/language'; +import { MarkdownEditView } from 'obsidian'; +// §\s\d+[a-z]?\s(I+\s)?(\d\s)?(Nr.\s\d\s)?\w+ +const placeholderMatcher = new MatchDecorator({ + regexp: /\[\[(\w+)\]\]/g, + decoration: match => Decoration.replace({ + + }) + }) class LawRefPluginEditorProcessor implements PluginValue { decorations: DecorationSet; @@ -49,7 +59,7 @@ class LawRefPluginEditorProcessor implements PluginValue { listCharFrom, listCharFrom + 1, Decoration.replace({ - widget: new EmojiWidget(), + }) ); } @@ -63,3 +73,50 @@ class LawRefPluginEditorProcessor implements PluginValue { export const lawRefPluginEditorProcessor = ViewPlugin.fromClass(LawRefPluginEditorProcessor); + + + + + + + + + +const addUnderline = StateEffect.define<{from: number, to: number}>({ + map: ({from, to}, change) => ({from: change.mapPos(from), to: change.mapPos(to)}) + }) + + const underlineField = StateField.define({ + create() { + return Decoration.none + }, + update(underlines, tr) { + underlines = underlines.map(tr.changes) + for (let e of tr.effects) if (e.is(addUnderline)) { + underlines = underlines.update({ + add: [underlineMark.range(e.value.from, e.value.to)] + }) + } + return underlines + }, + provide: f => EditorView.decorations.from(f) + }) + + const underlineMark = Decoration.mark({class: "cm-underline"}) + const underlineTheme = EditorView.baseTheme({ + ".cm-underline": { textDecoration: "underline 3px red" } + }) + + export function underlineSelection(view: EditorView) { + let effects: StateEffect[] = view.state.selection.ranges + .filter(r => !r.empty) + .map(({from, to}) => addUnderline.of({from, to})) + if (!effects.length) return false + + if (!view.state.field(underlineField, false)) + effects.push(StateEffect.appendConfig.of([underlineField, + underlineTheme])) + view.dispatch({effects}) + return true + } + \ No newline at end of file diff --git a/src/lawSuggester.ts b/src/lawSuggester.ts index 8b11c3c..da74170 100644 --- a/src/lawSuggester.ts +++ b/src/lawSuggester.ts @@ -5,8 +5,9 @@ import { OldpApi, OldpSearchResponseItem } from "./api/opld"; export default class LawSuggester extends EditorSuggest { private readonly oldpApi = new OldpApi(); plugin: LawRefPlugin; - queryRegex = new RegExp(/(?:(?<=^|\n)|(?<=\s))(§[-\w]+)(?=\s|$)/gi); - + queryRegex = new RegExp(/(?:(?<=^|\n)|(?<=\s))(§\s\d+\s\w+)(?=\s|$)/gi); + // Alte Fassung falls ich Scheiße gebaut habe /(?:(?<=^|\n)|(?<=\s))(§[-\w]+)(?=\s|$)/gi + constructor(plugin: LawRefPlugin) { super(plugin.app); this.plugin = plugin; diff --git a/src/main.ts b/src/main.ts index f8e8ea4..c340352 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,18 +1,17 @@ -import { App, Modal, Notice, Plugin, PluginSettingTab, Setting, Vault, Workspace, WorkspaceLeaf, MarkdownPostProcessorContext, parseFrontMatterEntry } from 'obsidian'; +import { App, Modal, Notice, Plugin, PluginSettingTab, Setting, Vault, Workspace, WorkspaceLeaf, MarkdownPostProcessorContext, parseFrontMatterEntry, View, MarkdownView } from 'obsidian'; import { ExampleView, VIEW_TYPE_EXAMPLE } from './law-view'; import { OldpApi } from './api/opld'; import LawSuggester from './lawSuggester'; -import { lawRefPluginEditorProcessor } from './law-editor-processor'; -import { syntaxTree } from '@codemirror/language'; +import { lawRefPluginEditorProcessor, underlineSelection } from './law-editor-processor'; // Remember to rename these classes and interfaces! interface LawRefPluginSettings { - mySetting: string; + useSuggester: boolean; } const DEFAULT_SETTINGS: LawRefPluginSettings = { - mySetting: 'default' + useSuggester: false } export default class LawRefPlugin extends Plugin { @@ -23,7 +22,7 @@ export default class LawRefPlugin extends Plugin { this.registerView(VIEW_TYPE_EXAMPLE, (leaf) => new ExampleView(leaf)) this.registerEditorExtension(lawRefPluginEditorProcessor); // This adds a settings tab so the user can configure various aspects of the plugin - this.addSettingTab(new SampleSettingTab(this.app, this)); + this.addSettingTab(new LawRefPluginSettingTab(this.app, this)); // If the plugin hooks up any global DOM events (on parts of the app that doesn't belong to this plugin) // Using this function will automatically remove the event listener when this plugin is disabled. @@ -33,7 +32,10 @@ export default class LawRefPlugin extends Plugin { const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { // Called when the user clicks the icon. - new Notice('This is a notice!'); + + // @ts-expect-error, not typed + const CoMieditorView = this.app.workspace.activeEditor.editor.cm as EditorView; + underlineSelection(CoMieditorView); this.activateView(); }); @@ -41,7 +43,9 @@ export default class LawRefPlugin extends Plugin { this.registerInterval(window.setInterval(() => console.log('setInterval'), 5 * 60 * 1000)); // register suggestor on § key - this.registerEditorSuggest(new LawSuggester(this)) + if (this.settings.useSuggester===true){ + this.registerEditorSuggest(new LawSuggester(this)) + } } @@ -55,7 +59,7 @@ export default class LawRefPlugin extends Plugin { let leaf: WorkspaceLeaf | null = null; const leaves = workspace.getLeavesOfType(VIEW_TYPE_EXAMPLE); - const paragraphs = this.getFrontMatterMeta(); + //const paragraphs = this.getFrontMatterMeta(); if (leaves.length > 0) { // A leaf with our view already exists, use that @@ -73,7 +77,7 @@ export default class LawRefPlugin extends Plugin { // "Reveal" the leaf in case it is in a collapsed sidebar workspace.revealLeaf(leaf); } - async getFrontMatterMeta(){ + /**async getFrontMatterMeta(){ const { workspace } = this.app; const actFile = workspace.getActiveFile(); if (!actFile) return @@ -94,7 +98,7 @@ export default class LawRefPlugin extends Plugin { container.createEl("p", {cls: "LawRefContainer", text: element})}); } }); - } + }**/ async loadSettings() { @@ -122,7 +126,7 @@ class SampleModal extends Modal { } } -class SampleSettingTab extends PluginSettingTab { +class LawRefPluginSettingTab extends PluginSettingTab { plugin: LawRefPlugin; constructor(app: App, plugin: LawRefPlugin) { @@ -136,13 +140,12 @@ class SampleSettingTab extends PluginSettingTab { containerEl.empty(); new Setting(containerEl) - .setName('Setting #1') - .setDesc('It\'s a secret') - .addText(text => text - .setPlaceholder('Enter your secret') - .setValue(this.plugin.settings.mySetting) + .setName('Use the Suggester for law Refs') + .setDesc('Warning: This Feature can lead to overload the oldpapi - Changing this setting requires a restart') + .addToggle(toggle => toggle + .setValue(this.plugin.settings.useSuggester) .onChange(async (value) => { - this.plugin.settings.mySetting = value; + this.plugin.settings.useSuggester = value; await this.plugin.saveSettings(); })); } diff --git a/yarn.lock b/yarn.lock index 8752d2e..2a0f6f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,12 +7,23 @@ resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@codemirror/language@github:codemirror/language": + version "6.10.3" + resolved "git+ssh://git@github.com/codemirror/language.git#308d5f4cfba541c19f4cb345a2a46bd4386519d1" + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.23.0" + "@lezer/common" "^1.1.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + "@codemirror/state@^6.0.0", "@codemirror/state@^6.4.0": version "6.4.0" resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.4.0.tgz" integrity sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A== -"@codemirror/view@^6.0.0": +"@codemirror/view@^6.0.0", "@codemirror/view@^6.23.0": version "6.23.0" resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.23.0.tgz" integrity sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ== @@ -77,6 +88,25 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz" integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@lezer/common@^1.0.0", "@lezer/common@^1.1.0": + version "1.2.3" + resolved "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz" + integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA== + +"@lezer/highlight@^1.0.0": + version "1.2.1" + resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz" + integrity sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/lr@^1.0.0": + version "1.4.2" + resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz" + integrity sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA== + dependencies: + "@lezer/common" "^1.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -260,9 +290,9 @@ asynckit@^0.4.0: integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.7.2: - version "1.7.2" - resolved "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== + version "1.7.7" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -286,12 +316,12 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" builtin-modules@3.3.0: version "3.3.0" @@ -708,10 +738,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -1017,11 +1047,11 @@ methods@^1.1.1: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -1314,7 +1344,7 @@ strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-mod@^4.1.0: +style-mod@^4.0.0, style-mod@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/style-mod/-/style-mod-4.1.0.tgz" integrity sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==