WXL
9 天以前 2895b4ea66e09cb355aeb4e030ca0de297bf8ce3
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
70
71
72
73
74
75
76
77
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Ivan Kopeykin @vankop
*/
 
"use strict";
 
const memorize = require("./memoize");
 
const getUrl = memorize(() => require("url"));
 
const PATH_QUERY_FRAGMENT_REGEXP =
    /^(#?(?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/;
const ZERO_ESCAPE_REGEXP = /\0(.)/g;
const FILE_REG_EXP = /file:/i;
 
/**
 * @param {string} identifier identifier
 * @returns {[string, string, string] | null} parsed identifier
 */
function parseIdentifier(identifier) {
    if (!identifier) {
        return null;
    }
 
    if (FILE_REG_EXP.test(identifier)) {
        identifier = getUrl().fileURLToPath(identifier);
    }
 
    const firstEscape = identifier.indexOf("\0");
 
    // Handle `\0`
    if (firstEscape !== -1) {
        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] || "",
        ];
    }
 
    // 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),
    ];
}
 
module.exports.parseIdentifier = parseIdentifier;