mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-06 03:51:24 +08:00
We plan to enable source maps for release builds behind a GN flag. For this to work rollup needs to consume the source maps already generated by tsc and merge it with its own source map. Rollup can't do this natively so this CL adds a plugin that can. R=jacktfranklin@chromium.org Bug: 1430396 Change-Id: Ibb38c7892326907431e54b7c7dbd7b912b59ccb9 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4397707 Reviewed-by: Jack Franklin <jacktfranklin@chromium.org> Commit-Queue: Simon Zünd <szuend@chromium.org>
95 lines
2.2 KiB
JavaScript
95 lines
2.2 KiB
JavaScript
'use strict';
|
|
var token = '%[a-f0-9]{2}';
|
|
var singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');
|
|
var multiMatcher = new RegExp('(' + token + ')+', 'gi');
|
|
|
|
function decodeComponents(components, split) {
|
|
try {
|
|
// Try to decode the entire string first
|
|
return [decodeURIComponent(components.join(''))];
|
|
} catch (err) {
|
|
// Do nothing
|
|
}
|
|
|
|
if (components.length === 1) {
|
|
return components;
|
|
}
|
|
|
|
split = split || 1;
|
|
|
|
// Split the array in 2 parts
|
|
var left = components.slice(0, split);
|
|
var right = components.slice(split);
|
|
|
|
return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));
|
|
}
|
|
|
|
function decode(input) {
|
|
try {
|
|
return decodeURIComponent(input);
|
|
} catch (err) {
|
|
var tokens = input.match(singleMatcher) || [];
|
|
|
|
for (var i = 1; i < tokens.length; i++) {
|
|
input = decodeComponents(tokens, i).join('');
|
|
|
|
tokens = input.match(singleMatcher) || [];
|
|
}
|
|
|
|
return input;
|
|
}
|
|
}
|
|
|
|
function customDecodeURIComponent(input) {
|
|
// Keep track of all the replacements and prefill the map with the `BOM`
|
|
var replaceMap = {
|
|
'%FE%FF': '\uFFFD\uFFFD',
|
|
'%FF%FE': '\uFFFD\uFFFD'
|
|
};
|
|
|
|
var match = multiMatcher.exec(input);
|
|
while (match) {
|
|
try {
|
|
// Decode as big chunks as possible
|
|
replaceMap[match[0]] = decodeURIComponent(match[0]);
|
|
} catch (err) {
|
|
var result = decode(match[0]);
|
|
|
|
if (result !== match[0]) {
|
|
replaceMap[match[0]] = result;
|
|
}
|
|
}
|
|
|
|
match = multiMatcher.exec(input);
|
|
}
|
|
|
|
// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else
|
|
replaceMap['%C2'] = '\uFFFD';
|
|
|
|
var entries = Object.keys(replaceMap);
|
|
|
|
for (var i = 0; i < entries.length; i++) {
|
|
// Replace all decoded components
|
|
var key = entries[i];
|
|
input = input.replace(new RegExp(key, 'g'), replaceMap[key]);
|
|
}
|
|
|
|
return input;
|
|
}
|
|
|
|
module.exports = function (encodedURI) {
|
|
if (typeof encodedURI !== 'string') {
|
|
throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');
|
|
}
|
|
|
|
try {
|
|
encodedURI = encodedURI.replace(/\+/g, ' ');
|
|
|
|
// Try the built in decoder first
|
|
return decodeURIComponent(encodedURI);
|
|
} catch (err) {
|
|
// Fallback to a more advanced decoder
|
|
return customDecodeURIComponent(encodedURI);
|
|
}
|
|
};
|