trousse 2.13.0 → 2.14.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/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, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, 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, getQueryParam, getQueryParams, 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, trimUrlValues, tx, upgradeProtocol, upgradeScheme, videoExtensions };
12
+ import { addMissingProtocol, addMissingScheme, composeQuery, createUrlSpellings, createUrlVariants, decodeSegment, encodePathSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, 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, composeQuery, createAcceptHeader, createUrlSpellings, createUrlVariants, decodeSegment, documentExtensions, encodePathSegment, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getQueryParam, getQueryParams, 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, trimUrlValues, 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, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, 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, getQueryParam, getQueryParams, 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, trimUrlValues, tx, upgradeProtocol, upgradeScheme, videoExtensions };
11
+ import { addMissingProtocol, addMissingScheme, composeQuery, createUrlSpellings, createUrlVariants, decodeSegment, encodePathSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, upgradeProtocol, upgradeScheme } from "./urls.js";
12
+ export { addMissingProtocol, addMissingScheme, anyWordMatchesAnyOf, archiveExtensions, audioExtensions, codeExtensions, coerceArray, coerceBoolean, coerceDate, coerceNumber, coerceSingular, coerceString, composeQuery, createAcceptHeader, createUrlSpellings, createUrlVariants, decodeSegment, documentExtensions, encodePathSegment, endsWithAnyOf, escapeHtml, escapeRegex, feedMimeTypes, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, flashExtensions, fontExtensions, genericFeedMimeTypes, genericHtmlMimeTypes, getAnyOf, getPathSegments, getQueryParam, getQueryParams, 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, trimUrlValues, tx, upgradeProtocol, upgradeScheme, videoExtensions };
package/dist/urls.d.ts CHANGED
@@ -8,8 +8,10 @@ export declare const isHttpUrl: (url: string | URL) => boolean;
8
8
  export declare const isHostOrSubdomainOf: (url: string | URL, domains: string | ReadonlyArray<string>) => boolean;
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
+ export declare const encodePathSegment: (value: string) => string;
11
12
  export declare const getQueryParams: (params: URLSearchParams | undefined, name: string) => Array<string>;
12
13
  export declare const getQueryParam: (params: URLSearchParams | undefined, name: string) => string | undefined;
14
+ export declare const composeQuery: (params?: Record<string, string>) => string;
13
15
  export declare const fixMalformedScheme: (url: string) => string;
14
16
  export declare const fixMalformedQuery: (url: string) => string;
15
17
  export declare const trimUrlValues: (url: string) => string;
@@ -21,6 +23,7 @@ export declare const normalizeUrl: (url: string, options: NormalizeOptions) => s
21
23
  export declare const stripWww: (hostname: string) => string;
22
24
  export declare const isIpAddress: (hostname: string) => boolean;
23
25
  export declare const createUrlVariants: (url: string) => Array<string>;
26
+ export declare const createUrlSpellings: (url: string) => Array<string>;
24
27
  export declare const getRegistrableDomain: (url: string | URL, options?: RegistrableDomainOptions) => string | undefined;
25
28
  /** @deprecated Use `fixMalformedScheme` instead. */
26
29
  export declare const fixMalformedProtocol: typeof fixMalformedScheme;
package/dist/urls.js CHANGED
@@ -57,6 +57,10 @@ const decodeSegment = (segment) => {
57
57
  return decodeURIComponent(segment);
58
58
  } catch {}
59
59
  };
60
+ const pathSegmentEscapeRegex = /[/?#\\\s]/g;
61
+ const encodePathSegment = (value) => {
62
+ return value.replace(pathSegmentEscapeRegex, (character) => encodeURIComponent(character));
63
+ };
60
64
  const getQueryParams = (params, name) => {
61
65
  const values = [];
62
66
  if (!params) return values;
@@ -67,6 +71,16 @@ const getQueryParams = (params, name) => {
67
71
  const getQueryParam = (params, name) => {
68
72
  return getQueryParams(params, name)[0];
69
73
  };
74
+ const queryPartEscapeRegex = /[&#%+\s]/g;
75
+ const composeQuery = (params) => {
76
+ const escapePart = (part) => {
77
+ return part.replace(queryPartEscapeRegex, (character) => encodeURIComponent(character));
78
+ };
79
+ const pairs = Object.entries(params ?? {}).map(([name, value]) => {
80
+ return `${escapePart(name)}=${escapePart(value)}`;
81
+ });
82
+ return pairs.length > 0 ? `?${pairs.join("&")}` : "";
83
+ };
70
84
  const strippedParamsCache = /* @__PURE__ */ new WeakMap();
71
85
  const getStrippedParamsSet = (params) => {
72
86
  let cached = strippedParamsCache.get(params);
@@ -362,6 +376,32 @@ const createUrlVariants = (url) => {
362
376
  }
363
377
  return variants;
364
378
  };
379
+ const sameQuerySpellings = [
380
+ ["+", "%20"],
381
+ [":", "%3A"],
382
+ ["@", "%40"]
383
+ ];
384
+ const percentEscapeRegex = /%[0-9a-f]{2}/gi;
385
+ const createUrlSpellings = (url) => {
386
+ const uppercaseHexUrl = url.replace(percentEscapeRegex, (hex) => hex.toUpperCase());
387
+ let spellings = [.../* @__PURE__ */ new Set([url, uppercaseHexUrl])];
388
+ const hashIndex = url.indexOf("#");
389
+ const queryEnd = hashIndex === -1 ? url.length : hashIndex;
390
+ const queryIndex = url.indexOf("?");
391
+ if (queryIndex === -1 || queryIndex > queryEnd) return spellings;
392
+ for (const [written, encoded] of sameQuerySpellings) {
393
+ const swapped = spellings.flatMap((spelling) => {
394
+ const fragmentIndex = spelling.indexOf("#");
395
+ const spellingQueryEnd = fragmentIndex === -1 ? spelling.length : fragmentIndex;
396
+ const head = spelling.slice(0, queryIndex);
397
+ const query = spelling.slice(queryIndex, spellingQueryEnd);
398
+ const fragment = spelling.slice(spellingQueryEnd);
399
+ return [`${head}${query.replaceAll(encoded, written)}${fragment}`, `${head}${query.replaceAll(written, encoded)}${fragment}`];
400
+ });
401
+ spellings = [...new Set(swapped)];
402
+ }
403
+ return [.../* @__PURE__ */ new Set([url, ...spellings])];
404
+ };
365
405
  const genericSecondLevels = [
366
406
  "ac",
367
407
  "co",
@@ -431,4 +471,4 @@ const addMissingProtocol = addMissingScheme;
431
471
  /** @deprecated Use `upgradeScheme` instead. */
432
472
  const upgradeProtocol = upgradeScheme;
433
473
  //#endregion
434
- export { addMissingProtocol, addMissingScheme, createUrlVariants, decodeSegment, fixMalformedProtocol, fixMalformedQuery, fixMalformedScheme, getPathSegments, getQueryParam, getQueryParams, getRegistrableDomain, getSubdomain, isHostOf, isHostOrSubdomainOf, isHttpUrl, isIpAddress, isSubdomainOf, normalizeUrl, parseUrl, resolveFeedProtocol, resolveFeedScheme, resolveUrl, stripWww, trimUrlValues, upgradeProtocol, upgradeScheme };
474
+ export { addMissingProtocol, addMissingScheme, composeQuery, createUrlSpellings, createUrlVariants, 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
@@ -46,5 +46,5 @@
46
46
  "dependencies": {
47
47
  "entities": "^8.1.0"
48
48
  },
49
- "version": "2.13.0"
49
+ "version": "2.14.1"
50
50
  }