We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
2 parents 31d83df + bd3b504 commit fb90bf9Copy full SHA for fb90bf9
3 files changed
.changepacks/changepack_log_s2ifFSZjZS9Av0TpjQsEW.json
@@ -0,0 +1 @@
1
+{"changes":{"packages/generator/package.json":"Patch"},"note":"Add warp guard","date":"2025-12-12T03:17:58.146361300Z"}
packages/generator/src/__tests__/wrap-interface-key-guard.test.ts
@@ -40,3 +40,18 @@ test.each([
40
] as const)('wrapInterfaceKeyGuard wraps key with multiple slashes: %s -> %s', (key, expected) => {
41
expect(wrapInterfaceKeyGuard(key)).toBe(expected)
42
})
43
+
44
+test.each([
45
+ ['field"name', '[`field"name`]'],
46
+ ["field'name", "[`field'name`]"],
47
+ ['field`name', '[`field`name`]'],
48
+ ['field-name', '[`field-name`]'],
49
+ ['field name', '[`field name`]'],
50
+ ['field@name', '[`field@name`]'],
51
+ ['field#name', '[`field#name`]'],
52
+ ['field$name', 'field$name'], // $ is valid in identifiers
53
+ ['field_name', 'field_name'], // _ is valid in identifiers
54
+ ['123field', '[`123field`]'], // cannot start with number
55
+] as const)('wrapInterfaceKeyGuard wraps key with forbidden characters: %s -> %s', (key, expected) => {
56
+ expect(wrapInterfaceKeyGuard(key)).toBe(expected)
57
+})
packages/generator/src/wrap-interface-key-guard.ts
@@ -1,5 +1,19 @@
export function wrapInterfaceKeyGuard(key: string): string {
2
- if (key.includes('/') || key.includes('.')) {
+ // Empty string should be returned as-is
3
+ if (key === '') {
4
+ return key
5
+ }
6
7
+ // Check if key contains forbidden characters that require wrapping
8
+ // TypeScript identifier pattern: starts with letter/underscore/dollar, followed by letters/numbers/underscore/dollar
9
+ const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)
10
11
+ if (
12
+ !isValidIdentifier ||
13
+ key.includes('"') ||
14
+ key.includes("'") ||
15
+ key.includes('`')
16
+ ) {
17
return `[\`${key}\`]`
18
}
19
return key
0 commit comments