1 | import * as tsm from 'ts-morph';
|
2 | import {
|
3 | Declaration,
|
4 | DeclarationKinds,
|
5 | EnumDeclaration,
|
6 | EnumMemberDeclaration,
|
7 | } from '../types/module-declarations';
|
8 | import { formatEnumMember, formatText } from './format';
|
9 | import { getJSDocs } from './get-jsdocs';
|
10 | import { isInternalDeclaration } from './is-internal-declaration';
|
11 | import { sortByID } from './sort-by-id';
|
12 | import { SourceProvider } from './source-provider';
|
13 | import { toID } from './to-id';
|
14 |
|
15 | export function isEnum(
|
16 | declaration: tsm.Node
|
17 | ): declaration is tsm.EnumDeclaration {
|
18 | return tsm.Node.isEnumDeclaration(declaration);
|
19 | }
|
20 |
|
21 | export function newEnum({
|
22 | id,
|
23 | name,
|
24 | declaration,
|
25 | getSource,
|
26 | }: {
|
27 | id: string;
|
28 | name: string;
|
29 | declaration: tsm.EnumDeclaration;
|
30 | getSource: SourceProvider;
|
31 | }): EnumDeclaration {
|
32 | const kind = DeclarationKinds.EnumDeclaration;
|
33 | const docs = getJSDocs({ declaration });
|
34 | const source = getSource({ declaration });
|
35 | const isConst = declaration.isConstEnum();
|
36 |
|
37 |
|
38 | const members = getEnumMembers({
|
39 | enumID: id,
|
40 | enumDeclaration: declaration,
|
41 | getSource,
|
42 | });
|
43 | const signature = getEnumSignature({ isConst, name, members });
|
44 | members.sort(sortByID);
|
45 |
|
46 | return {
|
47 | kind,
|
48 | id,
|
49 | name,
|
50 | docs,
|
51 | source,
|
52 | signature,
|
53 | isConst,
|
54 | members,
|
55 | };
|
56 | }
|
57 |
|
58 | function getEnumMembers({
|
59 | enumID,
|
60 | enumDeclaration,
|
61 | getSource,
|
62 | }: {
|
63 | enumID: string;
|
64 | enumDeclaration: tsm.EnumDeclaration;
|
65 | getSource: SourceProvider;
|
66 | }): EnumMemberDeclaration[] {
|
67 | return enumDeclaration.getMembers().flatMap((declaration) => {
|
68 | const name = declaration.getName();
|
69 | if (isInternalDeclaration({ declaration, name })) {
|
70 | return [];
|
71 | }
|
72 |
|
73 | const kind = DeclarationKinds.EnumMemberDeclaration;
|
74 | const id = toID(enumID, name);
|
75 | const docs = getJSDocs({ declaration });
|
76 | const source = getSource({ declaration });
|
77 | const signature = formatEnumMember(declaration.getText());
|
78 | const value = declaration.getValue();
|
79 |
|
80 | return {
|
81 | kind,
|
82 | id,
|
83 | name,
|
84 | docs,
|
85 | source,
|
86 | signature,
|
87 | value,
|
88 | };
|
89 | });
|
90 | }
|
91 |
|
92 | function getEnumSignature({
|
93 | isConst,
|
94 | name,
|
95 | members,
|
96 | }: {
|
97 | isConst: boolean;
|
98 | name: string;
|
99 | members: Declaration[];
|
100 | }): string {
|
101 | const kind = isConst ? 'const enum' : 'enum';
|
102 | const membersText = members.map(({ signature }) => signature).join();
|
103 | const signature = `${kind} ${name} { ${membersText} }`;
|
104 | return formatText(signature);
|
105 | }
|