@serwist/utils
Advanced tools
| import Browserslist from "browserslist"; | ||
| //#region src/non-nullable.d.ts | ||
| declare const nonNullable: <T>(value: T) => value is NonNullable<T>; | ||
| //#endregion | ||
| //#region src/parallel.d.ts | ||
| /** | ||
| * Executes many async functions in parallel. Returns the | ||
| * results from all functions as an array. Does not handle | ||
| * any error. | ||
| */ | ||
| declare const parallel: <T, K>(limit: number, array: readonly T[], func: (item: T) => Promise<K>) => Promise<K[]>; | ||
| //#endregion | ||
| //#region src/to-unix.d.ts | ||
| declare const toUnix: (p: string) => string; | ||
| //#endregion | ||
| //#region src/browserslist.d.ts | ||
| /** | ||
| * Loads and converts Browserslist into esbuild's `target` option. | ||
| * | ||
| * @param cwd | ||
| * @returns | ||
| */ | ||
| declare const browserslistToEsbuild: (browserslist: typeof Browserslist, cwd: string, defaultBrowserslist: string[]) => string[]; | ||
| //#endregion | ||
| //#region src/compare.d.ts | ||
| declare const compare: <T extends string | number>(a: T, b: T) => 1 | -1 | 0; | ||
| //#endregion | ||
| //#region src/constants.d.ts | ||
| /** @see https://esbuild.github.io/api/#target */ | ||
| declare const SUPPORTED_ESBUILD_TARGETS: string[]; | ||
| declare const UNSUPPORTED_BROWSERLIST_TARGETS: string[]; | ||
| //#endregion | ||
| //#region src/semver.d.ts | ||
| declare const compareSemver: (a: string[], b: string[]) => 1 | -1 | 0; | ||
| //#endregion | ||
| //#region src/types.d.ts | ||
| /** | ||
| * Make certain fields in a object type required | ||
| * | ||
| * @example | ||
| * interface A { | ||
| * a?: string; | ||
| * b?: string; | ||
| * c?: string; | ||
| * } | ||
| * type B = RequiredFields<A, "b" | "c">; | ||
| * const b: B = { | ||
| * b: "hehe", | ||
| * c: "hehe", | ||
| * }; //valid | ||
| * const b: B = { a: "hehe" }; //invalid | ||
| * const c: B = { a: "hehe", b: "hehe" }; //invalid | ||
| */ | ||
| type Require<T, U extends keyof T> = T & Required<Pick<T, U>>; | ||
| /** | ||
| * Make certain fields in a object type optional | ||
| * | ||
| * @example | ||
| * interface A { | ||
| * a: string; | ||
| * b: string; | ||
| * c: string; | ||
| * } | ||
| * type B = Optional<A, "b" | "c">; | ||
| * const b: B = { a: "hehe" }; //valid | ||
| * const b: B = {}; //invalid | ||
| */ | ||
| type Optional<T, U extends keyof T> = Omit<T, U> & Partial<Pick<T, U>>; | ||
| /** | ||
| * Makes an object type's hover overlay more readable | ||
| * | ||
| * @example | ||
| * | ||
| * interface A { | ||
| * b: string; | ||
| * c: boolean; | ||
| * } | ||
| * | ||
| * interface B { | ||
| * c: number; | ||
| * } | ||
| * | ||
| * type D = A | B; // Displayed as is written | ||
| * | ||
| * type C = Prettify<A | B>; // { b: string; c: boolean; } | { c: number; } | ||
| */ | ||
| type Prettify<T> = { [K in keyof T]: T[K] } & {}; | ||
| type MaybePromise<T> = T | Promise<T>; | ||
| //#endregion | ||
| export { MaybePromise, Optional, Prettify, Require, SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS, browserslistToEsbuild, compare, compareSemver, nonNullable, parallel, toUnix }; | ||
| //# sourceMappingURL=index.d.mts.map |
| {"version":3,"file":"index.d.mts","names":[],"sources":["../src/non-nullable.ts","../src/parallel.ts","../src/to-unix.ts","../src/browserslist.ts","../src/compare.ts","../src/constants.ts","../src/semver.ts","../src/types.ts"],"mappings":";;;cAAa,WAAA,MAAkB,KAAA,EAAO,CAAA,KAAI,KAAA,IAAS,WAAA,CAAY,CAAA;;;;;;AAA/D;;cCaa,QAAA,SAAwB,KAAA,UAAe,KAAA,WAAgB,CAAA,IAAK,IAAA,GAAO,IAAA,EAAM,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAK,OAAA,CAAQ,CAAA;;;cCbpG,MAAA,GAAU,CAAA;;;;;AFAvB;;;;cGaa,qBAAA,GAAyB,YAAA,SAAqB,YAAA,EAAc,GAAA,UAAa,mBAAA;;;cCbzE,OAAA,8BAAsC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;;;;cCC/C,yBAAA;AAAA,cAEA,+BAAA;;;cCCA,aAAA,GAAiB,CAAA,YAAa,CAAA;;;;;;ANJ3C;;;;;;;;;;;;;;KOiBY,OAAA,oBAA2B,CAAA,IAAK,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,CAAA;;;;;ANJjE;;;;;;;;;KMmBY,QAAA,oBAA4B,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,CAAA;;;;;;;;;;;;;;;;;;;KAoB9D,QAAA,oBACE,CAAA,GAAI,CAAA,CAAE,CAAA;AAAA,KAGR,YAAA,MAAkB,CAAA,GAAI,OAAA,CAAQ,CAAA"} |
| //#region src/non-nullable.ts | ||
| const nonNullable = (value) => value !== null && value !== void 0; | ||
| //#endregion | ||
| //#region src/parallel.ts | ||
| /** | ||
| * Executes many async functions in parallel. Returns the | ||
| * results from all functions as an array. Does not handle | ||
| * any error. | ||
| */ | ||
| const parallel = async (limit, array, func) => { | ||
| const work = array.map((item, index) => ({ | ||
| index, | ||
| item | ||
| })); | ||
| const processor = async (res) => { | ||
| const results = []; | ||
| while (true) { | ||
| const next = work.pop(); | ||
| if (!next) return res(results); | ||
| const result = await func(next.item); | ||
| results.push({ | ||
| result, | ||
| index: next.index | ||
| }); | ||
| } | ||
| }; | ||
| const queues = Array.from({ length: limit }, () => new Promise(processor)); | ||
| return (await Promise.all(queues)).flat().sort((a, b) => a.index < b.index ? -1 : 1).map((res) => res.result); | ||
| }; | ||
| //#endregion | ||
| //#region src/to-unix.ts | ||
| const toUnix = (p) => p.replace(/\\/g, "/").replace(/(?<!^)\/+/g, "/"); | ||
| //#endregion | ||
| //#region src/compare.ts | ||
| const compare = (a, b) => { | ||
| if (a < b) return -1; | ||
| if (a > b) return 1; | ||
| return 0; | ||
| }; | ||
| //#endregion | ||
| //#region src/constants.ts | ||
| /** @see https://esbuild.github.io/api/#target */ | ||
| const SUPPORTED_ESBUILD_TARGETS = [ | ||
| "chrome", | ||
| "deno", | ||
| "edge", | ||
| "firefox", | ||
| "hermes", | ||
| "ie", | ||
| "ios", | ||
| "node", | ||
| "opera", | ||
| "rhino", | ||
| "safari" | ||
| ]; | ||
| const UNSUPPORTED_BROWSERLIST_TARGETS = [ | ||
| "android 4", | ||
| "android 3", | ||
| "android 2" | ||
| ]; | ||
| //#endregion | ||
| //#region src/semver.ts | ||
| const compareSemver = (a, b) => { | ||
| 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)); | ||
| }; | ||
| //#endregion | ||
| //#region src/browserslist.ts | ||
| /** | ||
| * Loads and converts Browserslist into esbuild's `target` option. | ||
| * | ||
| * @param cwd | ||
| * @returns | ||
| */ | ||
| const browserslistToEsbuild = (browserslist, cwd, defaultBrowserslist) => { | ||
| return browserslist(browserslist.loadConfig({ path: cwd }) ?? defaultBrowserslist).filter((query) => !UNSUPPORTED_BROWSERLIST_TARGETS.some((target) => query.startsWith(target))).map((query) => { | ||
| const split = (query === "safari TP" ? browserslist("last 1 safari version")[0] : query).split(" "); | ||
| if (split[0] === "android" || split[0] === "and_chr") split[0] = "chrome"; | ||
| if (split[0] === "and_ff") split[0] = "firefox"; | ||
| if (split[0] === "ios_saf" || split[0] === "ios") split[0] = "safari"; | ||
| if (split[1].includes("-")) split[1] = split[1].slice(0, split[1].indexOf("-")); | ||
| if (split[1].endsWith(".0")) split[1] = split[1].slice(0, -2); | ||
| return split; | ||
| }).filter((split) => SUPPORTED_ESBUILD_TARGETS.includes(split[0]) && /^\d+(\.\d+)*$/.test(split[1])).sort((a, b) => { | ||
| if (a[0] === b[0]) return compareSemver(b[1].split("."), a[1].split(".")); | ||
| else return compare(a[0], b[0]); | ||
| }).reduce((acc, browser) => { | ||
| const existingIndex = acc.findIndex((br) => br[0] === browser[0]); | ||
| if (existingIndex !== -1) acc[existingIndex][1] = browser[1]; | ||
| else acc.push(browser); | ||
| return acc; | ||
| }, []).map((split) => split.join("")); | ||
| }; | ||
| //#endregion | ||
| export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS, browserslistToEsbuild, compare, compareSemver, nonNullable, parallel, toUnix }; | ||
| //# sourceMappingURL=index.mjs.map |
| {"version":3,"file":"index.mjs","names":[],"sources":["../src/non-nullable.ts","../src/parallel.ts","../src/to-unix.ts","../src/compare.ts","../src/constants.ts","../src/semver.ts","../src/browserslist.ts"],"sourcesContent":["export const nonNullable = <T>(value: T): value is NonNullable<T> => value !== null && value !== undefined;\n","// Source code: https://github.com/rayepps/radash/blob/03dd3152f560414e933cedcd3bda3c6db3e8306b/src/async.ts#L112-L147\n// License: MIT\n// Author: rayepps\ninterface ItemResult<K> {\n index: number;\n result: K;\n}\n\n/**\n * Executes many async functions in parallel. Returns the\n * results from all functions as an array. Does not handle\n * any error.\n */\nexport const parallel = async <T, K>(limit: number, array: readonly T[], func: (item: T) => Promise<K>): Promise<K[]> => {\n const work = array.map((item, index) => ({\n index,\n item,\n }));\n // Process array items\n const processor = async (res: (value: ItemResult<K>[]) => void) => {\n const results: ItemResult<K>[] = [];\n while (true) {\n const next = work.pop();\n if (!next) {\n return res(results);\n }\n const result = await func(next.item);\n results.push({\n result: result,\n index: next.index,\n });\n }\n };\n // Create queues\n const queues = Array.from({ length: limit }, () => new Promise(processor));\n // Wait for all queues to complete\n const results = (await Promise.all(queues))\n .flat()\n .sort((a, b) => (a.index < b.index ? -1 : 1))\n .map((res) => res.result);\n return results;\n};\n","export const toUnix = (p: string) => p.replace(/\\\\/g, \"/\").replace(/(?<!^)\\/+/g, \"/\");\n","export const compare = <T extends string | number>(a: T, b: T) => {\n if (a < b) return -1;\n if (a > b) return +1;\n return 0;\n};\n","/** @see https://esbuild.github.io/api/#target */\nexport const SUPPORTED_ESBUILD_TARGETS = [\"chrome\", \"deno\", \"edge\", \"firefox\", \"hermes\", \"ie\", \"ios\", \"node\", \"opera\", \"rhino\", \"safari\"];\n\nexport const UNSUPPORTED_BROWSERLIST_TARGETS = [\"android 4\", \"android 3\", \"android 2\"];\n","// Source: https://github.com/browserslist/browserslist/blob/5cad191bc1a1e5beb7768ca263503cc15d0dcc7d/index.js#L139-L151\n// License: MIT\nimport { compare } from \"./compare.js\";\n\nexport const compareSemver = (a: string[], b: string[]) => {\n return (\n compare(Number.parseInt(a[0], 10), Number.parseInt(b[0], 10)) ||\n compare(Number.parseInt(a[1] || \"0\", 10), Number.parseInt(b[1] || \"0\", 10)) ||\n compare(Number.parseInt(a[2] || \"0\", 10), Number.parseInt(b[2] || \"0\", 10))\n );\n};\n","import type Browserslist from \"browserslist\";\nimport { compare } from \"./compare.js\";\nimport { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS } from \"./constants.js\";\nimport { compareSemver } from \"./semver.js\";\n\n// Original: https://github.com/marcofugaro/browserslist-to-esbuild/blob/0875f1a4ec71f206a634ba406c3528ca5ecf04de/src/index.js\n// License: MIT\n/**\n * Loads and converts Browserslist into esbuild's `target` option.\n *\n * @param cwd\n * @returns\n */\nexport const browserslistToEsbuild = (browserslist: typeof Browserslist, cwd: string, defaultBrowserslist: string[]): string[] => {\n const browserslistConfig = browserslist.loadConfig({ path: cwd }) ?? defaultBrowserslist;\n return (\n browserslist(browserslistConfig)\n // Filter out legacy Android webview to avoid converting them into Chrome targets\n .filter((query) => !UNSUPPORTED_BROWSERLIST_TARGETS.some((target) => query.startsWith(target)))\n .map((query) => {\n const modified = query === \"safari TP\" ? browserslist(\"last 1 safari version\")[0] : query;\n const split = modified.split(\" \");\n // https://github.com/browserslist/browserslist/blob/5cad191bc1a1e5beb7768ca263503cc15d0dcc7d/README.md?plain=1#L329-L350\n // https://esbuild.github.io/api/#target\n if (split[0] === \"android\" || split[0] === \"and_chr\") {\n split[0] = \"chrome\";\n }\n if (split[0] === \"and_ff\") {\n split[0] = \"firefox\";\n }\n if (split[0] === \"ios_saf\" || split[0] === \"ios\") {\n split[0] = \"safari\";\n }\n // Remove upper version bound\n if (split[1].includes(\"-\")) {\n split[1] = split[1].slice(0, split[1].indexOf(\"-\"));\n }\n // Trim ending .0\n if (split[1].endsWith(\".0\")) {\n split[1] = split[1].slice(0, -2);\n }\n return split;\n })\n // Remove unsupported browsers and invalid versions\n .filter((split) => SUPPORTED_ESBUILD_TARGETS.includes(split[0]) && /^\\d+(\\.\\d+)*$/.test(split[1]))\n // Re-sort the result such that the oldest versions end up the latest, same as how\n // Browserslist does it.\n .sort((a, b) => {\n if (a[0] === b[0]) {\n return compareSemver(b[1].split(\".\"), a[1].split(\".\"));\n } else {\n return compare(a[0], b[0]);\n }\n })\n // Only pick the oldest included version for each browser to avoid duplications.\n .reduce((acc, browser) => {\n const existingIndex = acc.findIndex((br) => br[0] === browser[0]);\n if (existingIndex !== -1) {\n acc[existingIndex][1] = browser[1];\n } else {\n acc.push(browser);\n }\n return acc;\n }, [] as string[][])\n .map((split) => split.join(\"\"))\n );\n};\n"],"mappings":"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"} |
+10
-11
| { | ||
| "name": "@serwist/utils", | ||
| "version": "9.5.7", | ||
| "version": "9.5.8", | ||
| "type": "module", | ||
@@ -21,8 +21,8 @@ "description": "This module contains utilities used by Serwist packages.", | ||
| "homepage": "https://serwist.pages.dev", | ||
| "main": "./dist/index.js", | ||
| "types": "./dist/index.d.ts", | ||
| "main": "./dist/index.mjs", | ||
| "types": "./dist/index.d.mts", | ||
| "exports": { | ||
| ".": { | ||
| "types": "./dist/index.d.ts", | ||
| "default": "./dist/index.js" | ||
| "types": "./dist/index.d.mts", | ||
| "default": "./dist/index.mjs" | ||
| }, | ||
@@ -33,6 +33,5 @@ "./package.json": "./package.json" | ||
| "@types/common-tags": "1.8.4", | ||
| "browserslist": "4.28.1", | ||
| "rollup": "4.59.0", | ||
| "typescript": "5.9.3", | ||
| "@serwist/configs": "9.5.7" | ||
| "browserslist": "4.28.2", | ||
| "tsdown": "0.21.10", | ||
| "typescript": "6.0.3" | ||
| }, | ||
@@ -48,4 +47,4 @@ "peerDependencies": { | ||
| "scripts": { | ||
| "build": "rimraf dist && NODE_ENV=production rollup --config rollup.config.js", | ||
| "dev": "rollup --config rollup.config.js --watch", | ||
| "build": "rimraf dist && NODE_ENV=production tsdown", | ||
| "dev": "tsdown --watch", | ||
| "lint": "biome lint ./src", | ||
@@ -52,0 +51,0 @@ "typecheck": "tsc" |
| import type Browserslist from "browserslist"; | ||
| /** | ||
| * Loads and converts Browserslist into esbuild's `target` option. | ||
| * | ||
| * @param cwd | ||
| * @returns | ||
| */ | ||
| export declare const browserslistToEsbuild: (browserslist: typeof Browserslist, cwd: string, defaultBrowserslist: string[]) => string[]; | ||
| //# sourceMappingURL=browserslist.d.ts.map |
| {"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"} |
| export declare const compare: <T extends string | number>(a: T, b: T) => 1 | -1 | 0; | ||
| //# sourceMappingURL=compare.d.ts.map |
| {"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"} |
| /** @see https://esbuild.github.io/api/#target */ | ||
| export declare const SUPPORTED_ESBUILD_TARGETS: string[]; | ||
| export declare const UNSUPPORTED_BROWSERLIST_TARGETS: string[]; | ||
| //# sourceMappingURL=constants.d.ts.map |
| {"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"} |
| import { nonNullable } from "./non-nullable.js"; | ||
| import { parallel } from "./parallel.js"; | ||
| import { toUnix } from "./to-unix.js"; | ||
| export { browserslistToEsbuild } from "./browserslist.js"; | ||
| export { compare } from "./compare.js"; | ||
| export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS } from "./constants.js"; | ||
| export { compareSemver } from "./semver.js"; | ||
| export { nonNullable, parallel, toUnix }; | ||
| export type * from "./types.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"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"} |
-100
| const nonNullable = (value)=>value !== null && value !== undefined; | ||
| const parallel = async (limit, array, func)=>{ | ||
| const work = array.map((item, index)=>({ | ||
| index, | ||
| item | ||
| })); | ||
| const processor = async (res)=>{ | ||
| const results = []; | ||
| while(true){ | ||
| const next = work.pop(); | ||
| if (!next) { | ||
| return res(results); | ||
| } | ||
| const result = await func(next.item); | ||
| results.push({ | ||
| result: result, | ||
| index: next.index | ||
| }); | ||
| } | ||
| }; | ||
| const queues = Array.from({ | ||
| length: limit | ||
| }, ()=>new Promise(processor)); | ||
| const results = (await Promise.all(queues)).flat().sort((a, b)=>a.index < b.index ? -1 : 1).map((res)=>res.result); | ||
| return results; | ||
| }; | ||
| const toUnix = (p)=>p.replace(/\\/g, "/").replace(/(?<!^)\/+/g, "/"); | ||
| const compare = (a, b)=>{ | ||
| if (a < b) return -1; | ||
| if (a > b) return 1; | ||
| return 0; | ||
| }; | ||
| const SUPPORTED_ESBUILD_TARGETS = [ | ||
| "chrome", | ||
| "deno", | ||
| "edge", | ||
| "firefox", | ||
| "hermes", | ||
| "ie", | ||
| "ios", | ||
| "node", | ||
| "opera", | ||
| "rhino", | ||
| "safari" | ||
| ]; | ||
| const UNSUPPORTED_BROWSERLIST_TARGETS = [ | ||
| "android 4", | ||
| "android 3", | ||
| "android 2" | ||
| ]; | ||
| const compareSemver = (a, b)=>{ | ||
| 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)); | ||
| }; | ||
| const browserslistToEsbuild = (browserslist, cwd, defaultBrowserslist)=>{ | ||
| const browserslistConfig = browserslist.loadConfig({ | ||
| path: cwd | ||
| }) ?? defaultBrowserslist; | ||
| return browserslist(browserslistConfig).filter((query)=>!UNSUPPORTED_BROWSERLIST_TARGETS.some((target)=>query.startsWith(target))).map((query)=>{ | ||
| const modified = query === "safari TP" ? browserslist("last 1 safari version")[0] : query; | ||
| const split = modified.split(" "); | ||
| if (split[0] === "android" || split[0] === "and_chr") { | ||
| split[0] = "chrome"; | ||
| } | ||
| if (split[0] === "and_ff") { | ||
| split[0] = "firefox"; | ||
| } | ||
| if (split[0] === "ios_saf" || split[0] === "ios") { | ||
| split[0] = "safari"; | ||
| } | ||
| if (split[1].includes("-")) { | ||
| split[1] = split[1].slice(0, split[1].indexOf("-")); | ||
| } | ||
| if (split[1].endsWith(".0")) { | ||
| split[1] = split[1].slice(0, -2); | ||
| } | ||
| return split; | ||
| }).filter((split)=>SUPPORTED_ESBUILD_TARGETS.includes(split[0]) && /^\d+(\.\d+)*$/.test(split[1])).sort((a, b)=>{ | ||
| if (a[0] === b[0]) { | ||
| return compareSemver(b[1].split("."), a[1].split(".")); | ||
| } else { | ||
| return compare(a[0], b[0]); | ||
| } | ||
| }).reduce((acc, browser)=>{ | ||
| const existingIndex = acc.findIndex((br)=>br[0] === browser[0]); | ||
| if (existingIndex !== -1) { | ||
| acc[existingIndex][1] = browser[1]; | ||
| } else { | ||
| acc.push(browser); | ||
| } | ||
| return acc; | ||
| }, []).map((split)=>split.join("")); | ||
| }; | ||
| export { SUPPORTED_ESBUILD_TARGETS, UNSUPPORTED_BROWSERLIST_TARGETS, browserslistToEsbuild, compare, compareSemver, nonNullable, parallel, toUnix }; |
| export declare const nonNullable: <T>(value: T) => value is NonNullable<T>; | ||
| //# sourceMappingURL=non-nullable.d.ts.map |
| {"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"} |
| /** | ||
| * Executes many async functions in parallel. Returns the | ||
| * results from all functions as an array. Does not handle | ||
| * any error. | ||
| */ | ||
| export declare const parallel: <T, K>(limit: number, array: readonly T[], func: (item: T) => Promise<K>) => Promise<K[]>; | ||
| //# sourceMappingURL=parallel.d.ts.map |
| {"version":3,"file":"parallel.d.ts","sourceRoot":"","sources":["../src/parallel.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAAE,CAAC,EAAE,OAAO,MAAM,EAAE,OAAO,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,EAAE,CA4BnH,CAAC"} |
| export declare const compareSemver: (a: string[], b: string[]) => 1 | -1 | 0; | ||
| //# sourceMappingURL=semver.d.ts.map |
| {"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"} |
| export declare const toUnix: (p: string) => string; | ||
| //# sourceMappingURL=to-unix.d.ts.map |
| {"version":3,"file":"to-unix.d.ts","sourceRoot":"","sources":["../src/to-unix.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,WAAqD,CAAC"} |
| /** | ||
| * Make certain fields in a object type required | ||
| * | ||
| * @example | ||
| * interface A { | ||
| * a?: string; | ||
| * b?: string; | ||
| * c?: string; | ||
| * } | ||
| * type B = RequiredFields<A, "b" | "c">; | ||
| * const b: B = { | ||
| * b: "hehe", | ||
| * c: "hehe", | ||
| * }; //valid | ||
| * const b: B = { a: "hehe" }; //invalid | ||
| * const c: B = { a: "hehe", b: "hehe" }; //invalid | ||
| */ | ||
| export type Require<T, U extends keyof T> = T & Required<Pick<T, U>>; | ||
| /** | ||
| * Make certain fields in a object type optional | ||
| * | ||
| * @example | ||
| * interface A { | ||
| * a: string; | ||
| * b: string; | ||
| * c: string; | ||
| * } | ||
| * type B = Optional<A, "b" | "c">; | ||
| * const b: B = { a: "hehe" }; //valid | ||
| * const b: B = {}; //invalid | ||
| */ | ||
| export type Optional<T, U extends keyof T> = Omit<T, U> & Partial<Pick<T, U>>; | ||
| /** | ||
| * Makes an object type's hover overlay more readable | ||
| * | ||
| * @example | ||
| * | ||
| * interface A { | ||
| * b: string; | ||
| * c: boolean; | ||
| * } | ||
| * | ||
| * interface B { | ||
| * c: number; | ||
| * } | ||
| * | ||
| * type D = A | B; // Displayed as is written | ||
| * | ||
| * type C = Prettify<A | B>; // { b: string; c: boolean; } | { c: number; } | ||
| */ | ||
| export type Prettify<T> = { | ||
| [K in keyof T]: T[K]; | ||
| } & {}; | ||
| export type MaybePromise<T> = T | Promise<T>; | ||
| //# sourceMappingURL=types.d.ts.map |
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,EAAE,CAAC;AAEP,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"} |
23699
30.75%4
-20%15
-50%284
-22.62%