trousse 2.10.0 → 2.11.0
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.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/urls.d.ts +1 -0
- package/dist/urls.js +40 -2
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -9,5 +9,5 @@ import { anyWordMatchesAnyOf, endsWithAnyOf, escapeRegex, getAnyOf, includesAnyO
|
|
|
9
9
|
import { createAcceptHeader, feedMimeTypes, genericFeedMimeTypes, genericHtmlMimeTypes, htmlMimeTypes } from "./mimes.js";
|
|
10
10
|
import { omit, pick, toMap, trimObject } from "./objects.js";
|
|
11
11
|
import { sleep } from "./timers.js";
|
|
12
|
-
import { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme } from "./urls.js";
|
|
13
|
-
export { type AnyOf, type DeepOmit, type IsPlainObject, type MaybePromise, type NormalizeOptions, type Nullish, type PartialNullish, type Pattern, type RegistrableDomainOptions, type WeightedMimeType, addMissingProtocol, addMissingScheme, anyWordMatchesAnyOf, archiveExtensions, audioExtensions, codeExtensions, coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString, createAcceptHeader, createUrlVariants, decodeSegment, documentExtensions, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getRegistrableDomain, getSubdomain, htmlMimeTypes, imageExtensions, includesAnyOf, installerExtensions, isAnyOf, isBoolean, isFunction, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isJsonLike, isNonEmptyString, isNullish, isNumber, isObject, isParseableJson, isPlainObject, isPresent, isString, isSubdomainOf, isValidDate, normalizeUrl, omit, omitEmpty, parseUrl, pick, resolveFeedProtocol, resolveFeedScheme, resolveUrl, sleep, startsWithAnyOf, stripWww, subtitleExtensions, t, toMap, trimObject, tx, upgradeProtocol, upgradeScheme, videoExtensions };
|
|
12
|
+
import { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme } from "./urls.js";
|
|
13
|
+
export { type AnyOf, type DeepOmit, type IsPlainObject, type MaybePromise, type NormalizeOptions, type Nullish, type PartialNullish, type Pattern, type RegistrableDomainOptions, type WeightedMimeType, addMissingProtocol, addMissingScheme, anyWordMatchesAnyOf, archiveExtensions, audioExtensions, codeExtensions, coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString, createAcceptHeader, createUrlVariants, decodeSegment, documentExtensions, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getRegistrableDomain, getSubdomain, htmlMimeTypes, imageExtensions, includesAnyOf, installerExtensions, isAnyOf, isBoolean, isFunction, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isJsonLike, isNonEmptyString, isNullish, isNumber, isObject, isParseableJson, isPlainObject, isPresent, isString, isSubdomainOf, isValidDate, normalizeUrl, omit, omitEmpty, parseUrl, pick, resolveFeedProtocol, resolveFeedScheme, resolveUrl, sleep, startsWithAnyOf, stripWww, subtitleExtensions, t, toMap, trimObject, tx, upgradeProtocol, upgradeScheme, videoExtensions };
|
package/dist/index.js
CHANGED
|
@@ -8,5 +8,5 @@ import { anyWordMatchesAnyOf, endsWithAnyOf, escapeRegex, getAnyOf, includesAnyO
|
|
|
8
8
|
import { createAcceptHeader, feedMimeTypes, genericFeedMimeTypes, genericHtmlMimeTypes, htmlMimeTypes } from "./mimes.js";
|
|
9
9
|
import { omit, pick, toMap, trimObject } from "./objects.js";
|
|
10
10
|
import { sleep } from "./timers.js";
|
|
11
|
-
import { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme } from "./urls.js";
|
|
12
|
-
export { addMissingProtocol, addMissingScheme, anyWordMatchesAnyOf, archiveExtensions, audioExtensions, codeExtensions, coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString, createAcceptHeader, createUrlVariants, decodeSegment, documentExtensions, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getRegistrableDomain, getSubdomain, htmlMimeTypes, imageExtensions, includesAnyOf, installerExtensions, isAnyOf, isBoolean, isFunction, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isJsonLike, isNonEmptyString, isNullish, isNumber, isObject, isParseableJson, isPlainObject, isPresent, isString, isSubdomainOf, isValidDate, normalizeUrl, omit, omitEmpty, parseUrl, pick, resolveFeedProtocol, resolveFeedScheme, resolveUrl, sleep, startsWithAnyOf, stripWww, subtitleExtensions, t, toMap, trimObject, tx, upgradeProtocol, upgradeScheme, videoExtensions };
|
|
11
|
+
import { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme } from "./urls.js";
|
|
12
|
+
export { addMissingProtocol, addMissingScheme, anyWordMatchesAnyOf, archiveExtensions, audioExtensions, codeExtensions, coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString, createAcceptHeader, createUrlVariants, decodeSegment, documentExtensions, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getRegistrableDomain, getSubdomain, htmlMimeTypes, imageExtensions, includesAnyOf, installerExtensions, isAnyOf, isBoolean, isFunction, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isJsonLike, isNonEmptyString, isNullish, isNumber, isObject, isParseableJson, isPlainObject, isPresent, isString, isSubdomainOf, isValidDate, normalizeUrl, omit, omitEmpty, parseUrl, pick, resolveFeedProtocol, resolveFeedScheme, resolveUrl, sleep, startsWithAnyOf, stripWww, subtitleExtensions, t, toMap, trimObject, tx, upgradeProtocol, upgradeScheme, videoExtensions };
|
package/dist/urls.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const isHostOrSubdomainOf: (url: string | URL, domains: string |
|
|
|
9
9
|
export declare const getSubdomain: (url: string | URL, domains: string | ReadonlyArray<string>) => string | undefined;
|
|
10
10
|
export declare const decodeSegment: (segment: string | undefined) => string | undefined;
|
|
11
11
|
export declare const fixMalformedScheme: (url: string) => string;
|
|
12
|
+
export declare const fixMalformedQuery: (url: string) => string;
|
|
12
13
|
export declare const resolveFeedScheme: (url: string, scheme?: 'http' | 'https') => string;
|
|
13
14
|
export declare const addMissingScheme: (url: string, scheme?: 'http' | 'https') => string;
|
|
14
15
|
export declare const upgradeScheme: (url: string, scheme?: 'http' | 'https') => string;
|
package/dist/urls.js
CHANGED
|
@@ -78,6 +78,7 @@ const percentEscapeOrLettersRegex = /%[0-9A-Fa-f]{2}|[A-Z]+/g;
|
|
|
78
78
|
const plusRegex = /\+/g;
|
|
79
79
|
const httpSchemeRegex = /^http:\/\//i;
|
|
80
80
|
const httpsSchemeRegex = /^https:\/\//i;
|
|
81
|
+
const repeatedSlashesRegex = /(?<!:|%3a)\/{2,}/gi;
|
|
81
82
|
const leadingWhitespaceChars = [
|
|
82
83
|
" ",
|
|
83
84
|
" ",
|
|
@@ -119,6 +120,43 @@ const fixMalformedScheme = (url) => {
|
|
|
119
120
|
}
|
|
120
121
|
return url;
|
|
121
122
|
};
|
|
123
|
+
const nestedUrlRegex = /[a-z][a-z\d+.-]*(?::|%3A)(?:\/\/|%2F%2F)|(?<=[=?&])(?:\/\/|%2F%2F)/i;
|
|
124
|
+
const httpOrSchemeRelativeRegex = /^(?:https?:)?\/\//i;
|
|
125
|
+
const fixMalformedQuery = (url) => {
|
|
126
|
+
if (!httpOrSchemeRelativeRegex.test(url)) return url;
|
|
127
|
+
const hashIndex = url.indexOf("#");
|
|
128
|
+
const hasFragment = hashIndex !== -1;
|
|
129
|
+
const head = hasFragment ? url.slice(0, hashIndex) : url;
|
|
130
|
+
const fragment = hasFragment ? url.slice(hashIndex) : "";
|
|
131
|
+
const authorityEnd = head.indexOf("//") + 2;
|
|
132
|
+
const nestedOffset = head.slice(authorityEnd).search(nestedUrlRegex);
|
|
133
|
+
const ownEnd = nestedOffset !== -1 ? authorityEnd + nestedOffset : head.length;
|
|
134
|
+
const markIndex = head.indexOf("?");
|
|
135
|
+
const hasMark = markIndex !== -1 && markIndex < ownEnd;
|
|
136
|
+
const secondMarkIndex = hasMark ? head.indexOf("?", markIndex + 1) : -1;
|
|
137
|
+
const hasSecondMark = secondMarkIndex !== -1 && secondMarkIndex < ownEnd;
|
|
138
|
+
const pathIndex = head.indexOf("/", authorityEnd);
|
|
139
|
+
const pathEnd = hasMark ? markIndex : ownEnd;
|
|
140
|
+
const glueIndex = pathIndex !== -1 && pathIndex < pathEnd ? head.indexOf("&", pathIndex) : -1;
|
|
141
|
+
const isGlued = glueIndex !== -1 && glueIndex < pathEnd;
|
|
142
|
+
if (!isGlued && !hasSecondMark) return url;
|
|
143
|
+
const queryIndex = isGlued ? glueIndex : markIndex;
|
|
144
|
+
const queryStart = queryIndex + (isGlued && head[glueIndex + 1] === "?" ? 2 : 1);
|
|
145
|
+
let query = "";
|
|
146
|
+
let hasValue = false;
|
|
147
|
+
for (let index = queryStart; index < ownEnd; index++) {
|
|
148
|
+
const character = head[index];
|
|
149
|
+
if (character === "?" && (hasValue || isGlued && index === markIndex)) {
|
|
150
|
+
query += "&";
|
|
151
|
+
hasValue = false;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (character === "&") hasValue = false;
|
|
155
|
+
if (character === "=") hasValue = true;
|
|
156
|
+
query += character;
|
|
157
|
+
}
|
|
158
|
+
return `${head.slice(0, queryIndex)}?${query}${head.slice(ownEnd)}${fragment}`;
|
|
159
|
+
};
|
|
122
160
|
const feedSchemes = [
|
|
123
161
|
"feed:",
|
|
124
162
|
"rss:",
|
|
@@ -235,7 +273,7 @@ const normalizeUrl = (url, options) => {
|
|
|
235
273
|
if (options.stripHash) parsed.hash = "";
|
|
236
274
|
let pathname = parsed.pathname;
|
|
237
275
|
if (options.normalizeEncoding) pathname = decodeAndNormalizeEncoding(pathname);
|
|
238
|
-
if (options.collapseSlashes) pathname = pathname.replace(
|
|
276
|
+
if (options.collapseSlashes) pathname = pathname.replace(repeatedSlashesRegex, "/");
|
|
239
277
|
if (options.stripTrailingSlash && pathname.length > 1 && pathname.endsWith("/")) pathname = pathname.slice(0, -1);
|
|
240
278
|
parsed.pathname = pathname;
|
|
241
279
|
if (options.normalizeEncoding && parsed.search.includes("%")) parsed.search = decodeAndNormalizeEncoding(parsed.search);
|
|
@@ -355,4 +393,4 @@ const addMissingProtocol = addMissingScheme;
|
|
|
355
393
|
/** @deprecated Use `upgradeScheme` instead. */
|
|
356
394
|
const upgradeProtocol = upgradeScheme;
|
|
357
395
|
//#endregion
|
|
358
|
-
export { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme };
|
|
396
|
+
export { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, upgradeProtocol, upgradeScheme };
|
package/package.json
CHANGED