bunup 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
- import I from"node:fs";import vt from"node:path";import{isMainThread as Pt,parentPort as T,Worker as bt,workerData as $t}from"node:worker_threads";import P from"node:fs";import y from"node:path";import mt from"oxc-transform";import{rollup as dt}from"rollup";import yt from"rollup-plugin-dts";import C from"typescript";var d=t=>t instanceof Error?t.message:String(t),A=(t,r)=>{let e=d(t),n=r?`[${r}] `:"";console.error(`\x1B[31m[ERROR]\x1B[0m ${n}${e}`),process.env.NODE_ENV!=="production"&&t instanceof Error&&t.stack&&console.error("\x1B[2m"+t.stack.split(`
2
+ import z from"node:fs";import qt from"node:path";import{isMainThread as It,parentPort as j,Worker as Nt,workerData as Lt}from"node:worker_threads";import mt from"node:fs";import _ from"node:path";var P=class extends Error{constructor(r){super(r),this.name="BunupError"}},y=class extends P{constructor(r){super(r),this.name="BunupBuildError"}},g=class extends P{constructor(r){super(r),this.name="BunupDTSBuildError"}},d=class extends P{constructor(r){super(r),this.name="BunupCLIError"}},B=class extends P{constructor(r){super(r),this.name="BunupWatchError"}},f=t=>t instanceof Error?t.message:String(t),$t=(t,r)=>{let e=f(t),n=r?`[${r}] `:"",o="ERROR";t instanceof y?o="BUILD ERROR":t instanceof g?o="DTS ERROR":t instanceof d?o="CLI ERROR":t instanceof B?o="WATCH ERROR":t instanceof P&&(o="BUNUP ERROR"),console.error(`\x1B[31m[${o}]\x1B[0m ${n}${e}`),process.env.NODE_ENV!=="production"&&t instanceof Error&&t.stack&&console.error("\x1B[2m"+t.stack.split(`
3
3
  `).slice(1).join(`
4
- `)+"\x1B[0m")};function F(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function L(t=8){return Math.random().toString(36).substring(2,2+t)}function _(t,r){switch(t){case"esm":return".mjs";case"cjs":return D(r)?".cjs":".js";case"iife":return".global.js"}}function U(t,r){switch(t){case"esm":return".d.mts";case"cjs":return D(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function D(t){return t==="module"}function B(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function H(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function J(t,r){return t===void 0?r==="esm":t}function q(t){return t.map(r=>typeof r=="string"?new RegExp(`^${F(r)}($|\\/|\\\\)`):r)}function S(t,r){return q(t.external||[]).concat(H(r).map(e=>new RegExp(`^${F(e)}($|\\/|\\\\)`)))}function k(t){return q(t.noExternal||[])}import O from"node:fs";import G from"node:path";var a={MAX_LABEL_LENGTH:5,colors:{cli:"183",info:"240",warn:"221",error:"203",progress:{ESM:"214",CJS:"114",IIFE:"105",DTS:"75"},default:"255"},labels:{cli:"BUNUP",info:"INFO",warn:"WARN",error:"ERROR"},formatMessage(t,r,e){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-r.length));return`\x1B[38;5;${t}m[${r}]\x1B[0m ${n}${e}`},cli(t){let r=this.labels.cli;console.log(this.formatMessage(this.colors.cli,r,t))},info(t){let r=this.labels.info;console.log(this.formatMessage(this.colors.info,r,t))},warn(t){let r=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,r,t))},error(t){let r=this.labels.error;console.error(this.formatMessage(this.colors.error,r,t))},progress(t,r){let e=String(t),n=this.colors.default;for(let[o,s]of Object.entries(this.colors.progress))if(e.includes(o)){n=s;break}console.log(this.formatMessage(n,e,r))}};function z(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}var w={entry:[],format:["cjs"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function V(t,r){return{outdir:`${r}/${t.outDir}`,minify:gt(t),target:t.target,splitting:t.splitting}}function gt(t){let{minify:r,minifyWhitespace:e,minifyIdentifiers:n,minifySyntax:o}=t,s=r===!0;return{whitespace:e??s,identifiers:n??s,syntax:o??s}}async function X(t){let r=[];for(let e of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=G.join(t,`bunup.config${e}`);try{if(!O.existsSync(n))continue;let o;if(e===".json"||e===".jsonc"){let s=O.readFileSync(n,"utf8");o=JSON.parse(s)}else{let s=await import(`file://${n}`);o=s.default||s,o||(a.warn(`No default export found in ${n}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...w,...s},rootDir:t});else r.push({options:{...w,...o},rootDir:t});break}catch(o){a.error(`Failed to load config from ${n}: ${d(o)}`)}if(r.length>0)break}return r}function v(t){let r=G.join(t,"package.json");try{if(!O.existsSync(r))return null;let e=O.readFileSync(r,"utf8");return JSON.parse(e)}catch(e){return a.error(`Failed to load package.json at ${r}: ${d(e)}`),null}}function Y(t){try{if(!O.existsSync(t))return{};let r=O.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return a.warn(`Failed to parse tsconfig at ${t}: ${d(r)}`),{}}}async function K(t,r,e,n){let{absoluteRootDir:o,absoluteEntry:s}=Ot(t,r),i=await ht(s),l=await Et(i);return wt(s,l,e,n,o)}async function ht(t){let r=new Set,e=[t];for(;e.length>0;){let n=e.pop();if(!(!n||r.has(n))){r.add(n);try{let o=await P.promises.readFile(n,"utf8"),s=xt(o);for(let i of s){let l=y.dirname(n),c=y.resolve(l,i),u=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let p of u)if(P.existsSync(p)&&p.endsWith(".ts")&&!r.has(p)){e.push(p);break}}}catch(o){a.warn(`Error processing ${n}: ${o instanceof Error?o.message:String(o)}`)}}}return r}function xt(t){let r=new Set;try{let e=/(?:import|export)(?:(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*)|[\s\n]+)(["'`])([^'"]+)\1/g,n;for(;(n=e.exec(t))!==null;){let i=n[2];i.startsWith(".")&&r.add(i)}let o=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(n=o.exec(t))!==null;){let i=n[2];i.startsWith(".")&&r.add(i)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(n=s.exec(t))!==null;){let i=n[2];i.startsWith(".")&&r.add(i)}}catch(e){a.warn(`Error extracting imports: ${e instanceof Error?e.message:String(e)}`)}return Array.from(r)}async function Et(t){let r=new Map;return await Promise.all(Array.from(t).map(async e=>{try{let n=e.replace(/\.tsx?$/,".d.ts"),o=await P.promises.readFile(e,"utf8"),{code:s}=mt.isolatedDeclaration(e,o);s&&r.set(n,s)}catch(n){a.warn(`Failed to generate declaration for ${e}: ${n instanceof Error?n.message:String(n)}`)}})),r}async function wt(t,r,e,n,o){let s="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),l=`${s}${i}`,c=typeof n.dts=="object"?n.dts:{},u=c.preferredTsconfigPath?y.resolve(c.preferredTsconfigPath):y.join(o,"tsconfig.json"),m=(await Y(u)).compilerOptions,x={name:"bunup:virtual-dts",resolveId(f,g){if(f.startsWith(s))return f;if(g?.startsWith(s)){let E=g.slice(s.length),ut=y.dirname(E);if(f.startsWith(".")){let pt=y.resolve(ut,f);for(let ft of["",".d.ts","/index.d.ts"]){let N=`${pt}${ft}`;if(r.has(N))return`${s}${N}`}}}return null},load(f){if(f.startsWith(s)){let g=f.slice(s.length);return r.get(g)||null}return null}},at=v(o),lt=S(n,at),ct=k(n),$;try{$=await dt({input:l,onwarn(g,E){g.code==="UNRESOLVED_IMPORT"||g.code==="CIRCULAR_DEPENDENCY"||g.code==="EMPTY_BUNDLE"||E(g)},plugins:[x,yt({tsconfig:u,compilerOptions:{...m?C.parseJsonConfigFileContent({compilerOptions:m},C.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:C.ScriptTarget.ESNext}})],external:g=>lt.some(E=>E.test(g))&&!ct.some(E=>E.test(g))});let{output:f}=await $.generate({format:e});if(!f[0]?.code)throw new Error("Generated bundle is empty");return f[0].code}catch(f){throw new Error(`DTS bundling failed: ${d(f)}`)}finally{$&&await $.close()}}function Ot(t,r){let e=y.resolve(t),n=y.resolve(e,r);if(!P.existsSync(e))throw new Error(`Root directory does not exist: ${e}`);if(!P.existsSync(n))throw new Error(`Entry file does not exist: ${n}`);if(!n.endsWith(".ts"))throw new Error(`Entry file must be a TypeScript file (.ts): ${n}`);if(y.relative(e,n).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${n}`);return{absoluteRootDir:e,absoluteEntry:n}}async function Q(t,r,e,n,o){return new Promise((s,i)=>{let l={rootDir:t,entries:r,formats:e,options:n,packageType:o},c=new bt(new URL("./dtsWorker.js",import.meta.url),{workerData:l});c.on("message",u=>{if(u.success){if(u.timeMs){let p=B(u.timeMs);a.progress("DTS",`Bundled types in ${p}`)}s()}else i(new Error(u.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",u=>{u!==0&&i(new Error(`DTS worker stopped with exit code ${u}`))})})}if(!Pt&&T){let{rootDir:t,entries:r,formats:e,options:n,packageType:o}=$t,s=performance.now();a.progress("DTS","Bundling types");try{let i=e.flatMap(l=>r.map(async c=>{let u=await K(t,c.path,l,n),p=U(l,o),m=`${n.outDir}/${c.name}${p}`,x=`${t}/${m}`;await Bun.write(x,u),a.progress("DTS",m)}));Promise.all(i).then(()=>{let l=performance.now()-s;T?.postMessage({success:!0,timeMs:l})}).catch(l=>{T?.postMessage({success:!1,error:l instanceof Error?l.message:String(l)})})}catch(i){T?.postMessage({success:!1,error:i instanceof Error?i.message:String(i)})}}function Dt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function b(t){let r=[],e=new Set;function n(o,s){if(e.has(o)){let i=L();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),e.add(o)}if(Array.isArray(t))for(let o of t){let s=Dt(o);n(s,o)}else Object.entries(t).forEach(([o,s])=>{n(o,s)});return r}function Z(t,r){return`[dir]/${t}${r}`}function tt(t,r){return{name:"bunup:external-plugin",setup(e){e.onResolve({filter:/.*/},n=>{let o=n.path;return t.some(i=>i.test(o))&&!r.some(i=>i.test(o))?{path:o,external:!0}:null})}}}async function R(t,r){if(!t.entry||t.entry.length===0||!t.outDir){a.cli("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");return}let e=performance.now();a.cli("Build started");let n=v(r),o=n?.type,s=S(t,n),i=k(t),l=[tt(s,i)],c=b(t.entry),u=t.format.flatMap(p=>c.map(m=>Bt(t,r,m,p,o,l)));try{await Promise.all(u);let p=performance.now()-e,m=B(p);a.cli(`\u26A1 Build success in ${m}`)}catch{a.error("Build process encountered errors."),process.exit(1)}if(t.dts){a.progress("DTS","Bundling types");let p=t.format.filter(x=>!(x==="iife"&&!D(o)&&t.format.includes("cjs"))),m=t.dts===!0?c:b(t.dts.entry);try{await Q(r,m,p,t,o)}catch(x){a.error(`DTS build process encountered errors: ${d(x)}`)}}}async function Bt(t,r,e,n,o,s){let i=_(n,o),l=V(t,r),c=await Bun.build({...l,entrypoints:[`${r}/${e.path}`],format:n,naming:{entry:Z(e.name,i)},splitting:J(t.splitting,n),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(u=>{u.level==="error"?a.error(u.message):u.level==="warning"?a.warn(u.message):u.level==="info"&&a.info(u.message)}),new Error(`Build failed for ${e} (${n})`);a.progress(z(n,t.name),`${t.outDir}/${e.name}${i}`)}function h(t){return(r,e)=>{e[t]=r===!0?!0:r==="true"}}function M(t){return(r,e)=>{typeof r=="string"?e[t]=r:a.error(`Option --${t} requires a string value`)}}function rt(t){return(r,e)=>{typeof r=="string"?e[t]=r.split(","):a.error(`Option --${t} requires a string value`)}}var St={name:{flags:["n","name"],handler:M("name")},format:{flags:["f","format"],handler:(t,r)=>{typeof t=="string"?r.format=t.split(","):a.error("Option --format requires a string value")}},outDir:{flags:["o","out-dir"],handler:M("outDir")},minify:{flags:["m","minify"],handler:h("minify")},watch:{flags:["w","watch"],handler:h("watch")},dts:{flags:["d","dts"],handler:h("dts")},external:{flags:["e","external"],handler:rt("external")},target:{flags:["t","target"],handler:M("target")},minifyWhitespace:{flags:["mw","minify-whitespace"],handler:h("minifyWhitespace")},minifyIdentifiers:{flags:["mi","minify-identifiers"],handler:h("minifyIdentifiers")},minifySyntax:{flags:["ms","minify-syntax"],handler:h("minifySyntax")},clean:{flags:["c","clean"],handler:h("clean")},splitting:{flags:["s","splitting"],handler:h("splitting")},noExternal:{flags:["ne","no-external"],handler:rt("noExternal")}},j={};for(let t of Object.values(St))if(t)for(let r of t.flags)j[r]=t.handler;function et(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function nt(t){let r={},e={},n=0;for(;n<t.length;){let o=t[n];if(o.startsWith("--")){let s,i;if(o.includes("=")){let[l,c]=o.slice(2).split("=",2);s=l,i=c}else{s=o.slice(2);let l=t[n+1];i=l&&!l.startsWith("-")?l:!0,typeof i=="string"&&n++}if(s==="entry")if(typeof i=="string"){let l=et(i);e[l]&&a.warn(`Duplicate entry name '${l}' derived from '${i}'. Overwriting previous entry.`),e[l]=i}else a.error("Option --entry requires a string value");else if(s.startsWith("entry.")){let l=s.slice(6);typeof i=="string"?(e[l]&&a.warn(`Duplicate entry name '${l}' provided via --entry.${l}. Overwriting previous entry.`),e[l]=i):a.error(`Option --entry.${l} requires a string value`)}else{let l=j[s];l?l(i,r):a.error(`Unknown option: --${s}`)}}else if(o.startsWith("-")){let s=o.slice(1),i=t[n+1],l=i&&!i.startsWith("-")?i:!0;typeof l=="string"&&n++;let c=j[s];c?c(l,r):a.error(`Unknown option: -${s}`)}else{let s=et(o);e[s]&&a.warn(`Duplicate entry name '${s}' derived from positional argument '${o}'. Overwriting previous entry.`),e[s]=o}n++}return Object.keys(e).length>0&&(r.entry=e),r}typeof Bun>"u"&&(a.error(`Bunup requires Bun to run.
5
- To install Bun, visit https://bun.sh/docs/installation`),process.exit(1));import W from"node:path";import kt from"chokidar";async function ot(t,r){let e=new Set;b(t.entry).forEach(c=>{let u=W.resolve(r,c.path),p=W.dirname(u);e.add(p)});let o=kt.watch(Array.from(e),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),s=null,i=!1,l=async c=>{if(!i){i=!0;try{await R({...t,entry:[c],clean:!1},r)}catch(u){a.error(`Build failed: ${u}`)}finally{i=!1}}};o.on("change",c=>{let u=W.relative(r,c);a.cli(`File changed: ${u}`),s&&clearTimeout(s),s=setTimeout(()=>l(u),300)}),o.on("error",c=>{a.error(`Watcher error: ${c}`)})}async function Tt(t=Bun.argv.slice(2)){let r=nt(t),e=await X(process.cwd()),n=process.cwd();if(r.watch&&(a.cli("Starting watch mode"),a.cli("Watching for file changes")),e.length===0){let o={...w,...r};o.clean&&it(n,o.outDir),await st(o,n)}else{for(let{options:o,rootDir:s}of e)o.clean&&it(s,o.outDir);await Promise.all(e.map(async({options:o,rootDir:s})=>{let i={...w,...o,...r};await st(i,s)}))}r.watch||process.exit(0)}async function st(t,r){t.watch?await ot(t,r):await R(t,r)}function it(t,r){let e=vt.join(t,r);if(I.existsSync(e))try{I.rmSync(e,{recursive:!0,force:!0})}catch(n){a.error(`Failed to clean output directory: ${n}`)}I.mkdirSync(e,{recursive:!0})}Tt().catch(t=>{A(t),process.exit(1)});export{Tt as main};
4
+ `)+"\x1B[0m")},V=(t,r)=>{$t(t,r),process.exit(1)};import{loadTsConfig as Dt}from"load-tsconfig";var p={MAX_LABEL_LENGTH:5,colors:{cli:"183",info:"240",warn:"221",error:"203",progress:{ESM:"214",CJS:"114",IIFE:"105",DTS:"75"},default:"255"},labels:{cli:"BUNUP",info:"INFO",warn:"WARN",error:"ERROR"},formatMessage(t,r,e){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-r.length));return`\x1B[38;5;${t}m[${r}]\x1B[0m ${n}${e}`},cli(t){let r=this.labels.cli;console.log(this.formatMessage(this.colors.cli,r,t))},info(t){let r=this.labels.info;console.log(this.formatMessage(this.colors.info,r,t))},warn(t){let r=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,r,t))},error(t){let r=this.labels.error;console.error(this.formatMessage(this.colors.error,r,t))},progress(t,r){let e=String(t),n=this.colors.default;for(let[o,s]of Object.entries(this.colors.progress))if(e.includes(o)){n=s;break}console.log(this.formatMessage(n,e,r))}};function X(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}function Y(t){try{return Dt(".",t)}catch(r){return p.warn(`Failed to load tsconfig: ${f(r)}`),{path:t,data:{},files:[]}}}import it from"node:path";import{rollup as vt}from"rollup";import Rt from"rollup-plugin-dts";import U from"typescript";function L(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function K(t=8){return Math.random().toString(36).substring(2,2+t)}function Q(t,r){switch(t){case"esm":return".mjs";case"cjs":return v(r)?".cjs":".js";case"iife":return".global.js"}}function Z(t,r){switch(t){case"esm":return".d.mts";case"cjs":return v(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function v(t){return t==="module"}function R(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function tt(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function rt(t,r){return t===void 0?r==="esm":t}function et(t){return t.map(r=>typeof r=="string"?new RegExp(`^${L(r)}($|\\/|\\\\)`):r)}function k(t,r){return et(t.external||[]).concat(tt(r).map(e=>new RegExp(`^${L(e)}($|\\/|\\\\)`)))}function S(t){return et(t.noExternal||[])}import C from"node:fs";import ot from"node:path";var b={entry:[],format:["cjs"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function nt(t,r){return{outdir:`${r}/${t.outDir}`,minify:Tt(t),target:t.target,splitting:t.splitting}}function Tt(t){let{minify:r,minifyWhitespace:e,minifyIdentifiers:n,minifySyntax:o}=t,s=r===!0;return{whitespace:e??s,identifiers:n??s,syntax:o??s}}async function st(t){let r=[];for(let e of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=ot.join(t,`bunup.config${e}`);try{if(!C.existsSync(n))continue;let o;if(e===".json"||e===".jsonc"){let s=C.readFileSync(n,"utf8");o=JSON.parse(s)}else{let s=await import(`file://${n}`);o=s.default||s,o||(p.warn(`No default export found in ${n}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...b,...s},rootDir:t});else r.push({options:{...b,...o},rootDir:t});break}catch(o){throw new y(`Failed to load config from ${n}: ${f(o)}`)}if(r.length>0)break}return r}function M(t){let r=ot.join(t,"package.json");try{if(!C.existsSync(r))return null;let e=C.readFileSync(r,"utf8");return JSON.parse(e)}catch(e){return p.warn(`Failed to load package.json at ${r}: ${f(e)}`),null}}async function at(t,r,e,n,o,s){let i="\0virtual:",a=t.replace(/\.tsx?$/,".d.ts"),c=`${i}${a}`,l=s.data?.compilerOptions,u={name:"bunup:virtual-dts",resolveId(h,x){if(h.startsWith(i))return h;if(!x?.startsWith(i)||!h.startsWith("."))return null;let O=x.slice(i.length),N=it.resolve(it.dirname(O),h),G=r.has(N)?N:`${N}.d.ts`;return r.has(G)?`${i}${G}`:null},load(h){return h.startsWith(i)&&r.get(h.slice(i.length))||null}},m=M(o),E=k(n,m),bt=S(n),T;try{T=await vt({input:c,onwarn(x,O){["UNRESOLVED_IMPORT","CIRCULAR_DEPENDENCY","EMPTY_BUNDLE"].includes(x.code??"")||O(x)},plugins:[u,Rt({tsconfig:s.path,compilerOptions:{...l?U.parseJsonConfigFileContent({compilerOptions:l},U.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:U.ScriptTarget.ESNext}})],external:x=>E.some(O=>O.test(x))&&!bt.some(O=>O.test(x))});let{output:h}=await T.generate({format:e});if(!h[0]?.code)throw new g("Generated bundle is empty");return h[0].code}catch(h){throw new g(`DTS bundling failed: ${f(h)}`)}finally{T&&await T.close()}}import ct from"node:fs";import lt from"node:path";import F from"node:path";function $(t){let r=F.dirname(t.path||"");return t.data?.compilerOptions?.baseUrl?F.resolve(r,t.data.compilerOptions.baseUrl):r}function W(t){let r=new Map,e=t.data?.compilerOptions?.paths;if(!e)return r;let n=$(t);for(let[o,s]of Object.entries(e))if(Array.isArray(s)&&s.length){let i=o.replace(/\*/g,"(.*)"),a=s[0].replace(/\*/g,"$1");r.set(`^${i}$`,F.join(n,a))}return r}function A(t,r,e){for(let[n,o]of r){let s=new RegExp(n),i=t.match(s);if(i)return o.replace("$1",i[1]||"")}return e?F.join(e,t):null}var kt=/(?:import|export)(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*|[\s\n]+)(["'`])([^'"]+)\1/g,St=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;async function pt(t,r){let e=new Set([t]),n=[t],o=W(r),s=$(r);for(;n.length;){let i=n.pop();if(i)try{let a=await ct.promises.readFile(i,"utf8"),c=Ct(a);for(let l of c){let u=l.startsWith(".")?lt.resolve(lt.dirname(i),l):A(l,o,s);if(!u)continue;let m=Mt(u);m&&!e.has(m)&&(e.add(m),n.push(m))}}catch(a){p.warn(`Error processing ${i}: ${f(a)}`)}}return e}function Ct(t){let r=new Set;for(let e of[kt,St]){let n;for(;(n=e.exec(t))!==null;)r.add(n[2])}return Array.from(r)}function Mt(t){let r=["",".ts",".tsx","/index.ts","/index.tsx"];for(let e of r){let n=`${t}${e}`;if(ct.existsSync(n)&&(n.endsWith(".ts")||n.endsWith(".tsx")))return n}return null}import Ft from"node:fs";import ut from"node:path";import Wt from"oxc-transform";async function ft(t,r){let e=new Map,n=$(r),o=W(r);return await Promise.all([...t].map(async s=>{try{let i=s.replace(/\.tsx?$/,".d.ts"),a=await Ft.promises.readFile(s,"utf8"),{code:c}=Wt.isolatedDeclaration(s,a);if(c){let l=At(c,o,n,ut.dirname(s));e.set(i,l)}}catch(i){p.warn(`Failed to generate declaration for ${s}: ${f(i)}`)}})),e}function At(t,r,e,n){return t.replace(/(import|export)(.+?from\s+['"])([^'"]+)(['"])/g,(o,s,i,a,c)=>{if(a.startsWith(".")||a.startsWith("/"))return o;let l=A(a,r,e);if(!l)return o;let u=ut.relative(n,l).replace(/\\/g,"/"),m=u.startsWith(".")?u:`./${u}`;return`${s}${i}${m}${c}`})}async function gt(t,r,e,n){let{absoluteRootDir:o,absoluteEntry:s}=jt(t,r),i=Y(n.preferredTsconfigPath),a=await pt(s,i),c=await ft(a,i);return at(s,c,e,n,o,i)}function jt(t,r){let e=_.resolve(t),n=_.resolve(e,r);if(!mt.existsSync(e))throw new g(`Root directory does not exist: ${e}`);if(!mt.existsSync(n))throw new g(`Entry file does not exist: ${n}`);if(!n.endsWith(".ts"))throw new g(`Entry file must be a TypeScript file (.ts): ${n}`);if(_.relative(e,n).startsWith(".."))throw new g(`Entry file must be within rootDir: ${n}`);return{absoluteRootDir:e,absoluteEntry:n}}async function dt(t,r,e,n,o){return new Promise((s,i)=>{let a={rootDir:t,entries:r,formats:e,options:n,packageType:o},c=new Nt(new URL("./dtsWorker.js",import.meta.url),{workerData:a});c.on("message",l=>{if(l.success){if(l.timeMs){let u=R(l.timeMs);p.progress("DTS",`Bundled types in ${u}`)}s()}else i(new g(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",l=>{l!==0&&i(new g(`DTS worker stopped with exit code ${l}`))})})}if(!It&&j){let{rootDir:t,entries:r,formats:e,options:n,packageType:o}=Lt,s=performance.now();p.progress("DTS","Bundling types");try{let i=e.flatMap(a=>r.map(async c=>{let l=await gt(t,c.path,a,n),u=Z(a,o),m=`${n.outDir}/${c.name}${u}`,E=`${t}/${m}`;await Bun.write(E,l),p.progress("DTS",m)}));Promise.all(i).then(()=>{let a=performance.now()-s;j?.postMessage({success:!0,timeMs:a})}).catch(a=>{j?.postMessage({success:!1,error:f(a)})})}catch(i){j?.postMessage({success:!1,error:f(i)})}}function Ut(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function D(t){let r=[],e=new Set;function n(o,s){if(e.has(o)){let i=K();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),e.add(o)}if(Array.isArray(t))for(let o of t){let s=Ut(o);n(s,o)}else Object.entries(t).forEach(([o,s])=>{n(o,s)});return r}function ht(t,r){return`[dir]/${t}${r}`}function yt(t,r){return{name:"bunup:external-plugin",setup(e){e.onResolve({filter:/.*/},n=>{let o=n.path;return t.some(i=>i.test(o))&&!r.some(i=>i.test(o))?{path:o,external:!0}:null})}}}async function I(t,r){if(!t.entry||t.entry.length===0||!t.outDir)throw new y("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");let e=performance.now();p.cli("Build started");let n=M(r),o=n?.type,s=k(t,n),i=S(t),a=[yt(s,i)],c=D(t.entry),l=t.format.flatMap(u=>c.map(m=>_t(t,r,m,u,o,a)));try{await Promise.all(l);let u=performance.now()-e,m=R(u);p.cli(`\u26A1 Build success in ${m}`)}catch{throw new y("Build process encountered errors")}if(t.dts){p.progress("DTS","Bundling types");let u=t.format.filter(E=>!(E==="iife"&&!v(o)&&t.format.includes("cjs"))),m=t.dts===!0?c:D(t.dts.entry);try{await dt(r,m,u,t,o)}catch(E){throw new g(`DTS build process encountered errors: ${f(E)}`)}}}async function _t(t,r,e,n,o,s){let i=Q(n,o),a=nt(t,r),c=await Bun.build({...a,entrypoints:[`${r}/${e.path}`],format:n,naming:{entry:ht(e.name,i)},splitting:rt(t.splitting,n),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(l=>{l.level==="error"?p.error(l.message):l.level==="warning"?p.warn(l.message):l.level==="info"&&p.info(l.message)}),new y(`Build failed for ${e} (${n})`);p.progress(X(n,t.name),`${t.outDir}/${e.name}${i}`)}function w(t){return(r,e)=>{e[t]=r===!0?!0:r==="true"}}function H(t){return(r,e)=>{if(typeof r=="string")e[t]=r;else throw new d(`Option --${t} requires a string value`)}}function xt(t){return(r,e)=>{if(typeof r=="string")e[t]=r.split(",");else throw new d(`Option --${t} requires a string value`)}}var Ht={name:{flags:["n","name"],handler:H("name")},format:{flags:["f","format"],handler:(t,r)=>{if(typeof t=="string")r.format=t.split(",");else throw new d("Option --format requires a string value")}},outDir:{flags:["o","out-dir"],handler:H("outDir")},minify:{flags:["m","minify"],handler:w("minify")},watch:{flags:["w","watch"],handler:w("watch")},dts:{flags:["d","dts"],handler:w("dts")},external:{flags:["e","external"],handler:xt("external")},target:{flags:["t","target"],handler:H("target")},minifyWhitespace:{flags:["mw","minify-whitespace"],handler:w("minifyWhitespace")},minifyIdentifiers:{flags:["mi","minify-identifiers"],handler:w("minifyIdentifiers")},minifySyntax:{flags:["ms","minify-syntax"],handler:w("minifySyntax")},clean:{flags:["c","clean"],handler:w("clean")},splitting:{flags:["s","splitting"],handler:w("splitting")},noExternal:{flags:["ne","no-external"],handler:xt("noExternal")}},J={};for(let t of Object.values(Ht))if(t)for(let r of t.flags)J[r]=t.handler;function wt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function Et(t){let r={},e={},n=0;for(;n<t.length;){let o=t[n];if(o.startsWith("--")){let s,i;if(o.includes("=")){let[a,c]=o.slice(2).split("=",2);s=a,i=c}else{s=o.slice(2);let a=t[n+1];i=a&&!a.startsWith("-")?a:!0,typeof i=="string"&&n++}if(s==="entry")if(typeof i=="string"){let a=wt(i);e[a]&&p.warn(`Duplicate entry name '${a}' derived from '${i}'. Overwriting previous entry.`),e[a]=i}else throw new d("Option --entry requires a string value");else if(s.startsWith("entry.")){let a=s.slice(6);if(typeof i=="string")e[a]&&p.warn(`Duplicate entry name '${a}' provided via --entry.${a}. Overwriting previous entry.`),e[a]=i;else throw new d(`Option --entry.${a} requires a string value`)}else{let a=J[s];if(a)a(i,r);else throw new d(`Unknown option: --${s}`)}}else if(o.startsWith("-")){let s=o.slice(1),i=t[n+1],a=i&&!i.startsWith("-")?i:!0;typeof a=="string"&&n++;let c=J[s];if(c)c(a,r);else throw new d(`Unknown option: -${s}`)}else{let s=wt(o);e[s]&&p.warn(`Duplicate entry name '${s}' derived from positional argument '${o}'. Overwriting previous entry.`),e[s]=o}n++}return Object.keys(e).length>0&&(r.entry=e),r}(()=>{if(typeof Bun>"u")throw new d(`Bunup requires Bun to run.
5
+ To install Bun, visit https://bun.sh/docs/installation`)})();import q from"node:path";import Jt from"chokidar";async function Ot(t,r){let e=new Set;D(t.entry).forEach(c=>{let l=q.resolve(r,c.path),u=q.dirname(l);e.add(u)});let o=Jt.watch(Array.from(e),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),s=null,i=!1,a=async c=>{if(!i){i=!0;try{await I({...t,entry:[c],clean:!1},r)}catch(l){throw new B(`Build failed: ${f(l)}`)}finally{i=!1}}};o.on("change",c=>{let l=q.relative(r,c);p.cli(`File changed: ${l}`),s&&clearTimeout(s),s=setTimeout(()=>a(l),300)}),o.on("error",c=>{throw new B(`Watcher error: ${f(c)}`)})}async function zt(t=Bun.argv.slice(2)){let r=Et(t),e=await st(process.cwd()),n=process.cwd();if(r.watch&&(p.cli("Starting watch mode"),p.cli("Watching for file changes")),e.length===0){let o={...b,...r};o.clean&&Bt(n,o.outDir),await Pt(o,n)}else{for(let{options:o,rootDir:s}of e)o.clean&&Bt(s,o.outDir);await Promise.all(e.map(async({options:o,rootDir:s})=>{let i={...b,...o,...r};await Pt(i,s)}))}r.watch||process.exit(0)}async function Pt(t,r){t.watch?await Ot(t,r):await I(t,r)}function Bt(t,r){let e=qt.join(t,r);if(z.existsSync(e))try{z.rmSync(e,{recursive:!0,force:!0})}catch(n){throw new y(`Failed to clean output directory: ${n}`)}z.mkdirSync(e,{recursive:!0})}zt().catch(t=>V(t));export{zt as main};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _worker_threads = require('worker_threads');var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);var _path = require('path'); var _path2 = _interopRequireDefault(_path);var _oxctransform = require('oxc-transform'); var _oxctransform2 = _interopRequireDefault(_oxctransform);var _rollup = require('rollup');var _rollupplugindts = require('rollup-plugin-dts'); var _rollupplugindts2 = _interopRequireDefault(_rollupplugindts);var _typescript = require('typescript'); var _typescript2 = _interopRequireDefault(_typescript);var h=t=>t instanceof Error?t.message:String(t);function b(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function O(t,r){switch(t){case"esm":return".d.mts";case"cjs":return _(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function _(t){return t==="module"}function k(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function R(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function T(t){return t.map(r=>typeof r=="string"?new RegExp(`^${b(r)}($|\\/|\\\\)`):r)}function B(t,r){return T(t.external||[]).concat(R(r).map(n=>new RegExp(`^${b(n)}($|\\/|\\\\)`)))}function M(t){return T(t.noExternal||[])}var u={MAX_LABEL_LENGTH:5,colors:{cli:"183",info:"240",warn:"221",error:"203",progress:{ESM:"214",CJS:"114",IIFE:"105",DTS:"75"},default:"255"},labels:{cli:"BUNUP",info:"INFO",warn:"WARN",error:"ERROR"},formatMessage(t,r,n){let e=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-r.length));return`\x1B[38;5;${t}m[${r}]\x1B[0m ${e}${n}`},cli(t){let r=this.labels.cli;console.log(this.formatMessage(this.colors.cli,r,t))},info(t){let r=this.labels.info;console.log(this.formatMessage(this.colors.info,r,t))},warn(t){let r=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,r,t))},error(t){let r=this.labels.error;console.error(this.formatMessage(this.colors.error,r,t))},progress(t,r){let n=String(t),e=this.colors.default;for(let[i,s]of Object.entries(this.colors.progress))if(n.includes(i)){e=s;break}console.log(this.formatMessage(e,n,r))}};function F(t){let r=_path2.default.join(t,"package.json");try{if(!_fs2.default.existsSync(r))return null;let n=_fs2.default.readFileSync(r,"utf8");return JSON.parse(n)}catch(n){return u.error(`Failed to load package.json at ${r}: ${h(n)}`),null}}function C(t){try{if(!_fs2.default.existsSync(t))return{};let r=_fs2.default.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return u.warn(`Failed to parse tsconfig at ${t}: ${h(r)}`),{}}}async function v(t,r,n,e){let{absoluteRootDir:i,absoluteEntry:s}=z(t,r),o=await X(s),a=await Y(o);return q(s,a,n,e,i)}async function X(t){let r=new Set,n=[t];for(;n.length>0;){let e=n.pop();if(!(!e||r.has(e))){r.add(e);try{let i=await _fs2.default.promises.readFile(e,"utf8"),s=H(i);for(let o of s){let a=_path2.default.dirname(e),c=_path2.default.resolve(a,o),l=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let g of l)if(_fs2.default.existsSync(g)&&g.endsWith(".ts")&&!r.has(g)){n.push(g);break}}}catch(i){u.warn(`Error processing ${e}: ${i instanceof Error?i.message:String(i)}`)}}}return r}function H(t){let r=new Set;try{let n=/(?:import|export)(?:(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*)|[\s\n]+)(["'`])([^'"]+)\1/g,e;for(;(e=n.exec(t))!==null;){let o=e[2];o.startsWith(".")&&r.add(o)}let i=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(e=i.exec(t))!==null;){let o=e[2];o.startsWith(".")&&r.add(o)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(e=s.exec(t))!==null;){let o=e[2];o.startsWith(".")&&r.add(o)}}catch(n){u.warn(`Error extracting imports: ${n instanceof Error?n.message:String(n)}`)}return Array.from(r)}async function Y(t){let r=new Map;return await Promise.all(Array.from(t).map(async n=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),i=await _fs2.default.promises.readFile(n,"utf8"),{code:s}=_oxctransform2.default.isolatedDeclaration(n,i);s&&r.set(e,s)}catch(e){u.warn(`Failed to generate declaration for ${n}: ${e instanceof Error?e.message:String(e)}`)}})),r}async function q(t,r,n,e,i){let s="\0virtual:",o=t.replace(/\.tsx?$/,".d.ts"),a=`${s}${o}`,c=typeof e.dts=="object"?e.dts:{},l=c.preferredTsconfigPath?_path2.default.resolve(c.preferredTsconfigPath):_path2.default.join(i,"tsconfig.json"),x=(await C(l)).compilerOptions,$={name:"bunup:virtual-dts",resolveId(p,f){if(p.startsWith(s))return p;if(_optionalChain([f, 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3(s)])){let d=f.slice(s.length),N=_path2.default.dirname(d);if(p.startsWith(".")){let L=_path2.default.resolve(N,p);for(let A of["",".d.ts","/index.d.ts"]){let S=`${L}${A}`;if(r.has(S))return`${s}${S}`}}}return null},load(p){if(p.startsWith(s)){let f=p.slice(s.length);return r.get(f)||null}return null}},j=F(i),I=B(e,j),W=M(e),E;try{E=await _rollup.rollup.call(void 0, {input:a,onwarn(f,d){f.code==="UNRESOLVED_IMPORT"||f.code==="CIRCULAR_DEPENDENCY"||f.code==="EMPTY_BUNDLE"||d(f)},plugins:[$,_rollupplugindts2.default.call(void 0, {tsconfig:l,compilerOptions:{...x?_typescript2.default.parseJsonConfigFileContent({compilerOptions:x},_typescript2.default.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:_typescript2.default.ScriptTarget.ESNext}})],external:f=>I.some(d=>d.test(f))&&!W.some(d=>d.test(f))});let{output:p}=await E.generate({format:n});if(!_optionalChain([p, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.code]))throw new Error("Generated bundle is empty");return p[0].code}catch(p){throw new Error(`DTS bundling failed: ${h(p)}`)}finally{E&&await E.close()}}function z(t,r){let n=_path2.default.resolve(t),e=_path2.default.resolve(n,r);if(!_fs2.default.existsSync(n))throw new Error(`Root directory does not exist: ${n}`);if(!_fs2.default.existsSync(e))throw new Error(`Entry file does not exist: ${e}`);if(!e.endsWith(".ts"))throw new Error(`Entry file must be a TypeScript file (.ts): ${e}`);if(_path2.default.relative(n,e).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${e}`);return{absoluteRootDir:n,absoluteEntry:e}}async function Bt(t,r,n,e,i){return new Promise((s,o)=>{let a={rootDir:t,entries:r,formats:n,options:e,packageType:i},c=new (0, _worker_threads.Worker)(new URL("./dtsWorker.js",import.meta.url),{workerData:a});c.on("message",l=>{if(l.success){if(l.timeMs){let g=k(l.timeMs);u.progress("DTS",`Bundled types in ${g}`)}s()}else o(new Error(l.error||"Unknown DTS worker error"))}),c.on("error",o),c.on("exit",l=>{l!==0&&o(new Error(`DTS worker stopped with exit code ${l}`))})})}if(!_worker_threads.isMainThread&&_worker_threads.parentPort){let{rootDir:t,entries:r,formats:n,options:e,packageType:i}=_worker_threads.workerData,s=performance.now();u.progress("DTS","Bundling types");try{let o=n.flatMap(a=>r.map(async c=>{let l=await v(t,c.path,a,e),g=O(a,i),x=`${e.outDir}/${c.name}${g}`,$=`${t}/${x}`;await Bun.write($,l),u.progress("DTS",x)}));Promise.all(o).then(()=>{let a=performance.now()-s;_optionalChain([_worker_threads.parentPort, 'optionalAccess', _6 => _6.postMessage, 'call', _7 => _7({success:!0,timeMs:a})])}).catch(a=>{_optionalChain([_worker_threads.parentPort, 'optionalAccess', _8 => _8.postMessage, 'call', _9 => _9({success:!1,error:a instanceof Error?a.message:String(a)})])})}catch(o){_optionalChain([_worker_threads.parentPort, 'optionalAccess', _10 => _10.postMessage, 'call', _11 => _11({success:!1,error:o instanceof Error?o.message:String(o)})])}}exports.runDtsInWorker = Bt;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _worker_threads = require('worker_threads');var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);var _path = require('path'); var _path2 = _interopRequireDefault(_path);var O=class extends Error{constructor(r){super(r),this.name="BunupError"}};var p=class extends O{constructor(r){super(r),this.name="BunupDTSBuildError"}};var f=t=>t instanceof Error?t.message:String(t);var _loadtsconfig = require('load-tsconfig');var m={MAX_LABEL_LENGTH:5,colors:{cli:"183",info:"240",warn:"221",error:"203",progress:{ESM:"214",CJS:"114",IIFE:"105",DTS:"75"},default:"255"},labels:{cli:"BUNUP",info:"INFO",warn:"WARN",error:"ERROR"},formatMessage(t,r,n){let e=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-r.length));return`\x1B[38;5;${t}m[${r}]\x1B[0m ${e}${n}`},cli(t){let r=this.labels.cli;console.log(this.formatMessage(this.colors.cli,r,t))},info(t){let r=this.labels.info;console.log(this.formatMessage(this.colors.info,r,t))},warn(t){let r=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,r,t))},error(t){let r=this.labels.error;console.error(this.formatMessage(this.colors.error,r,t))},progress(t,r){let n=String(t),e=this.colors.default;for(let[c,s]of Object.entries(this.colors.progress))if(n.includes(c)){e=s;break}console.log(this.formatMessage(e,n,r))}};function M(t){try{return _loadtsconfig.loadTsConfig.call(void 0, ".",t)}catch(r){return m.warn(`Failed to load tsconfig: ${f(r)}`),{path:t,data:{},files:[]}}}var _rollup = require('rollup');var _rollupplugindts = require('rollup-plugin-dts'); var _rollupplugindts2 = _interopRequireDefault(_rollupplugindts);var _typescript = require('typescript'); var _typescript2 = _interopRequireDefault(_typescript);function P(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function k(t,r){switch(t){case"esm":return".d.mts";case"cjs":return K(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function K(t){return t==="module"}function v(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function F(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function j(t){return t.map(r=>typeof r=="string"?new RegExp(`^${P(r)}($|\\/|\\\\)`):r)}function A(t,r){return j(t.external||[]).concat(F(r).map(n=>new RegExp(`^${P(n)}($|\\/|\\\\)`)))}function N(t){return j(t.noExternal||[])}function I(t){let r=_path2.default.join(t,"package.json");try{if(!_fs2.default.existsSync(r))return null;let n=_fs2.default.readFileSync(r,"utf8");return JSON.parse(n)}catch(n){return m.warn(`Failed to load package.json at ${r}: ${f(n)}`),null}}async function L(t,r,n,e,c,s){let o="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),l=`${o}${i}`,a=_optionalChain([s, 'access', _2 => _2.data, 'optionalAccess', _3 => _3.compilerOptions]),u={name:"bunup:virtual-dts",resolveId(g,x){if(g.startsWith(o))return g;if(!_optionalChain([x, 'optionalAccess', _4 => _4.startsWith, 'call', _5 => _5(o)])||!g.startsWith("."))return null;let h=x.slice(o.length),T=_path2.default.resolve(_path2.default.dirname(h),g),S=r.has(T)?T:`${T}.d.ts`;return r.has(S)?`${o}${S}`:null},load(g){return g.startsWith(o)&&r.get(g.slice(o.length))||null}},d=I(c),R=A(e,d),z=N(e),E;try{E=await _rollup.rollup.call(void 0, {input:l,onwarn(x,h){["UNRESOLVED_IMPORT","CIRCULAR_DEPENDENCY","EMPTY_BUNDLE"].includes(_nullishCoalesce(x.code, () => ("")))||h(x)},plugins:[u,_rollupplugindts2.default.call(void 0, {tsconfig:s.path,compilerOptions:{...a?_typescript2.default.parseJsonConfigFileContent({compilerOptions:a},_typescript2.default.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:_typescript2.default.ScriptTarget.ESNext}})],external:x=>R.some(h=>h.test(x))&&!z.some(h=>h.test(x))});let{output:g}=await E.generate({format:n});if(!_optionalChain([g, 'access', _6 => _6[0], 'optionalAccess', _7 => _7.code]))throw new p("Generated bundle is empty");return g[0].code}catch(g){throw new p(`DTS bundling failed: ${f(g)}`)}finally{E&&await E.close()}}function y(t){let r=_path2.default.dirname(t.path||"");return _optionalChain([t, 'access', _8 => _8.data, 'optionalAccess', _9 => _9.compilerOptions, 'optionalAccess', _10 => _10.baseUrl])?_path2.default.resolve(r,t.data.compilerOptions.baseUrl):r}function D(t){let r=new Map,n=_optionalChain([t, 'access', _11 => _11.data, 'optionalAccess', _12 => _12.compilerOptions, 'optionalAccess', _13 => _13.paths]);if(!n)return r;let e=y(t);for(let[c,s]of Object.entries(n))if(Array.isArray(s)&&s.length){let o=c.replace(/\*/g,"(.*)"),i=s[0].replace(/\*/g,"$1");r.set(`^${o}$`,_path2.default.join(e,i))}return r}function $(t,r,n){for(let[e,c]of r){let s=new RegExp(e),o=t.match(s);if(o)return c.replace("$1",o[1]||"")}return n?_path2.default.join(n,t):null}var rt=/(?:import|export)(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*|[\s\n]+)(["'`])([^'"]+)\1/g,et=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;async function G(t,r){let n=new Set([t]),e=[t],c=D(r),s=y(r);for(;e.length;){let o=e.pop();if(o)try{let i=await _fs2.default.promises.readFile(o,"utf8"),l=nt(i);for(let a of l){let u=a.startsWith(".")?_path2.default.resolve(_path2.default.dirname(o),a):$(a,c,s);if(!u)continue;let d=ot(u);d&&!n.has(d)&&(n.add(d),e.push(d))}}catch(i){m.warn(`Error processing ${o}: ${f(i)}`)}}return n}function nt(t){let r=new Set;for(let n of[rt,et]){let e;for(;(e=n.exec(t))!==null;)r.add(e[2])}return Array.from(r)}function ot(t){let r=["",".ts",".tsx","/index.ts","/index.tsx"];for(let n of r){let e=`${t}${n}`;if(_fs2.default.existsSync(e)&&(e.endsWith(".ts")||e.endsWith(".tsx")))return e}return null}var _oxctransform = require('oxc-transform'); var _oxctransform2 = _interopRequireDefault(_oxctransform);async function X(t,r){let n=new Map,e=y(r),c=D(r);return await Promise.all([...t].map(async s=>{try{let o=s.replace(/\.tsx?$/,".d.ts"),i=await _fs2.default.promises.readFile(s,"utf8"),{code:l}=_oxctransform2.default.isolatedDeclaration(s,i);if(l){let a=at(l,c,e,_path2.default.dirname(s));n.set(o,a)}}catch(o){m.warn(`Failed to generate declaration for ${s}: ${f(o)}`)}})),n}function at(t,r,n,e){return t.replace(/(import|export)(.+?from\s+['"])([^'"]+)(['"])/g,(c,s,o,i,l)=>{if(i.startsWith(".")||i.startsWith("/"))return c;let a=$(i,r,n);if(!a)return c;let u=_path2.default.relative(e,a).replace(/\\/g,"/"),d=u.startsWith(".")?u:`./${u}`;return`${s}${o}${d}${l}`})}async function Y(t,r,n,e){let{absoluteRootDir:c,absoluteEntry:s}=ct(t,r),o=M(e.preferredTsconfigPath),i=await G(s,o),l=await X(i,o);return L(s,l,n,e,c,o)}function ct(t,r){let n=_path2.default.resolve(t),e=_path2.default.resolve(n,r);if(!_fs2.default.existsSync(n))throw new p(`Root directory does not exist: ${n}`);if(!_fs2.default.existsSync(e))throw new p(`Entry file does not exist: ${e}`);if(!e.endsWith(".ts"))throw new p(`Entry file must be a TypeScript file (.ts): ${e}`);if(_path2.default.relative(n,e).startsWith(".."))throw new p(`Entry file must be within rootDir: ${e}`);return{absoluteRootDir:n,absoluteEntry:e}}async function mr(t,r,n,e,c){return new Promise((s,o)=>{let i={rootDir:t,entries:r,formats:n,options:e,packageType:c},l=new (0, _worker_threads.Worker)(new URL("./dtsWorker.js",import.meta.url),{workerData:i});l.on("message",a=>{if(a.success){if(a.timeMs){let u=v(a.timeMs);m.progress("DTS",`Bundled types in ${u}`)}s()}else o(new p(a.error||"Unknown DTS worker error"))}),l.on("error",o),l.on("exit",a=>{a!==0&&o(new p(`DTS worker stopped with exit code ${a}`))})})}if(!_worker_threads.isMainThread&&_worker_threads.parentPort){let{rootDir:t,entries:r,formats:n,options:e,packageType:c}=_worker_threads.workerData,s=performance.now();m.progress("DTS","Bundling types");try{let o=n.flatMap(i=>r.map(async l=>{let a=await Y(t,l.path,i,e),u=k(i,c),d=`${e.outDir}/${l.name}${u}`,R=`${t}/${d}`;await Bun.write(R,a),m.progress("DTS",d)}));Promise.all(o).then(()=>{let i=performance.now()-s;_optionalChain([_worker_threads.parentPort, 'optionalAccess', _14 => _14.postMessage, 'call', _15 => _15({success:!0,timeMs:i})])}).catch(i=>{_optionalChain([_worker_threads.parentPort, 'optionalAccess', _16 => _16.postMessage, 'call', _17 => _17({success:!1,error:f(i)})])})}catch(o){_optionalChain([_worker_threads.parentPort, 'optionalAccess', _18 => _18.postMessage, 'call', _19 => _19({success:!1,error:f(o)})])}}exports.runDtsInWorker = mr;
package/build/index.d.mts CHANGED
@@ -28,17 +28,6 @@ type DtsOptions = {
28
28
  * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
29
29
  */
30
30
  entry: Entry;
31
- /**
32
- * Path to a preferred tsconfig.json file to use for declaration generation
33
- *
34
- * If not specified, the tsconfig.json in the project root will be used.
35
- * This option allows you to use a different TypeScript configuration
36
- * specifically for declaration file generation.
37
- *
38
- * @example
39
- * preferredTsconfigPath: './tsconfig.build.json'
40
- */
41
- preferredTsconfigPath?: string;
42
31
  };
43
32
  interface BunupOptions {
44
33
  /**
@@ -113,6 +102,17 @@ interface BunupOptions {
113
102
  * Can also be configured with DtsOptions for more control
114
103
  */
115
104
  dts?: boolean | DtsOptions;
105
+ /**
106
+ * Path to a preferred tsconfig.json file to use for declaration generation
107
+ *
108
+ * If not specified, the tsconfig.json in the project root will be used.
109
+ * This option allows you to use a different TypeScript configuration
110
+ * specifically for declaration file generation.
111
+ *
112
+ * @example
113
+ * preferredTsconfigPath: './tsconfig.build.json'
114
+ */
115
+ preferredTsconfigPath?: string;
116
116
  /**
117
117
  * External packages that should not be bundled
118
118
  * Useful for dependencies that should be kept as external imports
package/build/index.d.ts CHANGED
@@ -28,17 +28,6 @@ type DtsOptions = {
28
28
  * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
29
29
  */
30
30
  entry: Entry;
31
- /**
32
- * Path to a preferred tsconfig.json file to use for declaration generation
33
- *
34
- * If not specified, the tsconfig.json in the project root will be used.
35
- * This option allows you to use a different TypeScript configuration
36
- * specifically for declaration file generation.
37
- *
38
- * @example
39
- * preferredTsconfigPath: './tsconfig.build.json'
40
- */
41
- preferredTsconfigPath?: string;
42
31
  };
43
32
  interface BunupOptions {
44
33
  /**
@@ -113,6 +102,17 @@ interface BunupOptions {
113
102
  * Can also be configured with DtsOptions for more control
114
103
  */
115
104
  dts?: boolean | DtsOptions;
105
+ /**
106
+ * Path to a preferred tsconfig.json file to use for declaration generation
107
+ *
108
+ * If not specified, the tsconfig.json in the project root will be used.
109
+ * This option allows you to use a different TypeScript configuration
110
+ * specifically for declaration file generation.
111
+ *
112
+ * @example
113
+ * preferredTsconfigPath: './tsconfig.build.json'
114
+ */
115
+ preferredTsconfigPath?: string;
116
116
  /**
117
117
  * External packages that should not be bundled
118
118
  * Useful for dependencies that should be kept as external imports
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunup",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "A extremely fast, zero-config bundler for TypeScript & JavaScript, powered by Bun.",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -54,6 +54,7 @@
54
54
  "author": "Arshad Yaseen <m@arshadyaseen.com> (https://arshadyaseen.com)",
55
55
  "dependencies": {
56
56
  "chokidar": "^4.0.3",
57
+ "load-tsconfig": "^0.2.5",
57
58
  "oxc-transform": "^0.58.1",
58
59
  "rollup": "^4.35.0",
59
60
  "rollup-plugin-dts": "^6.1.1"
@@ -70,6 +71,6 @@
70
71
  "validate": "pnpm run tsc && pnpm run lint",
71
72
  "format": "prettier --write .",
72
73
  "release": "bumpp",
73
- "publish:ci": "pnpm -r publish --access public --no-git-checks"
74
+ "publish:ci": "pnpm -r --filter '!tests' --filter '!docs' publish --access public --no-git-checks"
74
75
  }
75
76
  }