@kubb/core 2.8.2 → 2.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/core",
3
- "version": "2.8.2",
3
+ "version": "2.9.1",
4
4
  "description": "Generator core",
5
5
  "keywords": [
6
6
  "typescript",
@@ -95,17 +95,20 @@
95
95
  "p-queue": "^8.0.1",
96
96
  "seedrandom": "^3.0.5",
97
97
  "semver": "^7.6.0",
98
- "@kubb/parser": "2.8.2",
99
- "@kubb/types": "2.8.2"
98
+ "unraw": "^3.0.0",
99
+ "@kubb/parser": "2.9.1",
100
+ "@kubb/types": "2.9.1"
100
101
  },
101
102
  "devDependencies": {
102
103
  "@types/fs-extra": "^11.0.4",
103
104
  "@types/lodash.isequal": "^4.5.8",
104
- "@types/react": "^18.2.64",
105
+ "@types/lodash.tonumber": "^4.0.9",
106
+ "@types/react": "^18.2.67",
105
107
  "@types/seedrandom": "^3.0.8",
106
108
  "@types/semver": "^7.5.8",
107
109
  "eslint": "^8.57.0",
108
110
  "lodash.isequal": "^4.5.0",
111
+ "lodash.tonumber": "^4.0.3",
109
112
  "ora": "^8.0.1",
110
113
  "tinyrainbow": "^1.1.1",
111
114
  "tsup": "^8.0.2",
@@ -29,3 +29,15 @@ export function jsStringEscape(input: any): string {
29
29
  }
30
30
  })
31
31
  }
32
+
33
+ export function escapeStringRegexp(string: string) {
34
+ if (typeof string !== 'string') {
35
+ throw new TypeError('Expected a string')
36
+ }
37
+
38
+ // Escape characters with special meaning either inside or outside character sets.
39
+ // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.
40
+ return string
41
+ .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
42
+ .replace(/-/g, '\\x2d')
43
+ }
@@ -5,8 +5,11 @@ import { escape, jsStringEscape } from './escape.ts'
5
5
  import { createIndent } from './indent.ts'
6
6
  import { nameSorter } from './nameSorter.ts'
7
7
  import { searchAndReplace } from './searchAndReplace.ts'
8
+ import { stringify } from './stringify.ts'
9
+ import { isNumber, toNumber } from './toNumber.ts'
10
+ import { toRegExp, toRegExpString } from './toRegExp.ts'
8
11
  import { transformReservedWord } from './transformReservedWord.ts'
9
- import { trim, trimExtName } from './trim.ts'
12
+ import { trim, trimExtName, trimQuotes } from './trim.ts'
10
13
 
11
14
  export { camelCase, pascalCase, pathCase } from './casing.ts'
12
15
  export { combineCodes } from './combineCodes.ts'
@@ -15,8 +18,11 @@ export { escape, jsStringEscape } from './escape.ts'
15
18
  export { createIndent } from './indent.ts'
16
19
  export { nameSorter } from './nameSorter.ts'
17
20
  export { searchAndReplace } from './searchAndReplace.ts'
21
+ export { stringify } from './stringify.ts'
22
+ export { isNumber, toNumber } from './toNumber.ts'
23
+ export { toRegExp, toRegExpString } from './toRegExp.ts'
18
24
  export { transformReservedWord } from './transformReservedWord.ts'
19
- export { trim, trimExtName } from './trim.ts'
25
+ export { trim, trimExtName, trimQuotes } from './trim.ts'
20
26
 
