UNPKG

2.71 kBPlain TextView Raw
1import * as tsm from 'ts-morph';
2import {
3 Declaration,
4 DeclarationKinds,
5 EnumDeclaration,
6 EnumMemberDeclaration,
7} from '../types/module-declarations';
8import { formatEnumMember, formatText } from './format';
9import { getJSDocs } from './get-jsdocs';
10import { isInternalDeclaration } from './is-internal-declaration';
11import { sortByID } from './sort-by-id';
12import { SourceProvider } from './source-provider';
13import { toID } from './to-id';
14
15export function isEnum(
16 declaration: tsm.Node
17): declaration is tsm.EnumDeclaration {
18 return tsm.Node.isEnumDeclaration(declaration);
19}
20
21export 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 // Keep members in original order for signature text and sort them later
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
58function 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
92function 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}