ses
Version:
Hardened JavaScript for Fearless Cooperation
51 lines (45 loc) • 1.98 kB
JavaScript
import { FERAL_REG_EXP, regexpExec, stringSlice } from './commons.js';
// Captures a key and value of the form #key=value or @key=value
const sourceMetaEntryRegExp =
'\\s*[@#]\\s*([a-zA-Z][a-zA-Z0-9]*)\\s*=\\s*([^\\s\\*]*)';
// Captures either a one-line or multi-line comment containing
// one #key=value or @key=value.
// Produces two pairs of capture groups, but the initial two may be undefined.
// On account of the mechanics of regular expressions, scanning from the end
// does not allow us to capture every pair, so getSourceURL must capture and
// trim until there are no matching comments.
const sourceMetaEntriesRegExp = new FERAL_REG_EXP(
`(?:\\s*//${sourceMetaEntryRegExp}|/\\*${sourceMetaEntryRegExp}\\s*\\*/)\\s*$`,
);
/**
* @param {string} src
*/
export const getSourceURL = src => {
let sourceURL = '<unknown>';
// Our regular expression matches the last one or two comments with key value
// pairs at the end of the source, avoiding a scan over the entire length of
// the string, but at the expense of being able to capture all the (key,
// value) pair meta comments at the end of the source, which may include
// sourceMapURL in addition to sourceURL.
// So, we sublimate the comments out of the source until no source or no
// comments remain.
while (src.length > 0) {
const match = regexpExec(sourceMetaEntriesRegExp, src);
if (match === null) {
break;
}
src = stringSlice(src, 0, src.length - match[0].length);
// We skip $0 since it contains the entire match.
// The match contains four capture groups,
// two (key, value) pairs, the first of which
// may be undefined.
// On the off-chance someone put two sourceURL comments in their code with
// different commenting conventions, the latter has precedence.
if (match[3] === 'sourceURL') {
sourceURL = match[4];
} else if (match[1] === 'sourceURL') {
sourceURL = match[2];
}
}
return sourceURL;
};