@teambit/typescript 0.0.0-004aea01bc027e428dfd0f6583f49a1b8286bdd0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cmds/check-types.cmd.ts +81 -0
- package/dist/cmds/check-types.cmd.d.ts +35 -0
- package/dist/cmds/check-types.cmd.js +105 -0
- package/dist/cmds/check-types.cmd.js.map +1 -0
- package/dist/compiler-options.d.ts +22 -0
- package/dist/compiler-options.js +3 -0
- package/dist/compiler-options.js.map +1 -0
- package/dist/esm.mjs +21 -0
- package/dist/exceptions/index.d.ts +1 -0
- package/dist/exceptions/index.js +20 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/exceptions/transformer-not-found.d.ts +8 -0
- package/dist/exceptions/transformer-not-found.js +26 -0
- package/dist/exceptions/transformer-not-found.js.map +1 -0
- package/dist/export-identifier.d.ts +6 -0
- package/dist/export-identifier.js +29 -0
- package/dist/export-identifier.js.map +1 -0
- package/dist/extractor-options.d.ts +26 -0
- package/dist/extractor-options.js +3 -0
- package/dist/extractor-options.js.map +1 -0
- package/dist/identifier-list.d.ts +7 -0
- package/dist/identifier-list.js +21 -0
- package/dist/identifier-list.js.map +1 -0
- package/dist/identifier.d.ts +11 -0
- package/dist/identifier.js +45 -0
- package/dist/identifier.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/preview-1760469561956.js +7 -0
- package/dist/remove-types-task.d.ts +12 -0
- package/dist/remove-types-task.js +64 -0
- package/dist/remove-types-task.js.map +1 -0
- package/dist/schema-extractor-context.d.ts +164 -0
- package/dist/schema-extractor-context.js +745 -0
- package/dist/schema-extractor-context.js.map +1 -0
- package/dist/schema-transformer.d.ts +19 -0
- package/dist/schema-transformer.js +3 -0
- package/dist/schema-transformer.js.map +1 -0
- package/dist/schema-transformer.plugin.d.ts +9 -0
- package/dist/schema-transformer.plugin.js +22 -0
- package/dist/schema-transformer.plugin.js.map +1 -0
- package/dist/sourceFileTransformers/class.d.ts +2 -0
- package/dist/sourceFileTransformers/class.js +57 -0
- package/dist/sourceFileTransformers/class.js.map +1 -0
- package/dist/sourceFileTransformers/empty-line-encoder.d.ts +14 -0
- package/dist/sourceFileTransformers/empty-line-encoder.js +62 -0
- package/dist/sourceFileTransformers/empty-line-encoder.js.map +1 -0
- package/dist/sourceFileTransformers/export.d.ts +2 -0
- package/dist/sourceFileTransformers/export.js +58 -0
- package/dist/sourceFileTransformers/export.js.map +1 -0
- package/dist/sourceFileTransformers/expression-statement.d.ts +2 -0
- package/dist/sourceFileTransformers/expression-statement.js +58 -0
- package/dist/sourceFileTransformers/expression-statement.js.map +1 -0
- package/dist/sourceFileTransformers/function.d.ts +2 -0
- package/dist/sourceFileTransformers/function.js +119 -0
- package/dist/sourceFileTransformers/function.js.map +1 -0
- package/dist/sourceFileTransformers/import.d.ts +2 -0
- package/dist/sourceFileTransformers/import.js +71 -0
- package/dist/sourceFileTransformers/import.js.map +1 -0
- package/dist/sourceFileTransformers/index.d.ts +12 -0
- package/dist/sourceFileTransformers/index.js +137 -0
- package/dist/sourceFileTransformers/index.js.map +1 -0
- package/dist/sourceFileTransformers/interface.d.ts +2 -0
- package/dist/sourceFileTransformers/interface.js +50 -0
- package/dist/sourceFileTransformers/interface.js.map +1 -0
- package/dist/sourceFileTransformers/replaceName.d.ts +1 -0
- package/dist/sourceFileTransformers/replaceName.js +19 -0
- package/dist/sourceFileTransformers/replaceName.js.map +1 -0
- package/dist/sourceFileTransformers/transform.d.ts +12 -0
- package/dist/sourceFileTransformers/transform.js +76 -0
- package/dist/sourceFileTransformers/transform.js.map +1 -0
- package/dist/sourceFileTransformers/type-reference.d.ts +2 -0
- package/dist/sourceFileTransformers/type-reference.js +38 -0
- package/dist/sourceFileTransformers/type-reference.js.map +1 -0
- package/dist/sourceFileTransformers/typeAlias.d.ts +2 -0
- package/dist/sourceFileTransformers/typeAlias.js +41 -0
- package/dist/sourceFileTransformers/typeAlias.js.map +1 -0
- package/dist/sourceFileTransformers/variable.d.ts +2 -0
- package/dist/sourceFileTransformers/variable.js +41 -0
- package/dist/sourceFileTransformers/variable.js.map +1 -0
- package/dist/transform-source-file.spec.d.ts +1 -0
- package/dist/transform-source-file.spec.js +182 -0
- package/dist/transform-source-file.spec.js.map +1 -0
- package/dist/transformers/array-literal-expression.d.ts +10 -0
- package/dist/transformers/array-literal-expression.js +51 -0
- package/dist/transformers/array-literal-expression.js.map +1 -0
- package/dist/transformers/array-type.d.ts +10 -0
- package/dist/transformers/array-type.js +37 -0
- package/dist/transformers/array-type.js.map +1 -0
- package/dist/transformers/binding-element.d.ts +17 -0
- package/dist/transformers/binding-element.js +63 -0
- package/dist/transformers/binding-element.js.map +1 -0
- package/dist/transformers/class-declaration.d.ts +12 -0
- package/dist/transformers/class-declaration.js +116 -0
- package/dist/transformers/class-declaration.js.map +1 -0
- package/dist/transformers/conditional-type.d.ts +10 -0
- package/dist/transformers/conditional-type.js +38 -0
- package/dist/transformers/conditional-type.js.map +1 -0
- package/dist/transformers/constructor.d.ts +10 -0
- package/dist/transformers/constructor.js +49 -0
- package/dist/transformers/constructor.js.map +1 -0
- package/dist/transformers/decorator.d.ts +10 -0
- package/dist/transformers/decorator.js +54 -0
- package/dist/transformers/decorator.js.map +1 -0
- package/dist/transformers/enum-declaration.d.ts +10 -0
- package/dist/transformers/enum-declaration.js +60 -0
- package/dist/transformers/enum-declaration.js.map +1 -0
- package/dist/transformers/export-assignment.d.ts +14 -0
- package/dist/transformers/export-assignment.js +54 -0
- package/dist/transformers/export-assignment.js.map +1 -0
- package/dist/transformers/export-declaration.d.ts +10 -0
- package/dist/transformers/export-declaration.js +154 -0
- package/dist/transformers/export-declaration.js.map +1 -0
- package/dist/transformers/expression-statement.d.ts +10 -0
- package/dist/transformers/expression-statement.js +36 -0
- package/dist/transformers/expression-statement.js.map +1 -0
- package/dist/transformers/function-like.d.ts +11 -0
- package/dist/transformers/function-like.js +81 -0
- package/dist/transformers/function-like.js.map +1 -0
- package/dist/transformers/get-accessor.d.ts +10 -0
- package/dist/transformers/get-accessor.js +46 -0
- package/dist/transformers/get-accessor.js.map +1 -0
- package/dist/transformers/import-declaration.d.ts +10 -0
- package/dist/transformers/import-declaration.js +72 -0
- package/dist/transformers/import-declaration.js.map +1 -0
- package/dist/transformers/index-signature.d.ts +10 -0
- package/dist/transformers/index-signature.js +41 -0
- package/dist/transformers/index-signature.js.map +1 -0
- package/dist/transformers/index.d.ts +43 -0
- package/dist/transformers/index.js +566 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/indexed-access-type.d.ts +10 -0
- package/dist/transformers/indexed-access-type.js +36 -0
- package/dist/transformers/indexed-access-type.js.map +1 -0
- package/dist/transformers/interface-declaration.d.ts +11 -0
- package/dist/transformers/interface-declaration.js +86 -0
- package/dist/transformers/interface-declaration.js.map +1 -0
- package/dist/transformers/intersection-type.d.ts +10 -0
- package/dist/transformers/intersection-type.js +47 -0
- package/dist/transformers/intersection-type.js.map +1 -0
- package/dist/transformers/keyword-type.d.ts +13 -0
- package/dist/transformers/keyword-type.js +54 -0
- package/dist/transformers/keyword-type.js.map +1 -0
- package/dist/transformers/literal-type.d.ts +13 -0
- package/dist/transformers/literal-type.js +39 -0
- package/dist/transformers/literal-type.js.map +1 -0
- package/dist/transformers/literal-value.d.ts +12 -0
- package/dist/transformers/literal-value.js +35 -0
- package/dist/transformers/literal-value.js.map +1 -0
- package/dist/transformers/module-declaration.d.ts +10 -0
- package/dist/transformers/module-declaration.js +36 -0
- package/dist/transformers/module-declaration.js.map +1 -0
- package/dist/transformers/named-tuple.d.ts +10 -0
- package/dist/transformers/named-tuple.js +37 -0
- package/dist/transformers/named-tuple.js.map +1 -0
- package/dist/transformers/object-literal-expression.d.ts +9 -0
- package/dist/transformers/object-literal-expression.js +51 -0
- package/dist/transformers/object-literal-expression.js.map +1 -0
- package/dist/transformers/parameter.d.ts +14 -0
- package/dist/transformers/parameter.js +109 -0
- package/dist/transformers/parameter.js.map +1 -0
- package/dist/transformers/parenthesized-type.d.ts +10 -0
- package/dist/transformers/parenthesized-type.js +35 -0
- package/dist/transformers/parenthesized-type.js.map +1 -0
- package/dist/transformers/property-assignment.d.ts +9 -0
- package/dist/transformers/property-assignment.js +39 -0
- package/dist/transformers/property-assignment.js.map +1 -0
- package/dist/transformers/property-declaration.d.ts +11 -0
- package/dist/transformers/property-declaration.js +56 -0
- package/dist/transformers/property-declaration.js.map +1 -0
- package/dist/transformers/set-accessor.d.ts +10 -0
- package/dist/transformers/set-accessor.js +44 -0
- package/dist/transformers/set-accessor.js.map +1 -0
- package/dist/transformers/source-file-transformer.d.ts +15 -0
- package/dist/transformers/source-file-transformer.js +108 -0
- package/dist/transformers/source-file-transformer.js.map +1 -0
- package/dist/transformers/template-literal-type-span.d.ts +10 -0
- package/dist/transformers/template-literal-type-span.js +36 -0
- package/dist/transformers/template-literal-type-span.js.map +1 -0
- package/dist/transformers/template-literal-type.d.ts +10 -0
- package/dist/transformers/template-literal-type.js +44 -0
- package/dist/transformers/template-literal-type.js.map +1 -0
- package/dist/transformers/this-type.d.ts +10 -0
- package/dist/transformers/this-type.js +34 -0
- package/dist/transformers/this-type.js.map +1 -0
- package/dist/transformers/tuple-type.d.ts +10 -0
- package/dist/transformers/tuple-type.js +46 -0
- package/dist/transformers/tuple-type.js.map +1 -0
- package/dist/transformers/type-alias.d.ts +11 -0
- package/dist/transformers/type-alias.js +48 -0
- package/dist/transformers/type-alias.js.map +1 -0
- package/dist/transformers/type-literal.d.ts +14 -0
- package/dist/transformers/type-literal.js +48 -0
- package/dist/transformers/type-literal.js.map +1 -0
- package/dist/transformers/type-operator.d.ts +15 -0
- package/dist/transformers/type-operator.js +51 -0
- package/dist/transformers/type-operator.js.map +1 -0
- package/dist/transformers/type-predicate.d.ts +10 -0
- package/dist/transformers/type-predicate.js +37 -0
- package/dist/transformers/type-predicate.js.map +1 -0
- package/dist/transformers/type-query.d.ts +13 -0
- package/dist/transformers/type-query.js +41 -0
- package/dist/transformers/type-query.js.map +1 -0
- package/dist/transformers/type-reference.d.ts +17 -0
- package/dist/transformers/type-reference.js +58 -0
- package/dist/transformers/type-reference.js.map +1 -0
- package/dist/transformers/union-type.d.ts +10 -0
- package/dist/transformers/union-type.js +47 -0
- package/dist/transformers/union-type.js.map +1 -0
- package/dist/transformers/utils/jsdoc-to-doc-schema.d.ts +5 -0
- package/dist/transformers/utils/jsdoc-to-doc-schema.js +114 -0
- package/dist/transformers/utils/jsdoc-to-doc-schema.js.map +1 -0
- package/dist/transformers/utils/parse-type-from-quick-info.d.ts +36 -0
- package/dist/transformers/utils/parse-type-from-quick-info.js +111 -0
- package/dist/transformers/utils/parse-type-from-quick-info.js.map +1 -0
- package/dist/transformers/variable-declaration.d.ts +11 -0
- package/dist/transformers/variable-declaration.js +102 -0
- package/dist/transformers/variable-declaration.js.map +1 -0
- package/dist/transformers/variable-statement.d.ts +14 -0
- package/dist/transformers/variable-statement.js +67 -0
- package/dist/transformers/variable-statement.js.map +1 -0
- package/dist/tsconfig.default.json +25 -0
- package/dist/typescript.aspect.d.ts +2 -0
- package/dist/typescript.aspect.js +18 -0
- package/dist/typescript.aspect.js.map +1 -0
- package/dist/typescript.composition.d.ts +1 -0
- package/dist/typescript.composition.js +29 -0
- package/dist/typescript.composition.js.map +1 -0
- package/dist/typescript.docs.mdx +8 -0
- package/dist/typescript.extractor.d.ts +52 -0
- package/dist/typescript.extractor.js +254 -0
- package/dist/typescript.extractor.js.map +1 -0
- package/dist/typescript.main.runtime.d.ts +130 -0
- package/dist/typescript.main.runtime.js +400 -0
- package/dist/typescript.main.runtime.js.map +1 -0
- package/dist/typescript.parser.d.ts +13 -0
- package/dist/typescript.parser.js +142 -0
- package/dist/typescript.parser.js.map +1 -0
- package/dist/typescript.parser.spec.d.ts +1 -0
- package/dist/typescript.parser.spec.js +189 -0
- package/dist/typescript.parser.spec.js.map +1 -0
- package/esm.mjs +21 -0
- package/exceptions/index.ts +1 -0
- package/exceptions/transformer-not-found.ts +20 -0
- package/package.json +86 -0
- package/sourceFileTransformers/class.ts +73 -0
- package/sourceFileTransformers/empty-line-encoder.ts +56 -0
- package/sourceFileTransformers/export.ts +65 -0
- package/sourceFileTransformers/expression-statement.ts +48 -0
- package/sourceFileTransformers/function.ts +170 -0
- package/sourceFileTransformers/import.ts +101 -0
- package/sourceFileTransformers/index.ts +14 -0
- package/sourceFileTransformers/interface.ts +41 -0
- package/sourceFileTransformers/replaceName.ts +11 -0
- package/sourceFileTransformers/transform.ts +70 -0
- package/sourceFileTransformers/type-reference.ts +19 -0
- package/sourceFileTransformers/typeAlias.ts +25 -0
- package/sourceFileTransformers/variable.ts +25 -0
- package/transformers/array-literal-expression.ts +31 -0
- package/transformers/array-type.ts +22 -0
- package/transformers/binding-element.ts +35 -0
- package/transformers/class-declaration.ts +109 -0
- package/transformers/conditional-type.ts +24 -0
- package/transformers/constructor.ts +37 -0
- package/transformers/decorator.ts +30 -0
- package/transformers/enum-declaration.ts +32 -0
- package/transformers/export-assignment.ts +48 -0
- package/transformers/export-declaration.ts +182 -0
- package/transformers/expression-statement.ts +21 -0
- package/transformers/function-like.ts +72 -0
- package/transformers/get-accessor.ts +25 -0
- package/transformers/import-declaration.ts +57 -0
- package/transformers/index-signature.ts +27 -0
- package/transformers/index.ts +43 -0
- package/transformers/indexed-access-type.ts +22 -0
- package/transformers/interface-declaration.ts +68 -0
- package/transformers/intersection-type.ts +26 -0
- package/transformers/keyword-type.ts +40 -0
- package/transformers/literal-type.ts +24 -0
- package/transformers/literal-value.ts +40 -0
- package/transformers/module-declaration.ts +21 -0
- package/transformers/named-tuple.ts +23 -0
- package/transformers/object-literal-expression.ts +29 -0
- package/transformers/parameter.ts +115 -0
- package/transformers/parenthesized-type.ts +21 -0
- package/transformers/property-assignment.ts +24 -0
- package/transformers/property-declaration.ts +35 -0
- package/transformers/set-accessor.ts +27 -0
- package/transformers/source-file-transformer.ts +95 -0
- package/transformers/template-literal-type-span.ts +22 -0
- package/transformers/template-literal-type.ts +26 -0
- package/transformers/this-type.ts +20 -0
- package/transformers/tuple-type.ts +25 -0
- package/transformers/type-alias.ts +27 -0
- package/transformers/type-literal.ts +27 -0
- package/transformers/type-operator.ts +38 -0
- package/transformers/type-predicate.ts +23 -0
- package/transformers/type-query.ts +26 -0
- package/transformers/type-reference.ts +37 -0
- package/transformers/union-type.ts +26 -0
- package/transformers/utils/jsdoc-to-doc-schema.ts +114 -0
- package/transformers/utils/parse-type-from-quick-info.ts +99 -0
- package/transformers/variable-declaration.ts +111 -0
- package/transformers/variable-statement.ts +34 -0
- package/types/asset.d.ts +41 -0
- package/types/style.d.ts +42 -0
- package/typescript.composition.tsx +7 -0
- package/typescript.docs.mdx +8 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { SourceFileTransformer } from './index';
|
|
3
|
+
import { replaceName } from './replaceName';
|
|
4
|
+
|
|
5
|
+
export const functionNamesTransformer: SourceFileTransformer = (mapping: Record<string, string>) => {
|
|
6
|
+
return (context) => {
|
|
7
|
+
const updateTypeReference: ts.Visitor = (node) => {
|
|
8
|
+
try {
|
|
9
|
+
if (ts.isTypeReferenceNode(node) && node.typeName) {
|
|
10
|
+
const typeName = node.typeName.getText(node.getSourceFile());
|
|
11
|
+
const newTypeName = replaceName(typeName, mapping);
|
|
12
|
+
if (newTypeName) {
|
|
13
|
+
return ts.factory.updateTypeReferenceNode(
|
|
14
|
+
node,
|
|
15
|
+
ts.factory.createIdentifier(newTypeName),
|
|
16
|
+
node.typeArguments
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return ts.visitEachChild(node, updateTypeReference, context);
|
|
21
|
+
} catch {
|
|
22
|
+
return node;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const visit: ts.Visitor = (node) => {
|
|
27
|
+
if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
|
|
28
|
+
const functionName = node.name?.getText() ?? '';
|
|
29
|
+
const newName = Object.entries(mapping).find(([key]) => functionName.includes(key))?.[1] ?? functionName;
|
|
30
|
+
const parameters = node.parameters.map((param) => {
|
|
31
|
+
const newParamType = param.type ? (ts.visitNode(param.type, updateTypeReference) as ts.TypeNode) : param.type;
|
|
32
|
+
if (ts.isIdentifier(param.name)) {
|
|
33
|
+
const oldName = param.name.getText();
|
|
34
|
+
const newParamName = Object.keys(mapping).find((key) => oldName.includes(key));
|
|
35
|
+
if (newParamName) {
|
|
36
|
+
return ts.factory.updateParameterDeclaration(
|
|
37
|
+
param,
|
|
38
|
+
param.modifiers,
|
|
39
|
+
param.dotDotDotToken,
|
|
40
|
+
ts.factory.createIdentifier(newParamName),
|
|
41
|
+
param.questionToken,
|
|
42
|
+
newParamType,
|
|
43
|
+
param.initializer
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
} else if (ts.isObjectBindingPattern(param.name)) {
|
|
47
|
+
const elements = param.name.elements.map((element) => {
|
|
48
|
+
const newElementName = mapping[element.name.getText()];
|
|
49
|
+
if (newElementName) {
|
|
50
|
+
return ts.factory.updateBindingElement(
|
|
51
|
+
element,
|
|
52
|
+
element.dotDotDotToken,
|
|
53
|
+
element.propertyName,
|
|
54
|
+
ts.factory.createIdentifier(newElementName),
|
|
55
|
+
element.initializer
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return element;
|
|
59
|
+
});
|
|
60
|
+
const newParamName = ts.factory.createObjectBindingPattern(elements);
|
|
61
|
+
return ts.factory.updateParameterDeclaration(
|
|
62
|
+
param,
|
|
63
|
+
param.modifiers,
|
|
64
|
+
param.dotDotDotToken,
|
|
65
|
+
newParamName,
|
|
66
|
+
param.questionToken,
|
|
67
|
+
newParamType,
|
|
68
|
+
param.initializer
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
return param;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
if (ts.isFunctionDeclaration(node)) {
|
|
75
|
+
const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
|
|
76
|
+
return ts.factory.updateFunctionDeclaration(
|
|
77
|
+
node,
|
|
78
|
+
node.modifiers,
|
|
79
|
+
node.asteriskToken,
|
|
80
|
+
newName ? ts.factory.createIdentifier(newName) : node.name,
|
|
81
|
+
node.typeParameters,
|
|
82
|
+
parameters,
|
|
83
|
+
node.type,
|
|
84
|
+
updatedBody
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
if (ts.isArrowFunction(node)) {
|
|
88
|
+
const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
|
|
89
|
+
return ts.factory.updateArrowFunction(
|
|
90
|
+
node,
|
|
91
|
+
node.modifiers,
|
|
92
|
+
node.typeParameters,
|
|
93
|
+
parameters,
|
|
94
|
+
node.type,
|
|
95
|
+
node.equalsGreaterThanToken,
|
|
96
|
+
updatedBody
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
if (ts.isFunctionExpression(node)) {
|
|
100
|
+
const updatedBody = node.body && ts.isBlock(node.body) ? updateReturnStatement(node.body) : node.body;
|
|
101
|
+
return ts.factory.updateFunctionExpression(
|
|
102
|
+
node,
|
|
103
|
+
node.modifiers,
|
|
104
|
+
node.asteriskToken,
|
|
105
|
+
newName ? ts.factory.createIdentifier(newName) : node.name,
|
|
106
|
+
node.typeParameters,
|
|
107
|
+
parameters,
|
|
108
|
+
node.type,
|
|
109
|
+
updatedBody
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return ts.visitEachChild(node, visit, context);
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
function updateReturnStatement(body: ts.ConciseBody): ts.Block {
|
|
117
|
+
if (ts.isBlock(body)) {
|
|
118
|
+
const updatedStatements: ts.Statement[] = [];
|
|
119
|
+
for (const statement of body.statements) {
|
|
120
|
+
if (ts.isReturnStatement(statement) && statement.expression && ts.isJsxElement(statement.expression)) {
|
|
121
|
+
const jsxElement = statement.expression;
|
|
122
|
+
const openingElement = jsxElement.openingElement;
|
|
123
|
+
const tagName = openingElement.tagName.getText();
|
|
124
|
+
const newTagName = mapping[tagName];
|
|
125
|
+
if (newTagName) {
|
|
126
|
+
const updatedTagName = ts.factory.createIdentifier(newTagName);
|
|
127
|
+
const updatedOpeningElement = ts.factory.updateJsxOpeningElement(
|
|
128
|
+
openingElement,
|
|
129
|
+
updatedTagName,
|
|
130
|
+
openingElement.typeArguments,
|
|
131
|
+
openingElement.attributes
|
|
132
|
+
);
|
|
133
|
+
const updatedClosingElement = jsxElement.closingElement
|
|
134
|
+
? ts.factory.updateJsxClosingElement(jsxElement.closingElement, updatedTagName)
|
|
135
|
+
: ts.factory.createJsxClosingElement(updatedTagName);
|
|
136
|
+
const updatedJsxElement = ts.factory.createJsxElement(
|
|
137
|
+
updatedOpeningElement,
|
|
138
|
+
jsxElement.children,
|
|
139
|
+
updatedClosingElement
|
|
140
|
+
);
|
|
141
|
+
const updatedStatement = ts.factory.createReturnStatement(updatedJsxElement);
|
|
142
|
+
updatedStatements.push(updatedStatement);
|
|
143
|
+
} else {
|
|
144
|
+
updatedStatements.push(statement);
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
updatedStatements.push(statement);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return ts.factory.updateBlock(body, updatedStatements);
|
|
151
|
+
}
|
|
152
|
+
if (
|
|
153
|
+
ts.isExpressionStatement(body) &&
|
|
154
|
+
ts.isReturnStatement(body.expression) &&
|
|
155
|
+
body.expression.expression &&
|
|
156
|
+
ts.isIdentifier(body.expression.expression)
|
|
157
|
+
) {
|
|
158
|
+
const oldName = body.expression.expression.text;
|
|
159
|
+
const newName = mapping[oldName];
|
|
160
|
+
if (newName) {
|
|
161
|
+
const updatedExpression = ts.factory.createIdentifier(newName);
|
|
162
|
+
const updatedReturnStatement = ts.factory.createReturnStatement(updatedExpression);
|
|
163
|
+
return ts.factory.createBlock([updatedReturnStatement], true);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return ts.factory.createBlock([], true);
|
|
167
|
+
}
|
|
168
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
169
|
+
};
|
|
170
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { SourceFileTransformer } from './index';
|
|
3
|
+
|
|
4
|
+
export const importTransformer: SourceFileTransformer = (mapping: Record<string, string>) => {
|
|
5
|
+
return (context) => {
|
|
6
|
+
const visit: ts.Visitor = (node) => {
|
|
7
|
+
if (ts.isImportDeclaration(node)) {
|
|
8
|
+
let moduleSpecifier = node.moduleSpecifier.getText().slice(1, -1);
|
|
9
|
+
for (const [oldName, newName] of Object.entries(mapping)) {
|
|
10
|
+
if (moduleSpecifier.includes(oldName)) {
|
|
11
|
+
moduleSpecifier = moduleSpecifier.replace(oldName, newName);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (node.importClause?.namedBindings && ts.isNamedImports(node.importClause.namedBindings)) {
|
|
16
|
+
const transformedBindings = node.importClause.namedBindings.elements.map((element) => {
|
|
17
|
+
let originalName = element.propertyName ? element.propertyName.text : element.name.text;
|
|
18
|
+
const aliasName = element.name.text;
|
|
19
|
+
|
|
20
|
+
for (const [oldName, newName] of Object.entries(mapping)) {
|
|
21
|
+
if (originalName.startsWith(oldName) || originalName.endsWith(oldName)) {
|
|
22
|
+
originalName = originalName.replace(oldName, newName);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return ts.factory.updateImportSpecifier(
|
|
27
|
+
element,
|
|
28
|
+
false,
|
|
29
|
+
element.propertyName ? ts.factory.createIdentifier(originalName) : undefined,
|
|
30
|
+
ts.factory.createIdentifier(aliasName)
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const updatedImportClause = ts.factory.updateImportClause(
|
|
35
|
+
node.importClause,
|
|
36
|
+
node.importClause.isTypeOnly,
|
|
37
|
+
node.importClause.name,
|
|
38
|
+
ts.factory.createNamedImports(transformedBindings)
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return ts.factory.updateImportDeclaration(
|
|
42
|
+
node,
|
|
43
|
+
node.modifiers,
|
|
44
|
+
updatedImportClause,
|
|
45
|
+
ts.factory.createStringLiteral(moduleSpecifier),
|
|
46
|
+
undefined
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return ts.factory.updateImportDeclaration(
|
|
51
|
+
node,
|
|
52
|
+
node.modifiers,
|
|
53
|
+
node.importClause,
|
|
54
|
+
ts.factory.createStringLiteral(moduleSpecifier),
|
|
55
|
+
undefined
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
if (ts.isImportEqualsDeclaration(node)) {
|
|
59
|
+
let moduleSpecifier = node.moduleReference.getText().slice(1, -1);
|
|
60
|
+
for (const [oldName, newName] of Object.entries(mapping)) {
|
|
61
|
+
if (moduleSpecifier.includes(oldName)) {
|
|
62
|
+
moduleSpecifier = moduleSpecifier.replace(oldName, newName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const updatedImportEqualsDeclaration = ts.factory.updateImportEqualsDeclaration(
|
|
67
|
+
node,
|
|
68
|
+
node.modifiers,
|
|
69
|
+
node.isTypeOnly,
|
|
70
|
+
node.name,
|
|
71
|
+
ts.factory.createExternalModuleReference(ts.factory.createStringLiteral(moduleSpecifier))
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
return updatedImportEqualsDeclaration;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'require') {
|
|
78
|
+
const [firstArg] = node.arguments;
|
|
79
|
+
|
|
80
|
+
if (ts.isStringLiteral(firstArg)) {
|
|
81
|
+
let moduleSpecifier = firstArg.text;
|
|
82
|
+
|
|
83
|
+
for (const [oldName, newName] of Object.entries(mapping)) {
|
|
84
|
+
if (moduleSpecifier.includes(oldName)) {
|
|
85
|
+
moduleSpecifier = moduleSpecifier.replace(oldName, newName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const updatedArg = ts.factory.createStringLiteral(moduleSpecifier);
|
|
90
|
+
return ts.factory.updateCallExpression(node, node.expression, node.typeArguments, [
|
|
91
|
+
updatedArg,
|
|
92
|
+
...node.arguments.slice(1),
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return ts.visitEachChild(node, visit, context);
|
|
98
|
+
};
|
|
99
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type ts from 'typescript';
|
|
2
|
+
|
|
3
|
+
export type SourceFileTransformer = (mapping: Record<string, string>) => ts.TransformerFactory<ts.SourceFile>;
|
|
4
|
+
|
|
5
|
+
export { classNamesTransformer } from './class';
|
|
6
|
+
export { interfaceNamesTransformer } from './interface';
|
|
7
|
+
export { variableNamesTransformer } from './variable';
|
|
8
|
+
export { functionNamesTransformer } from './function';
|
|
9
|
+
export { typeAliasNamesTransformer } from './typeAlias';
|
|
10
|
+
export { importTransformer } from './import';
|
|
11
|
+
export { expressionStatementTransformer } from './expression-statement';
|
|
12
|
+
export { exportTransformer } from './export';
|
|
13
|
+
export { transformSourceFile } from './transform';
|
|
14
|
+
export { typeReferenceTransformer } from './type-reference';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { replaceName } from './replaceName';
|
|
3
|
+
|
|
4
|
+
export function interfaceNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
|
|
5
|
+
return (context) => {
|
|
6
|
+
const { factory } = context;
|
|
7
|
+
const visit: ts.Visitor = (node) => {
|
|
8
|
+
if (ts.isInterfaceDeclaration(node)) {
|
|
9
|
+
const oldName = node.name.text;
|
|
10
|
+
const newName = replaceName(oldName, nameMapping);
|
|
11
|
+
if (newName) {
|
|
12
|
+
const newMembers = node.members.map((member) => {
|
|
13
|
+
if (ts.isPropertySignature(member) && ts.isIdentifier(member.name)) {
|
|
14
|
+
const memberName = member.name.text;
|
|
15
|
+
if (nameMapping[memberName]) {
|
|
16
|
+
return factory.updatePropertySignature(
|
|
17
|
+
member,
|
|
18
|
+
member.modifiers,
|
|
19
|
+
factory.createIdentifier(nameMapping[memberName]),
|
|
20
|
+
member.questionToken,
|
|
21
|
+
member.type
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return member;
|
|
26
|
+
});
|
|
27
|
+
return factory.updateInterfaceDeclaration(
|
|
28
|
+
node,
|
|
29
|
+
node.modifiers,
|
|
30
|
+
factory.createIdentifier(newName),
|
|
31
|
+
node.typeParameters,
|
|
32
|
+
node.heritageClauses,
|
|
33
|
+
newMembers
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return ts.visitEachChild(node, (child) => visit(child), context);
|
|
38
|
+
};
|
|
39
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function replaceName(oldName: string, nameMapping: Record<string, string>): string | undefined {
|
|
2
|
+
for (const old of Object.keys(nameMapping)) {
|
|
3
|
+
if (oldName.startsWith(old) || oldName === old) {
|
|
4
|
+
return oldName.replace(new RegExp(`^${old}`), nameMapping[old]);
|
|
5
|
+
}
|
|
6
|
+
if (oldName.endsWith(old)) {
|
|
7
|
+
return oldName.replace(new RegExp(`${old}$`), nameMapping[old]);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Formatter } from '@teambit/formatter';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { EmptyLineEncoder } from './empty-line-encoder';
|
|
5
|
+
/**
|
|
6
|
+
* Transforms a TypeScript source file using the provided transformer.
|
|
7
|
+
*
|
|
8
|
+
* @param sourceFilePath Path to the TypeScript source file.
|
|
9
|
+
* @param sourceFileContent The content of the source file.
|
|
10
|
+
* @param transformers The transformers to be applied on the source file.
|
|
11
|
+
* @param formatter (Optional) An optional formatter to format the transformed code. If no formatter is provided, the function returns the transformed source file as a string without any formatting.
|
|
12
|
+
* @returns A promise that resolves to the transformed source file as a string.
|
|
13
|
+
*/
|
|
14
|
+
export async function transformSourceFile(
|
|
15
|
+
sourceFilePath: string,
|
|
16
|
+
sourceFileContent: string,
|
|
17
|
+
transformers: ts.TransformerFactory<ts.SourceFile>[],
|
|
18
|
+
formatter?: Formatter,
|
|
19
|
+
updates?: Record<string, string>
|
|
20
|
+
): Promise<string> {
|
|
21
|
+
const ext = path.extname(sourceFilePath);
|
|
22
|
+
const compatibleExts = ['.ts', '.tsx', '.js', '.jsx'];
|
|
23
|
+
if (!compatibleExts.includes(ext)) {
|
|
24
|
+
if (!updates) return sourceFileContent;
|
|
25
|
+
let transformed = sourceFileContent;
|
|
26
|
+
Object.entries(updates).forEach(([oldStr, newStr]) => {
|
|
27
|
+
const oldStringRegex = new RegExp(oldStr, 'g');
|
|
28
|
+
transformed = transformed.replace(oldStringRegex, newStr);
|
|
29
|
+
});
|
|
30
|
+
return transformed;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const encoder = new EmptyLineEncoder();
|
|
34
|
+
sourceFileContent = encoder.encode(sourceFileContent);
|
|
35
|
+
|
|
36
|
+
const sourceFile = ts.createSourceFile(
|
|
37
|
+
sourceFilePath,
|
|
38
|
+
sourceFileContent,
|
|
39
|
+
ts.ScriptTarget.Latest,
|
|
40
|
+
true,
|
|
41
|
+
ts.ScriptKind.TSX
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const transformedResult: ts.TransformationResult<ts.SourceFile> = ts.transform<ts.SourceFile>(
|
|
45
|
+
sourceFile,
|
|
46
|
+
transformers
|
|
47
|
+
);
|
|
48
|
+
const transformedSourceFile: ts.SourceFile = transformedResult.transformed[0] as ts.SourceFile;
|
|
49
|
+
|
|
50
|
+
const printer: ts.Printer = ts.createPrinter({
|
|
51
|
+
removeComments: false,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
let transformedSourceFileStr = printer.printFile(transformedSourceFile);
|
|
55
|
+
transformedSourceFileStr = encoder.decode(transformedSourceFileStr);
|
|
56
|
+
// Remove trailing empty line markers
|
|
57
|
+
const emptyLineComment = `\\s*\\/\\*${encoder.emptyLineMarker}\\*\\/\\s*$`;
|
|
58
|
+
const regex = new RegExp(emptyLineComment, 'g');
|
|
59
|
+
transformedSourceFileStr = transformedSourceFileStr.replace(regex, '');
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const formattedSourceFileStr = await formatter?.formatSnippet(transformedSourceFileStr, sourceFilePath);
|
|
63
|
+
return formattedSourceFileStr || transformedSourceFileStr;
|
|
64
|
+
} catch {
|
|
65
|
+
// We can ignore if the formatter fails
|
|
66
|
+
// TODO: log the error
|
|
67
|
+
// ignore
|
|
68
|
+
}
|
|
69
|
+
return transformedSourceFileStr;
|
|
70
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { replaceName } from './replaceName';
|
|
3
|
+
|
|
4
|
+
export function typeReferenceTransformer(mapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
|
|
5
|
+
return (context) => {
|
|
6
|
+
const visit: ts.Visitor = (node) => {
|
|
7
|
+
if (ts.isTypeReferenceNode(node)) {
|
|
8
|
+
const oldName = node.typeName.getText();
|
|
9
|
+
const newName = replaceName(oldName, mapping);
|
|
10
|
+
if (newName) {
|
|
11
|
+
return ts.factory.updateTypeReferenceNode(node, ts.factory.createIdentifier(newName), node.typeArguments);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return ts.visitEachChild(node, visit, context);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { replaceName } from './replaceName';
|
|
3
|
+
|
|
4
|
+
export function typeAliasNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
|
|
5
|
+
return (context) => {
|
|
6
|
+
const { factory } = context;
|
|
7
|
+
const visit: ts.Visitor = (node) => {
|
|
8
|
+
if (ts.isTypeAliasDeclaration(node)) {
|
|
9
|
+
const oldName = node.name.text;
|
|
10
|
+
const newName = replaceName(oldName, nameMapping);
|
|
11
|
+
if (newName) {
|
|
12
|
+
return factory.updateTypeAliasDeclaration(
|
|
13
|
+
node,
|
|
14
|
+
node.modifiers,
|
|
15
|
+
factory.createIdentifier(newName),
|
|
16
|
+
node.typeParameters,
|
|
17
|
+
node.type
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return ts.visitEachChild(node, (child) => visit(child), context);
|
|
22
|
+
};
|
|
23
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { replaceName } from './replaceName';
|
|
3
|
+
|
|
4
|
+
export function variableNamesTransformer(nameMapping: Record<string, string>): ts.TransformerFactory<ts.SourceFile> {
|
|
5
|
+
return (context) => {
|
|
6
|
+
const { factory } = context;
|
|
7
|
+
const visit: ts.Visitor = (node) => {
|
|
8
|
+
if (ts.isVariableDeclaration(node) && node.name.kind === ts.SyntaxKind.Identifier) {
|
|
9
|
+
const oldName = node.name.text;
|
|
10
|
+
const newName = replaceName(oldName, nameMapping);
|
|
11
|
+
if (newName) {
|
|
12
|
+
return factory.updateVariableDeclaration(
|
|
13
|
+
node,
|
|
14
|
+
factory.createIdentifier(newName),
|
|
15
|
+
node.exclamationToken,
|
|
16
|
+
node.type,
|
|
17
|
+
node.initializer
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return ts.visitEachChild(node, (child) => visit(child), context);
|
|
22
|
+
};
|
|
23
|
+
return (node) => ts.visitNode(node, visit) as ts.SourceFile;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SchemaNode } from '@teambit/semantics.entities.semantic-schema';
|
|
2
|
+
import { ArrayLiteralExpressionSchema, UnImplementedSchema } from '@teambit/semantics.entities.semantic-schema';
|
|
3
|
+
import pMapSeries from 'p-map-series';
|
|
4
|
+
import type { ArrayLiteralExpression, Node } from 'typescript';
|
|
5
|
+
import ts from 'typescript';
|
|
6
|
+
import type { SchemaExtractorContext } from '../schema-extractor-context';
|
|
7
|
+
import type { SchemaTransformer } from '../schema-transformer';
|
|
8
|
+
import type { Identifier } from '../identifier';
|
|
9
|
+
|
|
10
|
+
export class ArrayLiteralExpressionTransformer implements SchemaTransformer {
|
|
11
|
+
predicate(node: Node): boolean {
|
|
12
|
+
return node.kind === ts.SyntaxKind.ArrayLiteralExpression;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async getIdentifiers(): Promise<Identifier[]> {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async transform(node: ArrayLiteralExpression, context: SchemaExtractorContext): Promise<SchemaNode> {
|
|
20
|
+
const members = await pMapSeries(node.elements, async (element) => {
|
|
21
|
+
const schema = await context.computeSchema(element);
|
|
22
|
+
if (schema instanceof UnImplementedSchema) {
|
|
23
|
+
const typeRef = await context.resolveType(element, element.getText());
|
|
24
|
+
return typeRef;
|
|
25
|
+
}
|
|
26
|
+
return schema;
|
|
27
|
+
});
|
|
28
|
+
const location = context.getLocation(node);
|
|
29
|
+
return new ArrayLiteralExpressionSchema(members, location);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ArrayTypeNode, Node } from 'typescript';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { TypeArraySchema } from '@teambit/semantics.entities.semantic-schema';
|
|
4
|
+
import type { SchemaTransformer } from '../schema-transformer';
|
|
5
|
+
import type { SchemaExtractorContext } from '../schema-extractor-context';
|
|
6
|
+
import type { Identifier } from '../identifier';
|
|
7
|
+
|
|
8
|
+
export class ArrayTypeTransformer implements SchemaTransformer {
|
|
9
|
+
predicate(node: Node) {
|
|
10
|
+
return node.kind === ts.SyntaxKind.ArrayType;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async getIdentifiers(): Promise<Identifier[]> {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async transform(node: ArrayTypeNode, context: SchemaExtractorContext) {
|
|
18
|
+
const type = await context.computeSchema(node.elementType);
|
|
19
|
+
const location = context.getLocation(node);
|
|
20
|
+
return new TypeArraySchema(location, type);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { BindingElement, Node } from 'typescript';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { VariableLikeSchema } from '@teambit/semantics.entities.semantic-schema';
|
|
4
|
+
import type { SchemaTransformer } from '../schema-transformer';
|
|
5
|
+
import type { SchemaExtractorContext } from '../schema-extractor-context';
|
|
6
|
+
import { parseTypeFromQuickInfo } from './utils/parse-type-from-quick-info';
|
|
7
|
+
import { Identifier } from '../identifier';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* for example:
|
|
11
|
+
*
|
|
12
|
+
* const objBindingElem = { elem1: 1, elem2: 2 };
|
|
13
|
+
* const { elem1 } = objBindingElem;
|
|
14
|
+
* export { elem1 };
|
|
15
|
+
*/
|
|
16
|
+
export class BindingElementTransformer implements SchemaTransformer {
|
|
17
|
+
predicate(node: Node) {
|
|
18
|
+
return node.kind === ts.SyntaxKind.BindingElement;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async getIdentifiers(node: BindingElement) {
|
|
22
|
+
return [new Identifier(node.name.getText(), node.getSourceFile().fileName)];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async transform(node: BindingElement, context: SchemaExtractorContext) {
|
|
26
|
+
const name = node.name.getText();
|
|
27
|
+
const info = await context.getQuickInfo(node.name);
|
|
28
|
+
const displaySig = info?.body?.displayString || '';
|
|
29
|
+
const typeStr = parseTypeFromQuickInfo(info);
|
|
30
|
+
const type = await context.resolveType(node, typeStr);
|
|
31
|
+
const doc = await context.jsDocToDocSchema(node);
|
|
32
|
+
const defaultValue = node.initializer ? node.initializer.getText() : undefined;
|
|
33
|
+
return new VariableLikeSchema(context.getLocation(node), name, displaySig, type, false, doc, defaultValue);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import pMapSeries from 'p-map-series';
|
|
2
|
+
import { compact } from 'lodash';
|
|
3
|
+
import {
|
|
4
|
+
ClassSchema,
|
|
5
|
+
UnresolvedSchema,
|
|
6
|
+
ExpressionWithTypeArgumentsSchema,
|
|
7
|
+
} from '@teambit/semantics.entities.semantic-schema';
|
|
8
|
+
import type { Node, ClassDeclaration } from 'typescript';
|
|
9
|
+
import ts from 'typescript';
|
|
10
|
+
import type { SchemaTransformer } from '../schema-transformer';
|
|
11
|
+
import type { SchemaExtractorContext } from '../schema-extractor-context';
|
|
12
|
+
import { Identifier } from '../identifier';
|
|
13
|
+
|
|
14
|
+
export class ClassDeclarationTransformer implements SchemaTransformer {
|
|
15
|
+
predicate(node: Node) {
|
|
16
|
+
if (node.kind !== ts.SyntaxKind.ClassDeclaration) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const classNode = node as ClassDeclaration;
|
|
20
|
+
if (!classNode.members || (classNode.members as any).isMissingList) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// @todo: in case of `export default class` the class has no name.
|
|
27
|
+
private getName(node: ClassDeclaration) {
|
|
28
|
+
return node.name?.getText() || 'default';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async getIdentifiers(node: ClassDeclaration) {
|
|
32
|
+
return [new Identifier(this.getName(node), node.getSourceFile().fileName)];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private async getExpressionWithTypeArgs(
|
|
36
|
+
node: ClassDeclaration,
|
|
37
|
+
context: SchemaExtractorContext,
|
|
38
|
+
token: ts.SyntaxKind.ExtendsKeyword | ts.SyntaxKind.ImplementsKeyword
|
|
39
|
+
) {
|
|
40
|
+
if (!node.heritageClauses) return [];
|
|
41
|
+
|
|
42
|
+
return pMapSeries(
|
|
43
|
+
node.heritageClauses
|
|
44
|
+
.filter((heritageClause: ts.HeritageClause) => heritageClause.token === token)
|
|
45
|
+
.flatMap((h: ts.HeritageClause) => {
|
|
46
|
+
const { types } = h;
|
|
47
|
+
const name = h.getText();
|
|
48
|
+
return types.map((type) => ({ ...type, name }));
|
|
49
|
+
}),
|
|
50
|
+
async (expressionWithTypeArgs: ts.ExpressionWithTypeArguments & { name: string }) => {
|
|
51
|
+
const { typeArguments, expression, name } = expressionWithTypeArgs;
|
|
52
|
+
const typeArgsNodes = typeArguments ? await pMapSeries(typeArguments, (t) => context.computeSchema(t)) : [];
|
|
53
|
+
const location = context.getLocation(expression);
|
|
54
|
+
const expressionNode =
|
|
55
|
+
(await context.visitDefinition(expression)) || new UnresolvedSchema(location, expression.getText());
|
|
56
|
+
return new ExpressionWithTypeArgumentsSchema(typeArgsNodes, expressionNode, name, location);
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async transform(node: ClassDeclaration, context: SchemaExtractorContext) {
|
|
62
|
+
const nodeDecorators = ts.canHaveDecorators(node) ? ts.getDecorators(node) : undefined;
|
|
63
|
+
const decorators = nodeDecorators?.length
|
|
64
|
+
? await pMapSeries(nodeDecorators, (decorator) => context.computeSchema(decorator))
|
|
65
|
+
: undefined;
|
|
66
|
+
const className = this.getName(node);
|
|
67
|
+
const extendsExpressionsWithTypeArgs = await this.getExpressionWithTypeArgs(
|
|
68
|
+
node,
|
|
69
|
+
context,
|
|
70
|
+
ts.SyntaxKind.ExtendsKeyword
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const implementsExpressionsWithTypeArgs = await this.getExpressionWithTypeArgs(
|
|
74
|
+
node,
|
|
75
|
+
context,
|
|
76
|
+
ts.SyntaxKind.ImplementsKeyword
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const typeParameters = node.typeParameters?.map((typeParam) => {
|
|
80
|
+
return typeParam.name.getText();
|
|
81
|
+
});
|
|
82
|
+
const signature = node.name ? await context.getQuickInfoDisplayString(node.name) : undefined;
|
|
83
|
+
const members = await pMapSeries(node.members, async (member) => {
|
|
84
|
+
const memberModifiers = ts.canHaveModifiers(member) ? ts.getModifiers(member) : undefined;
|
|
85
|
+
const isPrivate = memberModifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.PrivateKeyword);
|
|
86
|
+
if (isPrivate) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return context.computeSchema(member);
|
|
90
|
+
});
|
|
91
|
+
const doc = await context.jsDocToDocSchema(node);
|
|
92
|
+
|
|
93
|
+
if (!signature) {
|
|
94
|
+
throw Error(`Missing signature for class ${className} declaration`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return new ClassSchema(
|
|
98
|
+
className,
|
|
99
|
+
compact(members),
|
|
100
|
+
context.getLocation(node),
|
|
101
|
+
signature,
|
|
102
|
+
doc,
|
|
103
|
+
typeParameters,
|
|
104
|
+
extendsExpressionsWithTypeArgs,
|
|
105
|
+
implementsExpressionsWithTypeArgs,
|
|
106
|
+
decorators
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
}
|