diff --git a/src/common/k8s-api/json-api.ts b/src/common/k8s-api/json-api.ts index 988378641c..0470bfb125 100644 --- a/src/common/k8s-api/json-api.ts +++ b/src/common/k8s-api/json-api.ts @@ -16,7 +16,6 @@ import { EventEmitter } from "../../common/event-emitter"; import type { Logger } from "../../common/logger"; import type { Fetch } from "../fetch/fetch.injectable"; import type { Defaulted } from "../utils"; -import { json } from "../utils"; export interface JsonApiData {} @@ -194,7 +193,7 @@ export class JsonApi = Js let data: any; try { - data = text ? json.parse(text) : ""; // DELETE-requests might not have response-body + data = text ? JSON.parse(text) : ""; // DELETE-requests might not have response-body } catch (e) { data = text; } diff --git a/src/common/k8s-api/kube-object.ts b/src/common/k8s-api/kube-object.ts index d88c19db89..443d731b96 100644 --- a/src/common/k8s-api/kube-object.ts +++ b/src/common/k8s-api/kube-object.ts @@ -7,7 +7,7 @@ import moment from "moment"; import type { KubeJsonApiData, KubeJsonApiDataList, KubeJsonApiListMetadata } from "./kube-json-api"; -import { autoBind, formatDuration, hasOptionalTypedProperty, hasTypedProperty, isObject, isString, isNumber, bindPredicate, isTypedArray, isRecord, json } from "../utils"; +import { autoBind, formatDuration, hasOptionalTypedProperty, hasTypedProperty, isObject, isString, isNumber, bindPredicate, isTypedArray, isRecord } from "../utils"; import type { ItemObject } from "../item.store"; import type { Patch } from "rfc6902"; import assert from "assert"; @@ -624,7 +624,7 @@ export class KubeObject< } toPlainObject() { - return json.parse(JSON.stringify(this)) as JsonObject; + return JSON.parse(JSON.stringify(this)) as JsonObject; } /** diff --git a/src/common/utils/json.ts b/src/common/utils/json.ts index 53d357f05c..b612673312 100644 --- a/src/common/utils/json.ts +++ b/src/common/utils/json.ts @@ -3,8 +3,26 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { JsonValue } from "type-fest"; +import type { Result } from "./result"; -export function parse(input: string): JsonValue { - return JSON.parse(input); +export interface JsonParseError { + cause: SyntaxError; + text: string; +} + +export function parse(text: string): Result { + try { + return { + isOk: true, + value: JSON.parse(text), + }; + } catch (error) { + return { + isOk: false, + error: { + cause: error as SyntaxError, + text, + }, + }; + } } diff --git a/src/common/utils/tar.ts b/src/common/utils/tar.ts index 3102098976..701cd66fd8 100644 --- a/src/common/utils/tar.ts +++ b/src/common/utils/tar.ts @@ -7,7 +7,6 @@ // Docs: https://github.com/npm/node-tar import tar from "tar"; import path from "path"; -import { parse } from "./json"; import type { JsonValue } from "type-fest"; export type ReadFileFromTarOpts = { @@ -43,7 +42,7 @@ export function readFileFromTar({ tarPath, filePath, }); entry.once("end", () => { const data = Buffer.concat(fileChunks); - const result = parseJson ? parse(data.toString("utf8")) : data; + const result = parseJson ? JSON.parse(data.toString("utf8")) : data; resolve(result); }); diff --git a/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts b/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts index 71a38abf6b..637a4788a8 100644 --- a/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts +++ b/src/main/helm/helm-service/get-helm-release-resources/call-for-kube-resources-by-manifest/call-for-kube-resources-by-manifest.injectable.ts @@ -4,7 +4,6 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import type { JsonObject } from "type-fest"; -import { json } from "../../../../../common/utils"; import yaml from "js-yaml"; import execFileWithInputInjectable from "./exec-file-with-input/exec-file-with-input.injectable"; import { getErrorMessage } from "../../../../../common/utils/get-error-message"; @@ -60,7 +59,7 @@ const callForKubeResourcesByManifestInjectable = getInjectable({ throw new Error(errorMessage); } - const output = json.parse(result.response) as { items: JsonObject[] }; + const output = JSON.parse(result.response) as { items: JsonObject[] }; return output.items; }; diff --git a/src/main/helm/helm-service/get-helm-release.injectable.ts b/src/main/helm/helm-service/get-helm-release.injectable.ts index 71d3fe6184..f7f93330ce 100644 --- a/src/main/helm/helm-service/get-helm-release.injectable.ts +++ b/src/main/helm/helm-service/get-helm-release.injectable.ts @@ -22,7 +22,7 @@ const getHelmReleaseInjectable = getInjectable({ logger.debug("Fetch release"); - const result = await execHelm([ + const helmResult = await execHelm([ "status", releaseName, "--namespace", @@ -33,15 +33,21 @@ const getHelmReleaseInjectable = getInjectable({ "json", ]); - if (!result.callWasSuccessful) { - logger.warn(`Failed to exectute helm: ${result.error}`); + if (!helmResult.callWasSuccessful) { + logger.warn(`Failed to exectute helm: ${helmResult.error}`); return undefined; } - const release = json.parse(result.response); + const { isOk, error, value } = json.parse(helmResult.response); - if (!isObject(release) || Array.isArray(release)) { + if (!isOk) { + logger.warn(`Failed to get helm release resources: ${error.cause}`); + + return undefined; + } + + if (!isObject(value) || Array.isArray(value)) { return undefined; } @@ -58,7 +64,7 @@ const getHelmReleaseInjectable = getInjectable({ } return { - ...release, + ...value, resources: resourcesResult.response, }; }; diff --git a/src/main/helm/list-helm-releases.injectable.ts b/src/main/helm/list-helm-releases.injectable.ts index ff362eb3d2..4337e71233 100644 --- a/src/main/helm/list-helm-releases.injectable.ts +++ b/src/main/helm/list-helm-releases.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import execHelmInjectable from "./exec-helm/exec-helm.injectable"; -import { isObject, json, toCamelCase } from "../../common/utils"; +import { isObject, toCamelCase } from "../../common/utils"; export type ListHelmReleases = (pathToKubeconfig: string, namespace?: string) => Promise[]>; @@ -28,13 +28,13 @@ const listHelmReleasesInjectable = getInjectable({ args.push("--kubeconfig", pathToKubeconfig); - const result = await execHelm(args); + const helmResult = await execHelm(args); - if (!result.callWasSuccessful) { - throw result.error; + if (!helmResult.callWasSuccessful) { + throw helmResult.error; } - const output = json.parse(result.response); + const output = JSON.parse(helmResult.response); if (!Array.isArray(output) || output.length == 0) { return [];