trousse 2.15.1 → 2.16.1
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/arrays.d.ts +1 -3
- package/dist/arrays.js +1 -2
- package/dist/coercions.d.ts +1 -3
- package/dist/coercions.js +1 -2
- package/dist/files.d.ts +1 -3
- package/dist/files.js +1 -2
- package/dist/is.d.ts +1 -3
- package/dist/is.js +1 -2
- package/dist/json.d.ts +1 -3
- package/dist/json.js +1 -2
- package/dist/locales.d.ts +1 -3
- package/dist/locales.js +1 -2
- package/dist/matching.d.ts +4 -6
- package/dist/matching.js +10 -6
- package/dist/mimes.d.ts +1 -3
- package/dist/mimes.js +1 -2
- package/dist/objects.d.ts +1 -3
- package/dist/objects.js +1 -2
- package/dist/timers.d.ts +1 -3
- package/dist/timers.js +1 -2
- package/dist/types.d.ts +1 -3
- package/dist/urls.d.ts +4 -6
- package/dist/urls.js +11 -7
- package/package.json +3 -3
package/dist/arrays.d.ts
CHANGED
package/dist/arrays.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { isPresent } from "./is.js";
|
|
2
|
-
|
|
2
|
+
// src/arrays.ts
|
|
3
3
|
const omitEmpty = (array) => {
|
|
4
4
|
const result = [];
|
|
5
5
|
for (const item of array) if (isPresent(item) && item !== "") result.push(item);
|
|
6
6
|
return result.length ? result : void 0;
|
|
7
7
|
};
|
|
8
|
-
//#endregion
|
|
9
8
|
export { omitEmpty };
|
package/dist/coercions.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { Nullish } from "./types.js";
|
|
2
|
-
//#region src/coercions.d.ts
|
|
3
2
|
export declare const coerceString: (value: unknown) => string | undefined;
|
|
4
3
|
export declare const coerceNumber: (value: unknown) => number | undefined;
|
|
5
4
|
export declare const coerceBoolean: (value: unknown) => boolean | undefined;
|
|
6
5
|
export declare const coerceDate: (value: unknown) => Date | undefined;
|
|
7
6
|
export declare const coerceSingular: <T>(value: T | Array<T>) => T | undefined;
|
|
8
|
-
export declare const coerceArray: <T>(value: Nullish<T | Array<T>>) => Array<T>;
|
|
9
|
-
//#endregion
|
|
7
|
+
export declare const coerceArray: <T>(value: Nullish<T | Array<T>>) => Array<T>;
|
package/dist/coercions.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isBoolean, isNonEmptyString, isNullish, isNumber, isString, isValidDate } from "./is.js";
|
|
2
|
-
|
|
2
|
+
// src/coercions.ts
|
|
3
3
|
const coerceString = (value) => {
|
|
4
4
|
if (isString(value)) return value;
|
|
5
5
|
if (isNumber(value)) return String(value);
|
|
@@ -36,5 +36,4 @@ const coerceArray = (value) => {
|
|
|
36
36
|
if (isNullish(value)) return [];
|
|
37
37
|
return Array.isArray(value) ? value : [value];
|
|
38
38
|
};
|
|
39
|
-
//#endregion
|
|
40
39
|
export { coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString };
|
package/dist/files.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/files.d.ts
|
|
2
1
|
export declare const audioExtensions: string[];
|
|
3
2
|
export declare const videoExtensions: string[];
|
|
4
3
|
export declare const imageExtensions: string[];
|
|
@@ -8,5 +7,4 @@ export declare const installerExtensions: string[];
|
|
|
8
7
|
export declare const flashExtensions: string[];
|
|
9
8
|
export declare const codeExtensions: string[];
|
|
10
9
|
export declare const fontExtensions: string[];
|
|
11
|
-
export declare const subtitleExtensions: string[];
|
|
12
|
-
//#endregion
|
|
10
|
+
export declare const subtitleExtensions: string[];
|
package/dist/files.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/files.ts
|
|
2
2
|
const audioExtensions = [
|
|
3
3
|
"aac",
|
|
4
4
|
"aif",
|
|
@@ -97,5 +97,4 @@ const fontExtensions = [
|
|
|
97
97
|
"woff2"
|
|
98
98
|
];
|
|
99
99
|
const subtitleExtensions = ["srt", "vtt"];
|
|
100
|
-
//#endregion
|
|
101
100
|
export { archiveExtensions, audioExtensions, codeExtensions, documentExtensions, flashExtensions, fontExtensions, imageExtensions, installerExtensions, subtitleExtensions, videoExtensions };
|
package/dist/is.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/is.d.ts
|
|
2
1
|
export declare const isString: (value: unknown) => value is string;
|
|
3
2
|
export declare const isNumber: (value: unknown) => value is number;
|
|
4
3
|
export declare const isBoolean: (value: unknown) => value is boolean;
|
|
@@ -8,5 +7,4 @@ export declare const isNullish: (value: unknown) => value is null | undefined;
|
|
|
8
7
|
export declare const isObject: (value: unknown) => value is object;
|
|
9
8
|
export declare const isPlainObject: (value: unknown) => value is Record<string, unknown>;
|
|
10
9
|
export declare const isNonEmptyString: (value: unknown) => value is string;
|
|
11
|
-
export declare const isValidDate: (value: unknown) => value is Date;
|
|
12
|
-
//#endregion
|
|
10
|
+
export declare const isValidDate: (value: unknown) => value is Date;
|
package/dist/is.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/is.ts
|
|
2
2
|
const isString = (value) => {
|
|
3
3
|
return typeof value === "string";
|
|
4
4
|
};
|
|
@@ -33,5 +33,4 @@ const isNonEmptyString = (value) => {
|
|
|
33
33
|
const isValidDate = (value) => {
|
|
34
34
|
return value instanceof Date && !Number.isNaN(value.getTime());
|
|
35
35
|
};
|
|
36
|
-
//#endregion
|
|
37
36
|
export { isBoolean, isFunction, isNonEmptyString, isNullish, isNumber, isObject, isPlainObject, isPresent, isString, isValidDate };
|
package/dist/json.d.ts
CHANGED
package/dist/json.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/json.ts
|
|
2
2
|
const isWhitespaceCode = (code) => {
|
|
3
3
|
return code >= 9 && code <= 13 || code === 32 || code === 160 || code === 5760 || code >= 8192 && code <= 8202 || code === 8232 || code === 8233 || code === 8239 || code === 8287 || code === 12288 || code === 65279;
|
|
4
4
|
};
|
|
@@ -20,5 +20,4 @@ const isParseableJson = (value) => {
|
|
|
20
20
|
return false;
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
-
//#endregion
|
|
24
23
|
export { isJsonLike, isParseableJson };
|
package/dist/locales.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
//#region src/locales.d.ts
|
|
2
1
|
export declare const escapeHtml: (value: string) => string;
|
|
3
2
|
export declare const t: (template: string, params: Record<string, string | number>) => string;
|
|
4
|
-
export declare const tx: (template: string, params: Record<string, string | number>) => string;
|
|
5
|
-
//#endregion
|
|
3
|
+
export declare const tx: (template: string, params: Record<string, string | number>) => string;
|
package/dist/locales.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/locales.ts
|
|
2
2
|
const placeholderRegex = /\{\{(\w+)\}\}/g;
|
|
3
3
|
const escapableRegex = /[&<>"']/g;
|
|
4
4
|
const escapeHtml = (value) => {
|
|
@@ -22,5 +22,4 @@ const tx = (template, params) => {
|
|
|
22
22
|
return Object.hasOwn(params, key) ? escapeHtml(String(params[key])) : placeholder;
|
|
23
23
|
});
|
|
24
24
|
};
|
|
25
|
-
//#endregion
|
|
26
25
|
export { escapeHtml, t, tx };
|
package/dist/matching.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { Pattern } from "./types.js";
|
|
2
|
-
//#region src/matching.d.ts
|
|
3
2
|
export declare const escapeRegex: (value: string) => string;
|
|
4
3
|
export declare const isAnyOf: (value: string | undefined, patterns: Pattern | ReadonlyArray<Pattern>, parser?: (value: string) => string) => boolean;
|
|
5
4
|
export declare const getAnyOf: <T extends string>(value: string | undefined, patterns: ReadonlyArray<T>, parser?: (value: string) => string) => T | undefined;
|
|
6
|
-
export declare const includesAnyOf: (value: string | undefined, patterns: ReadonlyArray<Pattern>, parser?: (value: string) => string) => boolean;
|
|
7
|
-
export declare const startsWithAnyOf: (value: string, patterns: ReadonlyArray<Pattern>) => boolean;
|
|
8
|
-
export declare const endsWithAnyOf: (value: string, patterns: ReadonlyArray<Pattern>) => boolean;
|
|
9
|
-
export declare const anyWordMatchesAnyOf: (value: string, patterns: ReadonlyArray<Pattern>) => boolean;
|
|
10
|
-
//#endregion
|
|
5
|
+
export declare const includesAnyOf: (value: string | undefined, patterns: Pattern | ReadonlyArray<Pattern>, parser?: (value: string) => string) => boolean;
|
|
6
|
+
export declare const startsWithAnyOf: (value: string | undefined, patterns: Pattern | ReadonlyArray<Pattern>) => boolean;
|
|
7
|
+
export declare const endsWithAnyOf: (value: string | undefined, patterns: Pattern | ReadonlyArray<Pattern>) => boolean;
|
|
8
|
+
export declare const anyWordMatchesAnyOf: (value: string, patterns: ReadonlyArray<Pattern>) => boolean;
|
package/dist/matching.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isNullish } from "./is.js";
|
|
2
|
-
|
|
2
|
+
// src/matching.ts
|
|
3
3
|
const whitespaceRegex = /\s+/;
|
|
4
4
|
const regexSyntaxCharsRegex = /[.*+?^${}()|[\]\\/]/;
|
|
5
5
|
const regexEscapableCharsRegex = /[.*+?^${}()|[\]\\/&!#%,:;<=>@`~-]/g;
|
|
@@ -10,6 +10,9 @@ const testRegex = (regex, value) => {
|
|
|
10
10
|
const testRegexAnyCase = (regex, lowerValue, value) => {
|
|
11
11
|
return testRegex(regex, lowerValue) || lowerValue !== value && testRegex(regex, value);
|
|
12
12
|
};
|
|
13
|
+
const toPatternList = (patterns) => {
|
|
14
|
+
return typeof patterns === "string" || patterns instanceof RegExp ? [patterns] : patterns;
|
|
15
|
+
};
|
|
13
16
|
const escapeRegex = (value) => {
|
|
14
17
|
return value.replace(regexEscapableCharsRegex, (char) => {
|
|
15
18
|
if (regexSyntaxCharsRegex.test(char)) return `\\${char}`;
|
|
@@ -20,7 +23,7 @@ const isAnyOf = (value, patterns, parser) => {
|
|
|
20
23
|
if (isNullish(value)) return false;
|
|
21
24
|
const parsedValue = parser ? parser(value) : value.toLowerCase().trim();
|
|
22
25
|
const originalValue = parser ? parsedValue : value.trim();
|
|
23
|
-
return (
|
|
26
|
+
return toPatternList(patterns).some((pattern) => {
|
|
24
27
|
if (pattern instanceof RegExp) return testRegexAnyCase(pattern, parsedValue, originalValue);
|
|
25
28
|
return parsedValue === (parser ? pattern : pattern.toLowerCase().trim());
|
|
26
29
|
});
|
|
@@ -36,21 +39,23 @@ const includesAnyOf = (value, patterns, parser) => {
|
|
|
36
39
|
if (isNullish(value)) return false;
|
|
37
40
|
const parsedValue = parser ? parser(value) : value.toLowerCase();
|
|
38
41
|
const originalValue = parser ? parsedValue : value;
|
|
39
|
-
return patterns.some((pattern) => {
|
|
42
|
+
return toPatternList(patterns).some((pattern) => {
|
|
40
43
|
if (pattern instanceof RegExp) return testRegexAnyCase(pattern, parsedValue, originalValue);
|
|
41
44
|
return pattern && parsedValue.includes(parser ? pattern : pattern.toLowerCase());
|
|
42
45
|
});
|
|
43
46
|
};
|
|
44
47
|
const startsWithAnyOf = (value, patterns) => {
|
|
48
|
+
if (isNullish(value)) return false;
|
|
45
49
|
const lowerValue = value.toLowerCase();
|
|
46
|
-
return patterns.some((pattern) => {
|
|
50
|
+
return toPatternList(patterns).some((pattern) => {
|
|
47
51
|
if (pattern instanceof RegExp) return testRegexAnyCase(pattern, lowerValue, value);
|
|
48
52
|
return pattern && lowerValue.startsWith(pattern.toLowerCase());
|
|
49
53
|
});
|
|
50
54
|
};
|
|
51
55
|
const endsWithAnyOf = (value, patterns) => {
|
|
56
|
+
if (isNullish(value)) return false;
|
|
52
57
|
const lowerValue = value.toLowerCase();
|
|
53
|
-
return patterns.some((pattern) => {
|
|
58
|
+
return toPatternList(patterns).some((pattern) => {
|
|
54
59
|
if (pattern instanceof RegExp) return testRegexAnyCase(pattern, lowerValue, value);
|
|
55
60
|
return pattern && lowerValue.endsWith(pattern.toLowerCase());
|
|
56
61
|
});
|
|
@@ -74,5 +79,4 @@ const anyWordMatchesAnyOf = (value, patterns) => {
|
|
|
74
79
|
}
|
|
75
80
|
return false;
|
|
76
81
|
};
|
|
77
|
-
//#endregion
|
|
78
82
|
export { anyWordMatchesAnyOf, endsWithAnyOf, escapeRegex, getAnyOf, includesAnyOf, isAnyOf, startsWithAnyOf };
|
package/dist/mimes.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { WeightedMimeType } from "./types.js";
|
|
2
|
-
//#region src/mimes.d.ts
|
|
3
2
|
export declare const feedMimeTypes: Array<WeightedMimeType>;
|
|
4
3
|
export declare const genericFeedMimeTypes: Array<WeightedMimeType>;
|
|
5
4
|
export declare const htmlMimeTypes: Array<WeightedMimeType>;
|
|
6
5
|
export declare const genericHtmlMimeTypes: Array<WeightedMimeType>;
|
|
7
|
-
export declare const createAcceptHeader: (types: ReadonlyArray<WeightedMimeType>) => string;
|
|
8
|
-
//#endregion
|
|
6
|
+
export declare const createAcceptHeader: (types: ReadonlyArray<WeightedMimeType>) => string;
|
package/dist/mimes.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/mimes.ts
|
|
2
2
|
const feedMimeTypes = [
|
|
3
3
|
{
|
|
4
4
|
mime: "application/atom+xml",
|
|
@@ -99,5 +99,4 @@ const createAcceptHeader = (types) => {
|
|
|
99
99
|
return `${type.mime};q=${type.quality}`;
|
|
100
100
|
}).join(", ");
|
|
101
101
|
};
|
|
102
|
-
//#endregion
|
|
103
102
|
export { createAcceptHeader, feedMimeTypes, genericFeedMimeTypes, genericHtmlMimeTypes, htmlMimeTypes };
|
package/dist/objects.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { AnyOf } from "./types.js";
|
|
2
|
-
//#region src/objects.d.ts
|
|
3
2
|
export declare const pick: <T extends object, K extends keyof T>(object: T, keys: ReadonlyArray<K>) => Pick<T, K>;
|
|
4
3
|
export declare const omit: <T extends object, K extends keyof T>(object: T, keys: ReadonlyArray<K>) => Omit<T, K>;
|
|
5
4
|
export declare const trimObject: <T extends Record<string, unknown>>(object: T, keep?: (value: unknown) => boolean) => AnyOf<T> | undefined;
|
|
6
|
-
export declare const toMap: <V>(record: Record<string, V>) => Map<string, V>;
|
|
7
|
-
//#endregion
|
|
5
|
+
export declare const toMap: <V>(record: Record<string, V>) => Map<string, V>;
|
package/dist/objects.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isPresent } from "./is.js";
|
|
2
|
-
|
|
2
|
+
// src/objects.ts
|
|
3
3
|
const setKey = (object, key, value) => {
|
|
4
4
|
if (key === "__proto__") {
|
|
5
5
|
Object.defineProperty(object, key, {
|
|
@@ -42,5 +42,4 @@ const trimObject = (object, keep = isPresent) => {
|
|
|
42
42
|
const toMap = (record) => {
|
|
43
43
|
return new Map(Object.entries(record));
|
|
44
44
|
};
|
|
45
|
-
//#endregion
|
|
46
45
|
export { omit, pick, toMap, trimObject };
|
package/dist/timers.d.ts
CHANGED
package/dist/timers.js
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/types.d.ts
|
|
2
1
|
export type AnyOf<T> = Partial<{ [Key in keyof T]-?: NonNullable<T[Key]>; }> & { [Key in keyof T]-?: Pick<{ [InnerKey in keyof T]-?: NonNullable<T[InnerKey]>; }, Key>; }[keyof T];
|
|
3
2
|
export type IsPlainObject<T> = T extends Array<unknown> ? false : T extends ((...args: Array<unknown>) => unknown) ? false : T extends Date ? false : T extends object ? T extends null ? false : true : false;
|
|
4
3
|
export type DeepOmit<T, Keys extends string> = T extends Array<infer Item> ? Array<DeepOmit<Item, Keys>> : IsPlainObject<T> extends true ? Pick<{ [Key in keyof T]: DeepOmit<T[Key], Keys>; }, Exclude<keyof T, Keys>> : T;
|
|
@@ -31,5 +30,4 @@ export type NormalizeOptions = {
|
|
|
31
30
|
export type WeightedMimeType = {
|
|
32
31
|
mime: string;
|
|
33
32
|
quality: number;
|
|
34
|
-
};
|
|
35
|
-
//#endregion
|
|
33
|
+
};
|
package/dist/urls.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { NormalizeOptions, RegistrableDomainOptions } from "./types.js";
|
|
2
|
-
|
|
3
|
-
export declare const parseUrl: (value: string | URL, base?: string | URL) => URL | undefined;
|
|
1
|
+
import { NormalizeOptions, Nullish, RegistrableDomainOptions } from "./types.js";
|
|
2
|
+
export declare const parseUrl: (value: Nullish<string | URL>, base?: string | URL) => URL | undefined;
|
|
4
3
|
export declare const getPathSegments: (value: string | URL) => Array<string>;
|
|
5
4
|
export declare const isHostOf: (url: string | URL, hosts: string | ReadonlyArray<string>) => boolean;
|
|
6
5
|
export declare const isSubdomainOf: (url: string | URL, domains: string | ReadonlyArray<string>) => boolean;
|
|
@@ -12,7 +11,7 @@ export declare const decodePercent: (value: string) => string;
|
|
|
12
11
|
export declare const encodePathSegment: (value: string) => string;
|
|
13
12
|
export declare const getQueryParams: (params: URLSearchParams | undefined, name: string) => Array<string>;
|
|
14
13
|
export declare const getQueryParam: (params: URLSearchParams | undefined, name: string) => string | undefined;
|
|
15
|
-
export declare const composeQuery: (params?: Record<string, string>) => string;
|
|
14
|
+
export declare const composeQuery: (params?: Record<string, string | number>) => string;
|
|
16
15
|
export declare const fixMalformedScheme: (url: string) => string;
|
|
17
16
|
export declare const fixMalformedQuery: (url: string) => string;
|
|
18
17
|
export declare const trimUrlValues: (url: string) => string;
|
|
@@ -33,5 +32,4 @@ export declare const resolveFeedProtocol: typeof resolveFeedScheme;
|
|
|
33
32
|
/** @deprecated Use `addMissingScheme` instead. */
|
|
34
33
|
export declare const addMissingProtocol: typeof addMissingScheme;
|
|
35
34
|
/** @deprecated Use `upgradeScheme` instead. */
|
|
36
|
-
export declare const upgradeProtocol: typeof upgradeScheme;
|
|
37
|
-
//#endregion
|
|
35
|
+
export declare const upgradeProtocol: typeof upgradeScheme;
|
package/dist/urls.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { isNullish } from "./is.js";
|
|
1
2
|
import { endsWithAnyOf, isAnyOf } from "./matching.js";
|
|
2
3
|
import { decodeHTMLStrict } from "entities";
|
|
3
|
-
|
|
4
|
+
// src/urls.ts
|
|
4
5
|
const httpSchemes = ["http:", "https:"];
|
|
5
6
|
const parseUrl = (value, base) => {
|
|
7
|
+
if (isNullish(value)) return;
|
|
6
8
|
if (value instanceof URL && base === void 0) return value;
|
|
7
9
|
if (URL.parse) return URL.parse(value, base) ?? void 0;
|
|
8
10
|
try {
|
|
@@ -108,7 +110,7 @@ const composeQuery = (params) => {
|
|
|
108
110
|
return part.replace(queryPartEscapeRegex, (character) => encodeURIComponent(character));
|
|
109
111
|
};
|
|
110
112
|
const pairs = Object.entries(params ?? {}).map(([name, value]) => {
|
|
111
|
-
return `${escapePart(name)}=${escapePart(value)}`;
|
|
113
|
+
return `${escapePart(name)}=${escapePart(String(value))}`;
|
|
112
114
|
});
|
|
113
115
|
return pairs.length > 0 ? `?${pairs.join("&")}` : "";
|
|
114
116
|
};
|
|
@@ -178,8 +180,13 @@ const fixMalformedScheme = (url) => {
|
|
|
178
180
|
};
|
|
179
181
|
const nestedUrlRegex = /[a-z][a-z\d+.-]*(?::|%3A)(?:\/\/|%2F%2F)|(?<=[=?&])(?:\/\/|%2F%2F)/i;
|
|
180
182
|
const httpOrSchemeRelativeRegex = /^(?:https?:)?\/\//i;
|
|
183
|
+
const slugTailRegex = /[/.-]/;
|
|
181
184
|
const lostSeparatorRegex = /(?<!\s)\s+(?=[A-Za-z_][\w.-]*=)/g;
|
|
182
185
|
const slashClosedValueRegex = /(=[^&/=]+)\/+(?=&|$)/g;
|
|
186
|
+
const isGlueTail = (head, glueIndex, pathEnd) => {
|
|
187
|
+
const tail = head.slice(glueIndex + 1, pathEnd).split("&")[0] ?? "";
|
|
188
|
+
return tail.includes("=") || !slugTailRegex.test(tail);
|
|
189
|
+
};
|
|
183
190
|
const fixMalformedQuery = (url) => {
|
|
184
191
|
if (!httpOrSchemeRelativeRegex.test(url)) return url;
|
|
185
192
|
const hashIndex = url.indexOf("#");
|
|
@@ -195,7 +202,7 @@ const fixMalformedQuery = (url) => {
|
|
|
195
202
|
const pathIndex = head.indexOf("/", authorityEnd);
|
|
196
203
|
const pathEnd = hasMark ? markIndex : ownEnd;
|
|
197
204
|
const glueIndex = pathIndex !== -1 && pathIndex < pathEnd ? head.indexOf("&", pathIndex) : -1;
|
|
198
|
-
const isGlued = glueIndex !== -1 && glueIndex < pathEnd;
|
|
205
|
+
const isGlued = glueIndex !== -1 && glueIndex < pathEnd && isGlueTail(head, glueIndex, pathEnd);
|
|
199
206
|
if (!isGlued && !hasMark) return url;
|
|
200
207
|
const queryIndex = isGlued ? glueIndex : markIndex;
|
|
201
208
|
const queryStart = queryIndex + (isGlued && head[glueIndex + 1] === "?" ? 2 : 1);
|
|
@@ -282,9 +289,7 @@ const addMissingScheme = (url, scheme = "https") => {
|
|
|
282
289
|
if (relativeLeadChars.includes(url.charAt(0))) return url;
|
|
283
290
|
const slashIndex = url.indexOf("/");
|
|
284
291
|
const dotIndex = url.indexOf(".");
|
|
285
|
-
if (dotIndex
|
|
286
|
-
if (!localhostRegex.test(url)) return url;
|
|
287
|
-
}
|
|
292
|
+
if (!(dotIndex !== -1 && (slashIndex === -1 || dotIndex < slashIndex)) && !localhostRegex.test(url)) return url;
|
|
288
293
|
const firstChar = url.charAt(0);
|
|
289
294
|
if (leadingWhitespaceChars.includes(firstChar)) return url;
|
|
290
295
|
return `${scheme}://${url}`;
|
|
@@ -509,5 +514,4 @@ const resolveFeedProtocol = resolveFeedScheme;
|
|
|
509
514
|
const addMissingProtocol = addMissingScheme;
|
|
510
515
|
/** @deprecated Use `upgradeScheme` instead. */
|
|
511
516
|
const upgradeProtocol = upgradeScheme;
|
|
512
|
-
//#endregion
|
|
513
517
|
export { addMissingProtocol, addMissingScheme, composeQuery, createUrlSpellings, createUrlVariants, decodePercent, decodeSegment, encodePathSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, upgradeProtocol, upgradeScheme };
|
package/package.json
CHANGED
|
@@ -40,11 +40,11 @@
|
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/bun": "^1.4.2",
|
|
43
|
-
"kvalita": "^1.
|
|
44
|
-
"tsdown": "
|
|
43
|
+
"kvalita": "^1.26.4",
|
|
44
|
+
"tsdown": "0.23.1"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"entities": "^8.1.0"
|
|
48
48
|
},
|
|
49
|
-
"version": "2.
|
|
49
|
+
"version": "2.16.1"
|
|
50
50
|
}
|