UNPKG

14.3 kBJavaScriptView Raw
1import ts from 'typescript';
2import * as file_ from './file';
3export 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};
40export const markOriginal = (node) => {
41 node.__originalSet = true;
42 return ts.setSourceMapRange(node, file_.createSourceMapRange(node));
43};
44export 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};
52export const isOriginal = (node) => !node.__originalSet;
53const 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};
80export 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=