基本schema测试
This commit is contained in:
96
node_modules/fast-querystring/lib/internals/querystring.js
generated
vendored
Normal file
96
node_modules/fast-querystring/lib/internals/querystring.js
generated
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
// This file is taken from Node.js project.
|
||||
// Full implementation can be found from https://github.com/nodejs/node/blob/main/lib/internal/querystring.js
|
||||
|
||||
const hexTable = Array.from(
|
||||
{ length: 256 },
|
||||
(_, i) => "%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase(),
|
||||
);
|
||||
|
||||
// These characters do not need escaping when generating query strings:
|
||||
// ! - . _ ~
|
||||
// ' ( ) *
|
||||
// digits
|
||||
// alpha (uppercase)
|
||||
// alpha (lowercase)
|
||||
// rome-ignore format: the array should not be formatted
|
||||
const noEscape = new Int8Array([
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
|
||||
0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, // 32 - 47
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
|
||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, // 80 - 95
|
||||
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, // 112 - 127
|
||||
]);
|
||||
|
||||
/**
|
||||
* @param {string} str
|
||||
* @returns {string}
|
||||
*/
|
||||
function encodeString(str) {
|
||||
const len = str.length;
|
||||
if (len === 0) return "";
|
||||
|
||||
let out = "";
|
||||
let lastPos = 0;
|
||||
let i = 0;
|
||||
|
||||
outer: for (; i < len; i++) {
|
||||
let c = str.charCodeAt(i);
|
||||
|
||||
// ASCII
|
||||
while (c < 0x80) {
|
||||
if (noEscape[c] !== 1) {
|
||||
if (lastPos < i) out += str.slice(lastPos, i);
|
||||
lastPos = i + 1;
|
||||
out += hexTable[c];
|
||||
}
|
||||
|
||||
if (++i === len) break outer;
|
||||
|
||||
c = str.charCodeAt(i);
|
||||
}
|
||||
|
||||
if (lastPos < i) out += str.slice(lastPos, i);
|
||||
|
||||
// Multi-byte characters ...
|
||||
if (c < 0x800) {
|
||||
lastPos = i + 1;
|
||||
out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];
|
||||
continue;
|
||||
}
|
||||
if (c < 0xd800 || c >= 0xe000) {
|
||||
lastPos = i + 1;
|
||||
out +=
|
||||
hexTable[0xe0 | (c >> 12)] +
|
||||
hexTable[0x80 | ((c >> 6) & 0x3f)] +
|
||||
hexTable[0x80 | (c & 0x3f)];
|
||||
continue;
|
||||
}
|
||||
// Surrogate pair
|
||||
++i;
|
||||
|
||||
// This branch should never happen because all URLSearchParams entries
|
||||
// should already be converted to USVString. But, included for
|
||||
// completion's sake anyway.
|
||||
if (i >= len) {
|
||||
throw new Error("URI malformed");
|
||||
}
|
||||
|
||||
const c2 = str.charCodeAt(i) & 0x3ff;
|
||||
|
||||
lastPos = i + 1;
|
||||
c = 0x10000 + (((c & 0x3ff) << 10) | c2);
|
||||
out +=
|
||||
hexTable[0xf0 | (c >> 18)] +
|
||||
hexTable[0x80 | ((c >> 12) & 0x3f)] +
|
||||
hexTable[0x80 | ((c >> 6) & 0x3f)] +
|
||||
hexTable[0x80 | (c & 0x3f)];
|
||||
}
|
||||
if (lastPos === 0) return str;
|
||||
if (lastPos < len) return out + str.slice(lastPos);
|
||||
return out;
|
||||
}
|
||||
|
||||
module.exports = { encodeString };
|
||||
Reference in New Issue
Block a user