From 5f623689ccc088bfc35ac9e9e3af87228f74a0cb Mon Sep 17 00:00:00 2001 From: Elio Struyf Date: Mon, 29 Apr 2024 14:53:09 +0200 Subject: [PATCH] #802 - Update glob --- CHANGELOG.md | 2 + package-lock.json | 138 +++++++++--------- package.json | 4 +- src/commands/Article.ts | 30 ++-- src/commands/Diagnostics.ts | 2 +- src/commands/Folders.ts | 76 +++++----- src/commands/Preview.ts | 6 +- src/commands/StatusListener.ts | 4 +- src/commands/Template.ts | 2 +- src/commands/i18n.ts | 20 +-- src/helpers/ArticleHelper.ts | 33 +++-- src/helpers/ContentType.ts | 17 ++- src/helpers/DashboardSettings.ts | 2 +- src/helpers/MediaHelpers.ts | 8 +- src/helpers/PanelSettings.ts | 2 +- src/helpers/Questions.ts | 24 +-- src/helpers/TaxonomyHelper.ts | 4 +- src/helpers/processArticlePlaceholders.ts | 2 +- .../dashboard/LocalizationListener.ts | 2 +- src/listeners/dashboard/PagesListener.ts | 4 +- src/listeners/panel/DataListener.ts | 10 +- src/listeners/panel/TaxonomyListener.ts | 13 +- src/services/PagesParser.ts | 9 +- 23 files changed, 217 insertions(+), 197 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4278bdb6..0e919006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ ### ⚡️ Optimizations +- [#802](https://github.com/estruyf/vscode-front-matter/issues/802): Update `glob` to the latest version and remove the sync method + ### 🐞 Fixes - [#796](https://github.com/estruyf/vscode-front-matter/issues/796): Fix issue in retrieving folders/files on dashboard load diff --git a/package-lock.json b/package-lock.json index f4e8cf96..9ba9d047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@sentry/react": "^6.19.7", "@sentry/tracing": "^6.19.7", "@tailwindcss/forms": "^0.5.3", - "@types/glob": "7.1.3", + "@types/glob": "^8.1.0", "@types/invariant": "^2.2.35", "@types/js-yaml": "^4.0.9", "@types/lodash.omit": "^4.5.7", @@ -54,7 +54,7 @@ "eslint": "^8.33.0", "fuse.js": "6.5.3", "github-directory-downloader": "^1.3.6", - "glob": "7.1.6", + "glob": "^10.3.12", "gray-matter": "4.0.3", "html-loader": "1.3.2", "html-webpack-plugin": "4.5.0", @@ -1814,12 +1814,12 @@ } }, "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", "dev": true, "dependencies": { - "@types/minimatch": "*", + "@types/minimatch": "^5.1.2", "@types/node": "*" } }, @@ -5110,20 +5110,22 @@ } }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5147,6 +5149,30 @@ "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -8534,12 +8560,12 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -8550,9 +8576,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -10551,6 +10577,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11442,52 +11488,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/sucrase/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/package.json b/package.json index de3dbd9b..06cd444c 100644 --- a/package.json +++ b/package.json @@ -2742,7 +2742,7 @@ "@sentry/react": "^6.19.7", "@sentry/tracing": "^6.19.7", "@tailwindcss/forms": "^0.5.3", - "@types/glob": "7.1.3", + "@types/glob": "^8.1.0", "@types/invariant": "^2.2.35", "@types/js-yaml": "^4.0.9", "@types/lodash.omit": "^4.5.7", @@ -2775,7 +2775,7 @@ "eslint": "^8.33.0", "fuse.js": "6.5.3", "github-directory-downloader": "^1.3.6", - "glob": "7.1.6", + "glob": "^10.3.12", "gray-matter": "4.0.3", "html-loader": "1.3.2", "html-webpack-plugin": "4.5.0", diff --git a/src/commands/Article.ts b/src/commands/Article.ts index 5b7b0028..f533cfb5 100644 --- a/src/commands/Article.ts +++ b/src/commands/Article.ts @@ -80,7 +80,7 @@ export class Article { return; } - article = this.updateDate(article); + article = await this.updateDate(article); try { ArticleHelper.update(editor, article); @@ -95,8 +95,8 @@ export class Article { * Update the date in the front matter * @param article */ - public static updateDate(article: ParsedFrontMatter) { - article.data = ArticleHelper.updateDates(article); + public static async updateDate(article: ParsedFrontMatter) { + article.data = await ArticleHelper.updateDates(article); return article; } @@ -109,7 +109,7 @@ export class Article { return; } - const updatedArticle = this.setLastModifiedDateInner(editor.document); + const updatedArticle = await this.setLastModifiedDateInner(editor.document); if (typeof updatedArticle === 'undefined') { return; @@ -119,7 +119,7 @@ export class Article { } public static async setLastModifiedDateOnSave(document: TextDocument): Promise { - const updatedArticle = this.setLastModifiedDateInner(document); + const updatedArticle = await this.setLastModifiedDateInner(document); if (typeof updatedArticle === 'undefined') { return []; @@ -130,7 +130,9 @@ export class Article { return [update]; } - private static setLastModifiedDateInner(document: TextDocument): ParsedFrontMatter | undefined { + private static async setLastModifiedDateInner( + document: TextDocument + ): Promise { const article = ArticleHelper.getFrontMatterFromDocument(document); // Only set the date, if there is already front matter set @@ -139,7 +141,7 @@ export class Article { } const cloneArticle = Object.assign({}, article); - const dateField = ArticleHelper.getModifiedDateField(article); + const dateField = await ArticleHelper.getModifiedDateField(article); try { const fieldName = dateField?.name || DefaultFields.LastModified; cloneArticle.data[fieldName] = Article.formatDate(new Date(), dateField?.dateFormat); @@ -195,8 +197,12 @@ export class Article { } let filePrefix = Settings.get(SETTING_TEMPLATES_PREFIX); - const contentType = ArticleHelper.getContentType(article); - filePrefix = ArticleHelper.getFilePrefix(filePrefix, editor.document.uri.fsPath, contentType); + const contentType = await ArticleHelper.getContentType(article); + filePrefix = await ArticleHelper.getFilePrefix( + filePrefix, + editor.document.uri.fsPath, + contentType + ); const titleField = 'title'; const articleTitle: string = article.data[titleField]; @@ -344,7 +350,7 @@ export class Article { const autoUpdate = Settings.get(SETTING_AUTO_UPDATE_DATE); // Is article located in one of the content folders - const folders = Folders.get(); + const folders = await Folders.get(); const documentPath = parseWinPath(document.fileName); const folder = folders.find((f) => documentPath.startsWith(f.path)); if (!folder) { @@ -385,7 +391,7 @@ export class Article { const article = ArticleHelper.getFrontMatter(editor); const contentType = - article && article.data ? ArticleHelper.getContentType(article) : DEFAULT_CONTENT_TYPE; + article && article.data ? await ArticleHelper.getContentType(article) : DEFAULT_CONTENT_TYPE; const position = editor.selection.active; const selectionText = editor.document.getText(editor.selection); @@ -463,7 +469,7 @@ export class Article { } const article = ArticleHelper.getFrontMatter(editor); - const contentType = article ? ArticleHelper.getContentType(article) : undefined; + const contentType = article ? await ArticleHelper.getContentType(article) : undefined; await commands.executeCommand(COMMAND_NAME.dashboard, { type: NavigationType.Snippets, diff --git a/src/commands/Diagnostics.ts b/src/commands/Diagnostics.ts index 622a8fce..0516a449 100644 --- a/src/commands/Diagnostics.ts +++ b/src/commands/Diagnostics.ts @@ -7,7 +7,7 @@ import { Settings } from '../helpers/SettingsHelper'; export class Diagnostics { public static async show() { - const folders = Folders.get(); + const folders = await Folders.get(); const projectName = Folders.getProjectFolderName(); const wsFolder = Folders.getWorkspaceFolder(); diff --git a/src/commands/Folders.ts b/src/commands/Folders.ts index c9377430..c2e68748 100644 --- a/src/commands/Folders.ts +++ b/src/commands/Folders.ts @@ -105,7 +105,8 @@ export class Folders { return; } - const folders = Folders.get().filter((f) => !f.disableCreation); + let folders = await Folders.get(); + folders = folders.filter((f) => !f.disableCreation); const location = folders.find((f) => f.path === selectedFolder.path); if (location) { const folderPath = Folders.getFolderPath(Uri.file(location.path)); @@ -129,7 +130,7 @@ export class Folders { if (folder && folder.fsPath) { const wslPath = folder.fsPath.replace(/\//g, '\\'); - let folders = Folders.get(); + let folders = await Folders.get(); const exists = folders.find( (f) => f.path.includes(folder.fsPath) || f.path.includes(wslPath) @@ -178,7 +179,7 @@ export class Folders { */ public static async unregister(folder: Uri) { if (folder && folder.path) { - let folders = Folders.get(); + let folders = await Folders.get(); folders = folders.filter((f) => f.path !== folder.fsPath); await Folders.update(folders); @@ -291,7 +292,7 @@ export class Folders { public static async getInfo(limit?: number): Promise { Logger.verbose('Folders:getInfo:start'); const supportedFiles = Settings.get(SETTING_CONTENT_SUPPORTED_FILETYPES); - const folders = Folders.get(); + const folders = await Folders.get(); if (folders && folders.length > 0) { const folderInfo: FolderInfo[] = []; @@ -315,7 +316,7 @@ export class Folders { * Get the folder settings * @returns */ - public static get(): ContentFolder[] { + public static async get(): Promise { Logger.verbose('Folders:get:start'); if (Folders._folders.length > 0) { @@ -339,8 +340,7 @@ export class Folders { folders = folders.filter((f) => f.path !== folder.path); const folderPath = Folders.absWsFolder(folder, wsFolder); - const subFolders = glob.sync(folderPath, { ignore: '**/node_modules/**' }); - // const subFolders = await Folders.findFolders(folderPath); + const subFolders = await Folders.findFolders(folderPath); for (const subFolder of subFolders) { const subFolderPath = parseWinPath(subFolder); @@ -371,11 +371,11 @@ export class Folders { ), l10n.t(LocalizationKey.commandsFoldersGetNotificationErrorRemoveAction), l10n.t(LocalizationKey.commandsFoldersGetNotificationErrorCreateAction) - ).then((answer) => { + ).then(async (answer) => { if ( answer === l10n.t(LocalizationKey.commandsFoldersGetNotificationErrorRemoveAction) ) { - const folders = Folders.get(); + const folders = await Folders.get(); Folders.update(folders.filter((f) => f.path !== folder.path)); } else if ( answer === l10n.t(LocalizationKey.commandsFoldersGetNotificationErrorCreateAction) @@ -613,8 +613,8 @@ export class Folders { * @param folderPath * @returns */ - public static getFilePrefixByFolderPath(folderPath: string) { - const folders = Folders.get(); + public static async getFilePrefixByFolderPath(folderPath: string) { + const folders = await Folders.get(); const pageFolder = folders.find((f) => parseWinPath(f.path) === parseWinPath(folderPath)); if (pageFolder && typeof pageFolder.filePrefix !== 'undefined') { @@ -629,8 +629,8 @@ export class Folders { * @param filePath * @returns */ - public static getFilePrefixBeFilePath(filePath: string) { - const folders = Folders.get(); + public static async getFilePrefixBeFilePath(filePath: string) { + const folders = await Folders.get(); if (folders.length > 0) { filePath = parseWinPath(filePath); @@ -658,8 +658,10 @@ export class Folders { * @param filePath - The file path to match against the page folders. * @returns The page folder that matches the file path, or undefined if no match is found. */ - public static getPageFolderByFilePath(filePath: string): ContentFolder | undefined { - const folders = Folders.get(); + public static async getPageFolderByFilePath( + filePath: string + ): Promise { + const folders = await Folders.get(); const parsedPath = parseWinPath(filePath); const pageFolderMatches = folders .filter((folder) => parsedPath && folder.path && parsedPath.includes(folder.path)) @@ -763,21 +765,19 @@ export class Folders { * @param pattern * @returns */ - private static findFolders(pattern: string): Promise { + private static async findFolders(pattern: string): Promise { Logger.verbose(`Folders:findFolders:start - ${pattern}`); - return new Promise((resolve) => { - glob(pattern, { ignore: '**/node_modules/**', dot: true }, (err, files) => { - if (err) { - Logger.error(`Folders:findFolders:error - ${err?.message || err}`); - resolve([]); - } - const allFolders = (files || []).map((file) => dirname(file)); - const uniqueFolders = [...new Set(allFolders)]; - Logger.verbose(`Folders:findFolders:end - ${uniqueFolders.length}`); - resolve(uniqueFolders); - }); - }); + try { + const files = await glob(pattern, { ignore: '**/node_modules/**', dot: true }); + const allFolders = (files || []).map((file) => dirname(file)); + const uniqueFolders = [...new Set(allFolders)]; + Logger.verbose(`Folders:findFolders:end - ${uniqueFolders.length}`); + return uniqueFolders; + } catch (e) { + Logger.error(`Folders:findFolders:error - ${(e as Error).message}`); + return []; + } } /** @@ -787,17 +787,15 @@ export class Folders { */ private static async findFiles(pattern: string): Promise { Logger.verbose(`Folders:findFiles:start - ${pattern}`); - return new Promise((resolve) => { - glob(pattern, { ignore: '**/node_modules/**' }, (err, files) => { - if (err) { - Logger.error(`Folders:findFiles:error - ${err?.message || err}`); - resolve([]); - } - const allFiles = (files || []).map((file) => Uri.file(file)); - Logger.verbose(`Folders:findFiles:end - ${allFiles.length}`); - resolve(allFiles); - }); - }); + try { + const files = await glob(pattern, { ignore: '**/node_modules/**' }); + const allFiles = (files || []).map((file) => Uri.file(file)); + Logger.verbose(`Folders:findFiles:end - ${allFiles.length}`); + return allFiles; + } catch (e) { + Logger.error(`Folders:findFiles:error - ${(e as Error).message}`); + return []; + } } } diff --git a/src/commands/Preview.ts b/src/commands/Preview.ts index f0252f1d..310e7353 100644 --- a/src/commands/Preview.ts +++ b/src/commands/Preview.ts @@ -237,11 +237,11 @@ export class Preview { let contentType: ContentType | undefined = undefined; if (article?.data) { - contentType = ArticleHelper.getContentType(article); + contentType = await ArticleHelper.getContentType(article); } // Check if there is a pathname defined on content folder level - const folders = Folders.get(); + const folders = await Folders.get(); if (folders.length > 0) { const foldersWithPath = folders.filter((folder) => folder.previewPath); @@ -321,7 +321,7 @@ export class Preview { pathname = article?.data ? processFmPlaceholders(pathname, article?.data) : pathname; try { - const articleDate = ArticleHelper.getDate(article); + const articleDate = await ArticleHelper.getDate(article); slug = join( format(articleDate || new Date(), DateHelper.formatUpdate(pathname) as string), slug diff --git a/src/commands/StatusListener.ts b/src/commands/StatusListener.ts index 4968d044..79010a0e 100644 --- a/src/commands/StatusListener.ts +++ b/src/commands/StatusListener.ts @@ -102,13 +102,13 @@ export class StatusListener { * @param article * @param collection */ - private static verifyRequiredFields( + private static async verifyRequiredFields( editor: vscode.TextEditor, article: ParsedFrontMatter, collection: vscode.DiagnosticCollection ) { // Check for missing fields - const emptyFields = ContentType.findEmptyRequiredFields(article); + const emptyFields = await ContentType.findEmptyRequiredFields(article); const fieldsToReport = []; if (emptyFields && emptyFields.length > 0) { diff --git a/src/commands/Template.ts b/src/commands/Template.ts index 3c17921f..aaa176c0 100644 --- a/src/commands/Template.ts +++ b/src/commands/Template.ts @@ -176,7 +176,7 @@ export class Template { newFilePath ); - const article = Article.updateDate(frontMatter); + const article = await Article.updateDate(frontMatter); if (!article) { return; diff --git a/src/commands/i18n.ts b/src/commands/i18n.ts index e136b104..e4a58826 100644 --- a/src/commands/i18n.ts +++ b/src/commands/i18n.ts @@ -48,10 +48,10 @@ export class i18n { * * @returns An array of I18nConfig settings. */ - public static getAll() { + public static async getAll() { const i18nSettings = Settings.get(SETTING_CONTENT_I18N) || []; - const folders = Folders.get(); + const folders = await Folders.get(); if (folders) { for (const folder of folders) { if (folder.locales) { @@ -77,7 +77,7 @@ export class i18n { } const i18nSettings = Settings.get(SETTING_CONTENT_I18N); - let pageFolder = Folders.getPageFolderByFilePath(filePath); + let pageFolder = await Folders.getPageFolderByFilePath(filePath); if (!pageFolder) { pageFolder = await i18n.getPageFolder(filePath); } @@ -100,7 +100,7 @@ export class i18n { return false; } - const pageFolder = Folders.getPageFolderByFilePath(filePath); + const pageFolder = await Folders.getPageFolderByFilePath(filePath); if (!pageFolder || !pageFolder.locale) { return false; } @@ -119,7 +119,7 @@ export class i18n { return false; } - const pageFolder = Folders.getPageFolderByFilePath(filePath); + const pageFolder = await Folders.getPageFolderByFilePath(filePath); if (!pageFolder || !pageFolder.defaultLocale) { return false; } @@ -155,7 +155,7 @@ export class i18n { return; } - let pageFolder = Folders.getPageFolderByFilePath(filePath); + let pageFolder = await Folders.getPageFolderByFilePath(filePath); const fileInfo = await i18n.getFileInfo(filePath); @@ -217,7 +217,7 @@ export class i18n { }; } = {}; - let pageFolder = Folders.getPageFolderByFilePath(filePath); + let pageFolder = await Folders.getPageFolderByFilePath(filePath); const fileInfo = await i18n.getFileInfo(filePath); if (pageFolder && pageFolder.defaultLocale && pageFolder.localeSourcePath) { @@ -272,7 +272,7 @@ export class i18n { fileUri = Uri.file(fileUri); } - const pageFolder = Folders.getPageFolderByFilePath(fileUri.fsPath); + const pageFolder = await Folders.getPageFolderByFilePath(fileUri.fsPath); if (!pageFolder || !pageFolder.localeSourcePath) { Notifications.error(l10n.t(LocalizationKey.commandsI18nCreateErrorNoContentFolder)); return; @@ -331,7 +331,7 @@ export class i18n { return; } - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); if (!contentType) { Notifications.warning(l10n.t(LocalizationKey.commandsI18nCreateWarningNoContentType)); return; @@ -482,7 +482,7 @@ export class i18n { * @returns A promise that resolves to the ContentFolder object representing the page folder, or undefined if not found. */ private static async getPageFolder(filePath: string): Promise { - const folders = Folders.get(); + const folders = await Folders.get(); const localeFolders = folders?.filter((folder) => folder.defaultLocale); if (!localeFolders) { diff --git a/src/helpers/ArticleHelper.ts b/src/helpers/ArticleHelper.ts index 26129596..0b9391a6 100644 --- a/src/helpers/ArticleHelper.ts +++ b/src/helpers/ArticleHelper.ts @@ -359,7 +359,7 @@ export class ArticleHelper { return false; } - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); return !!contentType.pageBundle; } @@ -379,13 +379,14 @@ export class ArticleHelper { /** * Get date from front matter */ - public static getDate(article: ParsedFrontMatter | null | undefined) { + public static async getDate(article: ParsedFrontMatter | null | undefined) { if (!article || !article.data) { return; } const dateFormat = Settings.get(SETTING_DATE_FORMAT) as string; - const dateField = ArticleHelper.getPublishDateField(article) || DefaultFields.PublishingDate; + const dateField = + (await ArticleHelper.getPublishDateField(article)) || DefaultFields.PublishingDate; if (typeof article.data[dateField] !== 'undefined') { if (dateFormat && typeof dateFormat === 'string') { @@ -404,12 +405,12 @@ export class ArticleHelper { * @param article * @returns */ - public static getPublishDateField(article: ParsedFrontMatter | null) { + public static async getPublishDateField(article: ParsedFrontMatter | null) { if (!article || !article.data) { return; } - const articleCt = ArticleHelper.getContentType(article); + const articleCt = await ArticleHelper.getContentType(article); const pubDateField = articleCt.fields.find((f) => f.isPublishDate); return ( @@ -424,12 +425,14 @@ export class ArticleHelper { * @param article * @returns */ - public static getModifiedDateField(article: ParsedFrontMatter | null): Field | undefined { + public static async getModifiedDateField( + article: ParsedFrontMatter | null + ): Promise { if (!article || !article.data) { return; } - const articleCt = ArticleHelper.getContentType(article); + const articleCt = await ArticleHelper.getContentType(article); const modDateField = articleCt.fields.find((f) => f.isModifiedDate); return modDateField; @@ -447,7 +450,7 @@ export class ArticleHelper { * Retrieve the content type of the current file * @param updatedMetadata */ - public static getContentType(article: ParsedFrontMatter): IContentType { + public static async getContentType(article: ParsedFrontMatter): Promise { const contentTypes = ArticleHelper.getContentTypes(); if (!contentTypes || !article.data) { @@ -460,7 +463,7 @@ export class ArticleHelper { if (article.data.type) { contentType = contentTypes.find((ct) => ct.name === article.data.type); } else if (!contentType && article.path) { - const pageFolder = Folders.getPageFolderByFilePath(article.path); + const pageFolder = await Folders.getPageFolderByFilePath(article.path); if (pageFolder && pageFolder.contentTypes?.length === 1) { const contentTypeName = pageFolder.contentTypes[0]; contentType = contentTypes.find((ct) => ct.name === contentTypeName); @@ -488,8 +491,8 @@ export class ArticleHelper { * Update all dates in the metadata * @param metadata */ - public static updateDates(article: ParsedFrontMatter) { - const contentType = ArticleHelper.getContentType(article); + public static async updateDates(article: ParsedFrontMatter) { + const contentType = await ArticleHelper.getContentType(article); const dateFields = contentType.fields.filter((field) => field.type === 'datetime'); for (const dateField of dateFields) { @@ -529,7 +532,7 @@ export class ArticleHelper { const fileType = Settings.get(SETTING_CONTENT_DEFAULT_FILETYPE); let prefix = Settings.get(SETTING_TEMPLATES_PREFIX); - prefix = ArticleHelper.getFilePrefix(prefix, folderPath, contentType); + prefix = await ArticleHelper.getFilePrefix(prefix, folderPath, contentType); // Name of the file or folder to create let sanitizedName = ArticleHelper.sanitize(titleValue); @@ -588,18 +591,18 @@ export class ArticleHelper { * @param contentType * @returns */ - public static getFilePrefix( + public static async getFilePrefix( prefix: string | null | undefined, filePath?: string, contentType?: IContentType - ): string | undefined { + ): Promise { if (!prefix) { prefix = undefined; } // Retrieve the file prefix from the folder if (filePath) { - const filePrefixOnFolder = Folders.getFilePrefixByFolderPath(filePath); + const filePrefixOnFolder = await Folders.getFilePrefixByFolderPath(filePath); if (typeof filePrefixOnFolder !== 'undefined') { prefix = filePrefixOnFolder; } diff --git a/src/helpers/ContentType.ts b/src/helpers/ContentType.ts index 525405c1..2edf19fc 100644 --- a/src/helpers/ContentType.ts +++ b/src/helpers/ContentType.ts @@ -58,8 +58,8 @@ export class ContentType { * @param data * @returns */ - public static getDraftStatus(article: ParsedFrontMatter) { - const contentType = ArticleHelper.getContentType(article); + public static async getDraftStatus(article: ParsedFrontMatter) { + const contentType = await ArticleHelper.getContentType(article); const draftSetting = ContentType.getDraftField(); const draftField = contentType.fields.find((f) => f.type === 'draft'); @@ -94,7 +94,8 @@ export class ContentType { } const contentTypes = ContentType.getAll(); - const folders = Folders.get().filter((f) => !f.disableCreation); + let folders = await Folders.get(); + folders = folders.filter((f) => !f.disableCreation); const folder = folders.find((f) => f.path === selectedFolder.path); if (!folder) { @@ -314,7 +315,7 @@ export class ContentType { return; } - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); const updatedFields = ContentType.generateFields(article.data, contentType.fields); const contentTypes = ContentType.getAll() || []; @@ -531,8 +532,10 @@ export class ContentType { /** * Find the required fields */ - public static findEmptyRequiredFields(article: ParsedFrontMatter): Field[][] | undefined { - const contentType = ArticleHelper.getContentType(article); + public static async findEmptyRequiredFields( + article: ParsedFrontMatter + ): Promise { + const contentType = await ArticleHelper.getContentType(article); if (!contentType) { return; } @@ -950,7 +953,7 @@ export class ContentType { path: newFilePath }; - data = ArticleHelper.updateDates(article); + data = await ArticleHelper.updateDates(article); if (isTypeSet) { delete data.type; diff --git a/src/helpers/DashboardSettings.ts b/src/helpers/DashboardSettings.ts index 8fd8cff7..c465b492 100644 --- a/src/helpers/DashboardSettings.ts +++ b/src/helpers/DashboardSettings.ts @@ -115,7 +115,7 @@ export class DashboardSettings { contentTypes: ContentType.getAll() || [], draftField: Settings.get(SETTING_CONTENT_DRAFT_FIELD), customSorting: Settings.get(SETTING_CONTENT_SORTING), - contentFolders: Folders.get(), + contentFolders: await Folders.get(), filters: Settings.get<(FilterType | { title: string; name: string })[]>(SETTING_CONTENT_FILTERS), crntFramework: Settings.get(SETTING_FRAMEWORK_ID), diff --git a/src/helpers/MediaHelpers.ts b/src/helpers/MediaHelpers.ts index d6ab72e4..dbd9d7e9 100644 --- a/src/helpers/MediaHelpers.ts +++ b/src/helpers/MediaHelpers.ts @@ -50,7 +50,7 @@ export class MediaHelpers { ) { const wsFolder = Folders.getWorkspaceFolder(); const staticFolder = Folders.getStaticFolderRelativePath(); - const contentFolders = Folders.get(); + const contentFolders = await Folders.get(); const viewData = Dashboard.viewData; let selectedFolder = requestedFolder; @@ -398,12 +398,14 @@ export class MediaHelpers { const article = editor ? ArticleHelper.getFrontMatter(editor) : null; const articleCt = - article && article.data ? ArticleHelper.getContentType(article) : DEFAULT_CONTENT_TYPE; + article && article.data + ? await ArticleHelper.getContentType(article) + : DEFAULT_CONTENT_TYPE; const absImgPath = join(parseWinPath(wsFolder?.fsPath || ''), relPath); const fileDir = parseWinPath(dirname(filePath)); const imgDir = parseWinPath(dirname(absImgPath)); - const contentFolders = Folders.get(); + const contentFolders = await Folders.get(); // Check if relative paths need to be created for the media files if (articleCt.pageBundle) { diff --git a/src/helpers/PanelSettings.ts b/src/helpers/PanelSettings.ts index 84ca2ad1..a3720726 100644 --- a/src/helpers/PanelSettings.ts +++ b/src/helpers/PanelSettings.ts @@ -97,7 +97,7 @@ export class PanelSettings { }, dataTypes: Settings.get(SETTING_DATA_TYPES), fieldGroups: Settings.get(SETTING_TAXONOMY_FIELD_GROUPS), - contentFolders: Folders.get(), + contentFolders: await Folders.get(), websiteUrl: Settings.get(SETTING_WEBSITE_URL) || '', disabledActions: Settings.get(SETTING_PANEL_ACTIONS_DISABLED) || [] }; diff --git a/src/helpers/Questions.ts b/src/helpers/Questions.ts index 97b1088f..440d9c32 100644 --- a/src/helpers/Questions.ts +++ b/src/helpers/Questions.ts @@ -131,7 +131,8 @@ export class Questions { public static async SelectContentFolder( showWarning: boolean = true ): Promise { - let folders = Folders.get().filter((f) => !f.disableCreation); + let folders = await Folders.get(); + folders = folders.filter((f) => !f.disableCreation); let selectedFolder: FolderQuickPickItem | undefined; if (folders.length > 1) { @@ -149,16 +150,13 @@ export class Questions { } as FolderQuickPickItem; }); - selectedFolder = await window.showQuickPick( - folderOptions, - { - title: l10n.t(LocalizationKey.helpersQuestionsSelectContentFolderQuickPickTitle), - placeHolder: l10n.t( - LocalizationKey.helpersQuestionsSelectContentFolderQuickPickPlaceholder - ), - ignoreFocusOut: true - } - ); + selectedFolder = await window.showQuickPick(folderOptions, { + title: l10n.t(LocalizationKey.helpersQuestionsSelectContentFolderQuickPickTitle), + placeHolder: l10n.t( + LocalizationKey.helpersQuestionsSelectContentFolderQuickPickPlaceholder + ), + ignoreFocusOut: true + }); } else if (folders.length === 1) { selectedFolder = { label: folders[0].title, @@ -213,7 +211,9 @@ export class Questions { })); if (options.length === 0) { - Notifications.error(LocalizationKey.helpersQuestionsSelectContentTypeQuickPickErrorNoContentTypes); + Notifications.error( + LocalizationKey.helpersQuestionsSelectContentTypeQuickPickErrorNoContentTypes + ); return; } diff --git a/src/helpers/TaxonomyHelper.ts b/src/helpers/TaxonomyHelper.ts index da058062..87c9869f 100644 --- a/src/helpers/TaxonomyHelper.ts +++ b/src/helpers/TaxonomyHelper.ts @@ -347,7 +347,7 @@ export class TaxonomyHelper { if (mdFile) { try { const article = FrontMatterParser.fromFile(mdFile); - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); let fieldNames: string[] = this.getFieldsHierarchy(taxonomyType, contentType); @@ -482,7 +482,7 @@ export class TaxonomyHelper { if (mdFile) { try { const article = FrontMatterParser.fromFile(mdFile); - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); let oldFieldNames: string[] = this.getFieldsHierarchy(oldType, contentType); let newFieldNames: string[] = this.getFieldsHierarchy(newType, contentType, true); diff --git a/src/helpers/processArticlePlaceholders.ts b/src/helpers/processArticlePlaceholders.ts index 30709564..2bb508c9 100644 --- a/src/helpers/processArticlePlaceholders.ts +++ b/src/helpers/processArticlePlaceholders.ts @@ -38,7 +38,7 @@ export const processArticlePlaceholdersFromPath = async ( } if (value.includes('{{slug}}') && filePath) { - const contentType = article ? ArticleHelper.getContentType(article) : undefined; + const contentType = article ? await ArticleHelper.getContentType(article) : undefined; if (contentType) { const regex = new RegExp('{{slug}}', 'g'); value = value.replace( diff --git a/src/listeners/dashboard/LocalizationListener.ts b/src/listeners/dashboard/LocalizationListener.ts index 0a8ca42f..fd554614 100644 --- a/src/listeners/dashboard/LocalizationListener.ts +++ b/src/listeners/dashboard/LocalizationListener.ts @@ -34,7 +34,7 @@ export class LocalizationListener extends BaseListener { return; } - const config = i18n.getAll(); + const config = await i18n.getAll(); this.sendRequest(command as any, requestId, config); } } diff --git a/src/listeners/dashboard/PagesListener.ts b/src/listeners/dashboard/PagesListener.ts index 954742f0..56b75a66 100644 --- a/src/listeners/dashboard/PagesListener.ts +++ b/src/listeners/dashboard/PagesListener.ts @@ -80,7 +80,7 @@ export class PagesListener extends BaseListener { * Start watching the folders in the current workspace for content changes */ public static async startWatchers() { - const folders = Folders.get(); + const folders = await Folders.get(); if (!folders || folders.length === 0) { return; @@ -124,7 +124,7 @@ export class PagesListener extends BaseListener { if (!article) { return; } - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); Logger.info(`Deleting file: ${path}`); diff --git a/src/listeners/panel/DataListener.ts b/src/listeners/panel/DataListener.ts index 4e193394..b4f2d585 100644 --- a/src/listeners/panel/DataListener.ts +++ b/src/listeners/panel/DataListener.ts @@ -293,7 +293,7 @@ export class DataListener extends BaseListener { if (keys.length > 0 && contentTypes && wsFolder) { // Get the current content type - const contentType = ArticleHelper.getContentType({ + const contentType = await ArticleHelper.getContentType({ content: '', data: updatedMetadata, path: filePath @@ -361,7 +361,7 @@ export class DataListener extends BaseListener { return; } - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); const sourceField = ContentType.findFieldByName(contentType.fields, field); if (!value && field !== titleField && contentType.clearEmpty) { @@ -381,7 +381,7 @@ export class DataListener extends BaseListener { const fieldsWithEmojiEncoding = contentType.fields.filter((f) => f.encodeEmoji); // Support multi-level fields - const parentObj = DataListener.getParentObject(article.data, article, parents, blockData); + const parentObj = await DataListener.getParentObject(article.data, article, parents, blockData); // Check multi-image fields const multiImageFieldsArray = imageFields.find((f: Field[]) => { @@ -491,7 +491,7 @@ export class DataListener extends BaseListener { * @param blockData * @returns */ - public static getParentObject( + public static async getParentObject( data: any, article: ParsedFrontMatter, parents: string[] | undefined, @@ -499,7 +499,7 @@ export class DataListener extends BaseListener { ) { let parentObj = data; let allParents = Object.assign([], parents); - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); let selectedIndexes: number[] = []; if (blockData?.selectedIndex) { if (typeof blockData.selectedIndex === 'string') { diff --git a/src/listeners/panel/TaxonomyListener.ts b/src/listeners/panel/TaxonomyListener.ts index cf6cffd0..e533c4e8 100644 --- a/src/listeners/panel/TaxonomyListener.ts +++ b/src/listeners/panel/TaxonomyListener.ts @@ -134,7 +134,7 @@ export class TaxonomyListener extends BaseListener { * @param tagType * @param values */ - private static updateTags( + private static async updateTags( fieldName: string, values: string[], parents: string[], @@ -148,7 +148,12 @@ export class TaxonomyListener extends BaseListener { const article = ArticleHelper.getFrontMatter(editor); if (article && article.data) { - const parentObj = DataListener.getParentObject(article.data, article, parents, blockData); + const parentObj = await DataListener.getParentObject( + article.data, + article, + parents, + blockData + ); if (renderAsString) { if (values.length === 0) { @@ -170,7 +175,7 @@ export class TaxonomyListener extends BaseListener { * Update the tags in the current document * @param data */ - private static updateCustomTaxonomy(data: CustomTaxonomyData) { + private static async updateCustomTaxonomy(data: CustomTaxonomyData) { if (!data?.id || !data?.name) { return; } @@ -182,7 +187,7 @@ export class TaxonomyListener extends BaseListener { const article = ArticleHelper.getFrontMatter(editor); if (article && article.data) { - const parentObj = DataListener.getParentObject( + const parentObj = await DataListener.getParentObject( article.data, article, data.parents, diff --git a/src/services/PagesParser.ts b/src/services/PagesParser.ts index 2b770b17..465e2629 100644 --- a/src/services/PagesParser.ts +++ b/src/services/PagesParser.ts @@ -188,9 +188,10 @@ export class PagesParser { const descriptionField = (Settings.get(SETTING_SEO_DESCRIPTION_FIELD) as string) || DefaultFields.Description; - const dateField = ArticleHelper.getPublishDateField(article) || DefaultFields.PublishingDate; + const dateField = + (await ArticleHelper.getPublishDateField(article)) || DefaultFields.PublishingDate; - const contentType = ArticleHelper.getContentType(article); + const contentType = await ArticleHelper.getContentType(article); let dateFormat = Settings.get(SETTING_DATE_FORMAT) as string; const ctDateField = ContentType.findFieldByName(contentType.fields, dateField); if (ctDateField && ctDateField.dateFormat) { @@ -201,7 +202,7 @@ export class PagesParser { ? DateHelper.tryParse(article?.data[dateField], dateFormat) : undefined; - const modifiedField = ArticleHelper.getModifiedDateField(article); + const modifiedField = await ArticleHelper.getModifiedDateField(article); const modifiedFieldValue = modifiedField?.name && article?.data[modifiedField.name] ? DateHelper.tryParse(article?.data[modifiedField.name])?.getTime() @@ -234,7 +235,7 @@ export class PagesParser { fmRelFileWsPath: FilesHelper.absToRelPath(filePath), fmRelFilePath: parseWinPath(filePath).replace(wsFolder?.fsPath || '', ''), fmFileName: fileName, - fmDraft: ContentType.getDraftStatus(article), + fmDraft: await ContentType.getDraftStatus(article), fmModified: modifiedFieldValue ? modifiedFieldValue : fileMtime, fmPublished: dateFieldValue ? dateFieldValue.getTime() : null, fmYear: dateFieldValue ? dateFieldValue.getFullYear() : null,