1 | import ts from 'typescript';
|
2 | import * as file_ from './file';
|
3 | export const printBundle = (programIn, files, substituteNode) => {
|
4 | const program = programIn;
|
5 | const compiler = ts;
|
6 | const host = {
|
7 | getPrependNodes: () => [],
|
8 | getCanonicalFileName: (fileName) => (ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase()),
|
9 | getCommonSourceDirectory: program.getCommonSourceDirectory,
|
10 | getCompilerOptions: program.getCompilerOptions,
|
11 | getCurrentDirectory: program.getCurrentDirectory,
|
12 | getNewLine: () => ts.sys.newLine,
|
13 | getSourceFile: program.getSourceFile,
|
14 | getSourceFileByPath: program.getSourceFileByPath,
|
15 | getSourceFiles: program.getSourceFiles,
|
16 | isSourceFileFromExternalLibrary: program.isSourceFileFromExternalLibrary,
|
17 | writeFile: ts.sys.writeFile,
|
18 | readFile: ts.sys.readFile,
|
19 | fileExists: ts.sys.fileExists,
|
20 | directoryExists: ts.sys.directoryExists,
|
21 | };
|
22 | const writer = compiler.createTextWriter(ts.sys.newLine);
|
23 | const sourceMapGenerator = compiler.createSourceMapGenerator(host, 'foo.ts', program.getCurrentDirectory(), program.getCurrentDirectory(), {});
|
24 | const printer = compiler.createPrinter({ ...program.getCompilerOptions(), outFile: 'foo.ts' }, {
|
25 | substituteNode,
|
26 | });
|
27 | printer.writeBundle(ts.createBundle(files), writer, sourceMapGenerator);
|
28 | const resolvedSourceMap = sourceMapGenerator.toJSON();
|
29 | return {
|
30 | text: writer.getText(),
|
31 | sourceMap: {
|
32 | ...resolvedSourceMap,
|
33 | sourcesContent: resolvedSourceMap.sources.map((filePath) => {
|
34 | const foundFile = files.find((file) => file_.getFilePath(file).endsWith(filePath));
|
35 | return foundFile === undefined ? '' : file_.getText(foundFile);
|
36 | }),
|
37 | },
|
38 | };
|
39 | };
|
40 | export const markOriginal = (node) => {
|
41 | node.__originalSet = true;
|
42 | return ts.setSourceMapRange(node, file_.createSourceMapRange(node));
|
43 | };
|
44 | export const setOriginal = (node, original) => {
|
45 | if (!node.__originalSet) {
|
46 | const transformedNode = ts.moveSyntheticComments(ts.setSourceMapRange(ts.setOriginalNode(node, original), file_.createSourceMapRange(original)), original);
|
47 | node.__originalSet = true;
|
48 | return transformedNode;
|
49 | }
|
50 | return node;
|
51 | };
|
52 | export const isOriginal = (node) => !node.__originalSet;
|
53 | const context = {
|
54 | getCompilerOptions: () => ({}),
|
55 | startLexicalEnvironment: () => {
|
56 | },
|
57 | suspendLexicalEnvironment: () => {
|
58 | },
|
59 | resumeLexicalEnvironment: () => {
|
60 | },
|
61 | endLexicalEnvironment: () => undefined,
|
62 | hoistFunctionDeclaration: () => {
|
63 | },
|
64 | hoistVariableDeclaration: () => {
|
65 | },
|
66 | requestEmitHelper: () => {
|
67 | },
|
68 | readEmitHelpers: () => undefined,
|
69 | enableSubstitution: () => {
|
70 | },
|
71 | isSubstitutionEnabled: () => false,
|
72 | onSubstituteNode: (_hint, node) => node,
|
73 | enableEmitNotification: () => {
|
74 | },
|
75 | isEmitNotificationEnabled: () => false,
|
76 | onEmitNode: (hint, node, emitCallback) => {
|
77 | emitCallback(hint, node);
|
78 | },
|
79 | };
|
80 | export const setOriginalRecursive = (start, original) => {
|
81 | const seen = new Set();
|
82 | function visit(node) {
|
83 | if (seen.has(node)) {
|
84 | return node;
|
85 | }
|
86 | seen.add(node);
|
87 | const transformedNode = setOriginal(node, original);
|
88 | return ts.visitEachChild(transformedNode, visit, context);
|
89 | }
|
90 | return visit(start);
|
91 | };
|
92 |
|
93 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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bmUtdHMtdXRpbHMvc3JjL3ByaW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF3U291cmNlTWFwIH0gZnJvbSAnc291cmNlLW1hcCc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyBmaWxlXyBmcm9tICcuL2ZpbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdCB7XG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG59XG5leHBvcnQgY29uc3QgcHJpbnRCdW5kbGUgPSAoXG4gIHByb2dyYW1JbjogdHMuUHJvZ3JhbSxcbiAgZmlsZXM6IHJlYWRvbmx5IHRzLlNvdXJjZUZpbGVbXSxcbiAgc3Vic3RpdHV0ZU5vZGU6IChoaW50OiB0cy5FbWl0SGludCwgbm9kZTogdHMuTm9kZSkgPT4gdHMuTm9kZSxcbik6IFJlc3VsdCA9PiB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgY29uc3QgcHJvZ3JhbTogYW55ID0gcHJvZ3JhbUluO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIGNvbnN0IGNvbXBpbGVyOiBhbnkgPSB0cztcblxuICBjb25zdCBob3N0ID0ge1xuICAgIGdldFByZXBlbmROb2RlczogKCkgPT4gW10sXG4gICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChmaWxlTmFtZTogc3RyaW5nKSA9PiAodHMuc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXMgPyBmaWxlTmFtZSA6IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpLFxuICAgIGdldENvbW1vblNvdXJjZURpcmVjdG9yeTogcHJvZ3JhbS5nZXRDb21tb25Tb3VyY2VEaXJlY3RvcnksXG4gICAgZ2V0Q29tcGlsZXJPcHRpb25zOiBwcm9ncmFtLmdldENvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiBwcm9ncmFtLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgZ2V0TmV3TGluZTogKCkgPT4gdHMuc3lzLm5ld0xpbmUsXG4gICAgZ2V0U291cmNlRmlsZTogcHJvZ3JhbS5nZXRTb3VyY2VGaWxlLFxuICAgIGdldFNvdXJjZUZpbGVCeVBhdGg6IHByb2dyYW0uZ2V0U291cmNlRmlsZUJ5UGF0aCxcbiAgICBnZXRTb3VyY2VGaWxlczogcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcyxcbiAgICBpc1NvdXJjZUZpbGVGcm9tRXh0ZXJuYWxMaWJyYXJ5OiBwcm9ncmFtLmlzU291cmNlRmlsZUZyb21FeHRlcm5hbExpYnJhcnksXG4gICAgd3JpdGVGaWxlOiB0cy5zeXMud3JpdGVGaWxlLFxuICAgIHJlYWRGaWxlOiB0cy5zeXMucmVhZEZpbGUsXG4gICAgZmlsZUV4aXN0czogdHMuc3lzLmZpbGVFeGlzdHMsXG4gICAgZGlyZWN0b3J5RXhpc3RzOiB0cy5zeXMuZGlyZWN0b3J5RXhpc3RzLFxuICB9O1xuICBjb25zdCB3cml0ZXIgPSBjb21waWxlci5jcmVhdGVUZXh0V3JpdGVyKHRzLnN5cy5uZXdMaW5lKTtcbiAgY29uc3Qgc291cmNlTWFwR2VuZXJhdG9yID0gY29tcGlsZXIuY3JlYXRlU291cmNlTWFwR2VuZXJhdG9yKFxuICAgIGhvc3QsXG4gICAgJ2Zvby50cycsXG4gICAgcHJvZ3JhbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgcHJvZ3JhbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAge30sXG4gICk7XG4gIGNvbnN0IHByaW50ZXIgPSBjb21waWxlci5jcmVhdGVQcmludGVyKFxuICAgIHsgLi4ucHJvZ3JhbS5nZXRDb21waWxlck9wdGlvbnMoKSwgb3V0RmlsZTogJ2Zvby50cycgfSxcbiAgICB7XG4gICAgICBzdWJzdGl0dXRlTm9kZSxcbiAgICB9LFxuICApO1xuXG4gIHByaW50ZXIud3JpdGVCdW5kbGUodHMuY3JlYXRlQnVuZGxlKGZpbGVzKSwgd3JpdGVyLCBzb3VyY2VNYXBHZW5lcmF0b3IpO1xuXG4gIGNvbnN0IHJlc29sdmVkU291cmNlTWFwOiBSYXdTb3VyY2VNYXAgPSBzb3VyY2VNYXBHZW5lcmF0b3IudG9KU09OKCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiB3cml0ZXIuZ2V0VGV4dCgpLFxuICAgIHNvdXJjZU1hcDoge1xuICAgICAgLi4ucmVzb2x2ZWRTb3VyY2VNYXAsXG4gICAgICBzb3VyY2VzQ29udGVudDogcmVzb2x2ZWRTb3VyY2VNYXAuc291cmNlcy5tYXAoKGZpbGVQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGVfLmdldEZpbGVQYXRoKGZpbGUpLmVuZHNXaXRoKGZpbGVQYXRoKSk7XG5cbiAgICAgICAgcmV0dXJuIGZvdW5kRmlsZSA9PT0gdW5kZWZpbmVkID8gJycgOiBmaWxlXy5nZXRUZXh0KGZvdW5kRmlsZSk7XG4gICAgICB9KSxcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG1hcmtPcmlnaW5hbCA9IDxUIGV4dGVuZHMgdHMuTm9kZT4obm9kZTogVCk6IFQgPT4ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55IG5vLW9iamVjdC1tdXRhdGlvblxuICAobm9kZSBhcyBhbnkpLl9fb3JpZ2luYWxTZXQgPSB0cnVlO1xuXG4gIHJldHVybiB0cy5zZXRTb3VyY2VNYXBSYW5nZShub2RlLCBmaWxlXy5jcmVhdGVTb3VyY2VNYXBSYW5nZShub2RlKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0T3JpZ2luYWwgPSA8VCBleHRlbmRzIHRzLk5vZGU+KG5vZGU6IFQsIG9yaWdpbmFsOiB0cy5Ob2RlKTogVCA9PiB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbiAgaWYgKCEobm9kZSBhcyBhbnkpLl9fb3JpZ2luYWxTZXQpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZE5vZGUgPSB0cy5tb3ZlU3ludGhldGljQ29tbWVudHMoXG4gICAgICB0cy5zZXRTb3VyY2VNYXBSYW5nZSh0cy5zZXRPcmlnaW5hbE5vZGUobm9kZSwgb3JpZ2luYWwpLCBmaWxlXy5jcmVhdGVTb3VyY2VNYXBSYW5nZShvcmlnaW5hbCkpLFxuICAgICAgb3JpZ2luYWwsXG4gICAgKTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnkgbm8tb2JqZWN0LW11dGF0aW9uXG4gICAgKG5vZGUgYXMgYW55KS5fX29yaWdpbmFsU2V0ID0gdHJ1ZTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZE5vZGU7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn07XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbmV4cG9ydCBjb25zdCBpc09yaWdpbmFsID0gKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuID0+ICEobm9kZSBhcyBhbnkpLl9fb3JpZ2luYWxTZXQ7XG5cbmNvbnN0IGNvbnRleHQ6IHRzLlRyYW5zZm9ybWF0aW9uQ29udGV4dCA9IHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICBnZXRDb21waWxlck9wdGlvbnM6ICgpOiB0cy5Db21waWxlck9wdGlvbnMgPT4gKHt9IGFzIGFueSksXG4gIHN0YXJ0TGV4aWNhbEVudmlyb25tZW50OiAoKTogdm9pZCA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuICBzdXNwZW5kTGV4aWNhbEVudmlyb25tZW50OiAoKTogdm9pZCA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuICByZXN1bWVMZXhpY2FsRW52aXJvbm1lbnQ6ICgpOiB2b2lkID0+IHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0sXG5cbiAgZW5kTGV4aWNhbEVudmlyb25tZW50OiAoKSA9PiB1bmRlZmluZWQsXG4gIGhvaXN0RnVuY3Rpb25EZWNsYXJhdGlvbjogKCk6IHZvaWQgPT4ge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcbiAgaG9pc3RWYXJpYWJsZURlY2xhcmF0aW9uOiAoKTogdm9pZCA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuICByZXF1ZXN0RW1pdEhlbHBlcjogKCk6IHZvaWQgPT4ge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcbiAgcmVhZEVtaXRIZWxwZXJzOiAoKSA9PiB1bmRlZmluZWQsXG4gIGVuYWJsZVN1YnN0aXR1dGlvbjogKCk6IHZvaWQgPT4ge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcbiAgaXNTdWJzdGl0dXRpb25FbmFibGVkOiAoKTogYm9vbGVhbiA9PiBmYWxzZSxcbiAgb25TdWJzdGl0dXRlTm9kZTogKF9oaW50LCBub2RlKSA9PiBub2RlLFxuICBlbmFibGVFbWl0Tm90aWZpY2F0aW9uOiAoKTogdm9pZCA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuICBpc0VtaXROb3RpZmljYXRpb25FbmFibGVkOiAoKTogYm9vbGVhbiA9PiBmYWxzZSxcbiAgb25FbWl0Tm9kZTogKGhpbnQsIG5vZGUsIGVtaXRDYWxsYmFjaykgPT4ge1xuICAgIGVtaXRDYWxsYmFjayhoaW50LCBub2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRPcmlnaW5hbFJlY3Vyc2l2ZSA9IDxUIGV4dGVuZHMgdHMuTm9kZT4oc3RhcnQ6IFQsIG9yaWdpbmFsOiB0cy5Ob2RlKTogVCA9PiB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogdHMuTm9kZSk6IHRzLlZpc2l0UmVzdWx0PHRzLk5vZGU+IHtcbiAgICBpZiAoc2Vlbi5oYXMobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBzZWVuLmFkZChub2RlKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkTm9kZSA9IHNldE9yaWdpbmFsKG5vZGUsIG9yaWdpbmFsKTtcblxuICAgIHJldHVybiB0cy52aXNpdEVhY2hDaGlsZCh0cmFuc2Zvcm1lZE5vZGUsIHZpc2l0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChzdGFydCkgYXMgVDtcbn07XG4iXX0=
|