@serwist/utils 9.5.1 → 9.5.3

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.
@@ -0,0 +1,9 @@
1
+ import type Browserslist from "browserslist";
2
+ /**
3
+ * Loads and converts Browserslist into esbuild's `target` option.
4
+ *
5
+ * @param cwd
6
+ * @returns
7
+ */
8
+ export declare const browserslistToEsbuild: (browserslist: typeof Browserslist, cwd: string, defaultBrowserslist: string[]) => string[];
9
+ //# sourceMappingURL=browserslist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserslist.d.ts","sourceRoot":"","sources":["../src/browserslist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,cAAc,CAAC;AAO7C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,cAAc,OAAO,YAAY,EAAE,KAAK,MAAM,EAAE,qBAAqB,MAAM,EAAE,KAAG,MAAM,EAqD3H,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const compare: <T extends string | number>(a: T, b: T) => 1 | -1 | 0;
2
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,eAI5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** @see https://esbuild.github.io/api/#target */
2
+ export declare const SUPPORTED_ESBUILD_TARGETS: string[];
3
+ export declare const UNSUPPORTED_BROWSERLIST_TARGETS: string[];
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,UAAmG,CAAC;AAE1I,eAAO,MAAM,+BAA+B,UAA0C,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
- import { nonNullable } from "./nonNullable.js";
1
+ import { nonNullable } from "./non-nullable.js";
2
2
  import { parallel } from "./parallel.js";
3
- import { toUnix } from "./toUnix.js";
3
+ import { toUnix } from "./to-unix.js";
4
+ export { browserslistToEsbuild } from "./browserslist.js";
5
+ export { compare } from "./compare.js";
6
+ export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS } from "./constants.js";
7
+ export { compareSemver } from "./semver.js";
4
8
  export { nonNullable, parallel, toUnix };
5
9
  export type * from "./types.js";
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEzC,mBAAmB,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEzC,mBAAmB,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -28,4 +28,73 @@ const parallel = async (limit, array, func)=>{
28
28
 
29
29
  const toUnix = (p)=>p.replace(/\\/g, "/").replace(/(?<!^)\/+/g, "/");
30
30
 
31
- export { nonNullable, parallel, toUnix };
31
+ const compare = (a, b)=>{
32
+ if (a < b) return -1;
33
+ if (a > b) return 1;
34
+ return 0;
35
+ };
36
+
37
+ const SUPPORTED_ESBUILD_TARGETS = [
38
+ "chrome",
39
+ "deno",
40
+ "edge",
41
+ "firefox",
42
+ "hermes",
43
+ "ie",
44
+ "ios",
45
+ "node",
46
+ "opera",
47
+ "rhino",
48
+ "safari"
49
+ ];
50
+ const UNSUPPORTED_BROWSERLIST_TARGETS = [
51
+ "android 4",
52
+ "android 3",
53
+ "android 2"
54
+ ];
55
+
56
+ const compareSemver = (a, b)=>{
57
+ return compare(Number.parseInt(a[0], 10), Number.parseInt(b[0], 10)) || compare(Number.parseInt(a[1] || "0", 10), Number.parseInt(b[1] || "0", 10)) || compare(Number.parseInt(a[2] || "0", 10), Number.parseInt(b[2] || "0", 10));
58
+ };
59
+
60
+ const browserslistToEsbuild = (browserslist, cwd, defaultBrowserslist)=>{
61
+ const browserslistConfig = browserslist.loadConfig({
62
+ path: cwd
63
+ }) ?? defaultBrowserslist;
64
+ return browserslist(browserslistConfig).filter((query)=>!UNSUPPORTED_BROWSERLIST_TARGETS.some((target)=>query.startsWith(target))).map((query)=>{
65
+ const modified = query === "safari TP" ? browserslist("last 1 safari version")[0] : query;
66
+ const split = modified.split(" ");
67
+ if (split[0] === "android" || split[0] === "and_chr") {
68
+ split[0] = "chrome";
69
+ }
70
+ if (split[0] === "and_ff") {
71
+ split[0] = "firefox";
72
+ }
73
+ if (split[0] === "ios_saf" || split[0] === "ios") {
74
+ split[0] = "safari";
75
+ }
76
+ if (split[1].includes("-")) {
77
+ split[1] = split[1].slice(0, split[1].indexOf("-"));
78
+ }
79
+ if (split[1].endsWith(".0")) {
80
+ split[1] = split[1].slice(0, -2);
81
+ }
82
+ return split;
83
+ }).filter((split)=>SUPPORTED_ESBUILD_TARGETS.includes(split[0]) && /^\d+(\.\d+)*$/.test(split[1])).sort((a, b)=>{
84
+ if (a[0] === b[0]) {
85
+ return compareSemver(b[1].split("."), a[1].split("."));
86
+ } else {
87
+ return compare(a[0], b[0]);
88
+ }
89
+ }).reduce((acc, browser)=>{
90
+ const existingIndex = acc.findIndex((br)=>br[0] === browser[0]);
91
+ if (existingIndex !== -1) {
92
+ acc[existingIndex][1] = browser[1];
93
+ } else {
94
+ acc.push(browser);
95
+ }
96
+ return acc;
97
+ }, []).map((split)=>split.join(""));
98
+ };
99
+
100
+ export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS, browserslistToEsbuild, compare, compareSemver, nonNullable, parallel, toUnix };
@@ -1,2 +1,2 @@
1
1
  export declare const nonNullable: <T>(value: T) => value is NonNullable<T>;
