UNPKG

ses

Version:

Hardened JavaScript for Fearless Cooperation

51 lines (45 loc) 1.98 kB
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; };