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..fb02325e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "@sentry/react": "^6.19.7", "@sentry/tracing": "^6.19.7", "@tailwindcss/forms": "^0.5.3", - "@types/glob": "7.1.3", "@types/invariant": "^2.2.35", "@types/js-yaml": "^4.0.9", "@types/lodash.omit": "^4.5.7", @@ -54,7 +53,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", @@ -1813,16 +1812,6 @@ "@types/send": "*" } }, - "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==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/hast": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", @@ -1925,12 +1914,6 @@ "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", "dev": true }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -5110,20 +5093,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 +5132,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 +8543,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 +8559,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 +10560,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 +11471,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..285beb13 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "color": "#0e131f", "theme": "dark" }, - "badges": [{ + "badges": [ + { "description": "version", "url": "https://img.shields.io/github/package-json/v/estruyf/vscode-front-matter?color=green&label=vscode-front-matter&style=flat-square", "href": "https://github.com/estruyf/vscode-front-matter" @@ -69,7 +70,8 @@ "**/.frontmatter/config/*.json": "jsonc" } }, - "keybindings": [{ + "keybindings": [ + { "command": "frontMatter.dashboard", "key": "alt+d" }, @@ -93,19 +95,23 @@ } ], "viewsContainers": { - "activitybar": [{ - "id": "frontmatter-explorer", - "title": "FM", - "icon": "$(fm-logo)" - }] + "activitybar": [ + { + "id": "frontmatter-explorer", + "title": "FM", + "icon": "$(fm-logo)" + } + ] }, "views": { - "frontmatter-explorer": [{ - "id": "frontMatter.explorer", - "name": "Front Matter", - "icon": "$(fm-logo)", - "type": "webview" - }] + "frontmatter-explorer": [ + { + "id": "frontMatter.explorer", + "name": "Front Matter", + "icon": "$(fm-logo)", + "type": "webview" + } + ] }, "configuration": { "title": "%settings.configuration.title%", @@ -173,7 +179,8 @@ "frontMatter.content.defaultFileType": { "type": "string", "default": "md", - "oneOf": [{ + "oneOf": [ + { "enum": [ "md", "mdx" @@ -189,7 +196,8 @@ "frontMatter.content.defaultSorting": { "type": "string", "default": "", - "oneOf": [{ + "oneOf": [ + { "enum": [ "LastModifiedAsc", "LastModifiedDesc", @@ -537,7 +545,8 @@ "categories" ], "markdownDescription": "%setting.frontMatter.content.filters.markdownDescription%", - "items": [{ + "items": [ + { "type": "string", "enum": [ "contentFolders", @@ -610,7 +619,8 @@ "command": { "$id": "#scriptCommand", "type": "string", - "anyOf": [{ + "anyOf": [ + { "enum": [ "node", "bash", @@ -806,7 +816,8 @@ "title", "file" ], - "anyOf": [{ + "anyOf": [ + { "required": [ "schema" ] @@ -860,7 +871,8 @@ "id", "path" ], - "anyOf": [{ + "anyOf": [ + { "required": [ "schema" ] @@ -1101,26 +1113,29 @@ } } }, - "default": [{ - "name": "default", - "fileTypes": null, - "fields": [{ - "title": "Title", - "name": "title", - "type": "string" - }, - { - "title": "Caption", - "name": "caption", - "type": "string" - }, - { - "title": "Alt text", - "name": "alt", - "type": "string" - } - ] - }], + "default": [ + { + "name": "default", + "fileTypes": null, + "fields": [ + { + "title": "Title", + "name": "title", + "type": "string" + }, + { + "title": "Caption", + "name": "caption", + "type": "string" + }, + { + "title": "Alt text", + "name": "alt", + "type": "string" + } + ] + } + ], "scope": "Media" }, "frontMatter.media.supportedMimeTypes": { @@ -1350,7 +1365,8 @@ "default": "", "description": "%setting.frontMatter.taxonomy.contentTypes.items.properties.fields.items.properties.taxonomyId.description%", "not": { - "anyOf": [{ + "anyOf": [ + { "const": "" }, { @@ -1544,7 +1560,8 @@ "type", "name" ], - "allOf": [{ + "allOf": [ + { "if": { "properties": { "type": { @@ -1752,48 +1769,51 @@ "fields" ] }, - "default": [{ - "name": "default", - "pageBundle": false, - "fields": [{ - "title": "Title", - "name": "title", - "type": "string" - }, - { - "title": "Description", - "name": "description", - "type": "string" - }, - { - "title": "Publishing date", - "name": "date", - "type": "datetime", - "default": "{{now}}", - "isPublishDate": true - }, - { - "title": "Content preview", - "name": "preview", - "type": "image" - }, - { - "title": "Is in draft", - "name": "draft", - "type": "boolean" - }, - { - "title": "Tags", - "name": "tags", - "type": "tags" - }, - { - "title": "Categories", - "name": "categories", - "type": "categories" - } - ] - }], + "default": [ + { + "name": "default", + "pageBundle": false, + "fields": [ + { + "title": "Title", + "name": "title", + "type": "string" + }, + { + "title": "Description", + "name": "description", + "type": "string" + }, + { + "title": "Publishing date", + "name": "date", + "type": "datetime", + "default": "{{now}}", + "isPublishDate": true + }, + { + "title": "Content preview", + "name": "preview", + "type": "image" + }, + { + "title": "Is in draft", + "name": "draft", + "type": "boolean" + }, + { + "title": "Tags", + "name": "tags", + "type": "tags" + }, + { + "title": "Categories", + "name": "categories", + "type": "categories" + } + ] + } + ], "scope": "Taxonomy" }, "frontMatter.taxonomy.customTaxonomy": { @@ -1806,7 +1826,8 @@ "type": "string", "description": "%setting.frontMatter.taxonomy.customTaxonomy.items.properties.id.description%", "not": { - "anyOf": [{ + "anyOf": [ + { "const": "" }, { @@ -2001,7 +2022,8 @@ } } }, - "commands": [{ + "commands": [ + { "command": "frontMatter.project.switch", "title": "%command.frontMatter.project.switch%", "category": "Front Matter", @@ -2327,16 +2349,21 @@ } } ], - "submenus": [{ - "id": "frontmatter.submenu", - "label": "Front Matter" - }], + "submenus": [ + { + "id": "frontmatter.submenu", + "label": "Front Matter" + } + ], "menus": { - "webview/context": [{ - "command": "workbench.action.webview.openDeveloperTools", - "when": "frontMatter:isDevelopment" - }], - "editor/title": [{ + "webview/context": [ + { + "command": "workbench.action.webview.openDeveloperTools", + "when": "frontMatter:isDevelopment" + } + ], + "editor/title": [ + { "command": "frontMatter.markup.heading", "group": "navigation@-133", "when": "frontMatter:file:isValid == true && frontMatter:markdown:wysiwyg" @@ -2422,11 +2449,14 @@ "when": "resourceFilename == 'frontmatter.json'" } ], - "explorer/context": [{ - "submenu": "frontmatter.submenu", - "group": "frontmatter@1" - }], - "frontmatter.submenu": [{ + "explorer/context": [ + { + "submenu": "frontmatter.submenu", + "group": "frontmatter@1" + } + ], + "frontmatter.submenu": [ + { "command": "frontMatter.createFromTemplate", "when": "explorerResourceIsFolder", "group": "frontmatter@1" @@ -2442,7 +2472,8 @@ "group": "frontmatter@3" } ], - "commandPalette": [{ + "commandPalette": [ + { "command": "frontMatter.init", "when": "frontMatterCanInit" }, @@ -2619,7 +2650,8 @@ "when": "frontMatter:file:isValid == true" } ], - "view/title": [{ + "view/title": [ + { "command": "frontMatter.chatbot", "group": "navigation@0", "when": "view == frontMatter.explorer" @@ -2651,13 +2683,16 @@ } ] }, - "languages": [{ - "id": "frontmatter.project.output", - "mimetypes": [ - "text/x-code-output" - ] - }], - "grammars": [{ + "languages": [ + { + "id": "frontmatter.project.output", + "mimetypes": [ + "text/x-code-output" + ] + } + ], + "grammars": [ + { "path": "./syntaxes/hugo.tmLanguage.json", "scopeName": "frontmatter.markdown.hugo", "injectTo": [ @@ -2670,45 +2705,48 @@ "path": "./syntaxes/frontmatter-output.tmLanguage.json" } ], - "walkthroughs": [{ - "id": "frontmatter.welcome", - "title": "Get started with Front Matter", - "description": "Discover the features of Front Matter and learn how to use the CMS for your SSG or static site.", - "steps": [{ - "id": "frontmatter.welcome.init", - "title": "Get started", - "description": "Initial steps to get started.\n[Open dashboard](command:frontMatter.dashboard)", - "media": { - "markdown": "assets/walkthrough/get-started.md" + "walkthroughs": [ + { + "id": "frontmatter.welcome", + "title": "Get started with Front Matter", + "description": "Discover the features of Front Matter and learn how to use the CMS for your SSG or static site.", + "steps": [ + { + "id": "frontmatter.welcome.init", + "title": "Get started", + "description": "Initial steps to get started.\n[Open dashboard](command:frontMatter.dashboard)", + "media": { + "markdown": "assets/walkthrough/get-started.md" + }, + "completionEvents": [ + "onContext:frontMatterInitialized" + ] }, - "completionEvents": [ - "onContext:frontMatterInitialized" - ] - }, - { - "id": "frontmatter.welcome.documentation", - "title": "Documentation", - "description": "Check out the documentation for Front Matter.\n[View our documentation](https://frontmatter.codes/docs)", - "media": { - "markdown": "assets/walkthrough/documentation.md" + { + "id": "frontmatter.welcome.documentation", + "title": "Documentation", + "description": "Check out the documentation for Front Matter.\n[View our documentation](https://frontmatter.codes/docs)", + "media": { + "markdown": "assets/walkthrough/documentation.md" + }, + "completionEvents": [ + "onLink:https://frontmatter.codes/docs" + ] }, - "completionEvents": [ - "onLink:https://frontmatter.codes/docs" - ] - }, - { - "id": "frontmatter.welcome.supporter", - "title": "Support the project", - "description": "Become a supporter.\n[Support the project](https://github.com/sponsors/estruyf)", - "media": { - "markdown": "assets/walkthrough/support-the-project.md" - }, - "completionEvents": [ - "onLink:https://github.com/sponsors/estruyf" - ] - } - ] - }] + { + "id": "frontmatter.welcome.supporter", + "title": "Support the project", + "description": "Become a supporter.\n[Support the project](https://github.com/sponsors/estruyf)", + "media": { + "markdown": "assets/walkthrough/support-the-project.md" + }, + "completionEvents": [ + "onLink:https://github.com/sponsors/estruyf" + ] + } + ] + } + ] }, "scripts": { "dev:ext": "npm run clean && npm run localization:generate && npm-run-all --parallel watch:*", @@ -2742,7 +2780,6 @@ "@sentry/react": "^6.19.7", "@sentry/tracing": "^6.19.7", "@tailwindcss/forms": "^0.5.3", - "@types/glob": "7.1.3", "@types/invariant": "^2.2.35", "@types/js-yaml": "^4.0.9", "@types/lodash.omit": "^4.5.7", @@ -2775,7 +2812,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", @@ -2837,4 +2874,4 @@ "dependencies": { "@radix-ui/react-dropdown-menu": "^2.0.6" } -} \ No newline at end of file +} 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..1c0a8c00 100644 --- a/src/commands/Diagnostics.ts +++ b/src/commands/Diagnostics.ts @@ -4,10 +4,11 @@ import ContentProvider from '../providers/ContentProvider'; import { join } from 'path'; import { ContentFolder } from '../models'; import { Settings } from '../helpers/SettingsHelper'; +import { DEFAULT_FILE_TYPES, SETTING_CONTENT_SUPPORTED_FILETYPES } from '../constants'; export class Diagnostics { public static async show() { - const folders = Folders.get(); + const folders = await Folders.get(); const projectName = Folders.getProjectFolderName(); const wsFolder = Folders.getWorkspaceFolder(); @@ -18,27 +19,35 @@ export class Diagnostics { const all = await Diagnostics.allProjectFiles(); - const logging = `# Project name + const fileTypes = Diagnostics.getFileTypes(); + + const logging = `# Front Matter CMS - Diagnostics + +## Project name ${projectName} -# Folders +## Workspace folder -${folders.map((f) => `- ${f.title}: "${f.path}"`).join('\n')} +\`${wsFolder ? wsFolder.fsPath : 'No workspace folder'}\` -# Workspace folder - -${wsFolder ? wsFolder.fsPath : 'No workspace folder'} - -# Total files +## Total files ${all} -# Folders to search files +## Folders +| Title | Path | +| ----- | ---- | +${folders.map((f) => `| ${f.title} | \`${f.path}\` |`).join('\n')} + +### Files in folders + +| Project start length | Search in | ${fileTypes.join(` | `)} | +|--- | --- | --- | --- | --- | ${folderData.join('\n')} -# Complete frontmatter.json config +## Complete frontmatter.json config \`\`\`json ${JSON.stringify(Settings.globalConfig, null, 2)} @@ -48,6 +57,10 @@ ${JSON.stringify(Settings.globalConfig, null, 2)} ContentProvider.show(logging, `${projectName} diagnostics`, 'markdown', ViewColumn.One); } + private static getFileTypes = (): string[] => { + return Settings.get(SETTING_CONTENT_SUPPORTED_FILETYPES) || DEFAULT_FILE_TYPES; + }; + private static async allProjectFiles() { const allFiles = await workspace.findFiles(`**/*.*`); return `Total files found: ${allFiles.length}`; @@ -59,22 +72,19 @@ ${JSON.stringify(Settings.globalConfig, null, 2)} projectStart = projectStart?.replace(/\\/g, '/'); projectStart = projectStart?.startsWith('/') ? projectStart.substring(1) : projectStart; - const mdFiles = await workspace.findFiles( - join(projectStart, folder.excludeSubdir ? '/' : '**/', '*.md') - ); - const mdxFiles = await workspace.findFiles( - join(projectStart, folder.excludeSubdir ? '/' : '**/', '*.mdx') - ); - const markdownFiles = await workspace.findFiles( - join(projectStart, folder.excludeSubdir ? '/' : '**/', '*.markdown') + const fileTypes = Diagnostics.getFileTypes(); + const fileTypeLengths = await Promise.all( + fileTypes.map(async (ft) => { + const path = join(projectStart || '', folder.excludeSubdir ? '/' : '**/', `*.${ft}`); + const files = await workspace.findFiles(path, '**/node_modules/**'); + return (files || []).length; + }) ); - return `- Project start length: ${projectStart.length} | Search in: "${join( + return `| ${projectStart.length} | \`${join( projectStart, folder.excludeSubdir ? '/' : '**/', '*.*' - )}" | mdFiles: ${mdFiles.length} | mdxFiles: ${mdxFiles.length} | markdownFiles: ${ - markdownFiles.length - }`; + )}\` | ${fileTypeLengths.join(` | `)} |`; } } 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/extension.ts b/src/extension.ts index 3cea1ccb..600fc712 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -46,6 +46,10 @@ export async function activate(context: vscode.ExtensionContext) { const { subscriptions, extensionUri, extensionPath } = context; const extension = Extension.getInstance(context); + + Logger.info(`Activating ${EXTENSION_NAME} version ${Extension.getInstance().version}...`); + Logger.info(`Logging level: ${Logger.getLevel()}`); + // Set development context if (!Extension.getInstance().isProductionMode) { vscode.commands.executeCommand('setContext', CONTEXT.isDevelopment, true); 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/Logger.ts b/src/helpers/Logger.ts index f16d65ad..0345395e 100644 --- a/src/helpers/Logger.ts +++ b/src/helpers/Logger.ts @@ -18,6 +18,10 @@ export class Logger { }); } + public static getLevel(): string { + return Settings.get(SETTING_LOGGING) || 'info'; + } + public static getInstance(): Logger { if (!Logger.instance) { Logger.instance = new Logger(); @@ -34,7 +38,7 @@ export class Logger { Logger.getInstance(); } - const loggingLevel = Settings.get(SETTING_LOGGING) || 'info'; + const loggingLevel = Logger.getLevel(); const logMessage = `["${type}" - ${format(new Date(), 'HH:mm:ss')}] ${location} | ${message}`; 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/providers/ContentProvider.ts b/src/providers/ContentProvider.ts index 094de663..a115f3a5 100644 --- a/src/providers/ContentProvider.ts +++ b/src/providers/ContentProvider.ts @@ -25,8 +25,6 @@ export default class ContentProvider implements TextDocumentContentProvider { outputType?: string, column: ViewColumn = ViewColumn.Beside ) { - const apiData = JSON.stringify(data, null, 2); - const uri = Uri.parse(`${ContentProvider.scheme}:${title} output`); const doc = await workspace.openTextDocument(uri); 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,