2
- //# sourceMappingURL=nonNullable.d.ts.map
2
+ //# sourceMappingURL=non-nullable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"non-nullable.d.ts","sourceRoot":"","sources":["../src/non-nullable.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAA0C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const compareSemver: (a: string[], b: string[]) => 1 | -1 | 0;
2
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../src/semver.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,eAMrD,CAAC"}
@@ -1,2 +1,2 @@
1
1
  export declare const toUnix: (p: string) => string;
2
- //# sourceMappingURL=toUnix.d.ts.map
2
+ //# sourceMappingURL=to-unix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-unix.d.ts","sourceRoot":"","sources":["../src/to-unix.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,WAAqD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serwist/utils",
3
- "version": "9.5.1",
3
+ "version": "9.5.3",
4
4
  "type": "module",
5
5
  "description": "This module contains utilities used by Serwist packages.",
6
6
  "files": [
@@ -29,9 +29,18 @@
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/common-tags": "1.8.4",
32
+ "browserslist": "4.28.1",
32
33
  "rollup": "4.57.0",
33
34
  "typescript": "5.9.3",
34
- "@serwist/configs": "9.5.1"
35
+ "@serwist/configs": "9.5.3"
36
+ },
37
+ "peerDependencies": {
38
+ "browserslist": ">=4"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "browserslist": {
42
+ "optional": true
43
+ }
35
44
  },
