From 8d9ca7cf0487bf1d0492a6b35baae7124da82fc0 Mon Sep 17 00:00:00 2001 From: mfyuu <83203852+ve1997@users.noreply.github.com> Date: Tue, 27 Jan 2026 15:58:41 +0900 Subject: [PATCH 1/2] fix: handle non-string values in jsonToEnv and fix file extension - fix jsonToEnv to safely convert non-string values to strings - update type signature from Record to Record - add String() conversion for numbers, booleans, objects, null, and undefined - fix help message to show .e2smrc.jsonc instead of .e2smrc.json - add comprehensive tests for non-string value conversion --- src/index.ts | 2 +- src/lib/env.test.ts | 20 ++++++++++++++++++++ src/lib/env.ts | 5 +++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 208f3ab..43a3286 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,7 @@ const command = define({ console.error("Error: Please specify a subcommand (init, set, get, pull, or delete)"); console.error(""); console.error("Usage:"); - console.error(" e2sm init - Initialize .e2smrc.json configuration file"); + console.error(" e2sm init - Initialize .e2smrc.jsonc configuration file"); console.error(" e2sm set - Upload .env file to AWS Secrets Manager"); console.error(" e2sm get - Display secret from AWS Secrets Manager"); console.error(" e2sm pull - Pull secret and generate .env file"); diff --git a/src/lib/env.test.ts b/src/lib/env.test.ts index e9aaba0..21934b8 100644 --- a/src/lib/env.test.ts +++ b/src/lib/env.test.ts @@ -117,6 +117,26 @@ describe("jsonToEnv", () => { const result = jsonToEnv({ FOO: "bar\nbaz" }); expect(result).toBe('FOO="bar\nbaz"'); }); + + test("converts number values to string", () => { + const result = jsonToEnv({ PORT: 3000, DEBUG: 1 }); + expect(result).toBe('PORT="3000"\nDEBUG="1"'); + }); + + test("converts boolean values to string", () => { + const result = jsonToEnv({ ENABLED: true, DISABLED: false }); + expect(result).toBe('ENABLED="true"\nDISABLED="false"'); + }); + + test("converts null and undefined to string", () => { + const result = jsonToEnv({ NULL_VAL: null, UNDEF_VAL: undefined }); + expect(result).toBe('NULL_VAL="null"\nUNDEF_VAL="undefined"'); + }); + + test("converts object values to string", () => { + const result = jsonToEnv({ OBJ: { nested: "value" } }); + expect(result).toBe('OBJ="[object Object]"'); + }); }); describe("generateEnvHeader", () => { diff --git a/src/lib/env.ts b/src/lib/env.ts index dbafbe8..9cccadf 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -46,10 +46,11 @@ export function parseEnvContent(content: string): Record { /** * Converts JSON object to .env format string. */ -export function jsonToEnv(data: Record): string { +export function jsonToEnv(data: Record): string { return Object.entries(data) .map(([key, value]) => { - const escaped = value.replace(/"/g, '\\"'); + const stringValue = typeof value === "string" ? value : String(value); + const escaped = stringValue.replace(/"/g, '\\"'); return `${key}="${escaped}"`; }) .join("\n"); From d263ac944fb8a4bd2b37d9774af88f9b1af7e623 Mon Sep 17 00:00:00 2001 From: mfyuu <83203852+ve1997@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:04:41 +0900 Subject: [PATCH 2/2] fix: serialize objects and arrays with JSON.stringify - use JSON.stringify for objects and arrays instead of String() - preserve data structure in .env output for complex types - add test case for array value conversion --- src/lib/env.test.ts | 9 +++++++-- src/lib/env.ts | 9 ++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/lib/env.test.ts b/src/lib/env.test.ts index 21934b8..9711510 100644 --- a/src/lib/env.test.ts +++ b/src/lib/env.test.ts @@ -133,9 +133,14 @@ describe("jsonToEnv", () => { expect(result).toBe('NULL_VAL="null"\nUNDEF_VAL="undefined"'); }); - test("converts object values to string", () => { + test("converts object values to JSON string", () => { const result = jsonToEnv({ OBJ: { nested: "value" } }); - expect(result).toBe('OBJ="[object Object]"'); + expect(result).toBe('OBJ="{\\"nested\\":\\"value\\"}"'); + }); + + test("converts array values to JSON string", () => { + const result = jsonToEnv({ ITEMS: [1, 2, 3] }); + expect(result).toBe('ITEMS="[1,2,3]"'); }); }); diff --git a/src/lib/env.ts b/src/lib/env.ts index 9cccadf..0ce5977 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -49,7 +49,14 @@ export function parseEnvContent(content: string): Record { export function jsonToEnv(data: Record): string { return Object.entries(data) .map(([key, value]) => { - const stringValue = typeof value === "string" ? value : String(value); + let stringValue: string; + if (typeof value === "string") { + stringValue = value; + } else if (value !== null && typeof value === "object") { + stringValue = JSON.stringify(value); + } else { + stringValue = String(value); + } const escaped = stringValue.replace(/"/g, '\\"'); return `${key}="${escaped}"`; })