|
1 | 1 | import { defineConfig, type UserConfig } from "tsdown"; |
2 | 2 | import * as esbuild from "esbuild"; |
| 3 | +import fs from "node:fs"; |
| 4 | + |
| 5 | +const pkg = JSON.parse(fs.readFileSync("./package.json", "utf-8")); |
| 6 | +const dependencies = pkg.dependencies || {}; |
3 | 7 |
|
4 | 8 | const esbuildTypescript = await esbuild.build({ |
5 | 9 | entryPoints: ["node_modules/typescript/lib/typescript.js"], |
@@ -30,7 +34,45 @@ const bundleTypescriptPlugin: UserConfig["plugins"] = { |
30 | 34 | }, |
31 | 35 | }; |
32 | 36 |
|
| 37 | +const esmShPlugin: UserConfig["plugins"] = { |
| 38 | + name: "rewrite-to-esm-sh", |
| 39 | + resolveId: { |
| 40 | + order: "pre", |
| 41 | + handler(id: string) { |
| 42 | + if (!id.startsWith(".") && !id.startsWith("/") && !id.startsWith("virtual:") && !id.startsWith("\0")) { |
| 43 | + const parts = id.split("/"); |
| 44 | + const packageName = id.startsWith("@") ? `${parts[0]}/${parts[1]}` : parts[0]; |
| 45 | + const subpath = id.slice(packageName.length); |
| 46 | + |
| 47 | + if (dependencies[packageName]) { |
| 48 | + let version = dependencies[packageName]; |
| 49 | + try { |
| 50 | + const pkgJson = JSON.parse(fs.readFileSync(`./node_modules/${packageName}/package.json`, "utf-8")); |
| 51 | + if (pkgJson.version) version = pkgJson.version; |
| 52 | + } catch { |
| 53 | + version = version.replace(/^[\^~]/, ""); |
| 54 | + } |
| 55 | + return { id: `https://esm.sh/${packageName}@${version}${subpath}`, external: true }; |
| 56 | + } |
| 57 | + return { id: `https://esm.sh/${id}`, external: true }; |
| 58 | + } |
| 59 | + }, |
| 60 | + }, |
| 61 | +}; |
| 62 | + |
33 | 63 | export default defineConfig([ |
| 64 | + // index.cdn.js — ESM, unbundled, external deps rewritten to esm.sh |
| 65 | + { |
| 66 | + dts: false, |
| 67 | + entry: { index: "./src/index.ts" }, |
| 68 | + format: "esm", |
| 69 | + platform: "browser", |
| 70 | + target: ["esnext"], |
| 71 | + plugins: esmShPlugin, |
| 72 | + outputOptions: { |
| 73 | + entryFileNames: "[name].cdn.mjs", |
| 74 | + }, |
| 75 | + }, |
34 | 76 | // index.js — ESM, unbundled (external deps) |
35 | 77 | { |
36 | 78 | dts: true, |
|
0 commit comments