From bd3b5046486d21a2bc505c2ba28ed7b53da2987c Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Fri, 12 Dec 2025 12:18:04 +0900 Subject: [PATCH] Add warp guard --- .../changepack_log_s2ifFSZjZS9Av0TpjQsEW.json | 1 + .../__tests__/wrap-interface-key-guard.test.ts | 15 +++++++++++++++ .../generator/src/wrap-interface-key-guard.ts | 16 +++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 .changepacks/changepack_log_s2ifFSZjZS9Av0TpjQsEW.json diff --git a/.changepacks/changepack_log_s2ifFSZjZS9Av0TpjQsEW.json b/.changepacks/changepack_log_s2ifFSZjZS9Av0TpjQsEW.json new file mode 100644 index 0000000..e111033 --- /dev/null +++ b/.changepacks/changepack_log_s2ifFSZjZS9Av0TpjQsEW.json @@ -0,0 +1 @@ +{"changes":{"packages/generator/package.json":"Patch"},"note":"Add warp guard","date":"2025-12-12T03:17:58.146361300Z"} \ No newline at end of file diff --git a/packages/generator/src/__tests__/wrap-interface-key-guard.test.ts b/packages/generator/src/__tests__/wrap-interface-key-guard.test.ts index 2d72970..6f7ad95 100644 --- a/packages/generator/src/__tests__/wrap-interface-key-guard.test.ts +++ b/packages/generator/src/__tests__/wrap-interface-key-guard.test.ts @@ -40,3 +40,18 @@ test.each([ ] as const)('wrapInterfaceKeyGuard wraps key with multiple slashes: %s -> %s', (key, expected) => { expect(wrapInterfaceKeyGuard(key)).toBe(expected) }) + +test.each([ + ['field"name', '[`field"name`]'], + ["field'name", "[`field'name`]"], + ['field`name', '[`field`name`]'], + ['field-name', '[`field-name`]'], + ['field name', '[`field name`]'], + ['field@name', '[`field@name`]'], + ['field#name', '[`field#name`]'], + ['field$name', 'field$name'], // $ is valid in identifiers + ['field_name', 'field_name'], // _ is valid in identifiers + ['123field', '[`123field`]'], // cannot start with number +] as const)('wrapInterfaceKeyGuard wraps key with forbidden characters: %s -> %s', (key, expected) => { + expect(wrapInterfaceKeyGuard(key)).toBe(expected) +}) diff --git a/packages/generator/src/wrap-interface-key-guard.ts b/packages/generator/src/wrap-interface-key-guard.ts index ae0bd68..f418430 100644 --- a/packages/generator/src/wrap-interface-key-guard.ts +++ b/packages/generator/src/wrap-interface-key-guard.ts @@ -1,5 +1,19 @@ export function wrapInterfaceKeyGuard(key: string): string { - if (key.includes('/') || key.includes('.')) { + // Empty string should be returned as-is + if (key === '') { + return key + } + + // Check if key contains forbidden characters that require wrapping + // TypeScript identifier pattern: starts with letter/underscore/dollar, followed by letters/numbers/underscore/dollar + const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) + + if ( + !isValidIdentifier || + key.includes('"') || + key.includes("'") || + key.includes('`') + ) { return `[\`${key}\`]` } return key