From 9a056f6143872ffc386bbea46a7e7e2297e56795 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:58:09 +0000 Subject: [PATCH 01/13] Use modified date field for freshness candidate selection --- src/listeners/panel/DataListener.ts | 32 +++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/listeners/panel/DataListener.ts b/src/listeners/panel/DataListener.ts index e3525872..feafec3c 100644 --- a/src/listeners/panel/DataListener.ts +++ b/src/listeners/panel/DataListener.ts @@ -580,15 +580,39 @@ export class DataListener extends BaseListener { const threshold = Settings.get(SETTING_CONTENT_HEALTH_FRESHNESS_THRESHOLD) ?? 180; let freshnessWarning: { daysSince: number; threshold: number } | null = null; if (threshold > 0) { - const dateValue = (metadata?.date || metadata?.publishDate) as string | undefined; - if (dateValue) { - const dateFormat = Settings.get(SETTING_DATE_FORMAT); - const parsed = DateHelper.tryParse(dateValue, dateFormat || undefined); + const article = { content: '', data: metadata, path: filePath } as ParsedFrontMatter; + const contentType = await ArticleHelper.getContentType(article); + const modifiedDateField = contentType.fields.find((field) => field.isModifiedDate); + const publishDateField = contentType.fields.find((field) => field.isPublishDate); + const defaultDateFormat = Settings.get(SETTING_DATE_FORMAT) || undefined; + + const dateCandidates: { value: unknown; dateFormat?: string }[] = [ + { + value: modifiedDateField?.name ? metadata?.[modifiedDateField.name] : undefined, + dateFormat: modifiedDateField?.dateFormat || defaultDateFormat + }, + { + value: publishDateField?.name ? metadata?.[publishDateField.name] : undefined, + dateFormat: publishDateField?.dateFormat || defaultDateFormat + }, + { + value: metadata?.date, + dateFormat: defaultDateFormat + }, + { + value: metadata?.publishDate, + dateFormat: defaultDateFormat + } + ]; + + for (const candidate of dateCandidates) { + const parsed = DateHelper.tryParse(candidate.value, candidate.dateFormat); if (parsed && DateHelper.isValid(parsed)) { const daysSince = Math.floor((Date.now() - parsed.getTime()) / (1000 * 60 * 60 * 24)); if (daysSince > threshold) { freshnessWarning = { daysSince, threshold }; } + break; } } } From 1f73ded43f04a44a3b1591bda7afeddc4cdf674b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:01:28 +0000 Subject: [PATCH 02/13] Use article content when resolving freshness content type --- src/listeners/panel/DataListener.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/listeners/panel/DataListener.ts b/src/listeners/panel/DataListener.ts index feafec3c..982ff3ed 100644 --- a/src/listeners/panel/DataListener.ts +++ b/src/listeners/panel/DataListener.ts @@ -580,7 +580,11 @@ export class DataListener extends BaseListener { const threshold = Settings.get(SETTING_CONTENT_HEALTH_FRESHNESS_THRESHOLD) ?? 180; let freshnessWarning: { daysSince: number; threshold: number } | null = null; if (threshold > 0) { - const article = { content: '', data: metadata, path: filePath } as ParsedFrontMatter; + const article = { + content: articleDetails.content || '', + data: metadata, + path: filePath + } as ParsedFrontMatter; const contentType = await ArticleHelper.getContentType(article); const modifiedDateField = contentType.fields.find((field) => field.isModifiedDate); const publishDateField = contentType.fields.find((field) => field.isPublishDate); From 72f7d18659a820dea8d13a1285f4ded3698bbacb Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 30 Jul 2026 14:00:33 +0200 Subject: [PATCH 03/13] fix: resolve "Could not retrieve the locale for the current file" error for multilingual content in nested subfolders #1054 --- CHANGELOG.md | 1 + src/commands/i18n.ts | 176 +++++++++++++++++++++++++++---------------- 2 files changed, 114 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7be82844..97f0f102 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - [#920](https://github.com/estruyf/vscode-front-matter/issues/920): Fix `metadata.fmRelFilePath` returning an absolute path on Windows by normalizing the workspace folder path before stripping it - [#963](https://github.com/estruyf/vscode-front-matter/issues/963): Prevent infinite update loops for fields when using Hugo partials as values in the front matter - [#1041](https://github.com/estruyf/vscode-front-matter/issues/1041): Fix in image page when using page bundles +- [#1054](https://github.com/estruyf/vscode-front-matter/issues/1054): Fix the "Could not retrieve the locale for the current file" error for multilingual content nested in subfolders (ex. `content/de/posts/2024/07/my-post/index.md`). Translations are now created with the same folder structure as the source file ## [10.10.1] - 2026-04-23 diff --git a/src/commands/i18n.ts b/src/commands/i18n.ts index 4ddc3536..74dc7576 100644 --- a/src/commands/i18n.ts +++ b/src/commands/i18n.ts @@ -133,21 +133,14 @@ export class i18n { return false; } - const fileInfo = await i18n.getFileInfo(filePath); - if (pageFolder.path) { if (pageFolder.locale) { return pageFolder.locale === pageFolder.defaultLocale; } - let pageFolderPath = parseWinPath(pageFolder.path); - if (!pageFolderPath.endsWith('/')) { - pageFolderPath += '/'; - } - - return ( - parseWinPath(fileInfo.dir).toLowerCase() === parseWinPath(pageFolderPath).toLowerCase() - ); + // The content can be nested within the locale folder, that is why it only checks + // if the file is located in the folder instead of comparing the directories. + return typeof i18n.getRelativeFilePath(filePath, pageFolder.path) !== 'undefined'; } return false; @@ -166,20 +159,11 @@ export class i18n { let pageFolder = await Folders.getPageFolderByFilePath(filePath); - const fileInfo = await i18n.getFileInfo(filePath); - - if (pageFolder && pageFolder.defaultLocale) { - let pageFolderPath = parseWinPath(pageFolder.path); - if (!pageFolderPath.endsWith('/')) { - pageFolderPath += '/'; - } - - if ( - pageFolder.path && - pageFolder.locale && - parseWinPath(fileInfo.dir).toLowerCase() === parseWinPath(pageFolderPath).toLowerCase() - ) { - return i18nSettings.find((i18n) => i18n.locale === pageFolder?.locale); + if (pageFolder && pageFolder.defaultLocale && pageFolder.path && pageFolder.locale) { + // The content can be nested within the locale folder (ex. `content/de/posts/2024/07/my-post/index.md`), + // that is why it only checks if the file is located in the locale folder. + if (typeof i18n.getRelativeFilePath(filePath, pageFolder.path) !== 'undefined') { + return i18nSettings.find((setting) => setting.locale === pageFolder?.locale); } } @@ -188,12 +172,16 @@ export class i18n { return; } - for (const locale of i18nSettings) { - if (locale.path && pageFolder.defaultLocale !== locale.locale) { - const translation = join(pageFolder.path, locale.path, fileInfo.filename); - if (parseWinPath(translation).toLowerCase() === parseWinPath(filePath).toLowerCase()) { - return locale; - } + // Check in which locale folder the file is located + const sourcePath = pageFolder.localeSourcePath || pageFolder.path; + const locales = i18nSettings + .filter((setting) => setting.path && pageFolder?.defaultLocale !== setting.locale) + .sort((a, b) => (b.path as string).length - (a.path as string).length); + + for (const locale of locales) { + const localePath = join(sourcePath, locale.path as string); + if (typeof i18n.getRelativeFilePath(filePath, localePath) !== 'undefined') { + return locale; } } @@ -227,14 +215,15 @@ export class i18n { } = {}; let pageFolder = await Folders.getPageFolderByFilePath(filePath); - const fileInfo = await i18n.getFileInfo(filePath); if (pageFolder && pageFolder.defaultLocale && pageFolder.localeSourcePath) { - for (const i18n of i18nSettings) { - const translation = join(pageFolder.localeSourcePath, i18n.path || '', fileInfo.filename); + const relFilePath = await i18n.getLocaleRelativeFilePath(filePath, pageFolder); + + for (const setting of i18nSettings) { + const translation = join(pageFolder.localeSourcePath, setting.path || '', relFilePath); if (await existsAsync(translation)) { - translations[i18n.locale] = { - locale: i18n, + translations[setting.locale] = { + locale: setting, path: translation }; } @@ -247,11 +236,14 @@ export class i18n { return translations; } - for (const i18n of i18nSettings) { - const translation = join(pageFolder.path, i18n.path || '', fileInfo.filename); + const relFilePath = await i18n.getLocaleRelativeFilePath(filePath, pageFolder); + const sourcePath = pageFolder.localeSourcePath || pageFolder.path; + + for (const setting of i18nSettings) { + const translation = join(sourcePath, setting.path || '', relFilePath); if (await existsAsync(translation)) { - translations[i18n.locale] = { - locale: i18n, + translations[setting.locale] = { + locale: setting, path: translation }; } @@ -346,18 +338,11 @@ export class i18n { return; } - // Get the directory of the file + // Get the directory of the file relative to its locale folder const fileInfo = parse(fileUri.fsPath); - let dir = fileInfo.dir; - let pageBundleDir = ''; + const contentDir = await i18n.getLocaleRelativeDir(fileUri.fsPath, pageFolder); - if (await ArticleHelper.isPageBundle(fileUri.fsPath)) { - dir = ArticleHelper.getPageFolderFromBundlePath(fileUri.fsPath); - pageBundleDir = fileUri.fsPath.replace(dir, ''); - pageBundleDir = join(parse(pageBundleDir).dir); - } - - const i18nDir = join(pageFolder.localeSourcePath, targetLocale.path, pageBundleDir); + const i18nDir = join(pageFolder.localeSourcePath, targetLocale.path, contentDir); if (!(await existsAsync(i18nDir))) { await workspace.fs.createDirectory(Uri.file(i18nDir)); @@ -452,12 +437,7 @@ export class i18n { // Determine translation file paths const fileInfo = parse(fileUri.fsPath); - let pageBundleDir = ''; - if (await ArticleHelper.isPageBundle(fileUri.fsPath)) { - const dir = ArticleHelper.getPageFolderFromBundlePath(fileUri.fsPath); - pageBundleDir = fileUri.fsPath.replace(dir, ''); - pageBundleDir = join(parse(pageBundleDir).dir); - } + const contentDir = await i18n.getLocaleRelativeDir(fileUri.fsPath, pageFolder); // Gather target locales & metadata const translations = (await i18n.getTranslations(fileUri.fsPath)) || {}; @@ -468,14 +448,9 @@ export class i18n { .map((i18n) => { return { ...i18n, - dir: join(pageFolder.localeSourcePath!, i18n.path!, pageBundleDir), - absolutePath: join( - pageFolder.localeSourcePath!, - i18n.path!, - pageBundleDir, - fileInfo.base - ), - relativePath: join(i18n.path!, pageBundleDir, fileInfo.base) + dir: join(pageFolder.localeSourcePath!, i18n.path!, contentDir), + absolutePath: join(pageFolder.localeSourcePath!, i18n.path!, contentDir, fileInfo.base), + relativePath: join(i18n.path!, contentDir, fileInfo.base) }; }) .sort((a, b) => (a.title || a.locale).localeCompare(b.title || b.locale)); @@ -668,6 +643,71 @@ export class i18n { return i18n.processedFiles[filePath]; } + /** + * Retrieves the path of the file relative to the given folder. + * + * @param filePath - The path of the file. + * @param folderPath - The path of the folder. + * @returns The relative path of the file, or `undefined` when the file is not located in the folder. + */ + private static getRelativeFilePath(filePath: string, folderPath?: string): string | undefined { + if (!filePath || !folderPath) { + return; + } + + let parsedFolderPath = parseWinPath(folderPath); + if (!parsedFolderPath.endsWith('/')) { + parsedFolderPath += '/'; + } + + const parsedFilePath = parseWinPath(filePath); + if (!parsedFilePath.toLowerCase().startsWith(parsedFolderPath.toLowerCase())) { + return; + } + + return parsedFilePath.substring(parsedFolderPath.length); + } + + /** + * Retrieves the path of the file relative to its locale folder. + * + * The content can be nested within the locale folder, the whole folder structure is kept + * (ex. `posts/2024/07/my-post/index.md`) so that translations use the same structure. + * + * @param filePath - The path of the file. + * @param pageFolder - The content folder of the file. + * @returns The relative path of the file. + */ + private static async getLocaleRelativeFilePath( + filePath: string, + pageFolder: ContentFolder + ): Promise { + const relFilePath = i18n.getRelativeFilePath(filePath, pageFolder.path); + if (typeof relFilePath !== 'undefined') { + return relFilePath; + } + + const fileInfo = await i18n.getFileInfo(filePath); + return fileInfo.filename; + } + + /** + * Retrieves the directory of the file relative to its locale folder. + * + * @param filePath - The path of the file. + * @param pageFolder - The content folder of the file. + * @returns The relative directory of the file, or an empty string when the file is located in the root of the locale folder. + */ + private static async getLocaleRelativeDir( + filePath: string, + pageFolder: ContentFolder + ): Promise { + const relFilePath = await i18n.getLocaleRelativeFilePath(filePath, pageFolder); + const relDir = parse(relFilePath).dir; + + return relDir ? join(relDir) : ''; + } + /** * Retrieves the page folder for a given file path. * @@ -682,6 +722,16 @@ export class i18n { return; } + // Check in which locale folder the file is located, the deepest folder wins + const sortedFolders = [...localeFolders].sort( + (a, b) => (b.path || '').length - (a.path || '').length + ); + for (const folder of sortedFolders) { + if (typeof i18n.getRelativeFilePath(filePath, folder.path) !== 'undefined') { + return folder; + } + } + const fileInfo = await i18n.getFileInfo(filePath); for (const folder of localeFolders) { From cfa4e20b6606545d902443ff22be5371e2425d84 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 31 Jul 2026 12:07:49 +0200 Subject: [PATCH 04/13] chore: update CHANGELOG for version 10.12.0 enhancements and fixes --- CHANGELOG.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97f0f102..dda47713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## [10.12.0] - 2026-xx-xx - [Release notes](https://beta.frontmatter.codes/updates/v10.12.0) + +### 🎨 Enhancements + + +### 🐞 Fixes + +- [#1043](https://github.com/estruyf/vscode-front-matter/issues/1043): Fix issue with last modified date in content health freshness checks +- [#1054](https://github.com/estruyf/vscode-front-matter/issues/1054): Fix the "Could not retrieve the locale for the current file" error for multilingual content nested in subfolders (ex. `content/de/posts/2024/07/my-post/index.md`). Translations are now created with the same folder structure as the source file + ## [10.11.0] - 2026-07-02 - [Release notes](https://beta.frontmatter.codes/updates/v10.11.0) ### 🎨 Enhancements @@ -18,7 +28,6 @@ - [#920](https://github.com/estruyf/vscode-front-matter/issues/920): Fix `metadata.fmRelFilePath` returning an absolute path on Windows by normalizing the workspace folder path before stripping it - [#963](https://github.com/estruyf/vscode-front-matter/issues/963): Prevent infinite update loops for fields when using Hugo partials as values in the front matter - [#1041](https://github.com/estruyf/vscode-front-matter/issues/1041): Fix in image page when using page bundles -- [#1054](https://github.com/estruyf/vscode-front-matter/issues/1054): Fix the "Could not retrieve the locale for the current file" error for multilingual content nested in subfolders (ex. `content/de/posts/2024/07/my-post/index.md`). Translations are now created with the same folder structure as the source file ## [10.10.1] - 2026-04-23 From a401dbf94caffa4e9a65dbddc83f8529394455c1 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 31 Jul 2026 12:07:55 +0200 Subject: [PATCH 05/13] 10.12.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8d7d593..c6f510ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-front-matter-beta", - "version": "10.11.0", + "version": "10.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vscode-front-matter-beta", - "version": "10.11.0", + "version": "10.12.0", "license": "MIT", "devDependencies": { "@actions/core": "^1.10.0", diff --git a/package.json b/package.json index cc3ad1f9..56ac6437 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Front Matter CMS", "description": "Front Matter is a CMS that runs within Visual Studio Code. It gives you the power and control of a full-blown CMS while also providing you the flexibility and speed of the static site generator of your choice like: Hugo, Jekyll, Docusaurus, NextJs, Gatsby, and many more...", "icon": "assets/frontmatter-teal-128x128.png", - "version": "10.11.0", + "version": "10.12.0", "preview": false, "publisher": "eliostruyf", "galleryBanner": { From 253bdb8152e5604b09171285e7a7f65b1a417de8 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 31 Jul 2026 13:57:06 +0200 Subject: [PATCH 06/13] feat: add translate property to content type fields and enhance translation functionality #1055 --- CHANGELOG.md | 1 + package.json | 4 + package.nls.json | 1 + src/commands/i18n.ts | 230 +++++++++++++++++++++++++++++++---- src/models/PanelSettings.ts | 1 + src/services/Translations.ts | 74 ++++++++++- 6 files changed, 283 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dda47713..09b7d4c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### 🎨 Enhancements +- [#1055](https://github.com/estruyf/vscode-front-matter/issues/1055): Added the `translate` property on content type fields to define which front matter fields need to be machine translated. The title and description fields are translated by default, set `translate: false` to exclude them ### 🐞 Fixes diff --git a/package.json b/package.json index 56ac6437..3c27092d 100644 --- a/package.json +++ b/package.json @@ -1600,6 +1600,10 @@ "default": false, "description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.encodeEmoji.description%" }, + "translate": { + "type": "boolean", + "description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.translate.description%" + }, "dateFormat": { "type": "string", "default": "", diff --git a/package.nls.json b/package.nls.json index da09e680..28a27373 100644 --- a/package.nls.json +++ b/package.nls.json @@ -235,6 +235,7 @@ "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dataFileAdditionalFields.description": "Specify additional field names from the data record to include when storing the value. When set, the frontmatter value will be an object containing the dataFileKey field plus these additional fields.", "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.editable.description": "Specify if the field is editable", "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.encodeEmoji.description": "Specify if the field should encode emoji", + "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.translate.description": "Specify if the field value should be machine translated when creating a translation of the content. The title and description fields are translated by default, set it to `false` to exclude them.", "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.dateFormat.description": "Specify the date format to use", "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.required.description": "Specify if the field is required", "setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.contentTypeName.description": "Specify the content type name to filter content for the contentRelationship field", diff --git a/src/commands/i18n.ts b/src/commands/i18n.ts index 74dc7576..55c2457d 100644 --- a/src/commands/i18n.ts +++ b/src/commands/i18n.ts @@ -18,8 +18,15 @@ import { openFileInEditor, parseWinPath } from '../helpers'; -import { COMMAND_NAME, SETTING_CONTENT_I18N } from '../constants'; -import { ContentFolder, Field, I18nConfig, ContentType as IContentType } from '../models'; +import { COMMAND_NAME, SETTING_CONTENT_I18N, SETTING_TAXONOMY_FIELD_GROUPS } from '../constants'; +import { + ContentFolder, + Field, + FieldGroup, + FieldType, + I18nConfig, + ContentType as IContentType +} from '../models'; import { join, parse } from 'path'; import { existsAsync, getDescriptionField, getTitleField } from '../utils'; import { Folders } from '.'; @@ -28,11 +35,38 @@ import { PagesListener } from '../listeners/dashboard'; import { LocalizationKey, localize } from '../localization'; import { Translations } from '../services/Translations'; +/** + * Reference to a value which needs to be translated. + */ +interface TranslationValue { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + container: any; + key: string | number; +} + export class i18n { private static processedFiles: { [filePath: string]: { dir: string; filename: string; isPageBundle: boolean }; } = {}; + /** + * The field types which hold values that should never be machine translated. + */ + private static readonly nonTranslatableFieldTypes: FieldType[] = [ + 'boolean', + 'choice', + 'contentRelationship', + 'dataFile', + 'datetime', + 'divider', + 'draft', + 'file', + 'heading', + 'image', + 'json', + 'number' + ]; + /** * Registers the i18n commands. */ @@ -364,7 +398,7 @@ export class i18n { } if (sourceLocale?.locale) { - article = await i18n.translate(article, sourceLocale, targetLocale); + article = await i18n.translate(article, contentType, sourceLocale, targetLocale); } const newFileUri = Uri.file(newFilePath); @@ -535,7 +569,7 @@ export class i18n { targetLocale.dir ); if (sourceLocale?.locale) { - article = await i18n.translate(article, sourceLocale, targetLocale); + article = await i18n.translate(article, contentType, sourceLocale, targetLocale); } const newFileUri = Uri.file(targetLocale.absolutePath); @@ -559,12 +593,14 @@ export class i18n { /** * Translates the given article from the source locale to the target locale using DeepL translation service. * @param article - The article to be translated. + * @param contentType - The content type of the article. * @param sourceLocale - The source locale configuration. * @param targetLocale - The target locale configuration. * @returns A promise that resolves to the translated article. */ private static async translate( article: ParsedFrontMatter, + contentType: IContentType, sourceLocale: I18nConfig, targetLocale: I18nConfig ) { @@ -577,28 +613,26 @@ export class i18n { }, async () => { try { - const titleField = getTitleField(); - const descriptionField = getDescriptionField(); - - const title = article.data[titleField] || ''; - const description = article.data[descriptionField] || ''; - const content = article.content || ''; - - const text = [title, description, content]; - const translations = await Translations.translate( - text, - sourceLocale.locale, - targetLocale.locale - ); - - if (!translations || translations.length < 3) { + const values = i18n.getValuesToTranslate(article, contentType); + if (values.length === 0) { resolve(article); return; } - article.data[titleField] = article.data[titleField] ? translations[0] : ''; - article.data[descriptionField] = article.data[descriptionField] ? translations[1] : ''; - article.content = article.content ? translations[2] : ''; + const translations = await Translations.translate( + values.map((value) => value.container[value.key] as string), + sourceLocale.locale, + targetLocale.locale + ); + + if (!translations || translations.length !== values.length) { + resolve(article); + return; + } + + for (let i = 0; i < values.length; i++) { + values[i].container[values[i].key] = translations[i]; + } } catch (error) { Notifications.error(`${(error as Error).message}`); } @@ -609,6 +643,158 @@ export class i18n { }); } + /** + * Retrieves all the values of the article which need to be translated. + * + * The title and description fields are translated by default, unless the field is + * defined with `translate: false`. All other fields require `translate: true` to be + * taken into account. + * + * @param article - The parsed front matter of the article. + * @param contentType - The content type of the article. + * @returns The references to the values which need to be translated. + */ + private static getValuesToTranslate( + article: ParsedFrontMatter, + contentType: IContentType + ): TranslationValue[] { + const values: TranslationValue[] = []; + + // The title and description fields are translated by default + const defaultFields = [getTitleField(), getDescriptionField()]; + for (const fieldName of defaultFields) { + const field = ContentType.findFieldByName(contentType.fields, fieldName); + if (field && field.translate === false) { + continue; + } + + i18n.addValueToTranslate(article.data, fieldName, values); + } + + i18n.getFieldValuesToTranslate(contentType.fields, article.data, values); + + // The content of the article is always translated + i18n.addValueToTranslate(article, 'content', values); + + return values; + } + + /** + * Retrieves the values of the fields which are marked to be translated. + * + * @param fields - The fields to check. + * @param data - The data object which holds the field values. + * @param values - The references to the values which need to be translated. + */ + private static getFieldValuesToTranslate( + fields: Field[], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: { [key: string]: any } | undefined, + values: TranslationValue[] + ): void { + if (!fields || !data) { + return; + } + + for (const field of fields) { + const value = data[field.name]; + + if (field.type === 'fields' && field.fields) { + if (value && typeof value === 'object' && !Array.isArray(value)) { + i18n.getFieldValuesToTranslate(field.fields, value, values); + } + continue; + } + + if (field.type === 'block') { + i18n.getBlockValuesToTranslate(field, value, values); + continue; + } + + if (!field.translate || i18n.nonTranslatableFieldTypes.includes(field.type)) { + continue; + } + + if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + i18n.addValueToTranslate(value, i, values); + } + } else { + i18n.addValueToTranslate(data, field.name, values); + } + } + } + + /** + * Retrieves the values to translate from the items of a block field. + * + * @param field - The block field. + * @param value - The value of the block field. + * @param values - The references to the values which need to be translated. + */ + private static getBlockValuesToTranslate( + field: Field, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any, + values: TranslationValue[] + ): void { + if (!Array.isArray(value)) { + return; + } + + const fieldGroups = Settings.get(SETTING_TAXONOMY_FIELD_GROUPS); + if (!fieldGroups) { + return; + } + + const groupIds = Array.isArray(field.fieldGroup) + ? field.fieldGroup + : field.fieldGroup + ? [field.fieldGroup] + : []; + + for (const item of value) { + if (!item || typeof item !== 'object') { + continue; + } + + // When the block only allows a single group, the item doesn't need to define it + const groupId = item.fieldGroup || (groupIds.length === 1 ? groupIds[0] : undefined); + const group = fieldGroups.find((group) => group.id === groupId); + if (!group || !group.fields) { + continue; + } + + i18n.getFieldValuesToTranslate(group.fields, item, values); + } + } + + /** + * Adds the reference to the value to translate, when the value is a non-empty string + * and it hasn't been added yet. + * + * @param container - The object or array which holds the value. + * @param key - The key or index of the value. + * @param values - The references to the values which need to be translated. + */ + private static addValueToTranslate( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + container: any, + key: string | number, + values: TranslationValue[] + ): void { + const value = container[key]; + if (typeof value !== 'string' || !value) { + return; + } + + if (values.some((value) => value.container === container && value.key === key)) { + return; + } + + values.push({ container, key }); + } + /** * Retrieves the filename and directory information from the given file path. * If the file is a page bundle, the directory will be adjusted accordingly. diff --git a/src/models/PanelSettings.ts b/src/models/PanelSettings.ts index 1a610d51..8b4c3d7c 100644 --- a/src/models/PanelSettings.ts +++ b/src/models/PanelSettings.ts @@ -119,6 +119,7 @@ export interface Field { editable?: boolean; required?: boolean; encodeEmoji?: boolean; + translate?: boolean; // Date fields isPublishDate?: boolean; diff --git a/src/services/Translations.ts b/src/services/Translations.ts index 7ac60a06..0fd990eb 100644 --- a/src/services/Translations.ts +++ b/src/services/Translations.ts @@ -2,6 +2,17 @@ import { ExtensionState } from '../constants'; import { Extension } from '../helpers'; export class Translations { + /** + * The maximum number of texts which can be sent in a single request. + * DeepL allows 50 text parameters, Azure allows 1000 array elements. + */ + private static readonly maxBatchSize = 40; + /** + * The maximum number of characters which can be sent in a single request. + * Azure allows 50.000 characters per request. + */ + private static readonly maxBatchLength = 40000; + /** * Translates an array of text from a source language to a target language. * @param text - The array of text to be translated. @@ -24,15 +35,66 @@ export class Translations { ExtensionState.Secrets.Azure.TranslatorRegion ); - if (azureAuthKey && azureRegion) { - return this.translateAzure(text, source, target, azureAuthKey, azureRegion); + if (!text || text.length === 0) { + return []; } - if (deeplAuthKey) { - return this.translateDeepL(text, source, target, deeplAuthKey); + const translations: string[] = []; + + for (const batch of Translations.createBatches(text)) { + let translated: string[] | undefined; + + if (azureAuthKey && azureRegion) { + translated = await this.translateAzure(batch, source, target, azureAuthKey, azureRegion); + } else if (deeplAuthKey) { + translated = await this.translateDeepL(batch, source, target, deeplAuthKey); + } else { + return; + } + + if (!translated || translated.length !== batch.length) { + throw new Error('Invalid response'); + } + + translations.push(...translated); } - return; + return translations; + } + + /** + * Splits the texts into batches which stay within the limits of the translation services. + * @param text - The array of text to be translated. + * @returns An array of batches. + */ + private static createBatches(text: string[]): string[][] { + const batches: string[][] = []; + + let batch: string[] = []; + let batchLength = 0; + + for (const value of text) { + const valueLength = value?.length || 0; + + if ( + batch.length > 0 && + (batch.length >= Translations.maxBatchSize || + batchLength + valueLength > Translations.maxBatchLength) + ) { + batches.push(batch); + batch = []; + batchLength = 0; + } + + batch.push(value); + batchLength += valueLength; + } + + if (batch.length > 0) { + batches.push(batch); + } + + return batches; } /** @@ -120,7 +182,7 @@ export class Translations { } const data = await response.json(); - if (!data.translations || data.translations.length < 3) { + if (!data.translations) { throw new Error('Invalid response'); } From f8544e1173f08c5e9be28ffe9e1ffab430ff901f Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Mon, 3 Aug 2026 17:59:26 +0200 Subject: [PATCH 07/13] feat: add media paste functionality with folder selection and metadata input #1053 --- CHANGELOG.md | 1 + l10n/bundle.l10n.json | 17 +- package-lock.json | 13 +- package.json | 31 +- package.nls.json | 6 + src/commands/Dashboard.ts | 2 +- src/constants/settings.ts | 4 + src/dashboardWebView/DashboardMessage.ts | 1 + .../components/Media/DetailsForm.tsx | 20 +- .../components/Media/Media.tsx | 3 + .../components/Media/MediaPastePanel.tsx | 312 ++++++++++++++++++ src/extension.ts | 4 + src/helpers/MediaHelpers.ts | 30 ++ src/listeners/dashboard/MediaListener.ts | 67 +++- src/localization/localization.enum.ts | 54 ++- src/models/DashboardData.ts | 12 + src/providers/MediaPasteProvider.ts | 302 +++++++++++++++++ 17 files changed, 864 insertions(+), 15 deletions(-) create mode 100644 src/dashboardWebView/components/Media/MediaPastePanel.tsx create mode 100644 src/providers/MediaPasteProvider.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b7d4c1..2ad34d46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### 🎨 Enhancements +- [#1053](https://github.com/estruyf/vscode-front-matter/issues/1053): Support pasting images directly into Markdown/MDX files - [#1055](https://github.com/estruyf/vscode-front-matter/issues/1055): Added the `translate` property on content type fields to define which front matter fields need to be machine translated. The title and description fields are translated by default, set `translate: false` to exclude them ### 🐞 Fixes diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index 6c6b3729..2d1ddf48 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -236,6 +236,18 @@ "dashboard.media.dialog.title": "View details", "dashboard.media.panel.close": "Close panel", + "dashboard.media.paste.title": "Paste media", + "dashboard.media.paste.description": "Browse to the folder you want to store the image in.", + "dashboard.media.paste.storeIn": "Store in: {0}", + "dashboard.media.paste.noFolder": "Select a folder to store the image in.", + "dashboard.media.paste.store": "Store image", + "dashboard.media.paste.storing": "Storing the image...", + "dashboard.media.paste.error": "The image could not be stored. Please try again.", + "dashboard.media.paste.saveAndInsert": "Save and insert", + "dashboard.media.paste.snippetTitle": "Insert the image", + "dashboard.media.paste.snippetDescription": "Select how you want to insert the image into your content.", + "dashboard.media.paste.snippetNone": "Without snippet", + "dashboard.media.metadata.panel.title": "Update metadata", "dashboard.media.metadata.panel.description": "Please specify the metadata you want to set for the file.", "dashboard.media.metadata.panel.field.fileName": "Filename", @@ -856,5 +868,8 @@ "services.sponsorAi.getDescription.warning": "The AI description generation took too long. Please try again later.", "services.sponsorAi.getTaxonomySuggestions.warning": "The AI taxonomy generation took too long. Please try again later.", - "services.terminal.openLocalServerTerminal.terminalOption.message": "Starting local server" + "services.terminal.openLocalServerTerminal.terminalOption.message": "Starting local server", + + "providers.mediaPaste.title": "Insert media with Front Matter", + "providers.mediaPaste.saveFailed": "Front Matter: the pasted media could not be stored in \"{0}\"." } diff --git a/package-lock.json b/package-lock.json index c6f510ac..a8a9a563 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "@types/react": "17.0.0", "@types/react-datepicker": "^4.8.0", "@types/react-dom": "17.0.0", - "@types/vscode": "^1.90.0", + "@types/vscode": "^1.125.0", "@types/webpack-bundle-analyzer": "^4.7.0", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", @@ -120,7 +120,7 @@ "yawn-yaml": "^1.5.0" }, "engines": { - "vscode": "^1.90.0" + "vscode": "^1.97.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2138,10 +2138,11 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.90.0.tgz", - "integrity": "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ==", - "dev": true + "version": "1.125.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.125.0.tgz", + "integrity": "sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/vscode-webview": { "version": "1.57.0", diff --git a/package.json b/package.json index 3c27092d..2e2a1dcd 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "qna": "https://github.com/estruyf/vscode-front-matter/discussions", "engines": { - "vscode": "^1.90.0" + "vscode": "^1.97.0" }, "l10n": "./l10n", "categories": [ @@ -1236,6 +1236,33 @@ }, "scope": "Media" }, + "frontMatter.media.pasteBehavior": { + "type": "string", + "default": "dashboard", + "enum": [ + "dashboard", + "auto", + "disabled" + ], + "enumDescriptions": [ + "%setting.frontMatter.media.pasteBehavior.dashboard.description%", + "%setting.frontMatter.media.pasteBehavior.auto.description%", + "%setting.frontMatter.media.pasteBehavior.disabled.description%" + ], + "markdownDescription": "%setting.frontMatter.media.pasteBehavior.markdownDescription%", + "scope": "Media" + }, + "frontMatter.media.pasteFolder": { + "type": "string", + "markdownDescription": "%setting.frontMatter.media.pasteFolder.markdownDescription%", + "scope": "Media" + }, + "frontMatter.media.pasteFileName": { + "type": "string", + "default": "image-{date}-{time}", + "markdownDescription": "%setting.frontMatter.media.pasteFileName.markdownDescription%", + "scope": "Media" + }, "frontMatter.panel.openOnSupportedFile": { "type": "boolean", "default": false, @@ -2969,7 +2996,7 @@ "@types/react": "17.0.0", "@types/react-datepicker": "^4.8.0", "@types/react-dom": "17.0.0", - "@types/vscode": "^1.90.0", + "@types/vscode": "^1.125.0", "@types/webpack-bundle-analyzer": "^4.7.0", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", diff --git a/package.nls.json b/package.nls.json index 28a27373..61e04304 100644 --- a/package.nls.json +++ b/package.nls.json @@ -177,6 +177,12 @@ "setting.frontMatter.global.timezone.markdownDescription": "Specify the timezone for your date formatting. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.taxonomy.datetimezone) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.taxonomy.datetimezone%22%5D)", "setting.frontMatter.media.defaultSorting.markdownDescription": "Specify the default sorting option for the media dashboard. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.defaultsorting) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.defaultsorting%22%5D)", "setting.frontMatter.media.supportedMimeTypes.markdownDescription": "Specify the mime types to support for the media files. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.supportedmimetypes) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.supportedmimetypes%22%5D)", + "setting.frontMatter.media.pasteBehavior.markdownDescription": "Specify what happens when you paste an image into a content file. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.pastebehavior) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.pastebehavior%22%5D)", + "setting.frontMatter.media.pasteBehavior.dashboard.description": "Open the media dashboard to pick the folder and fill in the metadata before inserting.", + "setting.frontMatter.media.pasteBehavior.auto.description": "Save the image to the page bundle or public folder and insert it straight away.", + "setting.frontMatter.media.pasteBehavior.disabled.description": "Let Visual Studio Code handle the paste.", + "setting.frontMatter.media.pasteFolder.markdownDescription": "Specify the folder to store pasted images in. Relative to the workspace, and supports the `[[workspace]]` placeholder. When left empty, the page bundle folder or the public folder is used. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.pastefolder) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.pastefolder%22%5D)", + "setting.frontMatter.media.pasteFileName.markdownDescription": "Specify the file name to use for pasted images, without the extension. Supports the `{filename}`, `{date}`, and `{time}` placeholders. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.pastefilename) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.pastefilename%22%5D)", "setting.frontMatter.media.contentTypes.markdownDescription": "Specify the media content types you want to use in Front Matter. [Docs](https://frontmatter.codes/docs/settings/overview#frontmatter.media.contenttypes) - [View in VS Code](command:simpleBrowser.show?%5B%22https://frontmatter.codes/docs/settings/overview%23frontmatter.media.contenttypes%22%5D)", "setting.frontMatter.media.contentTypes.items.description": "Define the media content types you want to use in Front Matter.", "setting.frontMatter.media.contentTypes.items.properties.name.description": "Name of the media content type", diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index a6d1cdd3..e8b639bc 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -302,7 +302,7 @@ export class Dashboard { `default-src 'none';`, `img-src ${`vscode-file://vscode-app`} ${ webView.cspSource - } https://api.visitorbadge.io 'self' 'unsafe-inline' https://*`, + } https://api.visitorbadge.io 'self' 'unsafe-inline' https://* data:`, `media-src ${`vscode-file://vscode-app`} ${ webView.cspSource } 'self' 'unsafe-inline' https://*`, diff --git a/src/constants/settings.ts b/src/constants/settings.ts index 7d10952b..9b34b340 100644 --- a/src/constants/settings.ts +++ b/src/constants/settings.ts @@ -81,6 +81,10 @@ export const SETTING_CONTENT_HIDE_FRONTMATTER_MESSAGE = 'content.hideFmMessage'; export const SETTING_MEDIA_SUPPORTED_MIMETYPES = 'media.supportedMimeTypes'; export const SETTING_MEDIA_CONTENTTYPES = 'media.contentTypes'; +export const SETTING_MEDIA_PASTE_BEHAVIOR = 'media.pasteBehavior'; +export const SETTING_MEDIA_PASTE_FOLDER = 'media.pasteFolder'; +export const SETTING_MEDIA_PASTE_FILENAME = 'media.pasteFileName'; + export const SETTING_DASHBOARD_OPENONSTART = 'dashboard.openOnStart'; export const SETTING_DASHBOARD_CONTENT_TAGS = 'dashboard.content.cardTags'; export const SETTING_DASHBOARD_CONTENT_PAGINATION = 'dashboard.content.pagination'; diff --git a/src/dashboardWebView/DashboardMessage.ts b/src/dashboardWebView/DashboardMessage.ts index 579d6b87..e772b23c 100644 --- a/src/dashboardWebView/DashboardMessage.ts +++ b/src/dashboardWebView/DashboardMessage.ts @@ -40,6 +40,7 @@ export enum DashboardMessage { copyToClipboard = 'copyToClipboard', refreshMedia = 'refreshMedia', uploadMedia = 'uploadMedia', + uploadPastedMedia = 'uploadPastedMedia', deleteMedia = 'deleteMedia', revealMedia = 'revealMedia', insertMedia = 'insertMedia', diff --git a/src/dashboardWebView/components/Media/DetailsForm.tsx b/src/dashboardWebView/components/Media/DetailsForm.tsx index 8de191b8..e4ea4657 100644 --- a/src/dashboardWebView/components/Media/DetailsForm.tsx +++ b/src/dashboardWebView/components/Media/DetailsForm.tsx @@ -15,6 +15,14 @@ export interface IDetailsFormProps { isImageFile: boolean; isVideoFile: boolean; onDismiss: () => void; + /** + * Label for the submit button, defaults to the common save label + */ + submitLabel?: string; + /** + * Called with the submitted metadata once it has been stored + */ + onSubmitted?: (metadata: { [fieldName: string]: string }) => void; } export const DetailsForm: React.FunctionComponent = ({ @@ -22,6 +30,8 @@ export const DetailsForm: React.FunctionComponent = ({ isImageFile, isVideoFile, onDismiss, + submitLabel, + onSubmitted, }: React.PropsWithChildren) => { const settings = useRecoilValue(SettingsAtom); const selectedFolder = useRecoilValue(SelectedMediaFolderSelector); @@ -71,8 +81,14 @@ export const DetailsForm: React.FunctionComponent = ({ metadata, }); + // When a submit handler is provided, it takes over from here + if (onSubmitted) { + onSubmitted(metadata); + return; + } + onDismiss(); - }, [media, filename, metadata, selectedFolder, page, onDismiss]); + }, [media, filename, metadata, selectedFolder, page, onDismiss, onSubmitted]); const formFields = useMemo(() => { return fields.map((field) => { @@ -212,7 +228,7 @@ export const DetailsForm: React.FunctionComponent = ({ onClick={onSubmitMetadata} disabled={!filename} > - {l10n.t(LocalizationKey.commonSave)} + {submitLabel || l10n.t(LocalizationKey.commonSave)} + + + {mediaSnippets.map((mediaSnippet, idx) => ( +
  • + +
  • + ))} + + + ); + } + + if (step === 'metadata' && storedMedia) { + return ( +
    +
    + 0 + ? l10n.t(LocalizationKey.commonSave) + : l10n.t(LocalizationKey.dashboardMediaPasteSaveAndInsert) + } + onSubmitted={onMetadataSubmitted} + onDismiss={() => setDismissed(true)} + /> +
    +
    + ); + } + + return ( +
    + {pendingUpload.fileName} + +
    +

    + {l10n.t(LocalizationKey.dashboardMediaPasteTitle)} +

    +

    + {l10n.t(LocalizationKey.dashboardMediaPasteDescription)} +

    +

    + {relFolder + ? l10n.t(LocalizationKey.dashboardMediaPasteStoreIn, relFolder) + : l10n.t(LocalizationKey.dashboardMediaPasteNoFolder)} +

    + {error && ( +

    {error}

    + )} +
    + +
    + + + +
    +
    + ); +}; diff --git a/src/extension.ts b/src/extension.ts index 9c74bb71..e740b567 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,6 +2,7 @@ import { GitListener } from './listeners/general/GitListener'; import * as vscode from 'vscode'; import { COMMAND_NAME, CONTEXT, EXTENSION_NAME } from './constants'; import { MarkdownFoldingProvider } from './providers/MarkdownFoldingProvider'; +import { MediaPasteProvider } from './providers/MediaPasteProvider'; import { PanelProvider } from './panelWebView/PanelProvider'; import { DashboardSettings, @@ -116,6 +117,9 @@ export async function activate(context: vscode.ExtensionContext) { // Folding the front matter of markdown files MarkdownFoldingProvider.register(); + // Pasting media into the content files + MediaPasteProvider.register(subscriptions); + // Register the taxonomy commands Taxonomy.registerCommands(subscriptions); diff --git a/src/helpers/MediaHelpers.ts b/src/helpers/MediaHelpers.ts index 6417ab90..8c8fd034 100644 --- a/src/helpers/MediaHelpers.ts +++ b/src/helpers/MediaHelpers.ts @@ -352,6 +352,36 @@ export class MediaHelpers { return false; } + /** + * Write raw media contents to disk, making sure the file name is unique + * @param fileName File name including its extension + * @param contents The raw file contents + * @param absFolderPath The absolute path of the folder to store the file in + * @returns The absolute path of the stored file + */ + public static async saveMediaBuffer( + fileName: string, + contents: Uint8Array, + absFolderPath: string + ): Promise { + if (!(await existsAsync(absFolderPath))) { + await workspace.fs.createDirectory(Uri.file(absFolderPath)); + } + + const { name, ext } = parse(fileName); + + let filePath = join(absFolderPath, fileName); + let idx = 1; + while (await existsAsync(filePath)) { + filePath = join(absFolderPath, `${name}-${idx}${ext}`); + idx++; + } + + await writeFileAsync(filePath, contents); + + return filePath; + } + /** * Delete the selected file * @param data diff --git a/src/listeners/dashboard/MediaListener.ts b/src/listeners/dashboard/MediaListener.ts index b86aa19f..5854d231 100644 --- a/src/listeners/dashboard/MediaListener.ts +++ b/src/listeners/dashboard/MediaListener.ts @@ -7,8 +7,12 @@ import { commands, env, ProgressLocation, Uri, window, workspace } from 'vscode' import { COMMAND_NAME } from '../../constants'; import * as os from 'os'; import { Folders } from '../../commands'; -import { PostMessageData, UnmappedMedia } from '../../models'; -import { FilesHelper, MediaLibrary } from '../../helpers'; +import { MediaInfo, PostMessageData, UnmappedMedia } from '../../models'; +import { decodeBase64, FilesHelper, MediaLibrary } from '../../helpers'; +import { Dashboard } from '../../commands/Dashboard'; +import { lookup } from 'mime-types'; +import imageSize from 'image-size'; +import { ISizeCalculationResult } from 'image-size/dist/types/interface'; import { existsAsync, flattenObjectKeys } from '../../utils'; import { join, parse } from 'path'; import { LocalizationKey, localize } from '../../localization'; @@ -32,6 +36,9 @@ export class MediaListener extends BaseListener { case DashboardMessage.uploadMedia: this.store(msg?.payload); break; + case DashboardMessage.uploadPastedMedia: + await this.storePastedMedia(msg); + break; case DashboardMessage.deleteMedia: this.delete(msg?.payload); break; @@ -262,6 +269,62 @@ export class MediaListener extends BaseListener { } } + /** + * Store a pasted media file in the selected folder and report the stored file + * back to the dashboard so it can collect the metadata and insert it. + * @param msg + */ + private static async storePastedMedia({ command, payload, requestId }: PostMessageData) { + if (!command || !requestId) { + return; + } + + const { fileName, contents, folder } = payload ?? {}; + if (!fileName || !contents || !folder) { + this.sendError(command as DashboardCommand, requestId, 'Missing paste information'); + return; + } + + const data = decodeBase64(contents); + if (!data) { + this.sendError(command as DashboardCommand, requestId, 'Invalid media contents'); + return; + } + + let fsPath: string | undefined; + try { + fsPath = await MediaHelpers.saveMediaBuffer(fileName, data.data, folder); + } catch (e) { + fsPath = undefined; + } + + if (!fsPath) { + this.sendError(command as DashboardCommand, requestId, 'Could not store the media'); + return; + } + + const mimeType = lookup(fsPath) || undefined; + + let dimensions: ISizeCalculationResult | undefined; + try { + dimensions = mimeType?.startsWith('image/') ? imageSize(fsPath) : undefined; + } catch { + dimensions = undefined; + } + + MediaHelpers.resetMedia(); + this.sendRequest(command as DashboardCommand, requestId, { + filename: parse(fsPath).base, + fsPath, + vsPath: Dashboard.getWebview()?.asWebviewUri(Uri.file(fsPath))?.toString(), + dimensions, + mimeType, + metadata: {} + } as MediaInfo); + + this.sendMediaFiles(0, folder); + } + /** * Delete a media file * @param data diff --git a/src/localization/localization.enum.ts b/src/localization/localization.enum.ts index eec34d83..539dfb09 100644 --- a/src/localization/localization.enum.ts +++ b/src/localization/localization.enum.ts @@ -771,6 +771,50 @@ export enum LocalizationKey { * Close panel */ dashboardMediaPanelClose = 'dashboard.media.panel.close', + /** + * Paste media + */ + dashboardMediaPasteTitle = 'dashboard.media.paste.title', + /** + * Browse to the folder you want to store the image in. + */ + dashboardMediaPasteDescription = 'dashboard.media.paste.description', + /** + * Store in: {0} + */ + dashboardMediaPasteStoreIn = 'dashboard.media.paste.storeIn', + /** + * Select a folder to store the image in. + */ + dashboardMediaPasteNoFolder = 'dashboard.media.paste.noFolder', + /** + * Store image + */ + dashboardMediaPasteStore = 'dashboard.media.paste.store', + /** + * Storing the image... + */ + dashboardMediaPasteStoring = 'dashboard.media.paste.storing', + /** + * The image could not be stored. Please try again. + */ + dashboardMediaPasteError = 'dashboard.media.paste.error', + /** + * Save and insert + */ + dashboardMediaPasteSaveAndInsert = 'dashboard.media.paste.saveAndInsert', + /** + * Insert the image + */ + dashboardMediaPasteSnippetTitle = 'dashboard.media.paste.snippetTitle', + /** + * Select how you want to insert the image into your content. + */ + dashboardMediaPasteSnippetDescription = 'dashboard.media.paste.snippetDescription', + /** + * Without snippet + */ + dashboardMediaPasteSnippetNone = 'dashboard.media.paste.snippetNone', /** * Update metadata */ @@ -2851,5 +2895,13 @@ export enum LocalizationKey { /** * Starting local server */ - servicesTerminalOpenLocalServerTerminalTerminalOptionMessage = 'services.terminal.openLocalServerTerminal.terminalOption.message' + servicesTerminalOpenLocalServerTerminalTerminalOptionMessage = 'services.terminal.openLocalServerTerminal.terminalOption.message', + /** + * Insert media with Front Matter + */ + providersMediaPasteTitle = 'providers.mediaPaste.title', + /** + * Front Matter: the pasted media could not be stored in "{0}". + */ + providersMediaPasteSaveFailed = 'providers.mediaPaste.saveFailed' } diff --git a/src/models/DashboardData.ts b/src/models/DashboardData.ts index ca25175b..b06fc275 100644 --- a/src/models/DashboardData.ts +++ b/src/models/DashboardData.ts @@ -24,11 +24,23 @@ export interface ViewData { multiple?: string[]; value?: string; + // Media paste fields + suggestedFolder?: string; + pendingUpload?: PendingUpload; + // File fields type: 'file' | 'media'; fileExtensions?: string[]; } +export interface PendingUpload { + fileName: string; + /** + * The base64 encoded contents of the file + */ + contents: string; +} + export interface SnippetRange { start: Position; end: Position; diff --git a/src/providers/MediaPasteProvider.ts b/src/providers/MediaPasteProvider.ts new file mode 100644 index 00000000..4097db9d --- /dev/null +++ b/src/providers/MediaPasteProvider.ts @@ -0,0 +1,302 @@ +import { + CancellationToken, + DataTransfer, + DataTransferFile, + DocumentDropOrPasteEditKind, + DocumentPasteEdit, + DocumentPasteEditContext, + DocumentPasteEditProvider, + DocumentPasteProviderMetadata, + DocumentSelector, + Disposable, + Range, + TextDocument, + commands, + languages +} from 'vscode'; +import { basename, dirname, join, parse, relative } from 'path'; +import { extension } from 'mime-types'; +import * as l10n from '@vscode/l10n'; +import { Folders } from '../commands/Folders'; +import { Wysiwyg } from '../commands/Wysiwyg'; +import { + COMMAND_NAME, + DEFAULT_CONTENT_TYPE, + SETTING_CONTENT_SUPPORTED_FILETYPES, + SETTING_MEDIA_PASTE_BEHAVIOR, + SETTING_MEDIA_PASTE_FILENAME, + SETTING_MEDIA_PASTE_FOLDER +} from '../constants'; +import { STATIC_FOLDER_PLACEHOLDER } from '../constants/StaticFolderPlaceholder'; +import { ArticleHelper } from '../helpers/ArticleHelper'; +import { FrameworkDetector } from '../helpers/FrameworkDetector'; +import { Logger } from '../helpers/Logger'; +import { MediaHelpers } from '../helpers/MediaHelpers'; +import { Notifications } from '../helpers/Notifications'; +import { Settings } from '../helpers/SettingsHelper'; +import { parseWinPath } from '../helpers/parseWinPath'; +import { LocalizationKey } from '../localization'; +import { DashboardData } from '../models'; + +type PasteBehavior = 'dashboard' | 'auto' | 'disabled'; + +interface PasteContext { + document: TextDocument; + range: Range; + fileName: string; + mimeType: string; + contents: Uint8Array; +} + +/** + * Paste edit which carries the media contents over to the resolve step + */ +class MediaPasteEdit extends DocumentPasteEdit { + constructor(title: string, kind: DocumentDropOrPasteEditKind, public ctx: PasteContext) { + super('', title, kind); + } +} + +export class MediaPasteProvider implements DocumentPasteEditProvider { + public static readonly kind = DocumentDropOrPasteEditKind.Empty.append('image', 'frontMatter'); + + public static register(subscriptions: Disposable[]) { + const supportedFiles = Settings.get(SETTING_CONTENT_SUPPORTED_FILETYPES); + + const selectors: DocumentSelector[] = [{ language: 'markdown', scheme: 'file' }]; + for (const fileExt of supportedFiles || []) { + if (fileExt !== 'md' && fileExt !== 'markdown') { + selectors.push({ pattern: `**/*.${fileExt}`, scheme: 'file' }); + } + } + + const provider = new MediaPasteProvider(); + const metadata: DocumentPasteProviderMetadata = { + providedPasteEditKinds: [MediaPasteProvider.kind], + pasteMimeTypes: ['files', 'image/*'] + }; + + for (const selector of selectors) { + subscriptions.push(languages.registerDocumentPasteEditProvider(selector, provider, metadata)); + } + } + + public async provideDocumentPasteEdits( + document: TextDocument, + ranges: readonly Range[], + dataTransfer: DataTransfer, + _context: DocumentPasteEditContext, + token: CancellationToken + ): Promise { + if (MediaPasteProvider.getBehavior() === 'disabled') { + return; + } + + if (!ArticleHelper.isSupportedFile(document)) { + return; + } + + const image = MediaPasteProvider.getImageFile(dataTransfer); + if (!image) { + return; + } + + // Read the contents while the data transfer is still valid + const contents = await image.file.data(); + if (token.isCancellationRequested || !contents?.length) { + return; + } + + const edit = new MediaPasteEdit( + l10n.t(LocalizationKey.providersMediaPasteTitle), + MediaPasteProvider.kind, + { + document, + range: ranges[0], + fileName: MediaPasteProvider.getFileName(image.file, image.mimeType, document), + mimeType: image.mimeType, + contents + } + ); + + return [edit]; + } + + public async resolveDocumentPasteEdit( + pasteEdit: MediaPasteEdit, + token: CancellationToken + ): Promise { + const { document, range, fileName, mimeType, contents } = pasteEdit.ctx; + + const article = ArticleHelper.getFrontMatterFromDocument(document); + const contentType = article?.data + ? await ArticleHelper.getContentType(article) + : DEFAULT_CONTENT_TYPE; + const isPageBundle = !!contentType?.pageBundle; + + const folder = MediaPasteProvider.getTargetFolder(document.fileName, isPageBundle); + + if (token.isCancellationRequested) { + return pasteEdit; + } + + if (MediaPasteProvider.getBehavior() === 'dashboard') { + // The dashboard takes over: it stores the file, collects the metadata, and + // inserts the markup itself through `MediaHelpers.insertMediaToMarkdown`. + await commands.executeCommand(COMMAND_NAME.dashboard, { + type: 'media', + data: { + type: 'media', + pageBundle: isPageBundle, + filePath: document.fileName, + fieldName: basename(document.fileName), + position: range.start, + selection: document.getText(range), + suggestedFolder: folder, + pendingUpload: { + fileName, + contents: `data:${mimeType};base64,${Buffer.from(contents).toString('base64')}` + } + } + } as DashboardData); + + return pasteEdit; + } + + let absMediaPath: string | undefined; + try { + absMediaPath = await MediaHelpers.saveMediaBuffer(fileName, contents, folder); + } catch (e) { + Logger.error(`MediaPasteProvider: ${(e as Error)?.message}`); + } + + if (!absMediaPath) { + Notifications.error(l10n.t(LocalizationKey.providersMediaPasteSaveFailed, folder)); + return pasteEdit; + } + + const relPath = MediaPasteProvider.getRelPath(absMediaPath, document.fileName, isPageBundle); + pasteEdit.insertText = MediaPasteProvider.getMarkup(relPath, document.fileName); + + return pasteEdit; + } + + private static getBehavior(): PasteBehavior { + return Settings.get(SETTING_MEDIA_PASTE_BEHAVIOR) || 'dashboard'; + } + + /** + * Retrieve the first image from the data transfer + */ + private static getImageFile( + dataTransfer: DataTransfer + ): { file: DataTransferFile; mimeType: string } | undefined { + let image: { file: DataTransferFile; mimeType: string } | undefined; + + dataTransfer.forEach((item, mimeType) => { + if (image || !mimeType.startsWith('image/')) { + return; + } + + const file = item.asFile(); + if (file) { + image = { file, mimeType }; + } + }); + + return image; + } + + /** + * Determine the file name to use for the pasted media. Images pasted from the + * clipboard have no name of their own, so the configured template is used. + */ + private static getFileName( + file: DataTransferFile, + mimeType: string, + document: TextDocument + ): string { + const { name, ext } = parse(file.name || ''); + if (name && ext) { + return `${name}${ext}`; + } + + const template = Settings.get(SETTING_MEDIA_PASTE_FILENAME) || 'image-{date}-{time}'; + const now = new Date(); + const pad = (value: number) => `${value}`.padStart(2, '0'); + + const fileName = template + .replace(/{filename}/g, parse(document.fileName).name) + .replace(/{date}/g, `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}`) + .replace(/{time}/g, `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`); + + const fileExt = ext || `.${extension(mimeType) || 'png'}`; + + return `${fileName}${fileExt}`; + } + + /** + * Determine where the pasted media needs to be stored + */ + private static getTargetFolder(filePath: string, isPageBundle: boolean): string { + const pasteFolder = Settings.get(SETTING_MEDIA_PASTE_FOLDER); + if (pasteFolder) { + return Folders.getAbsFilePath(pasteFolder); + } + + const staticFolder = Folders.getStaticFolderRelativePath(); + + // Hexo stores its assets next to the post, in a folder named after the post + if (staticFolder === STATIC_FOLDER_PLACEHOLDER.hexo.placeholder) { + return parseWinPath(join(dirname(filePath), parse(filePath).name)); + } + + // Page bundles keep their media in the folder of the page itself + if (isPageBundle) { + return parseWinPath(dirname(filePath)); + } + + const wsFolder = Folders.getWorkspaceFolder(); + return parseWinPath( + join(wsFolder?.fsPath || '', !staticFolder || staticFolder === '/' ? '' : staticFolder) + ); + } + + /** + * Determine the path to reference the media by, taking the static folder and + * the framework of the project into account. + */ + private static getRelPath( + absMediaPath: string, + filePath: string, + isPageBundle: boolean + ): string { + if (isPageBundle) { + const relDir = parseWinPath(relative(dirname(filePath), dirname(absMediaPath))); + return parseWinPath(join(relDir, basename(absMediaPath))); + } + + const wsFolder = Folders.getWorkspaceFolder(); + const staticFolder = Folders.getStaticFolderRelativePath(); + + let relPath = + parseWinPath(absMediaPath).split(parseWinPath(wsFolder?.fsPath || '')).pop() || ''; + + if (staticFolder && staticFolder !== '/') { + relPath = relPath.split(parseWinPath(staticFolder)).pop() || relPath; + } + + return FrameworkDetector.relAssetPathUpdate(relPath, filePath); + } + + /** + * Create the markup to insert for the pasted media + */ + private static getMarkup(relPath: string, filePath: string): string { + const mediaPath = relPath.replace(/ /g, '%20'); + + return Wysiwyg.getDocType(filePath) === 'asciidoc' + ? `image:${mediaPath}[]` + : `![](${mediaPath})`; + } +} From ed97be02ba82ae99d2b8d2e5cb87173b4ce9b3ad Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 20 Aug 2026 18:14:24 +0200 Subject: [PATCH 08/13] feat: implement JSON database helper for Git-friendly formatting and error handling --- CHANGELOG.md | 2 + l10n/bundle.l10n.json | 2 + src/helpers/Extension.ts | 4 + src/helpers/JsonDbHelper.ts | 187 ++++++++++++++++++++++++++ src/helpers/MediaLibrary.ts | 17 +-- src/helpers/TaxonomyHelper.ts | 5 +- src/helpers/index.ts | 1 + src/localization/localization.enum.ts | 8 ++ src/services/PinnedItems.ts | 5 +- 9 files changed, 212 insertions(+), 19 deletions(-) create mode 100644 src/helpers/JsonDbHelper.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ad34d46..86e7c834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,13 @@ - [#1053](https://github.com/estruyf/vscode-front-matter/issues/1053): Support pasting images directly into Markdown/MDX files - [#1055](https://github.com/estruyf/vscode-front-matter/issues/1055): Added the `translate` property on content type fields to define which front matter fields need to be machine translated. The title and description fields are translated by default, set `translate: false` to exclude them +- The `.frontmatter/database` files are now stored in a human readable format with sorted keys, so that Git can merge them line by line instead of conflicting on a single line. Existing files are reformatted once, when the extension activates ### 🐞 Fixes - [#1043](https://github.com/estruyf/vscode-front-matter/issues/1043): Fix issue with last modified date in content health freshness checks - [#1054](https://github.com/estruyf/vscode-front-matter/issues/1054): Fix the "Could not retrieve the locale for the current file" error for multilingual content nested in subfolders (ex. `content/de/posts/2024/07/my-post/index.md`). Translations are now created with the same folder structure as the source file +- Show an error notification when one of the `.frontmatter/database` files contains invalid JSON or unresolved Git conflict markers, instead of failing silently ## [10.11.0] - 2026-07-02 - [Release notes](https://beta.frontmatter.codes/updates/v10.11.0) diff --git a/l10n/bundle.l10n.json b/l10n/bundle.l10n.json index 2d1ddf48..73b47765 100644 --- a/l10n/bundle.l10n.json +++ b/l10n/bundle.l10n.json @@ -763,6 +763,8 @@ "helpers.mediaLibrary.remove.warning": "The name \"{0}\" already exists at the file location.", "helpers.mediaLibrary.remove.error": "Sorry, something went wrong updating \"{0}\" to \"{1}\".", + "helpers.jsonDbHelper.conflict.error": "The \"{0}\" file still contains Git conflict markers. Resolve the conflict in the file to make Front Matter read it again.", + "helpers.jsonDbHelper.parse.error": "The \"{0}\" file could not be read, as it does not contain valid JSON: {1}", "helpers.openFileInEditor.error": "Couldn't open the file.", diff --git a/src/helpers/Extension.ts b/src/helpers/Extension.ts index 2b4f84b3..9d798e19 100644 --- a/src/helpers/Extension.ts +++ b/src/helpers/Extension.ts @@ -26,6 +26,7 @@ import { import { ContentFolder, TaxonomyType } from '../models'; import { Notifications } from './Notifications'; import { Settings } from './SettingsHelper'; +import { reformatJsonDbs } from './JsonDbHelper'; import { TaxonomyHelper } from './TaxonomyHelper'; import { Cache } from '../commands/Cache'; import * as l10n from '@vscode/l10n'; @@ -269,6 +270,9 @@ export class Extension { await Settings.safeUpdate(SETTING_CONTENT_PAGE_FOLDERS, folders, true); } + // Rewrite the databases which are still stored on a single line + await reformatJsonDbs(); + // The tags and categories settings need to be moved to the database const tags = Settings.get(SETTING_TAXONOMY_TAGS) || []; const categories = Settings.get(SETTING_TAXONOMY_CATEGORIES) || []; diff --git a/src/helpers/JsonDbHelper.ts b/src/helpers/JsonDbHelper.ts new file mode 100644 index 00000000..2d4bb9f8 --- /dev/null +++ b/src/helpers/JsonDbHelper.ts @@ -0,0 +1,187 @@ +import { ConfigWithAdapter, FileAdapter, IAdapter, JsonDB } from 'node-json-db'; +import { ParseError, parse as parseJsonc, printParseErrorCode } from 'jsonc-parser'; +import * as l10n from '@vscode/l10n'; +import { LocalStore } from '../constants'; +import { LocalizationKey } from '../localization'; +import { join } from 'path'; +import { Folders } from '../commands/Folders'; +import { existsAsync, readFileAsync } from '../utils'; +import { parseWinPath } from './parseWinPath'; +import { Notifications } from './Notifications'; +import { Logger } from './Logger'; + +const CONFLICT_MARKER = /^<{7}(?: |\t|$)/m; + +/** + * Adapter to store the Front Matter databases in a Git-friendly format. + * + * The databases live in the `.frontmatter/database` folder and are versioned by most + * teams. Storing them on a single minified line leaves Git nothing to merge line by + * line, so the data gets indented and its object keys sorted to keep the diffs stable. + */ +class JsonDbAdapter implements IAdapter { + private readonly dateRegex = new RegExp('^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}', 'm'); + + constructor(private readonly adapter: IAdapter, private readonly dbPath: string) {} + + public async readAsync(): Promise { + const data = await this.adapter.readAsync(); + + if (data === null) { + await this.writeAsync({}); + return {}; + } + + const errors: ParseError[] = []; + const contents = parseJsonc(data, errors, { allowTrailingComma: true }); + + if (errors.length > 0) { + // Let the error bubble up, as the database stays unloaded, no write can + // overwrite the file before the user got the chance to fix it + const parseError = JsonDbAdapter.getParseError(data, errors[0]); + this.notifyCorrupted(data, parseError); + throw new Error(`Failed to parse "${this.dbPath}": ${parseError}`); + } + + return this.revive(contents); + } + + public writeAsync(data: any): Promise { + // The trailing newline keeps the file from showing up as changed in every diff + return this.adapter.writeAsync(`${JSON.stringify(data, JsonDbAdapter.replacer, 2)}\n`); + } + + /** + * Sort the object keys, so that the same data always writes the same file + */ + private static replacer(_: string, value: any) { + if (value === null || typeof value !== 'object' || Array.isArray(value)) { + return value; + } + + return Object.keys(value) + .sort() + .reduce((sorted: Record, key: string) => { + sorted[key] = value[key]; + return sorted; + }, {}); + } + + /** + * Turn the date strings back into dates, as the JSONC parser takes no reviver + */ + private revive(value: any): any { + if (typeof value === 'string') { + return this.dateRegex.exec(value) !== null ? new Date(value) : value; + } + + if (Array.isArray(value)) { + return value.map((item) => this.revive(item)); + } + + if (value !== null && typeof value === 'object') { + for (const key of Object.keys(value)) { + value[key] = this.revive(value[key]); + } + } + + return value; + } + + /** + * Point the user to the place where the file breaks, a line and column are + * easier to find back than the character offset + */ + private static getParseError(contents: string, error: ParseError) { + const upToError = contents.substring(0, error.offset); + const line = upToError.split('\n').length; + const column = error.offset - upToError.lastIndexOf('\n'); + + return `${printParseErrorCode(error.error)} at line ${line}, column ${column}`; + } + + /** + * Tell the user which file is broken and why, instead of failing silently + */ + private notifyCorrupted(contents: string, error: string) { + const localPath = JsonDbAdapter.getLocalPath(this.dbPath); + + const message = CONFLICT_MARKER.test(contents) + ? l10n.t(LocalizationKey.helpersJsonDbHelperConflictError, localPath) + : l10n.t(LocalizationKey.helpersJsonDbHelperParseError, localPath, error); + + Notifications.errorShowOnce(message); + } + + /** + * Show the path relative to the project, as that is how the user knows the file + */ + private static getLocalPath(dbPath: string) { + const path = parseWinPath(dbPath); + const idx = path.indexOf(`/${LocalStore.rootFolder}/`); + return idx > -1 ? path.substring(idx + 1) : path; + } +} + +/** + * Create a database for one of the files in the `.frontmatter/database` folder + * @param dbPath + * @returns + */ +export const createJsonDb = (dbPath: string): JsonDB => { + const adapter = new JsonDbAdapter(new FileAdapter(dbPath, false), dbPath); + return new JsonDB(new ConfigWithAdapter(adapter, true, '/')); +}; + +/** + * Rewrite the databases which are still stored on a single line + * + * Without this, the files only get reformatted once the extension writes to them, + * which spreads the change out over whenever someone happens to add a tag or edit + * the metadata of a media file + */ +export const reformatJsonDbs = async (): Promise => { + const wsFolder = Folders.getWorkspaceFolder(); + if (!wsFolder) { + return; + } + + const dbFolder = join( + parseWinPath(wsFolder.fsPath), + LocalStore.rootFolder, + LocalStore.databaseFolder + ); + + const dbFiles = [ + LocalStore.taxonomyDatabaseFile, + LocalStore.mediaDatabaseFile, + LocalStore.pinnedItemsDatabaseFile + ]; + + for (const dbFile of dbFiles) { + const dbPath = join(dbFolder, dbFile); + + // Only touch the files which are already there, creating the missing ones would + // add files to the project which the user never used + if (!(await existsAsync(dbPath))) { + continue; + } + + try { + const contents = await readFileAsync(dbPath, 'utf8'); + if (contents.startsWith(`{\n`)) { + continue; + } + + const db = createJsonDb(dbPath); + // Loading first is crucial, saving an unloaded database writes an empty object + await db.load(); + await db.save(); + + Logger.info(`Reformatted "${dbFile}" to be able to merge it line by line`); + } catch (err) { + // The read already told the user which file is broken and why + Logger.error(`Failed to reformat "${dbFile}": ${(err as Error).message}`); + } + } +}; diff --git a/src/helpers/MediaLibrary.ts b/src/helpers/MediaLibrary.ts index b070e0c9..3a227c2d 100644 --- a/src/helpers/MediaLibrary.ts +++ b/src/helpers/MediaLibrary.ts @@ -1,6 +1,7 @@ import { MediaHelpers } from './MediaHelpers'; import { Disposable, workspace } from 'vscode'; -import { Config, JsonDB } from 'node-json-db'; +import { JsonDB } from 'node-json-db'; +import { createJsonDb } from './JsonDbHelper'; import { basename, dirname, join, parse } from 'path'; import { Folders, WORKSPACE_PLACEHOLDER } from '../commands/Folders'; import { Notifications } from './Notifications'; @@ -56,19 +57,7 @@ export class MediaLibrary { } } - this.db = new JsonDB( - new Config( - join( - parseWinPath(wsFolder?.fsPath || ''), - LocalStore.rootFolder, - LocalStore.databaseFolder, - LocalStore.mediaDatabaseFile - ), - true, - false, - '/' - ) - ); + this.db = createJsonDb(dbPath); if (this.renameFilesListener) { this.renameFilesListener.dispose(); diff --git a/src/helpers/TaxonomyHelper.ts b/src/helpers/TaxonomyHelper.ts index c19e4659..ac2842c8 100644 --- a/src/helpers/TaxonomyHelper.ts +++ b/src/helpers/TaxonomyHelper.ts @@ -17,7 +17,8 @@ import { Notifications } from './Notifications'; import { ArticleHelper } from './ArticleHelper'; import { ContentType } from './ContentType'; import { readFileAsync, writeFileAsync } from '../utils'; -import { Config, JsonDB } from 'node-json-db'; +import { JsonDB } from 'node-json-db'; +import { createJsonDb } from './JsonDbHelper'; import { Folders } from '../commands'; import { join } from 'path'; import { SettingsListener as PanelSettingsListener } from '../listeners/panel'; @@ -47,7 +48,7 @@ export class TaxonomyHelper { ); const dbPath = join(dbFolder, LocalStore.taxonomyDatabaseFile); - TaxonomyHelper.db = new JsonDB(new Config(dbPath, true, false, '/')); + TaxonomyHelper.db = createJsonDb(dbPath); } /** diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 5e2a4f62..1e60f307 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -10,6 +10,7 @@ export * from './FilesHelper'; export * from './FrameworkDetector'; export * from './GroupBy'; export * from './ImageHelper'; +export * from './JsonDbHelper'; export * from './Logger'; export * from './MediaHelpers'; export * from './MediaLibrary'; diff --git a/src/localization/localization.enum.ts b/src/localization/localization.enum.ts index 539dfb09..3dcdb5df 100644 --- a/src/localization/localization.enum.ts +++ b/src/localization/localization.enum.ts @@ -2536,6 +2536,14 @@ export enum LocalizationKey { * Sorry, something went wrong updating "{0}" to "{1}". */ helpersMediaLibraryRemoveError = 'helpers.mediaLibrary.remove.error', + /** + * The "{0}" file still contains Git conflict markers. Resolve the conflict in the file to make Front Matter read it again. + */ + helpersJsonDbHelperConflictError = 'helpers.jsonDbHelper.conflict.error', + /** + * The "{0}" file could not be read, as it does not contain valid JSON: {1} + */ + helpersJsonDbHelperParseError = 'helpers.jsonDbHelper.parse.error', /** * Couldn't open the file. */ diff --git a/src/services/PinnedItems.ts b/src/services/PinnedItems.ts index 88018b1f..095b7aee 100644 --- a/src/services/PinnedItems.ts +++ b/src/services/PinnedItems.ts @@ -1,8 +1,7 @@ -import { Config, JsonDB } from 'node-json-db'; import { Folders } from '../commands'; import { join } from 'path'; import { LocalStore } from '../constants'; -import { FilesHelper, parseWinPath } from '../helpers'; +import { createJsonDb, FilesHelper, parseWinPath } from '../helpers'; const PINNED_DB = '/pinned'; @@ -106,6 +105,6 @@ export class PinnedItems { ); const dbPath = join(dbFolder, LocalStore.pinnedItemsDatabaseFile); - return new JsonDB(new Config(dbPath, true, false, '/')); + return createJsonDb(dbPath); } } From 4ab1dcace2c1a520b2460287011b6f6e4ed86992 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Thu, 20 Aug 2026 23:06:00 +0200 Subject: [PATCH 09/13] feat: update vscode engine requirement to ^1.125.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8a9a563..8daef2fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,7 +120,7 @@ "yawn-yaml": "^1.5.0" }, "engines": { - "vscode": "^1.97.0" + "vscode": "^1.125.0" } }, "node_modules/@aashutoshrathi/word-wrap": { diff --git a/package.json b/package.json index 2e2a1dcd..85cb8ca7 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ }, "qna": "https://github.com/estruyf/vscode-front-matter/discussions", "engines": { - "vscode": "^1.97.0" + "vscode": "^1.125.0" }, "l10n": "./l10n", "categories": [ From cfe634bbaaba520ba6fdd9fa0aa42eea70a224bf Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 21 Aug 2026 09:47:40 +0200 Subject: [PATCH 10/13] Implement feature X to enhance user experience and optimize performance --- package-lock.json | 1787 +++++++++++++++++++++++++++------------------ 1 file changed, 1091 insertions(+), 696 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8daef2fb..bc4a1d3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -133,13 +133,24 @@ } }, "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", "dev": true, + "license": "MIT", "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@actions/io": "^1.0.1" } }, "node_modules/@actions/http-client": { @@ -152,6 +163,13 @@ "undici": "^5.25.4" } }, + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -399,13 +417,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -477,10 +493,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -508,12 +525,12 @@ } }, "node_modules/@estruyf/vscode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@estruyf/vscode/-/vscode-1.1.0.tgz", - "integrity": "sha512-JOjok+d870IsBPqk/E+KeW9E5ar+slqW8Sae5PtNb1yB8aMudJy9DHV5wQeki/ZwggFYDv+6EPjyzW/71/5yVw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@estruyf/vscode/-/vscode-1.2.0.tgz", + "integrity": "sha512-ZOTB1Yt44BdNIG0gsGd+cI0Cj8mef+i0ULeYMqt/lY8idSI48ZTc2F8CUyLhfVw9kgI2i37jOqTlvBo4+St50w==", "dev": true, + "license": "MIT", "dependencies": { - "@types/vscode-webview": "1.57.0", "uuid": "^9.0.0" }, "funding": { @@ -651,6 +668,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -664,10 +682,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -676,12 +695,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -720,17 +740,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -742,36 +759,30 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -970,6 +981,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -1565,10 +1577,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz", - "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==", + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.4.tgz", + "integrity": "sha512-q7j5geK7xs3UJSdm9/iytUNclBnLmYx1EnSeCFXHPeutdqgIMeFeHtUZgS3EhlKxdBEAu8OwtJCwmLrEzpSs7Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -1690,6 +1703,23 @@ "node": ">=6" } }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz", + "integrity": "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz", + "integrity": "sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.3" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1792,21 +1822,12 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -2144,12 +2165,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/vscode-webview": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.0.tgz", - "integrity": "sha512-x3Cb/SMa1IwRHfSvKaZDZOTh4cNoG505c3NjTqGlMC082m++x/ETUmtYniDsw6SSmYzZXO8KBNhYxR0+VqymqA==", - "dev": true - }, "node_modules/@types/webpack": { "version": "4.41.38", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.38.tgz", @@ -2429,148 +2444,163 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -2614,13 +2644,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/accepts": { "version": "1.3.8", @@ -2636,10 +2668,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2647,15 +2680,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -2675,15 +2699,16 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -3057,6 +3082,19 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -3088,43 +3126,36 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3133,7 +3164,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -3152,10 +3184,11 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3174,9 +3207,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -3192,11 +3225,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -3212,10 +3247,11 @@ "dev": true }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3234,6 +3270,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3269,9 +3336,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001583", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001583.tgz", - "integrity": "sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "dev": true, "funding": [ { @@ -3286,7 +3353,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", @@ -3579,17 +3647,18 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -3611,11 +3680,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", @@ -3655,15 +3728,17 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3717,10 +3792,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3837,12 +3913,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3949,6 +4026,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3973,6 +4051,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -4010,10 +4089,11 @@ "dev": true }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -4174,6 +4254,21 @@ "react": ">=16.8.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -4184,25 +4279,29 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.656", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.656.tgz", - "integrity": "sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==", - "dev": true + "version": "1.5.411", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.411.tgz", + "integrity": "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -4214,34 +4313,41 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/enhanced-resolve/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/entities": { @@ -4336,20 +4442,45 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, - "node_modules/es-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.0.0.tgz", - "integrity": "sha512-yHV74THqMJUyFKkHyN7hyENcEZM3Dj2a2IrdClY+IT4BFQHkIVwlh8s6uZfjsFydMdNHv0F5mWgAA3ajFbsvVQ==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4383,10 +4514,11 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4563,10 +4695,11 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4704,6 +4837,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4747,45 +4881,50 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -4873,6 +5012,23 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -4946,17 +5102,18 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~2.0.2", "unpipe": "~1.0.0" }, "engines": { @@ -4968,6 +5125,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4976,7 +5134,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -5018,15 +5177,16 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -5034,6 +5194,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -5107,6 +5268,7 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5198,16 +5360,22 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.3.tgz", - "integrity": "sha512-JIcZczvcMVE7AUOP+X72bh8HqHBRxFdz5PDHYtNG/lE3yk9b3KZBJlwFcTyPYjg3L4RLLmZJzvjxhaZVapxFrQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5225,6 +5393,20 @@ "node": ">=6" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -5268,23 +5450,23 @@ } }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -5301,28 +5483,24 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5382,12 +5560,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5430,10 +5609,11 @@ } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5512,10 +5692,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5539,10 +5720,11 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -6447,19 +6629,24 @@ "dev": true }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, + "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-parser-js": { @@ -6483,10 +6670,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz", + "integrity": "sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -6538,6 +6726,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6567,10 +6756,11 @@ } }, "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "dev": true, + "license": "MIT", "dependencies": { "queue": "6.0.2" }, @@ -6900,6 +7090,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7154,16 +7345,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -7193,6 +7382,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7207,6 +7397,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -7233,10 +7424,21 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7342,13 +7544,14 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", "dev": true, + "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" } }, "node_modules/levn": { @@ -7407,15 +7610,6 @@ "node": ">=4" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -7446,16 +7640,18 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -7540,6 +7736,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -10277,10 +10483,11 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -10601,6 +10808,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10627,10 +10835,14 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -12068,12 +12280,13 @@ ] }, "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, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -12085,6 +12298,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -12138,10 +12352,11 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12158,11 +12373,119 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minimizer-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimizer-webpack-plugin/node_modules/terser": { + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", + "integrity": "sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -12196,10 +12519,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -12235,9 +12559,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -12245,6 +12569,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12322,10 +12647,11 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } @@ -12340,10 +12666,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -12451,10 +12781,11 @@ "dev": true }, "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -12590,10 +12921,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12671,6 +13006,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -12679,10 +13015,11 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12806,6 +13143,13 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -12967,35 +13311,35 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -13007,16 +13351,18 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -13119,9 +13465,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -13137,10 +13483,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -13517,12 +13864,14 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -13588,15 +13937,6 @@ "node": ">=0.10" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13607,29 +13947,21 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rc-align": { "version": "4.0.15", "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", @@ -14628,12 +14960,13 @@ "dev": true }, "node_modules/react-router": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz", - "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==", + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.6.tgz", + "integrity": "sha512-5HfK7k5im7LTOB0EqCQmfvy4C13G92Ssj1VTmouTK3AJvyjKTnFuCV0vcMAD/JS+JC4DvDIBRrlAeJIFjh5VWg==", "dev": true, + "license": "MIT", "dependencies": { - "@remix-run/router": "1.15.0" + "@remix-run/router": "1.23.4" }, "engines": { "node": ">=14.0.0" @@ -14643,13 +14976,14 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz", - "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==", + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.6.tgz", + "integrity": "sha512-0RHKZz7wwffvkU+2MFVT2NnjK44ssLEV+m0CAJaS2Ksmorrwj7WxH00jO0SOCW26/tINUnJHToXblDs33I38YQ==", "dev": true, + "license": "MIT", "dependencies": { - "@remix-run/router": "1.15.0", - "react-router": "6.22.0" + "@remix-run/router": "1.23.4", + "react-router": "6.30.6" }, "engines": { "node": ">=14.0.0" @@ -14820,12 +15154,6 @@ } } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -16032,7 +16360,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/scheduler": { "version": "0.20.2", @@ -16063,10 +16392,11 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -16151,24 +16481,25 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "range-parser": "~1.2.1", - "statuses": "2.0.1" + "statuses": "~2.0.2" }, "engines": { "node": ">= 0.8.0" @@ -16179,6 +16510,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16187,22 +16519,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } + "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.1", @@ -16283,15 +16601,16 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "~0.19.1" }, "engines": { "node": ">= 0.8.0" @@ -16331,7 +16650,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -16374,23 +16694,89 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16403,14 +16789,17 @@ "dev": true }, "node_modules/simple-git": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", - "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.36.0.tgz", + "integrity": "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==", "dev": true, + "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" + "@simple-git/args-pathspec": "^1.0.3", + "@simple-git/argv-parser": "^1.1.0", + "debug": "^4.4.0" }, "funding": { "type": "github", @@ -16564,10 +16953,11 @@ "dev": true }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -16593,6 +16983,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -16611,6 +17002,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16624,13 +17016,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -16639,12 +17033,13 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -16747,6 +17142,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16953,64 +17349,6 @@ "node": ">=6.0.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17084,6 +17422,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -17227,6 +17566,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17329,10 +17669,11 @@ } }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "dev": true, + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -17638,14 +17979,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -17661,9 +18003,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17947,12 +18290,12 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "dev": true, + "license": "MIT", "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -17991,35 +18334,32 @@ "dev": true }, "node_modules/webpack": { - "version": "5.90.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", - "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", + "version": "5.109.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -18172,10 +18512,11 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -18205,7 +18546,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -18250,10 +18591,11 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18329,28 +18671,65 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.5.tgz", + "integrity": "sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -18440,6 +18819,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -18458,6 +18838,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18474,13 +18855,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -18491,10 +18874,11 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18503,10 +18887,11 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18515,12 +18900,13 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -18536,10 +18922,11 @@ "dev": true }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz", + "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -18563,12 +18950,19 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 14" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yaml-js": { @@ -18607,10 +19001,11 @@ } }, "node_modules/yawn-yaml/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" From 8e3b27fee30a62b55559ca995819f4f2161c29d8 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 21 Aug 2026 11:58:50 +0200 Subject: [PATCH 11/13] feat: update @estruyf/vscode dependency to ^1.2.1 and uuid to ^11.1.1 --- package-lock.json | 19 ++++++++++--------- package.json | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc4a1d3f..74e68cdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "devDependencies": { "@actions/core": "^1.10.0", - "@estruyf/vscode": "^1.1.0", + "@estruyf/vscode": "^1.2.1", "@headlessui/react": "^1.7.18", "@heroicons/react": "^2.1.1", "@iarna/toml": "2.2.3", @@ -525,13 +525,13 @@ } }, "node_modules/@estruyf/vscode": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@estruyf/vscode/-/vscode-1.2.0.tgz", - "integrity": "sha512-ZOTB1Yt44BdNIG0gsGd+cI0Cj8mef+i0ULeYMqt/lY8idSI48ZTc2F8CUyLhfVw9kgI2i37jOqTlvBo4+St50w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@estruyf/vscode/-/vscode-1.2.1.tgz", + "integrity": "sha512-i4RVnMJNkibrub7phyiDwgBHpri+6vaaoRwOPAjZKeYAazmzUUuVxc0owu8PnZEgMDMMJ/7meRREZlzkkg30rg==", "dev": true, "license": "MIT", "dependencies": { - "uuid": "^9.0.0" + "uuid": "^11.1.1" }, "funding": { "type": "individual", @@ -539,16 +539,17 @@ } }, "node_modules/@estruyf/vscode/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/@fastify/busboy": { diff --git a/package.json b/package.json index 85cb8ca7..c8d9b9d1 100644 --- a/package.json +++ b/package.json @@ -2975,7 +2975,7 @@ }, "devDependencies": { "@actions/core": "^1.10.0", - "@estruyf/vscode": "^1.1.0", + "@estruyf/vscode": "^1.2.1", "@headlessui/react": "^1.7.18", "@heroicons/react": "^2.1.1", "@iarna/toml": "2.2.3", From ae4b5f0bb51a8962735665ccd8ca7f0a0cd1f370 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 21 Aug 2026 12:42:26 +0200 Subject: [PATCH 12/13] fix: update import paths for WebviewHelper and EditorHelper to use dist directory --- src/commands/Dashboard.ts | 2 +- src/commands/Preview.ts | 2 +- src/helpers/ArticleHelper.ts | 2 +- src/helpers/MediaHelpers.ts | 2 +- src/listeners/dashboard/SnippetListener.ts | 2 +- src/listeners/panel/DataListener.ts | 2 +- src/listeners/panel/TaxonomyListener.ts | 2 +- src/panelWebView/PanelProvider.ts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index e8b639bc..000e770a 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -10,7 +10,7 @@ import { commands, Uri, ViewColumn, Webview, WebviewPanel, window } from 'vscode import { DashboardSettings, Logger, Settings as SettingsHelper, Telemetry } from '../helpers'; import { DashboardCommand } from '../dashboardWebView/DashboardCommand'; import { Extension } from '../helpers/Extension'; -import { WebviewHelper } from '@estruyf/vscode'; +import { WebviewHelper } from '@estruyf/vscode/dist/webview/WebviewHelper'; import { DashboardData } from '../models/DashboardData'; import { DashboardListener, diff --git a/src/commands/Preview.ts b/src/commands/Preview.ts index 5ddbc5b1..52cd2b62 100644 --- a/src/commands/Preview.ts +++ b/src/commands/Preview.ts @@ -23,7 +23,7 @@ import { } from '../helpers'; import { ContentFolder, ContentType, PreviewSettings } from '../models'; import { Article } from '.'; -import { WebviewHelper } from '@estruyf/vscode'; +import { WebviewHelper } from '@estruyf/vscode/dist/webview/WebviewHelper'; import { Folders } from './Folders'; import { ParsedFrontMatter } from '../parsers'; import { getLocalizationFile } from '../utils/getLocalizationFile'; diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 5eae96c2..11d01ecb 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -41,7 +41,7 @@ import { format, parse } from 'date-fns'; import { Notifications } from './Notifications'; import { Article } from '../commands'; import { dirname, join, parse as parseFile } from 'path'; -import { EditorHelper } from '@estruyf/vscode'; +import { EditorHelper } from '@estruyf/vscode/dist/editor/EditorHelper'; import sanitize from '../helpers/Sanitize'; import { ContentFolder, Field, ContentType as IContentType } from '../models'; import { DiagnosticSeverity, Position, window, Range } from 'vscode'; diff --git a/src/helpers/MediaHelpers.ts b/src/helpers/MediaHelpers.ts index 8c8fd034..6320518e 100644 --- a/src/helpers/MediaHelpers.ts +++ b/src/helpers/MediaHelpers.ts @@ -23,7 +23,7 @@ import { basename, join, parse, dirname, relative } from 'path'; import { statSync } from 'fs'; import { Uri, workspace, window, Position } from 'vscode'; import imageSize from 'image-size'; -import { EditorHelper } from '@estruyf/vscode'; +import { EditorHelper } from '@estruyf/vscode/dist/editor/EditorHelper'; import { SortOption } from '../dashboardWebView/constants/SortOption'; import { DataListener, MediaListener } from '../listeners/panel'; import { MediaListener as DashboardMediaListener } from '../listeners/dashboard'; diff --git a/src/listeners/dashboard/SnippetListener.ts b/src/listeners/dashboard/SnippetListener.ts index 9a3bf770..dacc450c 100644 --- a/src/listeners/dashboard/SnippetListener.ts +++ b/src/listeners/dashboard/SnippetListener.ts @@ -1,4 +1,4 @@ -import { EditorHelper } from '@estruyf/vscode'; +import { EditorHelper } from '@estruyf/vscode/dist/editor/EditorHelper'; import { window, Range, Position } from 'vscode'; import { Dashboard } from '../../commands/Dashboard'; import { SETTING_CONTENT_SNIPPETS, SETTING_DATE_FORMAT } from '../../constants'; diff --git a/src/listeners/panel/DataListener.ts b/src/listeners/panel/DataListener.ts index 982ff3ed..a0f0ceb2 100644 --- a/src/listeners/panel/DataListener.ts +++ b/src/listeners/panel/DataListener.ts @@ -45,7 +45,7 @@ import { } from '../../models'; import { encodeEmoji, fieldWhenClause, getTitleField } from '../../utils'; import { PanelProvider } from '../../panelWebView/PanelProvider'; -import { MessageHandlerData } from '@estruyf/vscode'; +import type { MessageHandlerData } from '@estruyf/vscode'; import { SponsorAi } from '../../services/SponsorAI'; import { Terminal } from '../../services'; import * as l10n from '@vscode/l10n'; diff --git a/src/listeners/panel/TaxonomyListener.ts b/src/listeners/panel/TaxonomyListener.ts index b8b3d735..b6c6885b 100644 --- a/src/listeners/panel/TaxonomyListener.ts +++ b/src/listeners/panel/TaxonomyListener.ts @@ -10,7 +10,7 @@ import { SettingsListener as PanelSettingsListener } from '.'; import { SettingsListener as DashboardSettingsListener } from '../dashboard'; import { SponsorAi } from '../../services/SponsorAI'; import { PanelProvider } from '../../panelWebView/PanelProvider'; -import { MessageHandlerData } from '@estruyf/vscode'; +import type { MessageHandlerData } from '@estruyf/vscode'; import * as l10n from '@vscode/l10n'; import { LocalizationKey } from '../../localization'; import { Copilot } from '../../services/Copilot'; diff --git a/src/panelWebView/PanelProvider.ts b/src/panelWebView/PanelProvider.ts index 2f96fe4b..6b1bf50a 100644 --- a/src/panelWebView/PanelProvider.ts +++ b/src/panelWebView/PanelProvider.ts @@ -24,7 +24,7 @@ import { import { ArticleHelper, Logger, Settings } from '../helpers'; import { Command } from '../panelWebView/Command'; import { TagType } from '../panelWebView/TagType'; -import { WebviewHelper } from '@estruyf/vscode'; +import { WebviewHelper } from '@estruyf/vscode/dist/webview/WebviewHelper'; import { Extension } from '../helpers/Extension'; import { Telemetry } from '../helpers/Telemetry'; import { GitListener, ModeListener } from '../listeners/general'; From 639cc2d6225e14f1beca0d20e9944739cb3abcf3 Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Fri, 21 Aug 2026 16:18:36 +0200 Subject: [PATCH 13/13] fix: update mediaDb.json formatting and add newlines; no changes to pinnedItemsDb.json and taxonomyDb.json --- .frontmatter/database/mediaDb.json | 11 ++++++++++- .frontmatter/database/pinnedItemsDb.json | 2 +- .frontmatter/database/taxonomyDb.json | 2 +- CHANGELOG.md | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.frontmatter/database/mediaDb.json b/.frontmatter/database/mediaDb.json index df5c2faf..391b3de0 100644 --- a/.frontmatter/database/mediaDb.json +++ b/.frontmatter/database/mediaDb.json @@ -1 +1,10 @@ -{"assets":{"v7.0.0":{"snippets-dashboard.png":{"caption":"Snippets dashboard","alt":"Snippets dashboard"}}}} \ No newline at end of file +{ + "assets": { + "v7.0.0": { + "snippets-dashboard.png": { + "alt": "Snippets dashboard", + "caption": "Snippets dashboard" + } + } + } +} diff --git a/.frontmatter/database/pinnedItemsDb.json b/.frontmatter/database/pinnedItemsDb.json index 9e26dfee..0967ef42 100644 --- a/.frontmatter/database/pinnedItemsDb.json +++ b/.frontmatter/database/pinnedItemsDb.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/.frontmatter/database/taxonomyDb.json b/.frontmatter/database/taxonomyDb.json index 9e26dfee..0967ef42 100644 --- a/.frontmatter/database/taxonomyDb.json +++ b/.frontmatter/database/taxonomyDb.json @@ -1 +1 @@ -{} \ No newline at end of file +{} diff --git a/CHANGELOG.md b/CHANGELOG.md index 86e7c834..0eda1b8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [10.12.0] - 2026-xx-xx - [Release notes](https://beta.frontmatter.codes/updates/v10.12.0) +## [10.12.0] - 2026-08-21 - [Release notes](https://beta.frontmatter.codes/updates/v10.12.0) ### 🎨 Enhancements