@expo/cli
Version:
121 lines (120 loc) • 4.68 kB
JavaScript
/**
* Copyright © 2023 650 Industries.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
getXcodeCompilerErrorMessage: ()=>getXcodeCompilerErrorMessage,
logMetroErrorInXcode: ()=>logMetroErrorInXcode,
isExecutingFromXcodebuild: ()=>isExecutingFromXcodebuild
});
function _fs() {
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
_fs = function() {
return data;
};
return data;
}
function _path() {
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
_path = function() {
return data;
};
return data;
}
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function isPossiblyUnableToResolveError(error) {
return "message" in error && typeof error.message === "string" && "originModulePath" in error && typeof error.originModulePath === "string" && "targetModuleName" in error && typeof error.targetModuleName === "string";
}
function isPossiblyTransformError(error) {
return "message" in error && typeof error.message === "string" && "filename" in error && typeof error.filename === "string" && "lineNumber" in error && typeof error.lineNumber === "number";
}
function getXcodeCompilerErrorMessage(projectRoot, error) {
const makeFilepathAbsolute = (filepath)=>filepath.startsWith("/") ? filepath : _path().default.join(projectRoot, filepath);
if ("message" in error) {
// Metro's `UnableToResolveError`
if (isPossiblyUnableToResolveError(error)) {
const loc = getLineNumberForStringInFile(error.originModulePath, error.targetModuleName);
return makeXcodeCompilerLog("error", error.message, {
fileName: error.originModulePath,
lineNumber: loc == null ? void 0 : loc.lineNumber,
column: loc == null ? void 0 : loc.column
});
} else if (isPossiblyTransformError(error)) {
return makeXcodeCompilerLog("error", error.message, {
// Metro generally returns the filename as relative from the project root.
fileName: makeFilepathAbsolute(error.filename),
lineNumber: error.lineNumber,
column: error.column
});
// TODO: ResourceNotFoundError, GraphNotFoundError, RevisionNotFoundError, AmbiguousModuleResolutionError
} else {
// Unknown error
return makeXcodeCompilerLog("error", error.message);
}
}
return null;
}
function logMetroErrorInXcode(projectRoot, error) {
const message = getXcodeCompilerErrorMessage(projectRoot, error);
if (message != null) {
console.error(message);
}
}
function isExecutingFromXcodebuild() {
return !!process.env.BUILT_PRODUCTS_DIR;
}
function makeXcodeCompilerLog(type, message, { fileName , lineNumber , column } = {}) {
// TODO: Figure out how to support multi-line logs.
const firstLine = message.split("\n")[0];
if (fileName && !(fileName == null ? void 0 : fileName.includes(":"))) {
return `${fileName}:${lineNumber || 0}:${column != null ? column + ":" : ""} ${type}: ${firstLine}`;
}
return `${type}: ${firstLine}`;
}
// TODO: Metro doesn't expose this info even though it knows it.
function getLineNumberForStringInFile(originModulePath, targetModuleName) {
let file;
try {
file = _fs().default.readFileSync(originModulePath, "utf8");
} catch (error) {
if (error.code === "ENOENT" || error.code === "EISDIR") {
// We're probably dealing with a virtualised file system where
// `this.originModulePath` doesn't actually exist on disk.
// We can't show a code frame, but there's no need to let this I/O
// error shadow the original module resolution error.
return null;
}
throw error;
}
const lines = file.split("\n");
let lineNumber = 0;
let column = -1;
for(let line = 0; line < lines.length; line++){
const columnLocation = lines[line].lastIndexOf(targetModuleName);
if (columnLocation >= 0) {
lineNumber = line;
column = columnLocation;
break;
}
}
return {
lineNumber,
column
};
}
//# sourceMappingURL=xcodeCompilerLogger.js.map