啊鑫
8 天以前 fca192d3c38c5dcfbb6ace8bc71d6078f6a079b2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Ivan Kopeykin @vankop
*/
 
"use strict";
 
const PATH_QUERY_FRAGMENT_REGEXP =
    /^(#?(?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/;
const ZERO_ESCAPE_REGEXP = /\0(.)/g;
 
/**
 * @param {string} identifier identifier
 * @returns {[string, string, string]|null} parsed identifier
 */
function parseIdentifier(identifier) {
    if (!identifier) {
        return null;
    }
 
    const firstEscape = identifier.indexOf("\0");
    if (firstEscape < 0) {
        // Fast path for inputs that don't use \0 escaping.
        const queryStart = identifier.indexOf("?");
        // Start at index 1 to ignore a possible leading hash.
        const fragmentStart = identifier.indexOf("#", 1);
 
        if (fragmentStart < 0) {
            if (queryStart < 0) {
                // No fragment, no query
                return [identifier, "", ""];
            }
            // Query, no fragment
            return [
                identifier.slice(0, queryStart),
                identifier.slice(queryStart),
                ""
            ];
        }
 
        if (queryStart < 0 || fragmentStart < queryStart) {
            // Fragment, no query
            return [
                identifier.slice(0, fragmentStart),
                "",
                identifier.slice(fragmentStart)
            ];
        }
 
        // Query and fragment
        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;