Merge pull request #803 from estruyf/issue/802

#802 - Update glob
This commit is contained in:
Elio Struyf
2024-05-02 09:31:06 +02:00
committed by GitHub
26 changed files with 436 additions and 380 deletions
+2
View File
@@ -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
+64 -81
View File
@@ -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",
+185 -148
View File
@@ -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"
}
}
}
+18 -12
View File
@@ -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<TextEdit[]> {
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<ParsedFrontMatter | undefined> {
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<string>(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,
+33 -23
View File
@@ -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<string[]>(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(` | `)} |`;
}
}
+37 -39
View File
@@ -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<FolderInfo[] | null> {
Logger.verbose('Folders:getInfo:start');
const supportedFiles = Settings.get<string[]>(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<ContentFolder[]> {
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<ContentFolder | undefined> {
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<string[]> {
private static async findFolders(pattern: string): Promise<string[]> {
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<Uri[]> {
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 [];
}
}
}
+3 -3
View File
@@ -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
+2 -2
View File
@@ -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) {
+1 -1
View File
@@ -176,7 +176,7 @@ export class Template {
newFilePath
);
const article = Article.updateDate(frontMatter);
const article = await Article.updateDate(frontMatter);
if (!article) {
return;
+10 -10
View File
@@ -48,10 +48,10 @@ export class i18n {
*
* @returns An array of I18nConfig settings.
*/
public static getAll() {
public static async getAll() {
const i18nSettings = Settings.get<I18nConfig[]>(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<I18nConfig[]>(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<ContentFolder | undefined> {
const folders = Folders.get();
const folders = await Folders.get();
const localeFolders = folders?.filter((folder) => folder.defaultLocale);
if (!localeFolders) {
+4
View File
@@ -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);
+18 -15
View File
@@ -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<Field | undefined> {
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<IContentType> {
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<string>(SETTING_CONTENT_DEFAULT_FILETYPE);
let prefix = Settings.get<string>(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<string | undefined> {
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;
}
+10 -7
View File
@@ -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<Field[][] | undefined> {
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;
+1 -1
View File
@@ -115,7 +115,7 @@ export class DashboardSettings {
contentTypes: ContentType.getAll() || [],
draftField: Settings.get<DraftField>(SETTING_CONTENT_DRAFT_FIELD),
customSorting: Settings.get<SortingSetting[]>(SETTING_CONTENT_SORTING),
contentFolders: Folders.get(),
contentFolders: await Folders.get(),
filters:
Settings.get<(FilterType | { title: string; name: string })[]>(SETTING_CONTENT_FILTERS),
crntFramework: Settings.get<string>(SETTING_FRAMEWORK_ID),
+5 -1
View File
@@ -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}`;
+5 -3
View File
@@ -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) {
+1 -1
View File
@@ -97,7 +97,7 @@ export class PanelSettings {
},
dataTypes: Settings.get<DataType[]>(SETTING_DATA_TYPES),
fieldGroups: Settings.get<FieldGroup[]>(SETTING_TAXONOMY_FIELD_GROUPS),
contentFolders: Folders.get(),
contentFolders: await Folders.get(),
websiteUrl: Settings.get<string>(SETTING_WEBSITE_URL) || '',
disabledActions: Settings.get<PanelAction[]>(SETTING_PANEL_ACTIONS_DISABLED) || []
};
+12 -12
View File
@@ -131,7 +131,8 @@ export class Questions {
public static async SelectContentFolder(
showWarning: boolean = true
): Promise<FolderQuickPickItem | undefined> {
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;
}
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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(
@@ -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);
}
}
+2 -2
View File
@@ -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}`);
+5 -5
View File
@@ -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') {
+9 -4
View File
@@ -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,
-2
View File
@@ -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);
+5 -4
View File
@@ -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,