21
27
  export default {
22
28
  combineCodes,
@@ -26,7 +32,13 @@ export default {
26
32
  transformReservedWord,
27
33
  nameSorter,
28
34
  searchAndReplace,
35
+ toNumber,
36
+ isNumber,
37
+ stringify,
38
+ toRegExp,
39
+ toRegExpString,
29
40
  trim,
41
+ trimQuotes,
30
42
  trimExtName,
31
43
  JSDoc: {
32
44
  createJSDocBlockText,
@@ -0,0 +1,8 @@
1
+ import { trimQuotes } from './trim'
2
+
3
+ export function stringify(text: string | number | undefined): string {
4
+ if (text === undefined) {
5
+ return '""'
6
+ }
7
+ return JSON.stringify(trimQuotes(text.toString()))
8
+ }
@@ -0,0 +1,13 @@
1
+ import _toNumber from 'lodash.tonumber'
2
+
3
+ export function isNumber(value: unknown): value is number {
4
+ if (typeof value === 'string') {
5
+ if (value === '') {
6
+ return false
7
+ }
8
+
9
+ return !isNaN(toNumber(value))
10
+ }
11
+ return typeof value === 'number'
12
+ }
13
+ export const toNumber = _toNumber
@@ -0,0 +1,35 @@
1
+ import { jsStringEscape } from './escape'
2
+ import { trimQuotes } from './trim'
3
+
4
+ function stringToRegex(text: string) {
5
+ const isStartWithSlash = text.startsWith('/')
6
+ const isEndWithSlash = text.endsWith('/')
7
+
8
+ return new RegExp(text.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : undefined))
9
+ }
10
+
11
+ /**
12
+ * @experimental
13
+ */
14
+ export function toRegExp(text: string | RegExp): RegExp {
15
+ if (typeof text === 'string') {
16
+ const source = trimQuotes(text)
17
+
18
+ return stringToRegex(source)
19
+ }
20
+
21
+ return stringToRegex(text.toString())
22
+ }
23
+
24
+ export function toRegExpString(text: string): string {
25
+ const isStartWithSlash = text.startsWith('/')
26
+ const isEndWithSlash = text.endsWith('/')
27
+
28
+ const regexp = `new RegExp('${
29
+ jsStringEscape(
30
+ text.slice(isStartWithSlash ? 1 : 0, isEndWithSlash ? -1 : undefined),
31
+ )
32
+ }')`
33
+
34
+ return regexp
35
+ }
@@ -2,6 +2,21 @@ export function trim(text: string): string {
2
2
  return text.replaceAll(/\n/g, '').trim()
3
3
  }
4
4
 
5
+ export function trimQuotes(text: string): string {
6
+ if (text.match(/^"(.*)"$/)) {
7
+ return text.replace(/^"(.*)"$/, '$1')
8
+ }
9
+ if (text.match(/^'(.*)'$/)) {
10
+ return text.replace(/^'(.*)'$/, '$1')
11
+ }
12
+
13
+ if (text.match(/^`(.*)`$/)) {
14
+ return text.replace(/^`(.*)`$/, '$1')
15
+ }
16
+
17
+ return text
18
+ }
19
+
5
20
  export function trimExtName(text: string): string {
6
21
  return text.replace(/\.[^/.]+$/, '')
7
22
  }
@@ -32,55 +32,128 @@ type FunctionParamsASTWithType = {
32
32
 
33
33
  export type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType
34
34
  export class FunctionParams {
35
- public type?: 'generics' | 'typed'
36
- public items: FunctionParamsAST[] = []
35
+ type?: 'generics' | 'typed'
36
+ #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []
37
37
  constructor(type?: 'generics' | 'typed') {
38
38
  this.type = type
39
39
 
40
40
  return this
41
41
  }
42
42
 
43
- add(item: FunctionParamsAST | Array<FunctionParamsAST | undefined> | undefined): FunctionParams {
43
+ get items(): FunctionParamsAST[] {
44
+ return this.#items.flat()
45
+ }
46
+
47
+ add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {
44
48
  if (!item) {
45
49
  return this
46
50
  }
47
51
 
48
52
  if (Array.isArray(item)) {
49
- item.filter(Boolean).forEach((it) => this.items.push(it))
53
+ item.filter(Boolean).forEach((it) => this.#items.push(it))
50
54
  return this
51
55
  }
52
- this.items.push(item)
56
+ this.#items.push(item)
53
57
 
54
58
  return this
55
59
  }
60
+ static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {
61
+ return orderBy(items.filter(Boolean), [
62
+ (v) => {
63
+ if (Array.isArray(v)) {
64
+ return undefined
65
+ }
66
+ return !v.default
67
+ },
68
+ (v) => {
69
+ if (Array.isArray(v)) {
70
+ return undefined
71
+ }
72
+ return v.required ?? true
73
+ },
74
+ ], [
75
+ 'desc',
76
+ 'desc',
77
+ ])
78
+ }
56
79
 
57
- toString(): string {
58
- const sortedData = orderBy(this.items.filter(Boolean), [(v) => !v.default, (v) => v.required ?? true], ['desc', 'desc'])
80
+ static #addParams(acc: string[], item: FunctionParamsAST) {
81
+ const { enabled = true, name, type, required = true, ...rest } = item
82
+
83
+ if (!enabled) {
84
+ return acc
85
+ }
86
+
87
+ if (!name) {
88
+ // when name is not se we will use TypeScript generics
89
+ acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)
90
+
91
+ return acc
92
+ }
93
+ // TODO check whey we still need the camelcase here
94
+ const parameterName = name.startsWith('{') ? name : camelCase(name)
95
+
96
+ if (type) {
97
+ if (required) {
98
+ acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)
99
+ } else {
100
+ acc.push(`${parameterName}?: ${type}`)
101
+ }
102
+ } else {
103
+ acc.push(`${parameterName}`)
104
+ }
105
+
106
+ return acc
107
+ }
108
+
109
+ static toObject(items: FunctionParamsAST[]): FunctionParamsAST {
110
+ let type: string[] = []
111
+ let name: string[] = []
112
+
113
+ const enabled = items.every(item => item.enabled) ? items.at(0)?.enabled : true
114
+ const required = items.every(item => item.required) ?? true
115
+
116
+ items.forEach(item => {
117
+ name = FunctionParams.#addParams(name, { ...item, type: undefined })
118
+ if (items.some(item => item.type)) {
119
+ type = FunctionParams.#addParams(type, item)
120
+ }
121
+ })
122
+
123
+ return {
124
+ name: `{ ${name.join(', ')} }`,
125
+ type: type.length ? `{ ${type.join(', ')} }` : undefined,
126
+ enabled,
127
+ required,
128
+ }
129
+ }
130
+
131
+ static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {
132
+ const sortedData = this.#orderItems(items)
59
133
 
60
134
  return sortedData
61
- .filter(({ enabled = true }) => enabled)
62
- .reduce((acc, { name, type, required = true, ...rest }) => {
63
- if (!name) {
64
- // when name is not se we will use TypeScript generics
65
- acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)
135
+ .reduce((acc, item) => {
136
+ if (Array.isArray(item)) {
137
+ const subItems = this.#orderItems(item) as FunctionParamsAST[]
138
+ const objectItem = FunctionParams.toObject(subItems)
66
139
 
67
- return acc
68
- }
69
- // TODO check whey we still need the camelcase here
70
- const parameterName = name.startsWith('{') ? name : camelCase(name)
71
-
72
- if (type) {
73
- if (required) {
74
- acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)
75
- } else {
76
- acc.push(`${parameterName}?: ${type}`)
77
- }
78
- } else {
79
- acc.push(`${parameterName}`)
140
+ return FunctionParams.#addParams(acc, objectItem)
80
141
  }
81
142
 
82
- return acc
143
+ return FunctionParams.#addParams(acc, item)
83
144
  }, [] as string[])
84
145
  .join(', ')
85
146
  }
147
+
148
+ toObject(): FunctionParamsAST {
149
+ const items = FunctionParams.#orderItems(this.#items).flat()
150
+
151
+ return FunctionParams.toObject(items)
152
+ }
153
+
154
+ toString(): string {
155
+ const items = FunctionParams.#orderItems(this.#items)
156
+
157
+ return FunctionParams.toString(items)
158
+ }
86
159
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transformers/searchAndReplace.ts","../src/transformers/trim.ts","../src/transformers/transformReservedWord.ts"],"sourcesContent":["type Options = {\n text: string\n replaceBy: string\n prefix?: string\n key: string\n searchValues?: (prefix: string, key: string) => Array<RegExp | string>\n}\n\nexport function searchAndReplace(options: Options): string {\n const { text, replaceBy, prefix = '', key } = options\n\n const searchValues = options.searchValues?.(prefix, key) || [\n `${prefix}[\"${key}\"]`,\n `${prefix}['${key}']`,\n `${prefix}[\\`${key}\\`]`,\n `${prefix}\"${key}\"`,\n `${prefix}'${key}'`,\n `${prefix}\\`${key}\\``,\n new RegExp(`${prefix}${key}`, 'g'),\n ]\n\n return searchValues.reduce((prev, searchValue) => {\n return prev.toString().replaceAll(searchValue, replaceBy)\n }, text) as string\n}\n","export function trim(text: string): string {\n return text.replaceAll(/\\n/g, '').trim()\n}\n\nexport function trimExtName(text: string): string {\n return text.replace(/\\.[^/.]+$/, '')\n}\n","/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word: string): string {\n if ((word && reservedWords.includes(word)) || word?.match(/^\\d/)) {\n return `_${word}`\n }\n\n return word\n}\n"],"mappings":";;;;;AAAA;AAQO,SAAS,iBAAiB,SAA0B;AACzD,QAAM,EAAE,MAAM,WAAW,SAAS,IAAI,IAAI,IAAI;AAE9C,QAAM,eAAe,QAAQ,eAAe,QAAQ,GAAG,KAAK;AAAA,IAC1D,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,GAAG,MAAM,MAAM,GAAG;AAAA,IAClB,GAAG,MAAM,IAAI,GAAG;AAAA,IAChB,GAAG,MAAM,IAAI,GAAG;AAAA,IAChB,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,IAAI,OAAO,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG;AAAA,EACnC;AAEA,SAAO,aAAa,OAAO,CAAC,MAAM,gBAAgB;AAChD,WAAO,KAAK,SAAS,EAAE,WAAW,aAAa,SAAS;AAAA,EAC1D,GAAG,IAAI;AACT;;;ACxBA;AAAO,SAAS,KAAK,MAAsB;AACzC,SAAO,KAAK,WAAW,OAAO,EAAE,EAAE,KAAK;AACzC;AAEO,SAAS,YAAY,MAAsB;AAChD,SAAO,KAAK,QAAQ,aAAa,EAAE;AACrC;;;ACNA;AAGA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,MAAK,QAAQ,cAAc,SAAS,IAAI,KAAM,MAAM,MAAM,KAAK,GAAG;AAChE,WAAO,IAAI,IAAI;AAAA,EACjB;AAEA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/transformers/searchAndReplace.ts","../src/transformers/trim.ts","../src/transformers/transformReservedWord.ts"],"names":[],"mappings":";;;;;AAAA;AAQO,SAAS,iBAAiB,SAA0B;AACzD,QAAM,EAAE,MAAM,WAAW,SAAS,IAAI,IAAI,IAAI;AAE9C,QAAM,eAAe,QAAQ,eAAe,QAAQ,GAAG,KAAK;AAAA,IAC1D,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,GAAG,MAAM,MAAM,GAAG;AAAA,IAClB,GAAG,MAAM,IAAI,GAAG;AAAA,IAChB,GAAG,MAAM,IAAI,GAAG;AAAA,IAChB,GAAG,MAAM,KAAK,GAAG;AAAA,IACjB,IAAI,OAAO,GAAG,MAAM,GAAG,GAAG,IAAI,GAAG;AAAA,EACnC;AAEA,SAAO,aAAa,OAAO,CAAC,MAAM,gBAAgB;AAChD,WAAO,KAAK,SAAS,EAAE,WAAW,aAAa,SAAS;AAAA,EAC1D,GAAG,IAAI;AACT;;;ACxBA;AAAO,SAAS,KAAK,MAAsB;AACzC,SAAO,KAAK,WAAW,OAAO,EAAE,EAAE,KAAK;AACzC;AAEO,SAAS,YAAY,MAAsB;AAChD,SAAO,KAAK,QAAQ,aAAa,EAAE;AACrC;;;ACNA;AAGA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,MAAK,QAAQ,cAAc,SAAS,IAAI,KAAM,MAAM,MAAM,KAAK,GAAG;AAChE,WAAO,IAAI,IAAI;AAAA,EACjB;AAEA,SAAO;AACT","sourcesContent":["type Options = {\n text: string\n replaceBy: string\n prefix?: string\n key: string\n searchValues?: (prefix: string, key: string) => Array<RegExp | string>\n}\n\nexport function searchAndReplace(options: Options): string {\n const { text, replaceBy, prefix = '', key } = options\n\n const searchValues = options.searchValues?.(prefix, key) || [\n `${prefix}[\"${key}\"]`,\n `${prefix}['${key}']`,\n `${prefix}[\\`${key}\\`]`,\n `${prefix}\"${key}\"`,\n `${prefix}'${key}'`,\n `${prefix}\\`${key}\\``,\n new RegExp(`${prefix}${key}`, 'g'),\n ]\n\n return searchValues.reduce((prev, searchValue) => {\n return prev.toString().replaceAll(searchValue, replaceBy)\n }, text) as string\n}\n","export function trim(text: string): string {\n return text.replaceAll(/\\n/g, '').trim()\n}\n\nexport function trimExtName(text: string): string {\n return text.replace(/\\.[^/.]+$/, '')\n}\n","/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word: string): string {\n if ((word && reservedWords.includes(word)) || word?.match(/^\\d/)) {\n return `_${word}`\n }\n\n return word\n}\n"]}