@yawlabs/tailscale-mcp 0.20.1 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +476 -145
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -3109,9 +3109,28 @@ var require_utils = __commonJS({
|
|
|
3109
3109
|
"use strict";
|
|
3110
3110
|
var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
|
|
3111
3111
|
var isIPv42 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
|
|
3112
|
+
var isPort = RegExp.prototype.test.bind(/^\d*$/u);
|
|
3112
3113
|
var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
|
|
3113
3114
|
var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
|
|
3114
|
-
var isPathCharacter = RegExp.prototype.test.bind(/^[
|
|
3115
|
+
var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
|
|
3116
|
+
var isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u);
|
|
3117
|
+
var isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u);
|
|
3118
|
+
var BYTE_HEX = new Array(256);
|
|
3119
|
+
{
|
|
3120
|
+
const HEX_DIGITS = "0123456789ABCDEF";
|
|
3121
|
+
for (let i = 0; i < 256; i++) {
|
|
3122
|
+
BYTE_HEX[i] = "%" + HEX_DIGITS[i >> 4] + HEX_DIGITS[i & 15];
|
|
3123
|
+
}
|
|
3124
|
+
}
|
|
3125
|
+
function percentEncodeNonAscii(cp) {
|
|
3126
|
+
if (cp < 2048) {
|
|
3127
|
+
return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63];
|
|
3128
|
+
}
|
|
3129
|
+
if (cp < 65536) {
|
|
3130
|
+
return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
|
|
3131
|
+
}
|
|
3132
|
+
return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
|
|
3133
|
+
}
|
|
3115
3134
|
function stringArrayToHexStripped(input) {
|
|
3116
3135
|
let acc = "";
|
|
3117
3136
|
let code = 0;
|
|
@@ -3136,91 +3155,105 @@ var require_utils = __commonJS({
|
|
|
3136
3155
|
}
|
|
3137
3156
|
return acc;
|
|
3138
3157
|
}
|
|
3158
|
+
var isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/);
|
|
3159
|
+
var isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/);
|
|
3160
|
+
var isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/);
|
|
3139
3161
|
var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
|
|
3140
|
-
function
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
if (hex3 !== "") {
|
|
3148
|
-
address.push(hex3);
|
|
3149
|
-
} else {
|
|
3150
|
-
output.error = true;
|
|
3151
|
-
return false;
|
|
3162
|
+
function isZoneIdentifier(zone) {
|
|
3163
|
+
if (zone.length === 0) return false;
|
|
3164
|
+
for (let i = 0; i < zone.length; i++) {
|
|
3165
|
+
if (isZoneCharacter(zone[i])) continue;
|
|
3166
|
+
if (zone[i] === "%" && i + 2 < zone.length && isHexPair(zone.slice(i + 1, i + 3))) {
|
|
3167
|
+
i += 2;
|
|
3168
|
+
continue;
|
|
3152
3169
|
}
|
|
3153
|
-
|
|
3170
|
+
return false;
|
|
3154
3171
|
}
|
|
3155
3172
|
return true;
|
|
3156
3173
|
}
|
|
3157
|
-
function
|
|
3158
|
-
let
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
let
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
}
|
|
3170
|
-
if (cursor === ":") {
|
|
3171
|
-
if (endipv6Encountered === true) {
|
|
3172
|
-
endIpv6 = true;
|
|
3173
|
-
}
|
|
3174
|
-
if (!consume(buffer, address, output)) {
|
|
3175
|
-
break;
|
|
3176
|
-
}
|
|
3177
|
-
if (++tokenCount > 7) {
|
|
3178
|
-
output.error = true;
|
|
3179
|
-
break;
|
|
3174
|
+
function compressIPv6ZeroRun(hextets) {
|
|
3175
|
+
let bestStart = -1;
|
|
3176
|
+
let bestLength = 0;
|
|
3177
|
+
let runStart = -1;
|
|
3178
|
+
let runLength = 0;
|
|
3179
|
+
for (let i = 0; i < hextets.length; i++) {
|
|
3180
|
+
if (hextets[i] === "0") {
|
|
3181
|
+
if (runStart === -1) runStart = i;
|
|
3182
|
+
runLength++;
|
|
3183
|
+
if (runLength > bestLength) {
|
|
3184
|
+
bestLength = runLength;
|
|
3185
|
+
bestStart = runStart;
|
|
3180
3186
|
}
|
|
3181
|
-
if (i > 0 && input[i - 1] === ":") {
|
|
3182
|
-
endipv6Encountered = true;
|
|
3183
|
-
}
|
|
3184
|
-
address.push(":");
|
|
3185
|
-
continue;
|
|
3186
|
-
} else if (cursor === "%") {
|
|
3187
|
-
if (!consume(buffer, address, output)) {
|
|
3188
|
-
break;
|
|
3189
|
-
}
|
|
3190
|
-
consume = consumeIsZone;
|
|
3191
3187
|
} else {
|
|
3192
|
-
|
|
3188
|
+
runStart = -1;
|
|
3189
|
+
runLength = 0;
|
|
3190
|
+
}
|
|
3191
|
+
}
|
|
3192
|
+
if (bestLength < 2) return hextets.join(":");
|
|
3193
|
+
const head = hextets.slice(0, bestStart).join(":");
|
|
3194
|
+
const tail = hextets.slice(bestStart + bestLength).join(":");
|
|
3195
|
+
return head + "::" + tail;
|
|
3196
|
+
}
|
|
3197
|
+
function normalizeIPv6Address(input) {
|
|
3198
|
+
const compression = input.indexOf("::");
|
|
3199
|
+
if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0;
|
|
3200
|
+
const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":");
|
|
3201
|
+
const right = compression === -1 ? [] : input.slice(compression + 2).split(":");
|
|
3202
|
+
if (compression !== -1) {
|
|
3203
|
+
if (left.length === 1 && left[0] === "") left.length = 0;
|
|
3204
|
+
if (right.length === 1 && right[0] === "") right.length = 0;
|
|
3205
|
+
}
|
|
3206
|
+
const parts = left.concat(right);
|
|
3207
|
+
let hextetCount = 0;
|
|
3208
|
+
for (let i = 0; i < parts.length; i++) {
|
|
3209
|
+
const part = parts[i];
|
|
3210
|
+
if (part === "") return void 0;
|
|
3211
|
+
if (part.indexOf(".") !== -1) {
|
|
3212
|
+
if (i !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv42(part)) return void 0;
|
|
3213
|
+
hextetCount += 2;
|
|
3193
3214
|
continue;
|
|
3194
3215
|
}
|
|
3216
|
+
if (!isHextet(part)) return void 0;
|
|
3217
|
+
parts[i] = parseInt(part, 16).toString(16);
|
|
3218
|
+
hextetCount++;
|
|
3195
3219
|
}
|
|
3196
|
-
if (
|
|
3197
|
-
if (
|
|
3198
|
-
|
|
3199
|
-
} else if (endIpv6) {
|
|
3200
|
-
address.push(buffer.join(""));
|
|
3201
|
-
} else {
|
|
3202
|
-
address.push(stringArrayToHexStripped(buffer));
|
|
3203
|
-
}
|
|
3220
|
+
if (compression === -1) {
|
|
3221
|
+
if (hextetCount !== 8) return void 0;
|
|
3222
|
+
return compressIPv6ZeroRun(parts);
|
|
3204
3223
|
}
|
|
3205
|
-
|
|
3206
|
-
|
|
3224
|
+
if (hextetCount >= 8) return void 0;
|
|
3225
|
+
const expanded = parts.slice(0, left.length);
|
|
3226
|
+
for (let i = hextetCount; i < 8; i++) expanded.push("0");
|
|
3227
|
+
for (let i = left.length; i < parts.length; i++) expanded.push(parts[i]);
|
|
3228
|
+
return compressIPv6ZeroRun(expanded);
|
|
3207
3229
|
}
|
|
3208
3230
|
function normalizeIPv6(host) {
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
}
|
|
3212
|
-
|
|
3213
|
-
if (
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3231
|
+
const bracketed = host[0] === "[" && host[host.length - 1] === "]";
|
|
3232
|
+
const hasBracket = host[0] === "[" || host[host.length - 1] === "]";
|
|
3233
|
+
if (hasBracket && !bracketed) return { host, isIPV6: false, error: true };
|
|
3234
|
+
let input = bracketed ? host.slice(1, -1) : host;
|
|
3235
|
+
if (bracketed && isIPvFuture(input)) {
|
|
3236
|
+
input = input.toLowerCase();
|
|
3237
|
+
return { host: `[${input}]`, escapedHost: input, isIPV6: false, isIPVFuture: true };
|
|
3238
|
+
}
|
|
3239
|
+
if (findToken(input, ":") < 2) {
|
|
3240
|
+
return { host, isIPV6: false, error: bracketed };
|
|
3241
|
+
}
|
|
3242
|
+
let zoneIdentifier = "";
|
|
3243
|
+
const zoneSeparator = input.indexOf("%");
|
|
3244
|
+
if (zoneSeparator !== -1) {
|
|
3245
|
+
const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1;
|
|
3246
|
+
zoneIdentifier = input.slice(zoneSeparator + separatorLength);
|
|
3247
|
+
if (!isZoneIdentifier(zoneIdentifier)) return { host, isIPV6: false, error: true };
|
|
3248
|
+
input = input.slice(0, zoneSeparator);
|
|
3249
|
+
}
|
|
3250
|
+
const address = normalizeIPv6Address(input);
|
|
3251
|
+
if (address === void 0) return { host, isIPV6: false, error: true };
|
|
3252
|
+
return {
|
|
3253
|
+
host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""),
|
|
3254
|
+
escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""),
|
|
3255
|
+
isIPV6: true
|
|
3256
|
+
};
|
|
3224
3257
|
}
|
|
3225
3258
|
function findToken(str, token) {
|
|
3226
3259
|
let ind = 0;
|
|
@@ -3339,7 +3372,8 @@ var require_utils = __commonJS({
|
|
|
3339
3372
|
function normalizePathEncoding(input) {
|
|
3340
3373
|
let output = "";
|
|
3341
3374
|
for (let i = 0; i < input.length; i++) {
|
|
3342
|
-
|
|
3375
|
+
const ch = input[i];
|
|
3376
|
+
if (ch === "%" && i + 2 < input.length) {
|
|
3343
3377
|
const hex3 = input.slice(i + 1, i + 3);
|
|
3344
3378
|
if (isHexPair(hex3)) {
|
|
3345
3379
|
const normalizedHex = hex3.toUpperCase();
|
|
@@ -3353,10 +3387,152 @@ var require_utils = __commonJS({
|
|
|
3353
3387
|
continue;
|
|
3354
3388
|
}
|
|
3355
3389
|
}
|
|
3356
|
-
if (isPathCharacter(
|
|
3357
|
-
output +=
|
|
3390
|
+
if (isPathCharacter(ch)) {
|
|
3391
|
+
output += ch;
|
|
3392
|
+
} else {
|
|
3393
|
+
const code = input.charCodeAt(i);
|
|
3394
|
+
if (code < 128) {
|
|
3395
|
+
output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
|
|
3396
|
+
} else if (code < 55296 || code > 57343) {
|
|
3397
|
+
output += percentEncodeNonAscii(code);
|
|
3398
|
+
} else if (code <= 56319 && i + 1 < input.length) {
|
|
3399
|
+
const low = input.charCodeAt(i + 1);
|
|
3400
|
+
if (low >= 56320 && low <= 57343) {
|
|
3401
|
+
output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
|
|
3402
|
+
i++;
|
|
3403
|
+
} else {
|
|
3404
|
+
output += percentEncodeNonAscii(65533);
|
|
3405
|
+
}
|
|
3406
|
+
} else {
|
|
3407
|
+
output += percentEncodeNonAscii(65533);
|
|
3408
|
+
}
|
|
3409
|
+
}
|
|
3410
|
+
}
|
|
3411
|
+
return output;
|
|
3412
|
+
}
|
|
3413
|
+
function serializePathEncoding(input, pathNoScheme = false) {
|
|
3414
|
+
let output = "";
|
|
3415
|
+
let firstSegment = pathNoScheme && input[0] !== "/";
|
|
3416
|
+
for (let i = 0; i < input.length; i++) {
|
|
3417
|
+
const ch = input[i];
|
|
3418
|
+
if (ch === "%" && i + 2 < input.length) {
|
|
3419
|
+
const hex3 = input.slice(i + 1, i + 3);
|
|
3420
|
+
if (isHexPair(hex3)) {
|
|
3421
|
+
output += "%" + hex3.toUpperCase();
|
|
3422
|
+
i += 2;
|
|
3423
|
+
continue;
|
|
3424
|
+
}
|
|
3425
|
+
}
|
|
3426
|
+
if (ch === "/") {
|
|
3427
|
+
firstSegment = false;
|
|
3428
|
+
}
|
|
3429
|
+
if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) {
|
|
3430
|
+
output += ch;
|
|
3431
|
+
} else {
|
|
3432
|
+
const code = input.charCodeAt(i);
|
|
3433
|
+
if (code < 128) {
|
|
3434
|
+
output += BYTE_HEX[code];
|
|
3435
|
+
} else if (code < 55296 || code > 57343) {
|
|
3436
|
+
output += percentEncodeNonAscii(code);
|
|
3437
|
+
} else if (code <= 56319 && i + 1 < input.length) {
|
|
3438
|
+
const low = input.charCodeAt(i + 1);
|
|
3439
|
+
if (low >= 56320 && low <= 57343) {
|
|
3440
|
+
output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
|
|
3441
|
+
i++;
|
|
3442
|
+
} else {
|
|
3443
|
+
output += percentEncodeNonAscii(65533);
|
|
3444
|
+
}
|
|
3445
|
+
} else {
|
|
3446
|
+
output += percentEncodeNonAscii(65533);
|
|
3447
|
+
}
|
|
3448
|
+
}
|
|
3449
|
+
}
|
|
3450
|
+
return output;
|
|
3451
|
+
}
|
|
3452
|
+
function encodeComponent(input, isAllowed) {
|
|
3453
|
+
let output = "";
|
|
3454
|
+
for (let i = 0; i < input.length; i++) {
|
|
3455
|
+
const ch = input[i];
|
|
3456
|
+
if (ch === "%" && i + 2 < input.length) {
|
|
3457
|
+
const hex3 = input.slice(i + 1, i + 3);
|
|
3458
|
+
if (isHexPair(hex3)) {
|
|
3459
|
+
output += "%" + hex3.toUpperCase();
|
|
3460
|
+
i += 2;
|
|
3461
|
+
continue;
|
|
3462
|
+
}
|
|
3463
|
+
}
|
|
3464
|
+
if (isAllowed(ch)) {
|
|
3465
|
+
output += ch;
|
|
3466
|
+
} else {
|
|
3467
|
+
const code = input.charCodeAt(i);
|
|
3468
|
+
if (code < 128) {
|
|
3469
|
+
output += BYTE_HEX[code];
|
|
3470
|
+
} else if (code < 55296 || code > 57343) {
|
|
3471
|
+
output += percentEncodeNonAscii(code);
|
|
3472
|
+
} else if (code <= 56319 && i + 1 < input.length) {
|
|
3473
|
+
const low = input.charCodeAt(i + 1);
|
|
3474
|
+
if (low >= 56320 && low <= 57343) {
|
|
3475
|
+
output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
|
|
3476
|
+
i++;
|
|
3477
|
+
} else {
|
|
3478
|
+
output += percentEncodeNonAscii(65533);
|
|
3479
|
+
}
|
|
3480
|
+
} else {
|
|
3481
|
+
output += percentEncodeNonAscii(65533);
|
|
3482
|
+
}
|
|
3483
|
+
}
|
|
3484
|
+
}
|
|
3485
|
+
return output;
|
|
3486
|
+
}
|
|
3487
|
+
function encodeUserinfo(input) {
|
|
3488
|
+
return encodeComponent(input, isUserinfoCharacter);
|
|
3489
|
+
}
|
|
3490
|
+
function encodeQuery(input) {
|
|
3491
|
+
return encodeComponent(input, isQueryFragmentCharacter);
|
|
3492
|
+
}
|
|
3493
|
+
function encodeFragment(input) {
|
|
3494
|
+
return encodeComponent(input, isQueryFragmentCharacter);
|
|
3495
|
+
}
|
|
3496
|
+
function isEscapeSafe(cp) {
|
|
3497
|
+
return cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 42 || cp === 43 || cp === 45 || cp === 46 || cp === 47 || cp === 64 || cp === 95;
|
|
3498
|
+
}
|
|
3499
|
+
function normalizeQueryFragmentEncoding(input) {
|
|
3500
|
+
let output = "";
|
|
3501
|
+
for (let i = 0; i < input.length; i++) {
|
|
3502
|
+
const ch = input[i];
|
|
3503
|
+
if (ch === "%" && i + 2 < input.length) {
|
|
3504
|
+
const hex3 = input.slice(i + 1, i + 3);
|
|
3505
|
+
if (isHexPair(hex3)) {
|
|
3506
|
+
const normalizedHex = hex3.toUpperCase();
|
|
3507
|
+
const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
|
|
3508
|
+
if (isUnreserved(decoded)) {
|
|
3509
|
+
output += decoded;
|
|
3510
|
+
} else {
|
|
3511
|
+
output += "%" + normalizedHex;
|
|
3512
|
+
}
|
|
3513
|
+
i += 2;
|
|
3514
|
+
continue;
|
|
3515
|
+
}
|
|
3516
|
+
}
|
|
3517
|
+
if (isQueryFragmentCharacter(ch)) {
|
|
3518
|
+
output += ch;
|
|
3358
3519
|
} else {
|
|
3359
|
-
|
|
3520
|
+
const code = input.charCodeAt(i);
|
|
3521
|
+
if (code < 128) {
|
|
3522
|
+
output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
|
|
3523
|
+
} else if (code < 55296 || code > 57343) {
|
|
3524
|
+
output += percentEncodeNonAscii(code);
|
|
3525
|
+
} else if (code <= 56319 && i + 1 < input.length) {
|
|
3526
|
+
const low = input.charCodeAt(i + 1);
|
|
3527
|
+
if (low >= 56320 && low <= 57343) {
|
|
3528
|
+
output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
|
|
3529
|
+
i++;
|
|
3530
|
+
} else {
|
|
3531
|
+
output += percentEncodeNonAscii(65533);
|
|
3532
|
+
}
|
|
3533
|
+
} else {
|
|
3534
|
+
output += percentEncodeNonAscii(65533);
|
|
3535
|
+
}
|
|
3360
3536
|
}
|
|
3361
3537
|
}
|
|
3362
3538
|
return output;
|
|
@@ -3379,14 +3555,18 @@ var require_utils = __commonJS({
|
|
|
3379
3555
|
function recomposeAuthority(component) {
|
|
3380
3556
|
const uriTokens = [];
|
|
3381
3557
|
if (component.userinfo !== void 0) {
|
|
3382
|
-
uriTokens.push(component.userinfo);
|
|
3558
|
+
uriTokens.push(encodeUserinfo(component.userinfo));
|
|
3383
3559
|
uriTokens.push("@");
|
|
3384
3560
|
}
|
|
3385
3561
|
if (component.host !== void 0) {
|
|
3386
|
-
let host =
|
|
3562
|
+
let host = component.host;
|
|
3387
3563
|
if (!isIPv42(host)) {
|
|
3388
|
-
|
|
3389
|
-
if (ipV6res.isIPV6
|
|
3564
|
+
let ipV6res = normalizeIPv6(host);
|
|
3565
|
+
if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) {
|
|
3566
|
+
host = normalizePercentEncoding(host, true);
|
|
3567
|
+
ipV6res = normalizeIPv6(host);
|
|
3568
|
+
}
|
|
3569
|
+
if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) {
|
|
3390
3570
|
host = `[${ipV6res.escapedHost}]`;
|
|
3391
3571
|
} else {
|
|
3392
3572
|
host = reescapeHostDelimiters(host, false);
|
|
@@ -3395,8 +3575,12 @@ var require_utils = __commonJS({
|
|
|
3395
3575
|
uriTokens.push(host);
|
|
3396
3576
|
}
|
|
3397
3577
|
if (typeof component.port === "number" || typeof component.port === "string") {
|
|
3578
|
+
const port = String(component.port);
|
|
3579
|
+
if (!isPort(port)) {
|
|
3580
|
+
throw new TypeError("URI port is malformed.");
|
|
3581
|
+
}
|
|
3398
3582
|
uriTokens.push(":");
|
|
3399
|
-
uriTokens.push(
|
|
3583
|
+
uriTokens.push(port);
|
|
3400
3584
|
}
|
|
3401
3585
|
return uriTokens.length ? uriTokens.join("") : void 0;
|
|
3402
3586
|
}
|
|
@@ -3406,6 +3590,11 @@ var require_utils = __commonJS({
|
|
|
3406
3590
|
reescapeHostDelimiters,
|
|
3407
3591
|
normalizePercentEncoding,
|
|
3408
3592
|
normalizePathEncoding,
|
|
3593
|
+
serializePathEncoding,
|
|
3594
|
+
normalizeQueryFragmentEncoding,
|
|
3595
|
+
encodeUserinfo,
|
|
3596
|
+
encodeQuery,
|
|
3597
|
+
encodeFragment,
|
|
3409
3598
|
escapePreservingEscapes,
|
|
3410
3599
|
removeDotSegments,
|
|
3411
3600
|
isIPv4: isIPv42,
|
|
@@ -3421,7 +3610,7 @@ var require_schemes = __commonJS({
|
|
|
3421
3610
|
"node_modules/fast-uri/lib/schemes.js"(exports, module) {
|
|
3422
3611
|
"use strict";
|
|
3423
3612
|
var { isUUID } = require_utils();
|
|
3424
|
-
var URN_REG =
|
|
3613
|
+
var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
|
|
3425
3614
|
var supportedSchemeNames = (
|
|
3426
3615
|
/** @type {const} */
|
|
3427
3616
|
[
|
|
@@ -3482,9 +3671,10 @@ var require_schemes = __commonJS({
|
|
|
3482
3671
|
wsComponent.secure = void 0;
|
|
3483
3672
|
}
|
|
3484
3673
|
if (wsComponent.resourceName) {
|
|
3485
|
-
const
|
|
3674
|
+
const queryIndex = wsComponent.resourceName.indexOf("?");
|
|
3675
|
+
const path = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex);
|
|
3486
3676
|
wsComponent.path = path && path !== "/" ? path : void 0;
|
|
3487
|
-
wsComponent.query =
|
|
3677
|
+
wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1);
|
|
3488
3678
|
wsComponent.resourceName = void 0;
|
|
3489
3679
|
}
|
|
3490
3680
|
wsComponent.fragment = void 0;
|
|
@@ -3496,7 +3686,7 @@ var require_schemes = __commonJS({
|
|
|
3496
3686
|
return urnComponent;
|
|
3497
3687
|
}
|
|
3498
3688
|
const matches = urnComponent.path.match(URN_REG);
|
|
3499
|
-
if (matches) {
|
|
3689
|
+
if (matches && matches[0] === urnComponent.path) {
|
|
3500
3690
|
const scheme = options.scheme || urnComponent.scheme || "urn";
|
|
3501
3691
|
urnComponent.nid = matches[1].toLowerCase();
|
|
3502
3692
|
urnComponent.nss = matches[2];
|
|
@@ -3630,8 +3820,17 @@ var require_schemes = __commonJS({
|
|
|
3630
3820
|
var require_fast_uri = __commonJS({
|
|
3631
3821
|
"node_modules/fast-uri/index.js"(exports, module) {
|
|
3632
3822
|
"use strict";
|
|
3633
|
-
var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding,
|
|
3823
|
+
var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4: isIPv42, nonSimpleDomain } = require_utils();
|
|
3634
3824
|
var { SCHEMES, getSchemeHandler } = require_schemes();
|
|
3825
|
+
var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
|
|
3826
|
+
var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
|
|
3827
|
+
function decodeValidScheme(scheme) {
|
|
3828
|
+
const decodedScheme = unescape(String(scheme));
|
|
3829
|
+
if (!VALID_SCHEME.test(decodedScheme)) {
|
|
3830
|
+
throw new TypeError(MALFORMED_SCHEME_ERROR);
|
|
3831
|
+
}
|
|
3832
|
+
return decodedScheme;
|
|
3833
|
+
}
|
|
3635
3834
|
function normalize(uri, options) {
|
|
3636
3835
|
if (typeof uri === "string") {
|
|
3637
3836
|
uri = /** @type {T} */
|
|
@@ -3644,7 +3843,34 @@ var require_fast_uri = __commonJS({
|
|
|
3644
3843
|
}
|
|
3645
3844
|
function resolve(baseURI, relativeURI, options) {
|
|
3646
3845
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
3647
|
-
const
|
|
3846
|
+
const {
|
|
3847
|
+
parsed: baseParsed,
|
|
3848
|
+
malformedAuthorityOrPort: baseMalformed,
|
|
3849
|
+
malformedPercentEncoding: baseMalformedPercentEncoding,
|
|
3850
|
+
malformedSchemeSpecific: baseMalformedSchemeSpecific,
|
|
3851
|
+
malformedHost: baseMalformedHost,
|
|
3852
|
+
malformedScheme: baseMalformedScheme
|
|
3853
|
+
} = parseWithStatus(baseURI, schemelessOptions);
|
|
3854
|
+
const {
|
|
3855
|
+
parsed: relativeParsed,
|
|
3856
|
+
malformedAuthorityOrPort: relativeMalformed,
|
|
3857
|
+
malformedPercentEncoding: relativeMalformedPercentEncoding,
|
|
3858
|
+
malformedSchemeSpecific: relativeMalformedSchemeSpecific,
|
|
3859
|
+
malformedHost: relativeMalformedHost,
|
|
3860
|
+
malformedScheme: relativeMalformedScheme
|
|
3861
|
+
} = parseWithStatus(relativeURI, schemelessOptions);
|
|
3862
|
+
if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) {
|
|
3863
|
+
throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
|
|
3864
|
+
}
|
|
3865
|
+
const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
|
|
3866
|
+
const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
|
|
3867
|
+
const resolvedHost = resolved.host;
|
|
3868
|
+
const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv42(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
|
|
3869
|
+
canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
|
|
3870
|
+
const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost);
|
|
3871
|
+
if (resolved.error && !encodedASCIIHost) {
|
|
3872
|
+
throw new Error(resolved.error);
|
|
3873
|
+
}
|
|
3648
3874
|
schemelessOptions.skipEscape = true;
|
|
3649
3875
|
return serialize(resolved, schemelessOptions);
|
|
3650
3876
|
}
|
|
@@ -3704,7 +3930,7 @@ var require_fast_uri = __commonJS({
|
|
|
3704
3930
|
function equal(uriA, uriB, options) {
|
|
3705
3931
|
const normalizedA = normalizeComparableURI(uriA, options);
|
|
3706
3932
|
const normalizedB = normalizeComparableURI(uriB, options);
|
|
3707
|
-
return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA
|
|
3933
|
+
return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB;
|
|
3708
3934
|
}
|
|
3709
3935
|
function serialize(cmpts, opts) {
|
|
3710
3936
|
const component = {
|
|
@@ -3725,19 +3951,22 @@ var require_fast_uri = __commonJS({
|
|
|
3725
3951
|
};
|
|
3726
3952
|
const options = Object.assign({}, opts);
|
|
3727
3953
|
const uriTokens = [];
|
|
3954
|
+
if (component.scheme) {
|
|
3955
|
+
component.scheme = decodeValidScheme(component.scheme);
|
|
3956
|
+
}
|
|
3728
3957
|
const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
|
|
3729
3958
|
if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
|
|
3959
|
+
const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
|
|
3960
|
+
const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
|
|
3730
3961
|
if (component.path !== void 0) {
|
|
3731
3962
|
if (!options.skipEscape) {
|
|
3732
|
-
component.path =
|
|
3733
|
-
if (component.scheme !== void 0) {
|
|
3734
|
-
component.path = component.path.split("%3A").join(":");
|
|
3735
|
-
}
|
|
3963
|
+
component.path = serializePathEncoding(component.path, pathNoScheme);
|
|
3736
3964
|
} else {
|
|
3737
3965
|
component.path = normalizePercentEncoding(component.path);
|
|
3738
3966
|
}
|
|
3739
3967
|
}
|
|
3740
3968
|
if (options.reference !== "suffix" && component.scheme) {
|
|
3969
|
+
component.scheme = decodeValidScheme(component.scheme);
|
|
3741
3970
|
uriTokens.push(component.scheme, ":");
|
|
3742
3971
|
}
|
|
3743
3972
|
const authority = recomposeAuthority(component);
|
|
@@ -3755,20 +3984,25 @@ var require_fast_uri = __commonJS({
|
|
|
3755
3984
|
if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
|
|
3756
3985
|
s = removeDotSegments(s);
|
|
3757
3986
|
}
|
|
3987
|
+
if (pathNoScheme) {
|
|
3988
|
+
s = serializePathEncoding(s, true);
|
|
3989
|
+
}
|
|
3758
3990
|
if (authority === void 0 && s[0] === "/" && s[1] === "/") {
|
|
3759
3991
|
s = "/%2F" + s.slice(2);
|
|
3760
3992
|
}
|
|
3761
3993
|
uriTokens.push(s);
|
|
3762
3994
|
}
|
|
3763
3995
|
if (component.query !== void 0) {
|
|
3764
|
-
uriTokens.push("?", component.query);
|
|
3996
|
+
uriTokens.push("?", encodeQuery(component.query));
|
|
3765
3997
|
}
|
|
3766
3998
|
if (component.fragment !== void 0) {
|
|
3767
|
-
uriTokens.push("#", component.fragment);
|
|
3999
|
+
uriTokens.push("#", encodeFragment(component.fragment));
|
|
3768
4000
|
}
|
|
3769
4001
|
return uriTokens.join("");
|
|
3770
4002
|
}
|
|
3771
4003
|
var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
|
|
4004
|
+
var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
|
|
4005
|
+
var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
|
|
3772
4006
|
function getParseError(parsed, matches) {
|
|
3773
4007
|
if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
|
|
3774
4008
|
return 'URI path must start with "/" when authority is present.';
|
|
@@ -3778,6 +4012,35 @@ var require_fast_uri = __commonJS({
|
|
|
3778
4012
|
}
|
|
3779
4013
|
return void 0;
|
|
3780
4014
|
}
|
|
4015
|
+
function hasMalformedPercentEncoding(component) {
|
|
4016
|
+
if (component === void 0) return false;
|
|
4017
|
+
let percent = component.indexOf("%");
|
|
4018
|
+
while (percent !== -1) {
|
|
4019
|
+
if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) {
|
|
4020
|
+
return true;
|
|
4021
|
+
}
|
|
4022
|
+
percent = component.indexOf("%", percent + 3);
|
|
4023
|
+
}
|
|
4024
|
+
return false;
|
|
4025
|
+
}
|
|
4026
|
+
function isIPLiteral(host) {
|
|
4027
|
+
return host[0] === "[" && host[host.length - 1] === "]";
|
|
4028
|
+
}
|
|
4029
|
+
function hasMalformedComponentPercentEncoding(matches) {
|
|
4030
|
+
const host = matches[4];
|
|
4031
|
+
return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
|
|
4032
|
+
}
|
|
4033
|
+
function canonicalizeHost(parsed, options, schemeHandler, isIP2) {
|
|
4034
|
+
if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP2 === false && nonSimpleDomain(parsed.host)) {
|
|
4035
|
+
try {
|
|
4036
|
+
parsed.host = new URL("http://" + parsed.host).hostname;
|
|
4037
|
+
} catch (e) {
|
|
4038
|
+
parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
|
|
4039
|
+
return true;
|
|
4040
|
+
}
|
|
4041
|
+
}
|
|
4042
|
+
return false;
|
|
4043
|
+
}
|
|
3781
4044
|
function parseWithStatus(uri, opts) {
|
|
3782
4045
|
const options = Object.assign({}, opts);
|
|
3783
4046
|
const parsed = {
|
|
@@ -3790,6 +4053,11 @@ var require_fast_uri = __commonJS({
|
|
|
3790
4053
|
fragment: void 0
|
|
3791
4054
|
};
|
|
3792
4055
|
let malformedAuthorityOrPort = false;
|
|
4056
|
+
let malformedPercentEncoding = false;
|
|
4057
|
+
let malformedSchemeSpecific = false;
|
|
4058
|
+
let malformedHost = false;
|
|
4059
|
+
let malformedIPLiteral = false;
|
|
4060
|
+
let malformedScheme = false;
|
|
3793
4061
|
let isIP2 = false;
|
|
3794
4062
|
if (options.reference === "suffix") {
|
|
3795
4063
|
if (options.scheme) {
|
|
@@ -3798,6 +4066,25 @@ var require_fast_uri = __commonJS({
|
|
|
3798
4066
|
uri = "//" + uri;
|
|
3799
4067
|
}
|
|
3800
4068
|
}
|
|
4069
|
+
const authorityMatch = uri.match(AUTHORITY_PREFIX);
|
|
4070
|
+
if (authorityMatch !== null && authorityMatch[1].indexOf("\\") !== -1) {
|
|
4071
|
+
parsed.error = "URI authority must not contain a literal backslash.";
|
|
4072
|
+
malformedAuthorityOrPort = true;
|
|
4073
|
+
}
|
|
4074
|
+
const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
|
|
4075
|
+
if (introducerMatch !== null) {
|
|
4076
|
+
const region = introducerMatch[1];
|
|
4077
|
+
const normalizedRegion = region.replace(/[\t\n\r]/g, "");
|
|
4078
|
+
if (normalizedRegion.length >= 2) {
|
|
4079
|
+
if (normalizedRegion.slice(0, 2) !== "//") {
|
|
4080
|
+
parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
|
|
4081
|
+
malformedAuthorityOrPort = true;
|
|
4082
|
+
} else if (region.length !== normalizedRegion.length) {
|
|
4083
|
+
parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
|
|
4084
|
+
malformedAuthorityOrPort = true;
|
|
4085
|
+
}
|
|
4086
|
+
}
|
|
4087
|
+
}
|
|
3801
4088
|
const matches = uri.match(URI_PARSE);
|
|
3802
4089
|
if (matches) {
|
|
3803
4090
|
parsed.scheme = matches[1];
|
|
@@ -3807,6 +4094,19 @@ var require_fast_uri = __commonJS({
|
|
|
3807
4094
|
parsed.path = matches[6] || "";
|
|
3808
4095
|
parsed.query = matches[7];
|
|
3809
4096
|
parsed.fragment = matches[8];
|
|
4097
|
+
if (parsed.scheme !== void 0) {
|
|
4098
|
+
const decodedScheme = unescape(parsed.scheme);
|
|
4099
|
+
if (VALID_SCHEME.test(decodedScheme)) {
|
|
4100
|
+
parsed.scheme = decodedScheme.toLowerCase();
|
|
4101
|
+
} else {
|
|
4102
|
+
parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
|
|
4103
|
+
malformedScheme = true;
|
|
4104
|
+
}
|
|
4105
|
+
}
|
|
4106
|
+
malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches);
|
|
4107
|
+
if (malformedPercentEncoding) {
|
|
4108
|
+
parsed.error = parsed.error || "URI contains malformed percent-encoding.";
|
|
4109
|
+
}
|
|
3810
4110
|
if (isNaN(parsed.port)) {
|
|
3811
4111
|
parsed.port = matches[5];
|
|
3812
4112
|
}
|
|
@@ -3818,9 +4118,16 @@ var require_fast_uri = __commonJS({
|
|
|
3818
4118
|
if (parsed.host) {
|
|
3819
4119
|
const ipv4result = isIPv42(parsed.host);
|
|
3820
4120
|
if (ipv4result === false) {
|
|
4121
|
+
const bracketedIPLiteral = isIPLiteral(parsed.host);
|
|
4122
|
+
const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
|
|
3821
4123
|
const ipv6result = normalizeIPv6(parsed.host);
|
|
3822
|
-
|
|
3823
|
-
|
|
4124
|
+
isIP2 = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
|
|
4125
|
+
malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
|
|
4126
|
+
parsed.host = isIP2 ? ipv6result.host : ipv6result.host.toLowerCase();
|
|
4127
|
+
if (malformedIPLiteral) {
|
|
4128
|
+
parsed.error = parsed.error || "URI host is malformed.";
|
|
4129
|
+
malformedAuthorityOrPort = true;
|
|
4130
|
+
}
|
|
3824
4131
|
} else {
|
|
3825
4132
|
isIP2 = true;
|
|
3826
4133
|
}
|
|
@@ -3838,42 +4145,36 @@ var require_fast_uri = __commonJS({
|
|
|
3838
4145
|
parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
|
|
3839
4146
|
}
|
|
3840
4147
|
const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
|
|
3841
|
-
if (!
|
|
3842
|
-
|
|
3843
|
-
try {
|
|
3844
|
-
parsed.host = URL.domainToASCII(parsed.host.toLowerCase());
|
|
3845
|
-
} catch (e) {
|
|
3846
|
-
parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
|
|
3847
|
-
}
|
|
3848
|
-
}
|
|
4148
|
+
if (!malformedIPLiteral) {
|
|
4149
|
+
malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP2);
|
|
3849
4150
|
}
|
|
3850
4151
|
if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
|
|
3851
4152
|
if (uri.indexOf("%") !== -1) {
|
|
3852
|
-
if (parsed.
|
|
3853
|
-
parsed.
|
|
3854
|
-
|
|
3855
|
-
if (parsed.host !== void 0) {
|
|
3856
|
-
parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP2);
|
|
4153
|
+
if (parsed.host !== void 0 && !malformedIPLiteral) {
|
|
4154
|
+
const host = isIP2 ? parsed.host : normalizePercentEncoding(parsed.host, true);
|
|
4155
|
+
parsed.host = reescapeHostDelimiters(host, isIP2);
|
|
3857
4156
|
}
|
|
3858
4157
|
}
|
|
3859
4158
|
if (parsed.path) {
|
|
3860
4159
|
parsed.path = normalizePathEncoding(parsed.path);
|
|
3861
4160
|
}
|
|
4161
|
+
if (parsed.query) {
|
|
4162
|
+
parsed.query = normalizeQueryFragmentEncoding(parsed.query);
|
|
4163
|
+
}
|
|
3862
4164
|
if (parsed.fragment) {
|
|
3863
|
-
|
|
3864
|
-
parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
|
|
3865
|
-
} catch {
|
|
3866
|
-
parsed.error = parsed.error || "URI malformed";
|
|
3867
|
-
}
|
|
4165
|
+
parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment);
|
|
3868
4166
|
}
|
|
3869
4167
|
}
|
|
3870
4168
|
if (schemeHandler && schemeHandler.parse) {
|
|
3871
4169
|
schemeHandler.parse(parsed, options);
|
|
4170
|
+
if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) {
|
|
4171
|
+
malformedSchemeSpecific = true;
|
|
4172
|
+
}
|
|
3872
4173
|
}
|
|
3873
4174
|
} else {
|
|
3874
4175
|
parsed.error = parsed.error || "URI can not be parsed.";
|
|
3875
4176
|
}
|
|
3876
|
-
return { parsed, malformedAuthorityOrPort };
|
|
4177
|
+
return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme };
|
|
3877
4178
|
}
|
|
3878
4179
|
function parse3(uri, opts) {
|
|
3879
4180
|
return parseWithStatus(uri, opts).parsed;
|
|
@@ -3882,20 +4183,28 @@ var require_fast_uri = __commonJS({
|
|
|
3882
4183
|
return normalizeStringWithStatus(uri, opts).normalized;
|
|
3883
4184
|
}
|
|
3884
4185
|
function normalizeStringWithStatus(uri, opts) {
|
|
3885
|
-
const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
|
|
4186
|
+
const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts);
|
|
3886
4187
|
return {
|
|
3887
|
-
normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
|
|
3888
|
-
malformedAuthorityOrPort
|
|
4188
|
+
normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts),
|
|
4189
|
+
malformedAuthorityOrPort,
|
|
4190
|
+
malformedPercentEncoding,
|
|
4191
|
+
malformedSchemeSpecific,
|
|
4192
|
+
malformedHost,
|
|
4193
|
+
malformedScheme
|
|
3889
4194
|
};
|
|
3890
4195
|
}
|
|
3891
4196
|
function normalizeComparableURI(uri, opts) {
|
|
3892
|
-
if (typeof uri
|
|
3893
|
-
|
|
3894
|
-
return malformedAuthorityOrPort ? void 0 : normalized;
|
|
4197
|
+
if (typeof uri !== "string" && typeof uri !== "object") {
|
|
4198
|
+
return void 0;
|
|
3895
4199
|
}
|
|
3896
|
-
|
|
3897
|
-
|
|
4200
|
+
let value;
|
|
4201
|
+
try {
|
|
4202
|
+
value = typeof uri === "string" ? uri : serialize(uri, opts);
|
|
4203
|
+
} catch {
|
|
4204
|
+
return void 0;
|
|
3898
4205
|
}
|
|
4206
|
+
const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts);
|
|
4207
|
+
return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized;
|
|
3899
4208
|
}
|
|
3900
4209
|
var fastUri = {
|
|
3901
4210
|
SCHEMES,
|
|
@@ -23045,17 +23354,33 @@ function normalizeObjectSchema(schema) {
|
|
|
23045
23354
|
}
|
|
23046
23355
|
return void 0;
|
|
23047
23356
|
}
|
|
23357
|
+
function getDotPath(path) {
|
|
23358
|
+
if (path.length === 0) {
|
|
23359
|
+
return "object root";
|
|
23360
|
+
}
|
|
23361
|
+
return path.reduce((acc, seg, index) => {
|
|
23362
|
+
if (index === 0) {
|
|
23363
|
+
return String(seg);
|
|
23364
|
+
}
|
|
23365
|
+
if (typeof seg === "number") {
|
|
23366
|
+
return `${acc}[${seg}]`;
|
|
23367
|
+
}
|
|
23368
|
+
return `${acc}.${seg}`;
|
|
23369
|
+
}, "");
|
|
23370
|
+
}
|
|
23048
23371
|
function getParseErrorMessage(error51) {
|
|
23049
23372
|
if (error51 && typeof error51 === "object") {
|
|
23373
|
+
if ("issues" in error51 && Array.isArray(error51.issues) && error51.issues.length > 0) {
|
|
23374
|
+
return error51.issues.map((i) => {
|
|
23375
|
+
if (!i.path?.length) {
|
|
23376
|
+
return i.message;
|
|
23377
|
+
}
|
|
23378
|
+
return `${i.message} at ${getDotPath(i.path)}`;
|
|
23379
|
+
}).join("\n");
|
|
23380
|
+
}
|
|
23050
23381
|
if ("message" in error51 && typeof error51.message === "string") {
|
|
23051
23382
|
return error51.message;
|
|
23052
23383
|
}
|
|
23053
|
-
if ("issues" in error51 && Array.isArray(error51.issues) && error51.issues.length > 0) {
|
|
23054
|
-
const firstIssue = error51.issues[0];
|
|
23055
|
-
if (firstIssue && typeof firstIssue === "object" && "message" in firstIssue) {
|
|
23056
|
-
return String(firstIssue.message);
|
|
23057
|
-
}
|
|
23058
|
-
}
|
|
23059
23384
|
try {
|
|
23060
23385
|
return JSON.stringify(error51);
|
|
23061
23386
|
} catch {
|
|
@@ -29670,16 +29995,7 @@ var Server = class extends Protocol {
|
|
|
29670
29995
|
if (!methodSchema) {
|
|
29671
29996
|
throw new Error("Schema is missing a method literal");
|
|
29672
29997
|
}
|
|
29673
|
-
|
|
29674
|
-
if (isZ4Schema(methodSchema)) {
|
|
29675
|
-
const v4Schema = methodSchema;
|
|
29676
|
-
const v4Def = v4Schema._zod?.def;
|
|
29677
|
-
methodValue = v4Def?.value ?? v4Schema.value;
|
|
29678
|
-
} else {
|
|
29679
|
-
const v3Schema = methodSchema;
|
|
29680
|
-
const legacyDef = v3Schema._def;
|
|
29681
|
-
methodValue = legacyDef?.value ?? v3Schema.value;
|
|
29682
|
-
}
|
|
29998
|
+
const methodValue = getLiteralValue(methodSchema);
|
|
29683
29999
|
if (typeof methodValue !== "string") {
|
|
29684
30000
|
throw new Error("Schema method literal must be a string");
|
|
29685
30001
|
}
|
|
@@ -30867,8 +31183,17 @@ var EMPTY_COMPLETION_RESULT = {
|
|
|
30867
31183
|
import process3 from "node:process";
|
|
30868
31184
|
|
|
30869
31185
|
// node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
|
|
31186
|
+
var STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;
|
|
30870
31187
|
var ReadBuffer = class {
|
|
31188
|
+
constructor(options) {
|
|
31189
|
+
this._maxBufferSize = options?.maxBufferSize ?? STDIO_DEFAULT_MAX_BUFFER_SIZE;
|
|
31190
|
+
}
|
|
30871
31191
|
append(chunk) {
|
|
31192
|
+
const newSize = (this._buffer?.length ?? 0) + chunk.length;
|
|
31193
|
+
if (newSize > this._maxBufferSize) {
|
|
31194
|
+
this.clear();
|
|
31195
|
+
throw new Error(`ReadBuffer exceeded maximum size of ${this._maxBufferSize} bytes`);
|
|
31196
|
+
}
|
|
30872
31197
|
this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;
|
|
30873
31198
|
}
|
|
30874
31199
|
readMessage() {
|
|
@@ -30896,18 +31221,24 @@ function serializeMessage(message) {
|
|
|
30896
31221
|
|
|
30897
31222
|
// node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
|
|
30898
31223
|
var StdioServerTransport = class {
|
|
30899
|
-
constructor(_stdin = process3.stdin, _stdout = process3.stdout) {
|
|
31224
|
+
constructor(_stdin = process3.stdin, _stdout = process3.stdout, options) {
|
|
30900
31225
|
this._stdin = _stdin;
|
|
30901
31226
|
this._stdout = _stdout;
|
|
30902
|
-
this._readBuffer = new ReadBuffer();
|
|
30903
31227
|
this._started = false;
|
|
30904
31228
|
this._ondata = (chunk) => {
|
|
30905
|
-
|
|
30906
|
-
|
|
31229
|
+
try {
|
|
31230
|
+
this._readBuffer.append(chunk);
|
|
31231
|
+
this.processReadBuffer();
|
|
31232
|
+
} catch (error51) {
|
|
31233
|
+
this.onerror?.(error51);
|
|
31234
|
+
this.close().catch(() => {
|
|
31235
|
+
});
|
|
31236
|
+
}
|
|
30907
31237
|
};
|
|
30908
31238
|
this._onerror = (error51) => {
|
|
30909
31239
|
this.onerror?.(error51);
|
|
30910
31240
|
};
|
|
31241
|
+
this._readBuffer = new ReadBuffer({ maxBufferSize: options?.maxBufferSize });
|
|
30911
31242
|
}
|
|
30912
31243
|
/**
|
|
30913
31244
|
* Starts listening for messages on stdin.
|
|
@@ -34551,7 +34882,7 @@ function buildMetaTools(state) {
|
|
|
34551
34882
|
}
|
|
34552
34883
|
|
|
34553
34884
|
// src/index.ts
|
|
34554
|
-
var version2 = true ? "0.20.
|
|
34885
|
+
var version2 = true ? "0.20.2" : resolveVersionFallback();
|
|
34555
34886
|
var subcommand = process.argv[2];
|
|
34556
34887
|
var USAGE = `Usage: tailscale-mcp [command]
|
|
34557
34888
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yawlabs/tailscale-mcp",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.2",
|
|
4
4
|
"mcpName": "io.github.YawLabs/tailscale-mcp",
|
|
5
5
|
"description": "Tailscale MCP server: admin-API tools for devices, ACLs, DNS, auth keys, users, and audit logs, plus a CLI to validate and deploy ACLs.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -62,15 +62,15 @@
|
|
|
62
62
|
"prepublishOnly": "npm run clean && npm run build"
|
|
63
63
|
},
|
|
64
64
|
"overrides": {
|
|
65
|
-
"hono": "^4.
|
|
66
|
-
"@hono/node-server": "^1.19.
|
|
67
|
-
"fast-uri": "^3.1.
|
|
68
|
-
"ip-address": "^10.
|
|
69
|
-
"qs": "^6.
|
|
65
|
+
"hono": "^4.13.5",
|
|
66
|
+
"@hono/node-server": "^1.19.15",
|
|
67
|
+
"fast-uri": "^3.1.6",
|
|
68
|
+
"ip-address": "^10.3.1",
|
|
69
|
+
"qs": "^6.16.0"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@biomejs/biome": "^2.4.12",
|
|
73
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
73
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
74
74
|
"@types/node": "^26.0.0",
|
|
75
75
|
"esbuild": "^0.28.1",
|
|
76
76
|
"postject": "^1.0.0-alpha.6",
|