{"version":3,"file":"browserslistToSwc.mjs","sources":["../src/browserslistToSwc.ts"],"sourcesContent":["// Inspired by https://github.com/marcofugaro/browserslist-to-esbuild/blob/main/src/index.js.\n//\n// This function exist because browserslist-rs (which is used under the hood by SWC) doesn't support browserslist \"extends\" syntax: https://github.com/browserslist/browserslist-rs#limitations.\n// Therefore, we must parse ourself the \".browserslistrc\" file to extract the browser entries and transform them into valid SWC \"env.targets\".\n//\n// The function will convert an array of browserslist entries from:\n//\n// ['and_chr 115',   'and_ff 115',   'and_qq 13.1',\n// 'and_uc 15.5',   'android 115',  'baidu 13.18',\n// 'bb 10',         'bb 7',         'chrome 116',\n// 'chrome 115',    'chrome 114',   'chrome 113',\n// 'chrome 112',    'chrome 111',   'chrome 110',\n// 'chrome 109',    'chrome 108',   'chrome 107',\n// 'edge 115',      'edge 114',     'edge 113',\n// 'edge 112',      'edge 111',     'edge 110',\n// 'edge 109',      'edge 108',     'edge 107',\n// 'edge 106',      'firefox 116',  'firefox 115',\n// 'firefox 114',   'firefox 113',  'firefox 112',\n// 'firefox 111',   'firefox 110',  'firefox 109',\n// 'firefox 108',   'firefox 107',  'ie 11',\n// 'ie 10',         'ie 9',         'ie 8',\n// 'ie 7',          'ie 6',         'ie 5.5',\n// 'ie_mob 11',     'ie_mob 10',    'ios_saf 16.5',\n// 'ios_saf 16.4',  'ios_saf 16.3', 'ios_saf 16.2',\n// 'ios_saf 16.1',  'ios_saf 16.0', 'ios_saf 15.6-15.7',\n// 'ios_saf 15.5',  'ios_saf 15.4', 'ios_saf 15.2-15.3',\n// 'kaios 3.0-3.1', 'kaios 2.5',    'op_mini all',\n// 'op_mob 73',     'opera 101',    'opera 100',\n// 'opera 99',      'opera 98',     'opera 97',\n// 'opera 96',      'opera 95',     'opera 94',\n// 'opera 93',      'opera 92',     'safari 16.5',\n// 'safari 16.4',   'safari 16.3',  'safari 16.2',\n// 'safari 16.1',   'safari 16.0',  'safari 15.6',\n// 'safari 15.5',   'safari 15.4',  'safari 15.2-15.3',\n// 'samsung 21',    'samsung 20',   'samsung 19.0',\n// 'samsung 18.0',  'samsung 17.0', 'samsung 16.0',\n// 'samsung 15.0',  'samsung 14.0', 'samsung 13.0',\n// 'samsung 12.0']\n//\n// To an object literal of SWC \"env.targets\":\n//\n// {\n//  chrome: '107',\n//  firefox: '107',\n//  android: '115',\n//  edge: '106',\n//  ie: '5.5',\n//  opera: '73',\n//  safari: '15.2',\n//  samsung: '12'\n// }\n\nimport browserslist from \"browserslist\";\n\n// Original browserslist-rs supported browsers (https://github.com/browserslist/browserslist-rs/blob/99a3244fc8c0e631a80a9cae5c41dca6c5a2aae5/build.rs#L10)\n// minus the browsers that are discarted by SWC (https://github.com/swc-project/swc/blob/main/crates/preset_env_base/src/lib.rs#L105).\nconst SwcSupportedBrowsers = [\n    \"ie\",\n    \"edge\",\n    \"firefox\",\n    \"chrome\",\n    \"safari\",\n    \"opera\",\n    \"ios\",\n    \"android\",\n    \"op_mob\",\n    \"and_chr\",\n    \"and_ff\",\n    \"ie_mob\",\n    \"samsung\"\n] as const;\n\n// SWC browsers aliases (https://github.com/swc-project/swc/blob/main/crates/preset_env_base/src/lib.rs#L90).\nconst SwcMobileBrowserAliases: Record<string, string> = {\n    \"and_chr\": \"chrome\",\n    \"and_ff\": \"firefox\",\n    \"ie_mob\": \"ie\",\n    \"ios_saf\": \"ios\",\n    \"op_mob\": \"opera\"\n};\n\nfunction parseBrowserslistEntry(entry: string) {\n    // \"chrome 11\" --> [\"chrome\", \"11\"]\n    const values = entry.split(\" \");\n\n    let browser = values[0];\n    let version = values[1];\n\n    // \"and_chr\" --> \"chrome\"\n    if (SwcMobileBrowserAliases[browser]) {\n        browser = SwcMobileBrowserAliases[browser];\n    }\n\n    // \"11.0-12.0\" --> \"11.0\"\n    if (version.includes(\"-\")) {\n        version = version.slice(0, version.indexOf(\"-\"));\n    }\n\n    // \"11.0\" --> \"11\"\n    if (version.endsWith(\".0\")) {\n        version = version.slice(0, -2);\n    }\n\n    return {\n        browser,\n        version\n    };\n}\n\nexport function createSwcTargetsFromBrowserslistEntries(entries: string[]) {\n    return entries.reduce((acc, x: string) => {\n        const { browser, version } = parseBrowserslistEntry(x);\n\n        // Exclude browsers that are not supported by SWC.\n        if (!((SwcSupportedBrowsers as unknown) as string[]).includes(browser)) {\n            return acc;\n        }\n\n        // Let's make TS happy as we are now certain that the browser is part\n        // of the supported browsers list.\n        const _browser = browser as keyof typeof SwcSupportedBrowsers;\n\n        // SWC \"env.targets\" only support a single entry per target (browser).\n        // Therefore, we loop through the browser versions to keep only the oldest one.\n        if (acc[_browser]) {\n            if (parseFloat(acc[_browser]) > parseFloat(version)) {\n                acc[_browser] = version;\n            }\n        } else {\n            acc[_browser] = version;\n        }\n\n        return acc;\n    }, {} as Record<keyof typeof SwcSupportedBrowsers, string>);\n}\n\nexport interface BrowserslistToSwcOptions extends Omit<browserslist.Options, \"path\"> {\n    queries?: string | string[];\n}\n\nexport function browserslistToSwc(options: BrowserslistToSwcOptions = {}) {\n    const {\n        queries,\n        ...browserlistsOptions\n    } = options;\n\n    // Will return the entries matching the \"queries\" prop when provided, otherwise,\n    // the function will load the closest \".browserslistrc\" file.\n    const entries = browserslist(queries, {\n        path: \"./browserslistrc\",\n        ...browserlistsOptions\n    });\n\n    return createSwcTargetsFromBrowserslistEntries(entries);\n}\n"],"names":["browserslist","SwcSupportedBrowsers","SwcMobileBrowserAliases","parseBrowserslistEntry","entry","values","browser","version","createSwcTargetsFromBrowserslistEntries","entries","acc","x","_browser","parseFloat","browserslistToSwc","options","queries","browserlistsOptions"],"mappings":";;;AAAA,6FAA6F;AAC7F,EAAE;AACF,gMAAgM;AAChM,8IAA8I;AAC9I,EAAE;AACF,mEAAmE;AACnE,EAAE;AACF,mDAAmD;AACnD,kDAAkD;AAClD,iDAAiD;AACjD,iDAAiD;AACjD,iDAAiD;AACjD,iDAAiD;AACjD,+CAA+C;AAC/C,+CAA+C;AAC/C,+CAA+C;AAC/C,kDAAkD;AAClD,kDAAkD;AAClD,kDAAkD;AAClD,4CAA4C;AAC5C,2CAA2C;AAC3C,6CAA6C;AAC7C,mDAAmD;AACnD,mDAAmD;AACnD,wDAAwD;AACxD,wDAAwD;AACxD,kDAAkD;AAClD,gDAAgD;AAChD,+CAA+C;AAC/C,+CAA+C;AAC/C,kDAAkD;AAClD,kDAAkD;AAClD,kDAAkD;AAClD,uDAAuD;AACvD,mDAAmD;AACnD,mDAAmD;AACnD,mDAAmD;AACnD,kBAAkB;AAClB,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,IAAI;AACJ,kBAAkB;AAClB,mBAAmB;AACnB,mBAAmB;AACnB,gBAAgB;AAChB,cAAc;AACd,gBAAgB;AAChB,mBAAmB;AACnB,iBAAiB;AACjB,IAAI;AAEoC;AAExC,2JAA2J;AAC3J,sIAAsI;AACtI,MAAMC,oBAAoBA,GAAG;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH;AAED,6GAA6G;AAC7G,MAAMC,uBAAuBA,GAA2B;IACpD,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;IACX,UAAU;AACd;AAEA,SAASC,sBAAsBA,CAACC,KAAa;IACzC,mCAAmC;IACnC,MAAMC,SAASD,MAAM,KAAK,CAAC;IAE3B,IAAIE,UAAUD,MAAM,CAAC,EAAE;IACvB,IAAIE,UAAUF,MAAM,CAAC,EAAE;IAEvB,yBAAyB;IACzB,IAAIH,uBAAuB,CAACI,QAAQ,EAAE;QAClCA,UAAUJ,uBAAuB,CAACI,QAAQ;IAC9C;IAEA,yBAAyB;IACzB,IAAIC,QAAQ,QAAQ,CAAC,MAAM;QACvBA,UAAUA,QAAQ,KAAK,CAAC,GAAGA,QAAQ,OAAO,CAAC;IAC/C;IAEA,kBAAkB;IAClB,IAAIA,QAAQ,QAAQ,CAAC,OAAO;QACxBA,UAAUA,QAAQ,KAAK,CAAC,GAAG,CAAC;IAChC;IAEA,OAAO;QACHD;QACAC;IACJ;AACJ;AAEO,SAASC,uCAAuCA,CAACC,OAAiB;IACrE,OAAOA,QAAQ,MAAM,CAAC,CAACC,KAAKC;QACxB,MAAM,EAAEL,OAAO,EAAEC,OAAO,EAAE,GAAGJ,sBAAsBA,CAACQ;QAEpD,kDAAkD;QAClD,IAAI,CAAGV,oBAAoBA,CAA0B,QAAQ,CAACK,UAAU;YACpE,OAAOI;QACX;QAEA,qEAAqE;QACrE,kCAAkC;QAClC,MAAME,WAAWN;QAEjB,sEAAsE;QACtE,+EAA+E;QAC/E,IAAII,GAAG,CAACE,SAAS,EAAE;YACf,IAAIC,WAAWH,GAAG,CAACE,SAAS,IAAIC,WAAWN,UAAU;gBACjDG,GAAG,CAACE,SAAS,GAAGL;YACpB;QACJ,OAAO;YACHG,GAAG,CAACE,SAAS,GAAGL;QACpB;QAEA,OAAOG;IACX,GAAG,CAAC;AACR;AAMO,SAASI,iBAAiBA,CAACC,UAAoC,CAAC,CAAC;IACpE,MAAM,EACFC,OAAO,EACP,GAAGC,qBACN,GAAGF;IAEJ,gFAAgF;IAChF,6DAA6D;IAC7D,MAAMN,UAAUT,YAAYA,CAACgB,SAAS;QAClC,MAAM;QACN,GAAGC,mBAAmB;IAC1B;IAEA,OAAOT,uCAAuCA,CAACC;AACnD"}