{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { builtinModules } from 'node:module'\nimport { join } from 'node:path'\nimport type { Plugin } from 'vite'\n\ninterface UserOptions {\n  deps: boolean,\n  devDeps: boolean,\n  except: Array<string | RegExp>,\n  /**\n   * Additional dependencies to externalize.\n   *\n   * @example\n   *\n   * ```ts\n   * externalizeDeps({\n   *   include: [\n   *     /^unlisted-dep(?:\\/.*)?$/,\n   *   ],\n   * })\n   * ```\n   *\n   * @default []\n   */\n  include: Array<string | RegExp>,\n  nodeBuiltins: boolean,\n  optionalDeps: boolean,\n  peerDeps: boolean,\n  useFile: string,\n}\n\nconst parseFile = (file: string) => {\n  return JSON.parse(readFileSync(file).toString())\n}\n\n/**\n * Returns a Vite plugin to exclude dependencies from the bundle.\n *\n * @example\n *\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import { externalizeDeps } from 'vite-plugin-externalize-deps'\n *\n * export default defineConfig({\n *   plugins: [\n *     externalizeDeps({\n *       deps: true,\n *       devDeps: false,\n *       except: [\n *         // Match exact values with strings.\n *         '@some/obscure/dependency',\n *         // Or match patterns with regular expressions.\n *         /^@some\\/obscure(?:\\/.+)?$/,\n *       ],\n *       include: [\n *         // Match exact values with strings.\n *         '@some/obscure/dependency',\n *         // Or match patterns with regular expressions.\n *         /^@some\\/obscure(?:\\/.+)?$/,\n *       ],\n *       nodeBuiltins: true,\n *       optionalDeps: true,\n *       peerDeps: true,\n *       useFile: join(process.cwd(), 'package.json'),\n *     }),\n *   ],\n * })\n * ```\n */\nexport const externalizeDeps = (options: Partial<UserOptions> = {}): Plugin => {\n  const optionsResolved: UserOptions = {\n    deps: true,\n    devDeps: false,\n    except: [],\n    include: [],\n    nodeBuiltins: true,\n    optionalDeps: true,\n    peerDeps: true,\n    useFile: join(process.cwd(), 'package.json'),\n    // User options take priority.\n    ...options,\n  }\n\n  return {\n    name: 'vite-plugin-externalize-deps',\n    config: (_config, _env) => {\n      if (!existsSync(optionsResolved.useFile)) {\n        throw new Error(`[vite-plugin-externalize-deps] The file specified for useFile (${optionsResolved.useFile}) does not exist.`)\n      }\n\n      const externalDeps = new Set<RegExp>()\n      const {\n        dependencies = {},\n        devDependencies = {},\n        optionalDependencies = {},\n        peerDependencies = {},\n      } = parseFile(optionsResolved.useFile)\n\n      if (optionsResolved.deps) {\n        Object.keys(dependencies).forEach((dep) => {\n          const depMatcher = new RegExp(`^${dep}(?:/.+)?$`)\n\n          externalDeps.add(depMatcher)\n        })\n      }\n\n      if (optionsResolved.devDeps) {\n        Object.keys(devDependencies).forEach((dep) => {\n          const depMatcher = new RegExp(`^${dep}(?:/.+)?$`)\n\n          externalDeps.add(depMatcher)\n        })\n      }\n\n      if (optionsResolved.nodeBuiltins) {\n        builtinModules.forEach((builtinModule) => {\n          const builtinMatcher = new RegExp(`^(?:node:)?${builtinModule}$`)\n\n          externalDeps.add(builtinMatcher)\n        })\n      }\n\n      if (optionsResolved.optionalDeps) {\n        Object.keys(optionalDependencies).forEach((dep) => {\n          const depMatcher = new RegExp(`^${dep}(?:/.+)?$`)\n\n          externalDeps.add(depMatcher)\n        })\n      }\n\n      if (optionsResolved.peerDeps) {\n        Object.keys(peerDependencies).forEach((dep) => {\n          const depMatcher = new RegExp(`^${dep}(?:/.+)?$`)\n\n          externalDeps.add(depMatcher)\n        })\n      }\n\n      const depMatchers = Array.from(externalDeps)\n\n      const isException = (id: string) => {\n        return optionsResolved.except.some((exception) => {\n          if (typeof exception === 'string') {\n            return exception === id\n          }\n\n          return exception.test(id)\n        })\n      }\n\n      const isIncluded = (id: string) => {\n        return optionsResolved.include.some((included) => {\n          if (typeof included === 'string') {\n            return included === id\n          }\n\n          return included.test(id)\n        })\n      }\n\n      return {\n        build: {\n          rollupOptions: {\n            external: (id) => {\n              if (isException(id)) {\n                return false\n              }\n\n              if (isIncluded(id)) {\n                return true\n              }\n\n              return depMatchers.some((depMatcher) => depMatcher.test(id))\n            },\n          },\n        },\n      }\n    },\n  }\n}\n"],"names":["parseFile","file","readFileSync","externalizeDeps","options","optionsResolved","join","_config","_env","existsSync","externalDeps","dependencies","devDependencies","optionalDependencies","peerDependencies","dep","depMatcher","builtinModules","builtinModule","builtinMatcher","depMatchers","isException","id","exception","isIncluded","included"],"mappings":"2JA+BMA,EAAaC,GACV,KAAK,MAAMC,EAAAA,aAAaD,CAAI,EAAE,UAAU,EAuCpCE,EAAkB,CAACC,EAAgC,KAAe,CAC7E,MAAMC,EAA+B,CACnC,KAAM,GACN,QAAS,GACT,OAAQ,CAAA,EACR,QAAS,CAAA,EACT,aAAc,GACd,aAAc,GACd,SAAU,GACV,QAASC,EAAAA,KAAK,QAAQ,IAAA,EAAO,cAAc,EAE3C,GAAGF,CAAA,EAGL,MAAO,CACL,KAAM,+BACN,OAAQ,CAACG,EAASC,IAAS,CACzB,GAAI,CAACC,EAAAA,WAAWJ,EAAgB,OAAO,EACrC,MAAM,IAAI,MAAM,kEAAkEA,EAAgB,OAAO,mBAAmB,EAG9H,MAAMK,MAAmB,IACnB,CACJ,aAAAC,EAAe,CAAA,EACf,gBAAAC,EAAkB,CAAA,EAClB,qBAAAC,EAAuB,CAAA,EACvB,iBAAAC,EAAmB,CAAA,CAAC,EAClBd,EAAUK,EAAgB,OAAO,EAEjCA,EAAgB,MAClB,OAAO,KAAKM,CAAY,EAAE,QAASI,GAAQ,CACzC,MAAMC,EAAa,IAAI,OAAO,IAAID,CAAG,WAAW,EAEhDL,EAAa,IAAIM,CAAU,CAC7B,CAAC,EAGCX,EAAgB,SAClB,OAAO,KAAKO,CAAe,EAAE,QAASG,GAAQ,CAC5C,MAAMC,EAAa,IAAI,OAAO,IAAID,CAAG,WAAW,EAEhDL,EAAa,IAAIM,CAAU,CAC7B,CAAC,EAGCX,EAAgB,cAClBY,iBAAe,QAASC,GAAkB,CACxC,MAAMC,EAAiB,IAAI,OAAO,cAAcD,CAAa,GAAG,EAEhER,EAAa,IAAIS,CAAc,CACjC,CAAC,EAGCd,EAAgB,cAClB,OAAO,KAAKQ,CAAoB,EAAE,QAASE,GAAQ,CACjD,MAAMC,EAAa,IAAI,OAAO,IAAID,CAAG,WAAW,EAEhDL,EAAa,IAAIM,CAAU,CAC7B,CAAC,EAGCX,EAAgB,UAClB,OAAO,KAAKS,CAAgB,EAAE,QAASC,GAAQ,CAC7C,MAAMC,EAAa,IAAI,OAAO,IAAID,CAAG,WAAW,EAEhDL,EAAa,IAAIM,CAAU,CAC7B,CAAC,EAGH,MAAMI,EAAc,MAAM,KAAKV,CAAY,EAErCW,EAAeC,GACZjB,EAAgB,OAAO,KAAMkB,GAC9B,OAAOA,GAAc,SAChBA,IAAcD,EAGhBC,EAAU,KAAKD,CAAE,CACzB,EAGGE,EAAcF,GACXjB,EAAgB,QAAQ,KAAMoB,GAC/B,OAAOA,GAAa,SACfA,IAAaH,EAGfG,EAAS,KAAKH,CAAE,CACxB,EAGH,MAAO,CACL,MAAO,CACL,cAAe,CACb,SAAWA,GACLD,EAAYC,CAAE,EACT,GAGLE,EAAWF,CAAE,EACR,GAGFF,EAAY,KAAMJ,GAAeA,EAAW,KAAKM,CAAE,CAAC,CAC7D,CACF,CACF,CAEJ,CAAA,CAEJ"}