@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/README.md +39 -34
- package/__index__.ts +16 -10
- package/package.json +13 -13
- package/src/importer.ts +40 -39
- package/src/manager.ts +9 -7
- package/src/register.ts +10 -4
- package/src/resolver/builder.ts +127 -66
- package/src/resolver/cache.ts +1 -0
- package/src/resolver/coerce.ts +12 -10
- package/src/resolver/service.ts +26 -19
- package/src/resolver/types.ts +17 -4
- package/src/state.ts +49 -36
- package/src/types/shared.ts +3 -3
- package/src/types/visitor.ts +13 -3
- package/src/util/core.ts +21 -16
- package/src/util/declaration.ts +69 -11
- package/src/util/decorator.ts +2 -2
- package/src/util/doc.ts +12 -11
- package/src/util/import.ts +2 -2
- package/src/util/literal.ts +11 -10
- package/src/util/log.ts +23 -5
- package/src/util/system.ts +2 -4
- package/src/visitor.ts +48 -48
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,
|
|
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
|
-
|
|
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
|
|
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) =>
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|