@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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@travetto/transformer",
3
3
  "displayName": "Transformation",
4
- "version": "2.0.1",
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.1"
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
  */
@@ -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 memberType = checker.getType(
182
- DeclarationUtil.getPrimaryDeclarationNode(member)
183
- );
184
- if (memberType.getCallSignatures().length) {
185
- continue;
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(),
@@ -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
 
@@ -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