fork of hey-api/openapi-ts because I need some additional things
1import { regexp } from './regexp';
2import type { ReservedList } from './reserved';
3import { reserved } from './reserved';
4
5export const safeAccessorName = (name: string): string => {
6 regexp.number.lastIndex = 0;
7 if (regexp.number.test(name)) {
8 return name.startsWith('-') ? `'${name}'` : name;
9 }
10
11 regexp.pythonIdentifier.lastIndex = 0;
12 if (regexp.pythonIdentifier.test(name)) {
13 return name;
14 }
15 return `'${name}'`;
16};
17
18const validPythonChar = /^[a-zA-Z0-9_]$/;
19
20const safeName = (name: string, reserved: ReservedList): string => {
21 let sanitized = '';
22 let index: number;
23
24 const first = name[0] ?? '';
25 regexp.illegalStartCharacters.lastIndex = 0;
26 if (regexp.illegalStartCharacters.test(first)) {
27 // Check if character becomes valid when not in leading position (e.g., digits)
28 if (validPythonChar.test(first)) {
29 sanitized += '_';
30 index = 0;
31 } else {
32 sanitized += '_';
33 index = 1;
34 }
35 } else {
36 sanitized += first;
37 index = 1;
38 }
39
40 while (index < name.length) {
41 const char = name[index] ?? '';
42 sanitized += validPythonChar.test(char) ? char : '_';
43 index += 1;
44 }
45
46 if (reserved['~values'].has(sanitized)) {
47 sanitized = `${sanitized}_`;
48 }
49
50 return sanitized || '_';
51};
52
53export const safeRuntimeName = (name: string): string => safeName(name, reserved.runtime);
54
55export const safeKeywordName = (name: string): string => safeName(name, reserved.keywords);