@travetto/transformer 2.0.1 → 2.1.0
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/package.json +2 -2
- package/src/register.ts +36 -0
- package/src/resolver/builder.ts +8 -6
- package/src/types/visitor.ts +1 -1
- package/src/util/declaration.ts +25 -0
- package/src/visitor.ts +4 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@travetto/transformer",
|
|
3
3
|
"displayName": "Transformation",
|
|
4
|
-
"version": "2.0
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"description": "Functionality for AST transformations, with transformer registration, and general utils",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"typescript",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"directory": "module/transformer"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@travetto/base": "^2.0
|
|
28
|
+
"@travetto/base": "^2.1.0"
|
|
29
29
|
},
|
|
30
30
|
"publishConfig": {
|
|
31
31
|
"access": "public"
|
package/src/register.ts
CHANGED
|
@@ -59,6 +59,24 @@ export function OnProperty(...target: string[]) {
|
|
|
59
59
|
) => storeHandler(inst, d.value!, 'before', 'property', target);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Listens for a `ts.GetAccessorDeclaration`, on descent
|
|
64
|
+
*/
|
|
65
|
+
export function OnGetter(...target: string[]) {
|
|
66
|
+
return <S extends State = State, R extends ts.Node = ts.Node>(
|
|
67
|
+
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.GetAccessorDeclaration, dm?: DecoratorMeta) => R>
|
|
68
|
+
) => storeHandler(inst, d.value!, 'before', 'getter', target);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Listens for a `ts.SetAccessorDeclaration`, on descent
|
|
73
|
+
*/
|
|
74
|
+
export function OnSetter(...target: string[]) {
|
|
75
|
+
return <S extends State = State, R extends ts.Node = ts.Node>(
|
|
76
|
+
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.SetAccessorDeclaration, dm?: DecoratorMeta) => R>
|
|
77
|
+
) => storeHandler(inst, d.value!, 'before', 'setter', target);
|
|
78
|
+
}
|
|
79
|
+
|
|
62
80
|
/**
|
|
63
81
|
* Listens for a `ts.MethodDeclaration`, on descent
|
|
64
82
|
*/
|
|
@@ -122,6 +140,24 @@ export function AfterProperty(...target: string[]) {
|
|
|
122
140
|
) => storeHandler(inst, d.value!, 'after', 'property', target);
|
|
123
141
|
}
|
|
124
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Listens for a `ts.GetAccessorDeclaration`, on ascent
|
|
145
|
+
*/
|
|
146
|
+
export function AfterGetter(...target: string[]) {
|
|
147
|
+
return <S extends State = State, R extends ts.Node = ts.Node>(
|
|
148
|
+
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.GetAccessorDeclaration, dm?: DecoratorMeta) => R>
|
|
149
|
+
) => storeHandler(inst, d.value!, 'after', 'getter', target);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Listens for a `ts.SetAccessorDeclaration`, on ascent
|
|
154
|
+
*/
|
|
155
|
+
export function AfterSetter(...target: string[]) {
|
|
156
|
+
return <S extends State = State, R extends ts.Node = ts.Node>(
|
|
157
|
+
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.SetAccessorDeclaration, dm?: DecoratorMeta) => R>
|
|
158
|
+
) => storeHandler(inst, d.value!, 'after', 'setter', target);
|
|
159
|
+
}
|
|
160
|
+
|
|
125
161
|
/**
|
|
126
162
|
* Listens for a `ts.MethodDeclaration`, on ascent
|
|
127
163
|
*/
|
package/src/resolver/builder.ts
CHANGED
|
@@ -64,6 +64,8 @@ export function TypeCategorize(checker: ts.TypeChecker, type: ts.Type): { catego
|
|
|
64
64
|
const source = DeclarationUtil.getPrimaryDeclarationNode(resolvedType).getSourceFile();
|
|
65
65
|
if (source?.fileName.includes('@types/node/globals') || source?.fileName.includes('typescript/lib')) {
|
|
66
66
|
return { category: 'literal', type };
|
|
67
|
+
} else if (!source?.fileName.includes('@travetto') && source?.fileName.endsWith('.d.ts')) {
|
|
68
|
+
return { category: 'unknown', type };
|
|
67
69
|
} else if (!resolvedType.isClass()) { // Not a real type
|
|
68
70
|
return { category: 'shape', type: resolvedType };
|
|
69
71
|
} else {
|
|
@@ -178,13 +180,13 @@ export const TypeBuilder: {
|
|
|
178
180
|
const name = CoreUtil.getSymbol(alias ?? type);
|
|
179
181
|
const source = DeclarationUtil.getPrimaryDeclarationNode(type)?.getSourceFile();
|
|
180
182
|
for (const member of checker.getPropertiesOfType(type)) {
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
const dec = DeclarationUtil.getPrimaryDeclarationNode(member);
|
|
184
|
+
if (DeclarationUtil.isPublic(dec)) { // If public
|
|
185
|
+
const memberType = checker.getType(dec);
|
|
186
|
+
if (!memberType.getCallSignatures().length) { // if not a function
|
|
187
|
+
fieldNodes[member.getName()] = memberType;
|
|
188
|
+
}
|
|
186
189
|
}
|
|
187
|
-
fieldNodes[member.getName()] = memberType;
|
|
188
190
|
}
|
|
189
191
|
return {
|
|
190
192
|
key: 'shape', name: name?.getName(),
|
package/src/types/visitor.ts
CHANGED
|
@@ -22,7 +22,7 @@ export type State = {
|
|
|
22
22
|
|
|
23
23
|
export type TransformPhase = 'before' | 'after';
|
|
24
24
|
|
|
25
|
-
export type TransformerType = 'class' | 'method' | 'property' | 'parameter' | 'static-method' | 'call' | 'function';
|
|
25
|
+
export type TransformerType = 'class' | 'method' | 'property' | 'getter' | 'setter' | 'parameter' | 'static-method' | 'call' | 'function';
|
|
26
26
|
|
|
27
27
|
export const TransformerId = Symbol.for('@trv:transformer/id');
|
|
28
28
|
|
package/src/util/declaration.ts
CHANGED
|
@@ -60,4 +60,29 @@ export class DeclarationUtil {
|
|
|
60
60
|
// @ts-ignore
|
|
61
61
|
return ts.getObjectFlags(type);
|
|
62
62
|
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get accessor pair based off of passing in one in
|
|
66
|
+
*
|
|
67
|
+
* @param node
|
|
68
|
+
* @returns
|
|
69
|
+
*/
|
|
70
|
+
static getAccessorPair(node: ts.GetAccessorDeclaration | ts.SetAccessorDeclaration) {
|
|
71
|
+
const acc = { getter: ts.isGetAccessorDeclaration(node) ? node : undefined, setter: ts.isSetAccessorDeclaration(node) ? node : undefined };
|
|
72
|
+
if (ts.isClassDeclaration(node.parent)) {
|
|
73
|
+
for (const el of node.parent.members) {
|
|
74
|
+
if (el.name && el.name.getText() === node.name.getText()) {
|
|
75
|
+
if (ts.isGetAccessor(el)) {
|
|
76
|
+
acc.getter = el;
|
|
77
|
+
} else if (ts.isSetAccessor(el)) {
|
|
78
|
+
acc.setter = el;
|
|
79
|
+
}
|
|
80
|
+
if (acc.getter && acc.setter) {
|
|
81
|
+
return acc;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return acc;
|
|
87
|
+
}
|
|
63
88
|
}
|
package/src/visitor.ts
CHANGED
|
@@ -30,6 +30,10 @@ export class VisitorFactory<S extends State = State> {
|
|
|
30
30
|
return 'parameter';
|
|
31
31
|
} else if (ts.isFunctionDeclaration(node) || (ts.isFunctionExpression(node) && !ts.isArrowFunction(node))) {
|
|
32
32
|
return 'function';
|
|
33
|
+
} else if (ts.isGetAccessor(node)) {
|
|
34
|
+
return 'getter';
|
|
35
|
+
} else if (ts.isSetAccessor(node)) {
|
|
36
|
+
return 'setter';
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
|