Skip to content

Commit 677e04a

Browse files
authored
Handle negative numeric enum values (#1601)
- append a `ValueMinus` string to numeric enum member names, if a name is not explicitly provided. - create negative numeric enum member values using `ts.factory.createPrefixUnaryExpression()` Previous behavior: When there is no name explicitly provided for them, numeric enum member names are constructed by prefixing the number with a `Value` string. The code did not take negative numbers into account, which resulted in enum members like: `_100 = -100`. Additionally, since Typescript 5.4 (see microsoft/TypeScript#56570), the `tsEnumMember` function failes on negative enum members.
1 parent e89573e commit 677e04a

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

packages/openapi-typescript/src/lib/ts.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,23 @@ export function tsEnumMember(
265265
if (!JS_PROPERTY_INDEX_RE.test(name)) {
266266
if (Number(name[0]) >= 0) {
267267
name = `Value${name}`.replace(".", "_"); // don't forged decimals;
268+
} else if (name[0] === "-") {
269+
name = `ValueMinus${name.slice(1)}`;
268270
}
269271
name = name.replace(JS_PROPERTY_INDEX_INVALID_CHARS_RE, "_");
270272
}
271273

272274
let member;
273275
if (typeof value === "number") {
274-
member = ts.factory.createEnumMember(
275-
name,
276-
ts.factory.createNumericLiteral(value),
277-
);
276+
const literal =
277+
value < 0
278+
? ts.factory.createPrefixUnaryExpression(
279+
ts.SyntaxKind.MinusToken,
280+
ts.factory.createNumericLiteral(Math.abs(value)),
281+
)
282+
: ts.factory.createNumericLiteral(value);
283+
284+
member = ts.factory.createEnumMember(name, literal);
278285
} else {
279286
member = ts.factory.createEnumMember(
280287
name,

packages/openapi-typescript/test/lib/ts.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,12 @@ describe("tsEnum", () => {
122122
});
123123

124124
test("number members", () => {
125-
expect(astToString(tsEnum(".Error.code.", [100, 101, 102])).trim())
125+
expect(astToString(tsEnum(".Error.code.", [100, 101, 102, -100])).trim())
126126
.toBe(`enum ErrorCode {
127127
Value100 = 100,
128128
Value101 = 101,
129-
Value102 = 102
129+
Value102 = 102,
130+
ValueMinus100 = -100
130131
}`);
131132
});
132133

0 commit comments

Comments
 (0)