|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"use strict"; |
|
|
|
|
|
const PATH_QUERY_FRAGMENT_REGEXP = |
|
|
/^(#?(?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/; |
|
|
const ZERO_ESCAPE_REGEXP = /\0(.)/g; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function parseIdentifier(identifier) { |
|
|
if (!identifier) { |
|
|
return null; |
|
|
} |
|
|
|
|
|
const firstEscape = identifier.indexOf("\0"); |
|
|
if (firstEscape < 0) { |
|
|
|
|
|
const queryStart = identifier.indexOf("?"); |
|
|
|
|
|
const fragmentStart = identifier.indexOf("#", 1); |
|
|
|
|
|
if (fragmentStart < 0) { |
|
|
if (queryStart < 0) { |
|
|
|
|
|
return [identifier, "", ""]; |
|
|
} |
|
|
|
|
|
return [ |
|
|
identifier.slice(0, queryStart), |
|
|
identifier.slice(queryStart), |
|
|
"", |
|
|
]; |
|
|
} |
|
|
|
|
|
if (queryStart < 0 || fragmentStart < queryStart) { |
|
|
|
|
|
return [ |
|
|
identifier.slice(0, fragmentStart), |
|
|
"", |
|
|
identifier.slice(fragmentStart), |
|
|
]; |
|
|
} |
|
|
|
|
|
|
|
|
return [ |
|
|
identifier.slice(0, queryStart), |
|
|
identifier.slice(queryStart, fragmentStart), |
|
|
identifier.slice(fragmentStart), |
|
|
]; |
|
|
} |
|
|
|
|
|
const match = PATH_QUERY_FRAGMENT_REGEXP.exec(identifier); |
|
|
|
|
|
if (!match) return null; |
|
|
|
|
|
return [ |
|
|
match[1].replace(ZERO_ESCAPE_REGEXP, "$1"), |
|
|
match[2] ? match[2].replace(ZERO_ESCAPE_REGEXP, "$1") : "", |
|
|
match[3] || "", |
|
|
]; |
|
|
} |
|
|
|
|
|
module.exports.parseIdentifier = parseIdentifier; |
|
|
|