Last active
December 18, 2019 18:37
-
-
Save JLHwung/a4e735de002261d84764b8c3ed136c24 to your computer and use it in GitHub Desktop.
Hotfix for https://github.com/babel/babel/issues/10875
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
exports.default = normalizeFile; | |
function _fs() { | |
const data = _interopRequireDefault(require("fs")); | |
_fs = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _path() { | |
const data = _interopRequireDefault(require("path")); | |
_path = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _debug() { | |
const data = _interopRequireDefault(require("debug")); | |
_debug = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _cloneDeep() { | |
const data = _interopRequireDefault(require("lodash/cloneDeep")); | |
_cloneDeep = function () { | |
return data; | |
}; | |
return data; | |
} | |
function t() { | |
const data = _interopRequireWildcard(require("@babel/types")); | |
t = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _convertSourceMap() { | |
const data = _interopRequireDefault(require("convert-source-map")); | |
_convertSourceMap = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _parser() { | |
const data = require("@babel/parser"); | |
_parser = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _codeFrame() { | |
const data = require("@babel/code-frame"); | |
_codeFrame = function () { | |
return data; | |
}; | |
return data; | |
} | |
var _file = _interopRequireDefault(require("./file/file")); | |
var _missingPluginHelper = _interopRequireDefault(require("./util/missing-plugin-helper")); | |
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } | |
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
const debug = (0, _debug().default)("babel:transform:file"); | |
const LARGE_INPUT_SOURCEMAP_THRESHOLD = 1000000; | |
function normalizeFile(pluginPasses, options, code, ast) { | |
code = `${code || ""}`; | |
if (ast) { | |
if (ast.type === "Program") { | |
ast = t().file(ast, [], []); | |
} else if (ast.type !== "File") { | |
throw new Error("AST root must be a Program or File node"); | |
} | |
ast = (0, _cloneDeep().default)(ast); | |
} else { | |
ast = parser(pluginPasses, options, code); | |
} | |
let inputMap = null; | |
if (options.inputSourceMap !== false) { | |
if (typeof options.inputSourceMap === "object") { | |
inputMap = _convertSourceMap().default.fromObject(options.inputSourceMap); | |
} | |
if (!inputMap) { | |
const lastComment = extractComments(INLINE_SOURCEMAP_REGEX, ast); | |
if (lastComment) { | |
try { | |
inputMap = _convertSourceMap().default.fromComment(lastComment); | |
} catch (err) { | |
debug("discarding unknown inline input sourcemap", err); | |
} | |
} | |
} | |
if (!inputMap) { | |
const lastComment = extractComments(EXTERNAL_SOURCEMAP_REGEX, ast); | |
if (typeof options.filename === "string" && lastComment) { | |
try { | |
const match = EXTERNAL_SOURCEMAP_REGEX.exec(lastComment); | |
const inputMapContent = _fs().default.readFileSync(_path().default.resolve(_path().default.dirname(options.filename), match[1])); | |
if (inputMapContent.length > LARGE_INPUT_SOURCEMAP_THRESHOLD) { | |
debug("skip merging input map > 1 MB"); | |
} else { | |
inputMap = _convertSourceMap().default.fromJSON(inputMapContent); | |
} | |
} catch (err) { | |
debug("discarding unknown file input sourcemap", err); | |
} | |
} else if (lastComment) { | |
debug("discarding un-loadable file input sourcemap"); | |
} | |
} | |
} | |
return new _file.default(options, { | |
code, | |
ast, | |
inputMap | |
}); | |
} | |
function parser(pluginPasses, { | |
parserOpts, | |
highlightCode = true, | |
filename = "unknown" | |
}, code) { | |
try { | |
const results = []; | |
for (const plugins of pluginPasses) { | |
for (const plugin of plugins) { | |
const { | |
parserOverride | |
} = plugin; | |
if (parserOverride) { | |
const ast = parserOverride(code, parserOpts, _parser().parse); | |
if (ast !== undefined) results.push(ast); | |
} | |
} | |
} | |
if (results.length === 0) { | |
return (0, _parser().parse)(code, parserOpts); | |
} else if (results.length === 1) { | |
if (typeof results[0].then === "function") { | |
throw new Error(`You appear to be using an async parser plugin, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`); | |
} | |
return results[0]; | |
} | |
throw new Error("More than one plugin attempted to override parsing."); | |
} catch (err) { | |
if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { | |
err.message += "\nConsider renaming the file to '.mjs', or setting sourceType:module " + "or sourceType:unambiguous in your Babel config for this file."; | |
} | |
const { | |
loc, | |
missingPlugin | |
} = err; | |
if (loc) { | |
const codeFrame = (0, _codeFrame().codeFrameColumns)(code, { | |
start: { | |
line: loc.line, | |
column: loc.column + 1 | |
} | |
}, { | |
highlightCode | |
}); | |
if (missingPlugin) { | |
err.message = `${filename}: ` + (0, _missingPluginHelper.default)(missingPlugin[0], loc, codeFrame); | |
} else { | |
err.message = `${filename}: ${err.message}\n\n` + codeFrame; | |
} | |
err.code = "BABEL_PARSE_ERROR"; | |
} | |
throw err; | |
} | |
} | |
const INLINE_SOURCEMAP_REGEX = /^[@#]\s+sourceMappingURL=data:(?:application|text)\/json;(?:charset[:=]\S+?;)?base64,(?:.*)$/; | |
const EXTERNAL_SOURCEMAP_REGEX = /^[@#][ \t]+sourceMappingURL=([^\s'"`]+)[ \t]*$/; | |
function extractCommentsFromList(regex, comments, lastComment) { | |
if (comments) { | |
comments = comments.filter(({ | |
value | |
}) => { | |
if (regex.test(value)) { | |
lastComment = value; | |
return false; | |
} | |
return true; | |
}); | |
} | |
return [comments, lastComment]; | |
} | |
function extractComments(regex, ast) { | |
let lastComment = null; | |
t().traverseFast(ast, node => { | |
[node.leadingComments, lastComment] = extractCommentsFromList(regex, node.leadingComments, lastComment); | |
[node.innerComments, lastComment] = extractCommentsFromList(regex, node.innerComments, lastComment); | |
[node.trailingComments, lastComment] = extractCommentsFromList(regex, node.trailingComments, lastComment); | |
}); | |
return lastComment; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment