blob: c499034abf5c96284dca93c74f9fe3c7810eba40 [file] [log] [blame]
'use strict';
exports.createParseFunction = undefined;
exports.addError = undefined;
exports.CONTEXT_KEY = undefined;
exports.getCacheKey = undefined;
exports.getPosition = undefined;
exports.removeErrorsCausedByOverloading = undefined;
exports.spacesRegExp = undefined;
exports.stripComments = undefined;
/**
* Adds some parse error to parse results.
*/
const addError = exports.addError = (importsExports, message, start, end) => {
const { source } = importsExports[CONTEXT_KEY];
var { errors } = importsExports;
errors !== null && errors !== void 0 ? errors : (errors = importsExports.errors = { __proto__: null });
const additionalOffset = end !== undefined && end < start + 2 ? 100 : 0;
const fullMessage = end === undefined
? message
: `${message}:\n${source.slice(start, Math.min(end + additionalOffset, start + 200))}`;
const lineColumn = getLineColumnByIndex(importsExports, start);
const currentError = errors[lineColumn];
errors[lineColumn] = currentError === undefined ? fullMessage : `${currentError}\n${fullMessage}`;
};
/**
* Internal key for `Context` in `MutableImportsExports`.
*/
const CONTEXT_KEY = exports.CONTEXT_KEY = Symbol.for('parse-imports-exports:context-key');
{
const { createParseFunction } = require('parse-statements');
Object.assign(exports, {createParseFunction});
};
/**
* Get key for cache of parse functions by options.
*/
const getCacheKey = exports.getCacheKey = (options) => {
if (options === undefined) {
return '';
}
var cacheKey = '';
if (options.ignoreCommonJsExports === true) {
cacheKey += 'ignoreCommonJsExports';
}
if (options.ignoreDynamicImports === true) {
cacheKey += 'ignoreDynamicImports';
}
if (options.ignoreRegexpLiterals === true) {
cacheKey += 'ignoreRegexpLiterals';
}
if (options.ignoreRequires === true) {
cacheKey += 'ignoreRequires';
}
if (options.ignoreStringLiterals === true) {
cacheKey += 'ignoreStringLiterals';
}
return cacheKey;
};
/**
* Get position object by start and end indexes.
*/
const getPosition = exports.getPosition = (importsExports, start, end) => {
var _a;
return ((_a = importsExports[CONTEXT_KEY].options) === null || _a === void 0 ? void 0 : _a.includeLineColumn)
? {
start,
startLineColumn: getLineColumnByIndex(importsExports, start),
end,
endLineColumn: getLineColumnByIndex(importsExports, end),
}
: { start, end };
};
/**
* Removes errors, caused by function overloading.
* Re-declarations when overloading functions are not an error, so we remove them.
*/
const removeErrorsCausedByOverloading = exports.removeErrorsCausedByOverloading = (importsExports) => {
const { errors } = importsExports;
if (errors === undefined) {
return;
}
var previousError;
var previousLineColumn;
for (const lineColumn of Object.keys(errors)) {
const error = errors[lineColumn];
if ((error.startsWith('Duplicate exported declaration `function') ||
error.startsWith('Duplicate exported declaration `async function') ||
error.startsWith('Duplicate exported declaration `declare function')) &&
error.split(':')[0] === (previousError === null || previousError === void 0 ? void 0 : previousError.split(':')[0])) {
delete errors[previousLineColumn];
delete errors[lineColumn];
}
previousError = error;
previousLineColumn = lineColumn;
}
if (Object.keys(errors).length === 0) {
importsExports.errors = undefined;
}
};
/**
* Regexp that find all spaces.
*/
const spacesRegExp = exports.spacesRegExp = /\s+/g;
/**
* Strips comments from string interval from source.
*/
const stripComments = exports.stripComments = (source, intervalStart, intervalEnd, comments) => {
if (comments === undefined) {
return source.slice(intervalStart, intervalEnd);
}
var currentStart = intervalStart;
const parts = [];
for (const [{ start }, { end }] of comments) {
parts.push(source.slice(currentStart, start));
currentStart = end;
}
parts.push(source.slice(currentStart, intervalEnd));
return parts.join('');
};
/**
* Get `LineColumn` string by index in source.
*/
const getLineColumnByIndex = ({ [CONTEXT_KEY]: context }, index) => {
var { lineColumnCache, linesIndexes } = context;
lineColumnCache !== null && lineColumnCache !== void 0 ? lineColumnCache : (lineColumnCache = context.lineColumnCache = { __proto__: null });
var lineColumn = lineColumnCache[index];
if (lineColumn !== undefined) {
return lineColumn;
}
linesIndexes !== null && linesIndexes !== void 0 ? linesIndexes : (linesIndexes = context.linesIndexes = getLinesIndexes(context.source));
const numberOfLine = getNumberOfLine(index, linesIndexes);
const line = numberOfLine + 1;
const column = index - linesIndexes[numberOfLine] + 1;
lineColumn = `${line}:${column}`;
lineColumnCache[index] = lineColumn;
return lineColumn;
};
/**
* Get number of line where in which the character with the specified index is located.
*/
const getNumberOfLine = (index, linesIndexes) => {
const { length } = linesIndexes;
if (index >= linesIndexes[length - 1]) {
return length - 1;
}
var min = 0;
var max = length - 2;
while (min < max) {
var middle = min + ((max - min) >> 1);
if (index < linesIndexes[middle]) {
max = middle - 1;
}
else if (index >= linesIndexes[middle + 1]) {
min = middle + 1;
}
else {
min = middle;
break;
}
}
return min;
};
/**
* Get array of indexes of lines first symbols in source.
*/
const getLinesIndexes = (source) => {
var index = 0;
const lines = source.split('\n');
const indexes = new Array(lines.length);
for (var lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
indexes[lineNumber] = index;
index += lines[lineNumber].length + 1;
}
return indexes;
};