36
45
  "scripts": {
37
46
  "build": "rimraf dist && NODE_ENV=production rollup --config rollup.config.js",
@@ -0,0 +1,67 @@
1
+ import type Browserslist from "browserslist";
2
+ import { compare } from "./compare.js";
3
+ import { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS } from "./constants.js";
4
+ import { compareSemver } from "./semver.js";
5
+
6
+ // Original: https://github.com/marcofugaro/browserslist-to-esbuild/blob/0875f1a4ec71f206a634ba406c3528ca5ecf04de/src/index.js
7
+ // License: MIT
8
+ /**
9
+ * Loads and converts Browserslist into esbuild's `target` option.
10
+ *
11
+ * @param cwd
12
+ * @returns
13
+ */
14
+ export const browserslistToEsbuild = (browserslist: typeof Browserslist, cwd: string, defaultBrowserslist: string[]): string[] => {
15
+ const browserslistConfig = browserslist.loadConfig({ path: cwd }) ?? defaultBrowserslist;
16
+ return (
17
+ browserslist(browserslistConfig)
18
+ // Filter out legacy Android webview to avoid converting them into Chrome targets
19
+ .filter((query) => !UNSUPPORTED_BROWSERLIST_TARGETS.some((target) => query.startsWith(target)))
20
+ .map((query) => {
21
+ const modified = query === "safari TP" ? browserslist("last 1 safari version")[0] : query;
22
+ const split = modified.split(" ");
23
+ // https://github.com/browserslist/browserslist/blob/5cad191bc1a1e5beb7768ca263503cc15d0dcc7d/README.md?plain=1#L329-L350
24
+ // https://esbuild.github.io/api/#target
25
+ if (split[0] === "android" || split[0] === "and_chr") {
26
+ split[0] = "chrome";
27
+ }
28
+ if (split[0] === "and_ff") {
29
+ split[0] = "firefox";
30
+ }
31
+ if (split[0] === "ios_saf" || split[0] === "ios") {
32
+ split[0] = "safari";
33
+ }
34
+ // Remove upper version bound
35
+ if (split[1].includes("-")) {
36
+ split[1] = split[1].slice(0, split[1].indexOf("-"));
37
+ }
38
+ // Trim ending .0
39
+ if (split[1].endsWith(".0")) {
40
+ split[1] = split[1].slice(0, -2);
41
+ }
42
+ return split;
43
+ })
44
+ // Remove unsupported browsers and invalid versions
45
+ .filter((split) => SUPPORTED_ESBUILD_TARGETS.includes(split[0]) && /^\d+(\.\d+)*$/.test(split[1]))
46
+ // Re-sort the result such that the oldest versions end up the latest, same as how
47
+ // Browserslist does it.
48
+ .sort((a, b) => {
49
+ if (a[0] === b[0]) {
50
+ return compareSemver(b[1].split("."), a[1].split("."));
51
+ } else {
52
+ return compare(a[0], b[0]);
53
+ }
54
+ })
55
+ // Only pick the oldest included version for each browser to avoid duplications.
56
+ .reduce((acc, browser) => {
57
+ const existingIndex = acc.findIndex((br) => br[0] === browser[0]);
58
+ if (existingIndex !== -1) {
59
+ acc[existingIndex][1] = browser[1];
60
+ } else {
61
+ acc.push(browser);
62
+ }
63
+ return acc;
64
+ }, [] as string[][])
65
+ .map((split) => split.join(""))
66
+ );
67
+ };
package/src/compare.ts ADDED
@@ -0,0 +1,5 @@
1
+ export const compare = <T extends string | number>(a: T, b: T) => {
2
+ if (a < b) return -1;
3
+ if (a > b) return +1;
4
+ return 0;
5
+ };
@@ -0,0 +1,4 @@
1
+ /** @see https://esbuild.github.io/api/#target */
2
+ export const SUPPORTED_ESBUILD_TARGETS = ["chrome", "deno", "edge", "firefox", "hermes", "ie", "ios", "node", "opera", "rhino", "safari"];
3
+
4
+ export const UNSUPPORTED_BROWSERLIST_TARGETS = ["android 4", "android 3", "android 2"];
package/src/index.ts CHANGED
@@ -1,7 +1,11 @@
1
- import { nonNullable } from "./nonNullable.js";
1
+ import { nonNullable } from "./non-nullable.js";
2
2
  import { parallel } from "./parallel.js";
3
- import { toUnix } from "./toUnix.js";
3
+ import { toUnix } from "./to-unix.js";
4
4
 
5
+ export { browserslistToEsbuild } from "./browserslist.js";
6
+ export { compare } from "./compare.js";
7
+ export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS } from "./constants.js";
8
+ export { compareSemver } from "./semver.js";
5
9
  export { nonNullable, parallel, toUnix };
6
10
 
7
11
  export type * from "./types.js";
package/src/semver.ts ADDED
@@ -0,0 +1,11 @@
1
+ // Source: https://github.com/browserslist/browserslist/blob/5cad191bc1a1e5beb7768ca263503cc15d0dcc7d/index.js#L139-L151
2
+ // License: MIT
3
+ import { compare } from "./compare.js";
4
+
5
+ export const compareSemver = (a: string[], b: string[]) => {
6
+ return (
7
+ compare(Number.parseInt(a[0], 10), Number.parseInt(b[0], 10)) ||
8
+ compare(Number.parseInt(a[1] || "0", 10), Number.parseInt(b[1] || "0", 10)) ||
9
+ compare(Number.parseInt(a[2] || "0", 10), Number.parseInt(b[2] || "0", 10))
10
+ );
11
+ };
@@ -1 +0,0 @@
1
- {"version":3,"file":"nonNullable.d.ts","sourceRoot":"","sources":["../src/nonNullable.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAA0C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"toUnix.d.ts","sourceRoot":"","sources":["../src/toUnix.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,WAAqD,CAAC"}
File without changes
File without changes