UNPKG

5.01 kBJavaScriptView Raw
1"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _CJSImportProcessor = require('./CJSImportProcessor'); var _CJSImportProcessor2 = _interopRequireDefault(_CJSImportProcessor);
2var _computeSourceMap = require('./computeSourceMap'); var _computeSourceMap2 = _interopRequireDefault(_computeSourceMap);
3var _HelperManager = require('./HelperManager');
4var _identifyShadowedGlobals = require('./identifyShadowedGlobals'); var _identifyShadowedGlobals2 = _interopRequireDefault(_identifyShadowedGlobals);
5var _NameManager = require('./NameManager'); var _NameManager2 = _interopRequireDefault(_NameManager);
6var _Options = require('./Options');
7var _parser = require('./parser');
8
9var _TokenProcessor = require('./TokenProcessor'); var _TokenProcessor2 = _interopRequireDefault(_TokenProcessor);
10var _RootTransformer = require('./transformers/RootTransformer'); var _RootTransformer2 = _interopRequireDefault(_RootTransformer);
11var _formatTokens = require('./util/formatTokens'); var _formatTokens2 = _interopRequireDefault(_formatTokens);
12var _getTSImportedNames = require('./util/getTSImportedNames'); var _getTSImportedNames2 = _interopRequireDefault(_getTSImportedNames);
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 function getVersion() {
33 // eslint-disable-next-line
34 return require("../package.json").version;
35} exports.getVersion = getVersion;
36
37 function transform(code, options) {
38 _Options.validateOptions.call(void 0, options);
39 try {
40 const sucraseContext = getSucraseContext(code, options);
41 const transformer = new (0, _RootTransformer2.default)(
42 sucraseContext,
43 options.transforms,
44 Boolean(options.enableLegacyBabel5ModuleInterop),
45 options,
46 );
47 let result = {code: transformer.transform()};
48 if (options.sourceMapOptions) {
49 if (!options.filePath) {
50 throw new Error("filePath must be specified when generating a source map.");
51 }
52 result = {
53 ...result,
54 sourceMap: _computeSourceMap2.default.call(void 0, result.code, options.filePath, options.sourceMapOptions),
55 };
56 }
57 return result;
58 } catch (e) {
59 if (options.filePath) {
60 e.message = `Error transforming ${options.filePath}: ${e.message}`;
61 }
62 throw e;
63 }
64} exports.transform = transform;
65
66/**
67 * Return a string representation of the sucrase tokens, mostly useful for
68 * diagnostic purposes.
69 */
70 function getFormattedTokens(code, options) {
71 const tokens = getSucraseContext(code, options).tokenProcessor.tokens;
72 return _formatTokens2.default.call(void 0, code, tokens);
73} exports.getFormattedTokens = getFormattedTokens;
74
75/**
76 * Call into the parser/tokenizer and do some further preprocessing:
77 * - Come up with a set of used names so that we can assign new names.
78 * - Preprocess all import/export statements so we know which globals we are interested in.
79 * - Compute situations where any of those globals are shadowed.
80 *
81 * In the future, some of these preprocessing steps can be skipped based on what actual work is
82 * being done.
83 */
84function getSucraseContext(code, options) {
85 const isJSXEnabled = options.transforms.includes("jsx");
86 const isTypeScriptEnabled = options.transforms.includes("typescript");
87 const isFlowEnabled = options.transforms.includes("flow");
88 const disableESTransforms = options.disableESTransforms === true;
89 const file = _parser.parse.call(void 0, code, isJSXEnabled, isTypeScriptEnabled, isFlowEnabled);
90 const tokens = file.tokens;
91 const scopes = file.scopes;
92
93 const nameManager = new (0, _NameManager2.default)(code, tokens);
94 const helperManager = new (0, _HelperManager.HelperManager)(nameManager);
95 const tokenProcessor = new (0, _TokenProcessor2.default)(
96 code,
97 tokens,
98 isFlowEnabled,
99 disableESTransforms,
100 helperManager,
101 );
102 const enableLegacyTypeScriptModuleInterop = Boolean(options.enableLegacyTypeScriptModuleInterop);
103
104 let importProcessor = null;
105 if (options.transforms.includes("imports")) {
106 importProcessor = new (0, _CJSImportProcessor2.default)(
107 nameManager,
108 tokenProcessor,
109 enableLegacyTypeScriptModuleInterop,
110 options,
111 options.transforms.includes("typescript"),
112 helperManager,
113 );
114 importProcessor.preprocessTokens();
115 // We need to mark shadowed globals after processing imports so we know that the globals are,
116 // but before type-only import pruning, since that relies on shadowing information.
117 _identifyShadowedGlobals2.default.call(void 0, tokenProcessor, scopes, importProcessor.getGlobalNames());
118 if (options.transforms.includes("typescript")) {
119 importProcessor.pruneTypeOnlyImports();
120 }
121 } else if (options.transforms.includes("typescript")) {
122 _identifyShadowedGlobals2.default.call(void 0, tokenProcessor, scopes, _getTSImportedNames2.default.call(void 0, tokenProcessor));
123 }
124 return {tokenProcessor, scopes, nameManager, importProcessor, helperManager};
125}