Skip to content

Commit d6b3dc9

Browse files
committed
fix: number default value cannot be negative with Typescript 5.4
1 parent 99391d3 commit d6b3dc9

6 files changed

Lines changed: 29 additions & 8 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
.idea
12
node_modules
23
dist
34
example-dist

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
"react": "^17.0.1",
7070
"ts-jest": "^26.5.6",
7171
"ts-loader": "^9.1.2",
72-
"typescript": "4.8.3",
72+
"typescript": "5.4.2",
7373
"webpack": "^5.36.2",
7474
"webpack-cli": "^4.7.0",
7575
"yarn-add-no-save": "^1.0.3"

src/__tests__/__fixtures__/DefaultPropValue.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ interface DefaultPropValueComponentProps {
1717
* Button disabled.
1818
*/
1919
disabled: boolean;
20+
21+
tabIndex: number;
2022
}
2123

2224
/**
@@ -34,4 +36,5 @@ export const DefaultPropValueComponent: React.FC<DefaultPropValueComponentProps>
3436
DefaultPropValueComponent.defaultProps = {
3537
counter: 123,
3638
disabled: false,
39+
tabIndex: -1,
3740
};

src/__tests__/__snapshots__/generateDocgenCodeBlock.test.ts.snap

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ interface DefaultPropValueComponentProps {
4848
* Button disabled.
4949
*/
5050
disabled: boolean;
51+
52+
tabIndex: number;
5153
}
5254
5355
/**
@@ -65,13 +67,14 @@ export const DefaultPropValueComponent: React.FC<DefaultPropValueComponentProps>
6567
DefaultPropValueComponent.defaultProps = {
6668
counter: 123,
6769
disabled: false,
70+
tabIndex: -1,
6871
};
6972
7073
try {
7174
// @ts-ignore
7275
DefaultPropValueComponent.displayName = \\"DefaultPropValueComponent\\";
7376
// @ts-ignore
74-
DefaultPropValueComponent.__docgenInfo = { \\"description\\": \\"Component with a prop with a default value.\\", \\"displayName\\": \\"DefaultPropValueComponent\\", \\"props\\": { \\"color\\": { \\"defaultValue\\": { value: \\"blue\\" }, \\"description\\": \\"Button color.\\", \\"name\\": \\"color\\", \\"required\\": true, \\"type\\": { \\"name\\": \\"\\\\\\"blue\\\\\\" | \\\\\\"green\\\\\\"\\" } }, \\"counter\\": { \\"defaultValue\\": { value: 123 }, \\"description\\": \\"Button counter.\\", \\"name\\": \\"counter\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } }, \\"disabled\\": { \\"defaultValue\\": { value: false }, \\"description\\": \\"Button disabled.\\", \\"name\\": \\"disabled\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"boolean\\" } } } };
77+
DefaultPropValueComponent.__docgenInfo = { \\"description\\": \\"Component with a prop with a default value.\\", \\"displayName\\": \\"DefaultPropValueComponent\\", \\"props\\": { \\"color\\": { \\"defaultValue\\": { value: \\"blue\\" }, \\"description\\": \\"Button color.\\", \\"name\\": \\"color\\", \\"required\\": true, \\"type\\": { \\"name\\": \\"\\\\\\"blue\\\\\\" | \\\\\\"green\\\\\\"\\" } }, \\"counter\\": { \\"defaultValue\\": { value: 123 }, \\"description\\": \\"Button counter.\\", \\"name\\": \\"counter\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } }, \\"disabled\\": { \\"defaultValue\\": { value: false }, \\"description\\": \\"Button disabled.\\", \\"name\\": \\"disabled\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"boolean\\" } }, \\"tabIndex\\": { \\"defaultValue\\": { value: -1 }, \\"description\\": \\"\\", \\"name\\": \\"tabIndex\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } } } };
7578
}
7679
catch (__react_docgen_typescript_loader_error) { }"
7780
`;
@@ -272,6 +275,8 @@ interface DefaultPropValueComponentProps {
272275
* Button disabled.
273276
*/
274277
disabled: boolean;
278+
279+
tabIndex: number;
275280
}
276281
277282
/**
@@ -289,13 +294,14 @@ export const DefaultPropValueComponent: React.FC<DefaultPropValueComponentProps>
289294
DefaultPropValueComponent.defaultProps = {
290295
counter: 123,
291296
disabled: false,
297+
tabIndex: -1,
292298
};
293299
294300
try {
295301
// @ts-ignore
296302
DefaultPropValueComponent.displayName = \\"DefaultPropValueComponent\\";
297303
// @ts-ignore
298-
DefaultPropValueComponent.__docgenInfo = { \\"description\\": \\"Component with a prop with a default value.\\", \\"displayName\\": \\"DefaultPropValueComponent\\", \\"props\\": { \\"color\\": { \\"defaultValue\\": { value: \\"blue\\" }, \\"description\\": \\"Button color.\\", \\"name\\": \\"color\\", \\"required\\": true, \\"type\\": { \\"name\\": \\"enum\\", \\"value\\": [{ \\"value\\": \\"\\\\\\"blue\\\\\\"\\" }, { \\"value\\": \\"\\\\\\"green\\\\\\"\\" }] } }, \\"counter\\": { \\"defaultValue\\": { value: 123 }, \\"description\\": \\"Button counter.\\", \\"name\\": \\"counter\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } }, \\"disabled\\": { \\"defaultValue\\": { value: false }, \\"description\\": \\"Button disabled.\\", \\"name\\": \\"disabled\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"boolean\\" } } } };
304+
DefaultPropValueComponent.__docgenInfo = { \\"description\\": \\"Component with a prop with a default value.\\", \\"displayName\\": \\"DefaultPropValueComponent\\", \\"props\\": { \\"color\\": { \\"defaultValue\\": { value: \\"blue\\" }, \\"description\\": \\"Button color.\\", \\"name\\": \\"color\\", \\"required\\": true, \\"type\\": { \\"name\\": \\"enum\\", \\"value\\": [{ \\"value\\": \\"\\\\\\"blue\\\\\\"\\" }, { \\"value\\": \\"\\\\\\"green\\\\\\"\\" }] } }, \\"counter\\": { \\"defaultValue\\": { value: 123 }, \\"description\\": \\"Button counter.\\", \\"name\\": \\"counter\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } }, \\"disabled\\": { \\"defaultValue\\": { value: false }, \\"description\\": \\"Button disabled.\\", \\"name\\": \\"disabled\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"boolean\\" } }, \\"tabIndex\\": { \\"defaultValue\\": { value: -1 }, \\"description\\": \\"\\", \\"name\\": \\"tabIndex\\", \\"required\\": false, \\"type\\": { \\"name\\": \\"number\\" } } } };
299305
}
300306
catch (__react_docgen_typescript_loader_error) { }"
301307
`;

src/generateDocgenCodeBlock.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ function createPropDefinition(
7878
prop: PropItem,
7979
options: GeneratorOptions
8080
) {
81+
const createNumericDefaultValue = (value: number) => {
82+
if (value < 0) {
83+
return ts.factory.createPrefixUnaryExpression(
84+
ts.SyntaxKind.MinusToken,
85+
ts.factory.createNumericLiteral(-value),
86+
);
87+
}
88+
89+
return ts.factory.createNumericLiteral(value);
90+
};
91+
8192
/**
8293
* Set default prop value.
8394
*
@@ -112,7 +123,7 @@ function createPropDefinition(
112123
? ts.factory.createStringLiteral(defaultValue.value)
113124
: // eslint-disable-next-line no-nested-ternary
114125
typeof defaultValue.value === "number"
115-
? ts.factory.createNumericLiteral(defaultValue.value)
126+
? createNumericDefaultValue(defaultValue.value)
116127
: defaultValue.value
117128
? ts.factory.createTrue()
118129
: ts.factory.createFalse()

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6172,10 +6172,10 @@ typescript-memoize@^1.0.0-alpha.3:
61726172
dependencies:
61736173
core-js "2.4.1"
61746174

6175-
typescript@4.8.3:
6176-
version "4.8.3"
6177-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88"
6178-
integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==
6175+
typescript@5.4.2:
6176+
version "5.4.2"
6177+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372"
6178+
integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==
61796179

61806180
typical@^4.0.0:
61816181
version "4.0.0"

0 commit comments

Comments
 (0)