fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #2541 from ixnas/feat/const-enum

feat: add support for generating const enum as enum type

authored by

Lubos and committed by
GitHub
54e9939e 61e0956f

+212 -5
+5
.changeset/itchy-kiwis-repeat.md
··· 1 + --- 2 + '@hey-api/openapi-ts': patch 3 + --- 4 + 5 + feat(typescript): add `typescript-const` to `enums.mode` for generating TypeScript enums as constants
+16
packages/openapi-ts-tests/main/test/2.0.x.test.ts
··· 249 249 }, 250 250 { 251 251 config: createConfig({ 252 + input: 'enum-names-values.json', 253 + output: 'enum-names-values-typescript-const', 254 + plugins: [ 255 + { 256 + enums: { 257 + case: 'camelCase', 258 + mode: 'typescript-const', 259 + }, 260 + name: '@hey-api/typescript', 261 + }, 262 + ], 263 + }), 264 + description: 'handles TypeScript const enum modifier', 265 + }, 266 + { 267 + config: createConfig({ 252 268 input: 'exclude-deprecated.yaml', 253 269 output: 'exclude-deprecated', 254 270 parser: {
+16
packages/openapi-ts-tests/main/test/3.0.x.test.ts
··· 452 452 }, 453 453 { 454 454 config: createConfig({ 455 + input: 'enum-names-values.json', 456 + output: 'enum-names-values-typescript-const', 457 + plugins: [ 458 + { 459 + enums: { 460 + case: 'camelCase', 461 + mode: 'typescript-const', 462 + }, 463 + name: '@hey-api/typescript', 464 + }, 465 + ], 466 + }), 467 + description: 'handles TypeScript const enum modifier', 468 + }, 469 + { 470 + config: createConfig({ 455 471 input: 'enum-null.json', 456 472 output: 'enum-null', 457 473 plugins: ['@hey-api/typescript', 'valibot'],
+16
packages/openapi-ts-tests/main/test/3.1.x.test.ts
··· 473 473 }, 474 474 { 475 475 config: createConfig({ 476 + input: 'enum-names-values.yaml', 477 + output: 'enum-names-values-typescript-const', 478 + plugins: [ 479 + { 480 + enums: { 481 + case: 'camelCase', 482 + mode: 'typescript-const', 483 + }, 484 + name: '@hey-api/typescript', 485 + }, 486 + ], 487 + }), 488 + description: 'handles TypeScript const enum modifier', 489 + }, 490 + { 491 + config: createConfig({ 476 492 input: 'union-types.json', 477 493 output: 'union-types', 478 494 plugins: ['@hey-api/typescript'],
+2
packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/enum-names-values-typescript-const/index.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + export * from './types.gen';
+39
packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/enum-names-values-typescript-const/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export const enum _110 { 4 + _110 = '1-10', 5 + _1120 = '11-20' 6 + } 7 + 8 + export const enum MyFoo { 9 + myFoo = 'myFoo', 10 + myBar = 'myBar' 11 + } 12 + 13 + export const enum MyFoo2 { 14 + myFoo = 'MyFoo', 15 + myBar = 'MyBar' 16 + } 17 + 18 + export type Foo = 'foo' | 'bar' | '' | true | false; 19 + 20 + export const enum Numbers { 21 + _100 = 100, 22 + _200 = 200, 23 + _300 = 300, 24 + '_-100' = -100, 25 + '_-200' = -200, 26 + '_-300' = -300 27 + } 28 + 29 + export type Arrays = [ 30 + 'foo' 31 + ] | [ 32 + 'bar' 33 + ] | [ 34 + 'baz' 35 + ]; 36 + 37 + export type ClientOptions = { 38 + baseUrl: string; 39 + };
+2
packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/enum-names-values-typescript-const/index.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + export * from './types.gen';
+39
packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/enum-names-values-typescript-const/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export const enum _110 { 4 + _110 = '1-10', 5 + _1120 = '11-20' 6 + } 7 + 8 + export const enum MyFoo { 9 + myFoo = 'myFoo', 10 + myBar = 'myBar' 11 + } 12 + 13 + export const enum MyFoo2 { 14 + myFoo = 'MyFoo', 15 + myBar = 'MyBar' 16 + } 17 + 18 + export type Foo = 'foo' | 'bar' | null | '' | true | false; 19 + 20 + export const enum Numbers { 21 + _100 = 100, 22 + _200 = 200, 23 + _300 = 300, 24 + '_-100' = -100, 25 + '_-200' = -200, 26 + '_-300' = -300 27 + } 28 + 29 + export type Arrays = [ 30 + 'foo' 31 + ] | [ 32 + 'bar' 33 + ] | [ 34 + 'baz' 35 + ]; 36 + 37 + export type ClientOptions = { 38 + baseUrl: `${string}://${string}` | (string & {}); 39 + };
+2
packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/enum-names-values-typescript-const/index.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + export * from './types.gen';
+43
packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/enum-names-values-typescript-const/types.gen.ts
··· 1 + // This file is auto-generated by @hey-api/openapi-ts 2 + 3 + export const enum _110 { 4 + _110 = '1-10', 5 + _1120 = '11-20' 6 + } 7 + 8 + export const enum MyFoo { 9 + myFoo = 'myFoo', 10 + myBar = 'myBar' 11 + } 12 + 13 + export const enum MyFoo2 { 14 + myFoo = 'MyFoo', 15 + myBar = 'MyBar' 16 + } 17 + 18 + export type Foo = 'foo' | 'bar' | null | '' | true | false; 19 + 20 + export const enum Numbers { 21 + _100 = 100, 22 + _200 = 200, 23 + _300 = 300, 24 + '_-100' = -100, 25 + '_-200' = -200, 26 + '_-300' = -300 27 + } 28 + 29 + export type Arrays = [ 30 + 'foo' 31 + ] | [ 32 + 'bar' 33 + ] | [ 34 + 'baz' 35 + ]; 36 + 37 + export type MyFooRef = { 38 + foo?: Array<MyFoo2>; 39 + }; 40 + 41 + export type ClientOptions = { 42 + baseUrl: `${string}://${string}` | (string & {}); 43 + };
+13 -1
packages/openapi-ts/src/plugins/@hey-api/typescript/plugin-legacy.ts
··· 76 76 ...setUniqueTypeNameArgs, 77 77 }); 78 78 if (created) { 79 + const config = getConfig(); 80 + const pluginTypeScript = config.plugins['@hey-api/typescript']; 79 81 const node = tsc.enumDeclaration({ 82 + asConst: 83 + typeof pluginTypeScript?.config.enums === 'object' && 84 + pluginTypeScript.config.enums.mode === 'typescript-const', 80 85 comments, 81 86 leadingComment, 82 87 name, ··· 176 181 pluginTypeScript?.config && 177 182 typeof pluginTypeScript.config.enums === 'object' && 178 183 pluginTypeScript.config.enums.enabled && 179 - pluginTypeScript.config.enums.mode === 'typescript' 184 + (pluginTypeScript.config.enums.mode === 'typescript' || 185 + pluginTypeScript.config.enums.mode === 'typescript-const') 180 186 ) { 181 187 generateEnum({ 188 + asConst: pluginTypeScript.config.enums.mode === 'typescript-const', 182 189 client, 183 190 comments, 184 191 leadingComment: comment, ··· 237 244 comments[key] = [escapeComment(comment)]; 238 245 } 239 246 }); 247 + const config = getConfig(); 248 + const pluginTypeScript = config.plugins['@hey-api/typescript']; 240 249 onNode( 241 250 tsc.enumDeclaration({ 251 + asConst: 252 + typeof pluginTypeScript?.config.enums === 'object' && 253 + pluginTypeScript.config.enums.mode === 'typescript-const', 242 254 comments, 243 255 leadingComment: [ 244 256 model.description && escapeComment(model.description),
+7 -2
packages/openapi-ts/src/plugins/@hey-api/typescript/plugin.ts
··· 77 77 if ( 78 78 numberRegExp.test(key) && 79 79 plugin.config.enums.enabled && 80 - plugin.config.enums.mode === 'typescript' 80 + (plugin.config.enums.mode === 'typescript' || 81 + plugin.config.enums.mode === 'typescript-const') 81 82 ) { 82 83 key = `_${key}`; 83 84 } ··· 628 629 }); 629 630 file.add(node); 630 631 return; 631 - } else if (plugin.config.enums.mode === 'typescript') { 632 + } else if ( 633 + plugin.config.enums.mode === 'typescript' || 634 + plugin.config.enums.mode === 'typescript-const' 635 + ) { 632 636 // TypeScript enums support only string and number values 633 637 const shouldCreateTypeScriptEnum = !enumObject.typeofItems.some( 634 638 (type) => type !== 'number' && type !== 'string', 635 639 ); 636 640 if (shouldCreateTypeScriptEnum) { 637 641 const enumNode = tsc.enumDeclaration({ 642 + asConst: plugin.config.enums.mode === 'typescript-const', 638 643 leadingComment: createSchemaComment({ schema }), 639 644 name: nodeInfo.node, 640 645 obj: enumObject.obj,
+3 -1
packages/openapi-ts/src/plugins/@hey-api/typescript/types.d.ts
··· 2 2 import type { DefinePlugin, Plugin } from '../../types'; 3 3 import type { Api } from './api'; 4 4 5 - export type EnumsType = 'javascript' | 'typescript'; 5 + export type EnumsType = 'javascript' | 'typescript' | 'typescript-const'; 6 6 7 7 export type UserConfig = Plugin.Name<'@hey-api/typescript'> & { 8 8 /** ··· 81 81 * Can be: 82 82 * - `javascript`: Generates JavaScript objects 83 83 * - `typescript`: Generates TypeScript enums 84 + * - `typescript-const`: Generates TypeScript const enums 84 85 * 85 86 * @default 'javascript' 86 87 */ ··· 330 331 * Can be: 331 332 * - `javascript`: Generates JavaScript objects 332 333 * - `typescript`: Generates TypeScript enums 334 + * - `typescript-const`: Generates TypeScript const enums 333 335 * 334 336 * @default 'javascript' 335 337 */
+9 -1
packages/openapi-ts/src/tsc/types.ts
··· 747 747 748 748 /** 749 749 * Create enum declaration. Example `export enum T = { X, Y };` 750 + * @param asConst - whether to use const enums. 750 751 * @param comments - comments to add to each property. 751 752 * @param leadingComment - leading comment to add to enum. 752 753 * @param name - the name of the enum. ··· 756 757 export const createEnumDeclaration = < 757 758 T extends Record<string, any> | Array<ObjectValue>, 758 759 >({ 760 + asConst, 759 761 comments: enumMemberComments = {}, 760 762 leadingComment: comments, 761 763 name, 762 764 obj, 763 765 }: { 766 + asConst: boolean; 764 767 comments?: Record<string | number, Comments>; 765 768 leadingComment?: Comments; 766 769 name: string | ts.TypeReferenceNode; ··· 800 803 return enumMember; 801 804 }); 802 805 806 + const defaultModifiers = [createModifier({ keyword: 'export' })]; 807 + const constModifier = asConst 808 + ? [ts.factory.createToken(ts.SyntaxKind.ConstKeyword)] 809 + : []; 810 + const modifiers = [...defaultModifiers, ...constModifier]; 803 811 const node = ts.factory.createEnumDeclaration( 804 - [createModifier({ keyword: 'export' })], 812 + modifiers, 805 813 typeof name === 'string' 806 814 ? createIdentifier({ text: name }) 807 815 : // TODO: https://github.com/hey-api/openapi-ts/issues/2289