#802 - Update glob

This commit is contained in:
Elio Struyf
2024-04-29 14:53:09 +02:00
parent 54bf408c76
commit 5f623689cc
23 changed files with 217 additions and 197 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
+69 -69
View File
@@ -21,7 +21,7 @@
"@sentry/react": "^6.19.7",
"@sentry/tracing": "^6.19.7",
"@tailwindcss/forms": "^0.5.3",
"@types/glob": "7.1.3",
"@types/glob": "^8.1.0",
"@types/invariant": "^2.2.35",
"@types/js-yaml": "^4.0.9",
"@types/lodash.omit": "^4.5.7",
@@ -54,7 +54,7 @@
"eslint": "^8.33.0",
"fuse.js": "6.5.3",
"github-directory-downloader": "^1.3.6",
"glob": "7.1.6",
"glob": "^10.3.12",
"gray-matter": "4.0.3",
"html-loader": "1.3.2",
"html-webpack-plugin": "4.5.0",
@@ -1814,12 +1814,12 @@
}
},
"node_modules/@types/glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
"dev": true,
"dependencies": {
"@types/minimatch": "*",
"@types/minimatch": "^5.1.2",
"@types/node": "*"
}
},
@@ -5110,20 +5110,22 @@
}
},
"node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"version": "10.3.12",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz",
"integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
"foreground-child": "^3.1.0",
"jackspeak": "^2.3.6",
"minimatch": "^9.0.1",
"minipass": "^7.0.4",
"path-scurry": "^1.10.2"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": "*"
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -5147,6 +5149,30 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"dev": true
},
"node_modules/glob/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/glob/node_modules/minimatch": {
"version": "9.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
"integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -8534,12 +8560,12 @@
"dev": true
},
"node_modules/path-scurry": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
"integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz",
"integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==",
"dev": true,
"dependencies": {
"lru-cache": "^9.1.1 || ^10.0.0",
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
@@ -8550,9 +8576,9 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
"integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
"integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
"dev": true,
"engines": {
"node": "14 || >=16.14"
@@ -10551,6 +10577,26 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/rimraf/node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -11442,52 +11488,6 @@
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/sucrase/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/sucrase/node_modules/glob": {
"version": "10.3.10",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
"integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
"dev": true,
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^2.3.5",
"minimatch": "^9.0.1",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
"path-scurry": "^1.10.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/sucrase/node_modules/minimatch": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+2 -2
View File
@@ -2742,7 +2742,7 @@
"@sentry/react": "^6.19.7",
"@sentry/tracing": "^6.19.7",
"@tailwindcss/forms": "^0.5.3",
"@types/glob": "7.1.3",
"@types/glob": "^8.1.0",
"@types/invariant": "^2.2.35",
"@types/js-yaml": "^4.0.9",
"@types/lodash.omit": "^4.5.7",
@@ -2775,7 +2775,7 @@
"eslint": "^8.33.0",
"fuse.js": "6.5.3",
"github-directory-downloader": "^1.3.6",
"glob": "7.1.6",
"glob": "^10.3.12",
"gray-matter": "4.0.3",
"html-loader": "1.3.2",
"html-webpack-plugin": "4.5.0",
+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,
+1 -1
View File
@@ -7,7 +7,7 @@ import { Settings } from '../helpers/SettingsHelper';
export class Diagnostics {
public static async show() {
const folders = Folders.get();
const folders = await Folders.get();
const projectName = Folders.getProjectFolderName();
const wsFolder = Folders.getWorkspaceFolder();
+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) {
+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 -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,
+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,