@travetto/transformer 8.0.0-alpha.9 → 8.0.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/src/visitor.ts CHANGED
@@ -2,7 +2,7 @@ import ts from 'typescript';
2
2
 
3
3
  import { type ManifestModuleFolderType, ManifestModuleUtil } from '@travetto/manifest';
4
4
 
5
- import type { DecoratorMeta, TransformerType, NodeTransformer, TransformerSet, State, TransformPhase } from './types/visitor.ts';
5
+ import type { DecoratorMeta, NodeTransformer, State, TransformerSet, TransformerType, TransformPhase } from './types/visitor.ts';
6
6
  import { CoreUtil } from './util/core.ts';
7
7
 
8
8
  const COMPILER_SOURCE = new Set<ManifestModuleFolderType>(['support', 'src', '$index']);
@@ -11,7 +11,6 @@ const COMPILER_SOURCE = new Set<ManifestModuleFolderType>(['support', 'src', '$i
11
11
  * AST Visitor Factory, combines all active transformers into a single pass transformer for the ts compiler
12
12
  */
13
13
  export class VisitorFactory<S extends State = State> {
14
-
15
14
  /**
16
15
  * Get the type of transformer from a given a ts.node
17
16
  */
@@ -19,8 +18,7 @@ export class VisitorFactory<S extends State = State> {
19
18
  if (ts.isConstructorDeclaration(node)) {
20
19
  return 'constructor';
21
20
  } else if (ts.isMethodDeclaration(node)) {
22
- // eslint-disable-next-line no-bitwise
23
- return (ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static) ? 'static-method' : 'method';
21
+ return ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Static ? 'static-method' : 'method';
24
22
  } else if (ts.isPropertyDeclaration(node)) {
25
23
  return 'property';
26
24
  } else if (ts.isCallExpression(node)) {
@@ -62,7 +60,7 @@ export class VisitorFactory<S extends State = State> {
62
60
  for (const trn of transformers) {
63
61
  const set = this.#transformers.getOrInsert(trn.type, new Map());
64
62
 
65
- const targets = trn.target && trn.target.length ? trn.target : ['__all__'];
63
+ const targets = trn.target?.length ? trn.target : ['__all__'];
66
64
 
67
65
  for (const target of targets) {
68
66
  for (const phase of ['before', 'after'] as const) {
@@ -78,52 +76,54 @@ export class VisitorFactory<S extends State = State> {
78
76
  * Produce a visitor for a given a file
79
77
  */
80
78
  visitor(): ts.TransformerFactory<ts.SourceFile> {
81
- return (context: ts.TransformationContext) => (file: ts.SourceFile): ts.SourceFile => {
82
- const type = ManifestModuleUtil.getFileType(file.fileName);
83
- if (type !== 'ts' || /^\/\/\s*@trv-no-transform/.test(file.getFullText())) { // Skip all non-ts files
84
- return file;
85
- }
86
-
87
- try {
88
- const state = this.#getState(context, file);
89
- // Skip transforming all the compiler related content
90
- if (
91
- /@travetto[/](compiler|manifest|transformer)/.test(state.importName) &&
92
- COMPILER_SOURCE.has(ManifestModuleUtil.getFolderKey(state.importName.replace(/@travetto[/][^/]+[/]/, '')))
93
- ) {
94
- return state.finalize(file);
79
+ return (context: ts.TransformationContext) =>
80
+ (file: ts.SourceFile): ts.SourceFile => {
81
+ const type = ManifestModuleUtil.getFileType(file.fileName);
82
+ if (type !== 'ts' || /^\/\/\s*@trv-no-transform/.test(file.getFullText())) {
83
+ // Skip all non-ts files
84
+ return file;
95
85
  }
96
86
 
97
- let node = this.visit(state, context, file);
98
-
99
- // Process added content
100
- const changed = state.added.size;
101
- let statements: ts.NodeArray<ts.Statement> | ts.Statement[] = node.statements;
102
- while (state.added.size) {
103
- for (const [idx, all] of [...state.added].toSorted(([idxA], [idxB]) => idxB - idxA)) {
104
- statements = [
105
- ...statements.slice(0, Math.max(idx, 0)),
106
- ...all.map(value => this.visit(state, context, value)),
107
- ...statements.slice(Math.max(idx, 0))
108
- ];
109
- state.added.delete(idx);
87
+ try {
88
+ const state = this.#getState(context, file);
89
+ // Skip transforming all the compiler related content
90
+ if (
91
+ /@travetto[/](compiler|manifest|transformer)/.test(state.importName) &&
92
+ COMPILER_SOURCE.has(ManifestModuleUtil.getFolderKey(state.importName.replace(/@travetto[/][^/]+[/]/, '')))
93
+ ) {
94
+ return state.finalize(file);
110
95
  }
111
- }
112
96
 
113
- if (changed) {
114
- node = CoreUtil.updateSource(context.factory, node, statements);
115
- }
116
- return state.finalize(node);
117
- } catch (error) {
118
- if (!(error instanceof Error)) {
119
- throw error;
97
+ let node = this.visit(state, context, file);
98
+
99
+ // Process added content
100
+ const changed = state.added.size;
101
+ let statements: ts.NodeArray<ts.Statement> | ts.Statement[] = node.statements;
102
+ while (state.added.size) {
103
+ for (const [idx, all] of [...state.added].toSorted(([idxA], [idxB]) => idxB - idxA)) {
104
+ statements = [
105
+ ...statements.slice(0, Math.max(idx, 0)),
106
+ ...all.map(value => this.visit(state, context, value)),
107
+ ...statements.slice(Math.max(idx, 0))
108
+ ];
109
+ state.added.delete(idx);
110
+ }
111
+ }
112
+
113
+ if (changed) {
114
+ node = CoreUtil.updateSource(context.factory, node, statements);
115
+ }
116
+ return state.finalize(node);
117
+ } catch (error) {
118
+ if (!(error instanceof Error)) {
119
+ throw error;
120
+ }
121
+ console!.error('Failed transforming', { error: `${error.message}\n${error.stack}`, file: file.fileName });
122
+ const out = new Error(`Failed transforming: ${file.fileName}: ${error.message}`);
123
+ out.stack = error.stack;
124
+ throw out;
120
125
  }
121
- console!.error('Failed transforming', { error: `${error.message}\n${error.stack}`, file: file.fileName });
122
- const out = new Error(`Failed transforming: ${file.fileName}: ${error.message}`);
123
- out.stack = error.stack;
124
- throw out;
125
- }
126
- };
126
+ };
127
127
  }
128
128
 
129
129
  /**
@@ -162,7 +162,7 @@ export class VisitorFactory<S extends State = State> {
162
162
 
163
163
  for (const [key, decorator] of targets.entries()) {
164
164
  const values = set.get(phase)!.get(key);
165
- if (!values || !values.length) {
165
+ if (!values?.length) {
166
166
  continue;
167
167
  }
168
168
 
@@ -196,4 +196,4 @@ export class VisitorFactory<S extends State = State> {
196
196
  return node;
197
197
  }
198
198
  }
199
- }
199
+ }