diff --git a/CHANGELOG.md b/CHANGELOG.md index f980ef9..14aeb70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to the "vscode-appwrite" extension will be documented in thi Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. ## [Unreleased] +## Added +- New feature! JSON strings inside documents will now be automatically formatted as JSON when viewing documents. You can turn this feature off via the `appwrite.formatJsonStrings` setting. ## [0.1.2] - 2021-6-03 ## Added diff --git a/package.json b/package.json index b653cd9..9d7a56d 100644 --- a/package.json +++ b/package.json @@ -726,6 +726,11 @@ "type": "string", "default": "", "markdownDescription": "Project id of the active project, see [docs](https://github.com/streamlux/vscode-appwrite/) for more information." + }, + "appwrite.formatJsonStrings": { + "type": "boolean", + "default": true, + "markdownDescription": "Format JSON strings when viewing documents" } } } diff --git a/src/commands/database/openDocument.ts b/src/commands/database/openDocument.ts index e8b2e4a..45d57eb 100644 --- a/src/commands/database/openDocument.ts +++ b/src/commands/database/openDocument.ts @@ -1,8 +1,30 @@ +import { workspace } from "vscode"; import { DocumentTreeItem } from "../../tree/database/DocumentTreeItem"; import { openReadOnlyJson } from "../../ui/openReadonlyContent"; +function parseJSONString(str: string): { valid: boolean; value: any } { + try { + return { value: JSON.parse(str), valid: true }; + } catch (e) { + return { value: str, valid: false }; + } +} + export async function viewDocumentAsJson(documentTreeItem: DocumentTreeItem): Promise { - const documentId = documentTreeItem.document["$id"]; + const document = documentTreeItem.document; + const documentId = document["$id"]; + + const formatJsonStrings = workspace.getConfiguration("appwrite").get("formatJsonStrings"); + + if (formatJsonStrings) { + Object.entries(document).forEach(([key, value]) => { + if (typeof value === "string") { + const result = parseJSONString(value); + document[key] = result; + } + }); + } + await openReadOnlyJson( { label: documentId,