@travetto/transformer 3.0.0-rc.1 → 3.0.0-rc.11
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 +7 -12
- package/__index__.ts +15 -0
- package/package.json +13 -6
- package/src/importer.ts +122 -34
- package/src/manager.ts +62 -0
- package/src/manifest-index.ts +36 -0
- package/src/register.ts +40 -11
- package/src/resolver/builder.ts +42 -37
- package/src/resolver/cache.ts +2 -2
- package/src/resolver/coerce.ts +103 -0
- package/src/resolver/service.ts +3 -3
- package/src/resolver/types.ts +3 -3
- package/src/state.ts +78 -58
- package/src/types/shared.ts +1 -1
- package/src/types/visitor.ts +7 -5
- package/src/util/core.ts +8 -6
- package/src/util/declaration.ts +3 -3
- package/src/util/decorator.ts +1 -1
- package/src/util/doc.ts +1 -1
- package/src/util/import.ts +17 -10
- package/src/util/literal.ts +3 -2
- package/src/util/log.ts +2 -4
- package/src/util/system.ts +31 -0
- package/src/visitor.ts +13 -28
- package/index.ts +0 -7
- package/src/util/index.ts +0 -6
- package/test-support/util.ts +0 -57
package/src/visitor.ts
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { createWriteStream } from 'fs';
|
|
3
|
-
|
|
4
|
-
import { ConsoleManager } from '@travetto/base/src/console';
|
|
5
|
-
import { AppCache } from '@travetto/boot';
|
|
1
|
+
import ts from 'typescript';
|
|
6
2
|
|
|
7
3
|
import { DecoratorMeta, TransformerType, NodeTransformer, TransformerSet, State, TransformPhase } from './types/visitor';
|
|
8
|
-
import { LogUtil } from './util/log';
|
|
9
4
|
import { CoreUtil } from './util/core';
|
|
10
5
|
|
|
11
6
|
/**
|
|
@@ -28,25 +23,24 @@ export class VisitorFactory<S extends State = State> {
|
|
|
28
23
|
return 'class';
|
|
29
24
|
} else if (ts.isParameter(node)) {
|
|
30
25
|
return 'parameter';
|
|
31
|
-
} else if (ts.isFunctionDeclaration(node) || (ts.isFunctionExpression(node) && !ts.isArrowFunction(node))) {
|
|
26
|
+
} else if ((ts.isFunctionDeclaration(node) && node.body) || (ts.isFunctionExpression(node) && !ts.isArrowFunction(node))) {
|
|
32
27
|
return 'function';
|
|
33
28
|
} else if (ts.isGetAccessor(node)) {
|
|
34
29
|
return 'getter';
|
|
35
30
|
} else if (ts.isSetAccessor(node)) {
|
|
36
31
|
return 'setter';
|
|
32
|
+
} else if (ts.isSourceFile(node)) {
|
|
33
|
+
return 'file';
|
|
37
34
|
}
|
|
38
35
|
}
|
|
39
36
|
|
|
40
37
|
#transformers = new Map<TransformerType, TransformerSet<S>>();
|
|
41
|
-
#logTarget: string;
|
|
42
38
|
#getState: (context: ts.TransformationContext, src: ts.SourceFile) => S;
|
|
43
39
|
|
|
44
40
|
constructor(
|
|
45
41
|
getState: (context: ts.TransformationContext, src: ts.SourceFile) => S,
|
|
46
|
-
transformers: NodeTransformer<S, TransformerType, ts.Node>[]
|
|
47
|
-
logTarget = 'compiler.log'
|
|
42
|
+
transformers: NodeTransformer<S, TransformerType, ts.Node>[]
|
|
48
43
|
) {
|
|
49
|
-
this.#logTarget = logTarget;
|
|
50
44
|
this.#getState = getState;
|
|
51
45
|
this.#init(transformers);
|
|
52
46
|
}
|
|
@@ -83,17 +77,11 @@ export class VisitorFactory<S extends State = State> {
|
|
|
83
77
|
*/
|
|
84
78
|
visitor(): ts.TransformerFactory<ts.SourceFile> {
|
|
85
79
|
return (context: ts.TransformationContext) => (file: ts.SourceFile): ts.SourceFile => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
inspectOptions: { depth: 4 },
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
ConsoleManager.set({
|
|
93
|
-
onLog: (level, ctx, args) => c[level](level, ctx, ...LogUtil.collapseNodes(args))
|
|
94
|
-
});
|
|
80
|
+
if (!file.fileName.endsWith('.ts')) { // Skip all non-ts files
|
|
81
|
+
return file;
|
|
82
|
+
}
|
|
95
83
|
|
|
96
|
-
|
|
84
|
+
try {
|
|
97
85
|
const state = this.#getState(context, file);
|
|
98
86
|
let ret = this.visit(state, context, file);
|
|
99
87
|
|
|
@@ -101,12 +89,11 @@ export class VisitorFactory<S extends State = State> {
|
|
|
101
89
|
const changed = state.added.size;
|
|
102
90
|
let statements: ts.NodeArray<ts.Statement> | ts.Statement[] = ret.statements;
|
|
103
91
|
while (state.added.size) {
|
|
104
|
-
for (const [
|
|
105
|
-
const idx = k === -1 ? state.added.size : k;
|
|
92
|
+
for (const [idx, all] of [...state.added].sort(([idxA], [idxB]) => idxB - idxA)) {
|
|
106
93
|
statements = [
|
|
107
|
-
...statements.slice(0, idx),
|
|
94
|
+
...statements.slice(0, Math.max(idx, 0)),
|
|
108
95
|
...all.map(v => this.visit(state, context, v)),
|
|
109
|
-
...statements.slice(idx)
|
|
96
|
+
...statements.slice(Math.max(idx, 0))
|
|
110
97
|
];
|
|
111
98
|
state.added.delete(idx);
|
|
112
99
|
}
|
|
@@ -120,12 +107,10 @@ export class VisitorFactory<S extends State = State> {
|
|
|
120
107
|
if (!(err instanceof Error)) {
|
|
121
108
|
throw err;
|
|
122
109
|
}
|
|
123
|
-
console
|
|
110
|
+
console!.error('Failed transforming', { error: `${err.message}\n${err.stack}`, file: file.fileName });
|
|
124
111
|
const out = new Error(`Failed transforming: ${file.fileName}: ${err.message}`);
|
|
125
112
|
out.stack = err.stack;
|
|
126
113
|
throw out;
|
|
127
|
-
} finally {
|
|
128
|
-
ConsoleManager.clear(); // Reset logging
|
|
129
114
|
}
|
|
130
115
|
};
|
|
131
116
|
}
|
package/index.ts
DELETED
package/src/util/index.ts
DELETED
package/test-support/util.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import * as ts from 'typescript';
|
|
2
|
-
import { readFileSync } from 'fs';
|
|
3
|
-
|
|
4
|
-
import { FsUtil, ScanFs } from '@travetto/boot';
|
|
5
|
-
import { Util } from '@travetto/base';
|
|
6
|
-
|
|
7
|
-
import { VisitorFactory, TransformerState, getAllTransformers } from '..';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Utils for testing transformers
|
|
11
|
-
*/
|
|
12
|
-
export class TransformerTestUtil {
|
|
13
|
-
/**
|
|
14
|
-
* Compile a single file from a folder
|
|
15
|
-
*/
|
|
16
|
-
static async compile(folder: string, file?: string): Promise<string> {
|
|
17
|
-
|
|
18
|
-
const tsconfigObj = await import('@travetto/boot/tsconfig.trv.json');
|
|
19
|
-
|
|
20
|
-
const prog = ts.createProgram({
|
|
21
|
-
options: ts.convertCompilerOptionsFromJson(tsconfigObj, '').options,
|
|
22
|
-
rootNames: (await ScanFs.scanDir({ testFile: f => f.startsWith('src/') && f.endsWith('.ts') }, folder))
|
|
23
|
-
.filter(x => x.stats?.isFile())
|
|
24
|
-
.filter(x => !file || x.file.endsWith(file))
|
|
25
|
-
.map(x => x.file),
|
|
26
|
-
});
|
|
27
|
-
const log = `${folder}/.trv_compiler.log`;
|
|
28
|
-
|
|
29
|
-
await FsUtil.unlinkRecursive(log);
|
|
30
|
-
|
|
31
|
-
const transformers =
|
|
32
|
-
(await ScanFs.scanDir({ testFile: f => f.startsWith('support/transformer') }, folder))
|
|
33
|
-
.filter(x => x.stats?.isFile())
|
|
34
|
-
.map(x => import(x.file).then(getAllTransformers));
|
|
35
|
-
|
|
36
|
-
const visitor = new VisitorFactory(
|
|
37
|
-
(ctx, src) => new TransformerState(src, ctx.factory, prog.getTypeChecker()),
|
|
38
|
-
(await Promise.all(transformers)).flat(),
|
|
39
|
-
log
|
|
40
|
-
);
|
|
41
|
-
|
|
42
|
-
const out = await new Promise<string>(res => {
|
|
43
|
-
prog.emit(prog.getSourceFile(`src/${file}`), (__, data) => res(data), undefined, false,
|
|
44
|
-
{ before: [visitor.visitor()] }
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
await Util.wait('1s'); // Wait for file buffer to sync
|
|
49
|
-
try {
|
|
50
|
-
console.info(readFileSync(log, 'utf8'));
|
|
51
|
-
} catch { }
|
|
52
|
-
|
|
53
|
-
await FsUtil.unlinkRecursive(log);
|
|
54
|
-
|
|
55
|
-
return out;
|
|
56
|
-
}
|
|
57
|
-
}
|