|
| 1 | +import { readFile } from "node:fs/promises"; |
| 2 | +import { codeBlock } from "omark"; |
| 3 | +import { findExportNames, resolvePath } from "mlly"; |
| 4 | +import { getPkg } from "../_utils"; |
| 5 | +import { defineGenerator } from "../generator"; |
| 6 | + |
| 7 | +const DEFAULT_CDN = "https://esm.sh/"; |
| 8 | + |
| 9 | +export const jsimport = defineGenerator({ |
| 10 | + name: "js-import", |
| 11 | + async generate({ config, args }) { |
| 12 | + const { name } = await getPkg(config.dir, args); |
| 13 | + |
| 14 | + const importPath = name + (args.path || ""); |
| 15 | + |
| 16 | + const importNames: string[] = ([] as string[]) |
| 17 | + .concat(args.import, args.imports) // eslint-disable-line unicorn/prefer-spread |
| 18 | + .filter(Boolean) |
| 19 | + .flatMap((i) => i.split(/\s*,\s*/)); |
| 20 | + |
| 21 | + if (args.src) { |
| 22 | + const resolved = await resolvePath(args.src, { url: config.dir }); |
| 23 | + const contents = await readFile(resolved, "utf8"); |
| 24 | + const exportNames = findExportNames(contents); |
| 25 | + if (exportNames && exportNames.length > 0) { |
| 26 | + importNames.push(...exportNames); |
| 27 | + } |
| 28 | + } |
| 29 | + |
| 30 | + const lines: string[] = []; |
| 31 | + |
| 32 | + const fmtImports = |
| 33 | + importNames.length > 1 |
| 34 | + ? `\n${importNames.map((i) => " " + i + ",").join("\n")}\n` |
| 35 | + : (importNames[0] && ` ${importNames[0]} `) || ""; |
| 36 | + |
| 37 | + if (args.esm !== false) { |
| 38 | + const code = `import {${fmtImports}} from "${importPath}";`; |
| 39 | + lines.push("**ESM** (Node.js, Bun)", codeBlock(code, "js")); |
| 40 | + } |
| 41 | + |
| 42 | + if (args.cjs) { |
| 43 | + const code = `const {${fmtImports}} = require("${importPath}");`; |
| 44 | + lines.push("**CommonJS** (Legacy Node.js)", codeBlock(code, "js")); |
| 45 | + } |
| 46 | + |
| 47 | + if (args.cdn) { |
| 48 | + const cdnBase = typeof args.cdn === "string" ? args.cdn : DEFAULT_CDN; |
| 49 | + const code = `import {${fmtImports}} from "${cdnBase}${importPath}";`; |
| 50 | + lines.push("**CDN** (Deno, Bun and Browsers)", codeBlock(code, "js")); |
| 51 | + } |
| 52 | + |
| 53 | + return { |
| 54 | + contents: lines.join("\n\n"), |
| 55 | + }; |
| 56 | + }, |
| 57 | +}); |
0 commit comments