bunup 0.1.17 → 0.1.19

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,6 @@
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
+ // @bun
3
+ import q from"fs";import Ht from"path";import{isMainThread as Nt,parentPort as A,Worker as It,workerData as Wt}from"node:worker_threads";import pt from"node:fs";import L from"node:path";class $ extends Error{constructor(t){super(t);this.name="BunupError"}}class x extends ${constructor(t){super(t);this.name="BunupBuildError"}}class g extends ${constructor(t){super(t);this.name="BunupDTSBuildError"}}class h extends ${constructor(t){super(t);this.name="BunupCLIError"}}class C extends ${constructor(t){super(t);this.name="BunupWatchError"}}var u=(t)=>{if(t instanceof Error)return t.message;return String(t)},Ct=(t,r)=>{let n=u(t),e=r?`[${r}] `:"",s="ERROR";if(t instanceof x)s="BUILD ERROR";else if(t instanceof g)s="DTS ERROR";else if(t instanceof h)s="CLI ERROR";else if(t instanceof C)s="WATCH ERROR";else if(t instanceof $)s="BUNUP ERROR";if(console.error(`\x1B[31m[${s}]\x1B[0m ${e}${n}`),t instanceof Error&&t.stack)console.error("\x1B[2m"+t.stack.split(`
3
4
  `).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};
5
+ `)+"\x1B[0m")},X=(t,r)=>{Ct(t,r),process.exit(1)};import{loadTsConfig as Bt}from"load-tsconfig";var f={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[s,o]of Object.entries(this.colors.progress))if(n.includes(s)){e=o;break}console.log(this.formatMessage(e,n,r))}};function Y(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}function J(t){try{return Bt(".",t)}catch(r){return f.warn(`Failed to load tsconfig: ${u(r)}`),{path:t,data:{},files:[]}}}import st from"node:path";import{rollup as Pt}from"rollup";import St from"rollup-plugin-dts";import W from"typescript";function I(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 P(r)?".cjs":".js";case"iife":return".global.js"}}function V(t,r){switch(t){case"esm":return".d.mts";case"cjs":return P(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function P(t){return t==="module"}function S(t){return t>=1000?`${(t/1000).toFixed(2)}s`:`${Math.round(t)}ms`}function Z(t){if(!t)return[];return Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})]))}function z(t,r){return t===void 0?r==="esm":t}function tt(t){return t.map((r)=>typeof r==="string"?new RegExp(`^${I(r)}($|\\/|\\\\)`):r)}function D(t,r){return tt(t.external||[]).concat(Z(r).map((n)=>new RegExp(`^${I(n)}($|\\/|\\\\)`)))}function T(t){return tt(t.noExternal||[])}import b from"node:fs";import nt from"node:path";var v={entry:[],format:["cjs"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function rt(t,r){return{outdir:`${r}/${t.outDir}`,minify:Rt(t),target:t.target,splitting:t.splitting}}function Rt(t){let{minify:r,minifyWhitespace:n,minifyIdentifiers:e,minifySyntax:s}=t,o=r===!0;return{whitespace:n??o,identifiers:e??o,syntax:s??o}}async function et(t){let r=[];for(let n of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let e=nt.join(t,`bunup.config${n}`);try{if(!b.existsSync(e))continue;let s;if(n===".json"||n===".jsonc"){let o=b.readFileSync(e,"utf8");s=JSON.parse(o)}else{let o=await import(`file://${e}`);if(s=o.default||o,!s)f.warn(`No default export found in ${e}`),s={}}if(Array.isArray(s))for(let o of s)r.push({options:{...v,...o},rootDir:t});else r.push({options:{...v,...s},rootDir:t});break}catch(s){throw new x(`Failed to load config from ${e}: ${u(s)}`)}if(r.length>0)break}return r}function M(t){let r=nt.join(t,"package.json");try{if(!b.existsSync(r))return null;let n=b.readFileSync(r,"utf8");return JSON.parse(n)}catch(n){return f.warn(`Failed to load package.json at ${r}: ${u(n)}`),null}}async function ot(t,r,n,e,s,o){let c=`\x00virtual:${t.replace(/\.tsx?$/,".d.ts")}`,l=o.data?.compilerOptions,p={name:"bunup:virtual-dts",resolveId(d,w){if(d.startsWith("\x00virtual:"))return d;if(!w?.startsWith("\x00virtual:")||!d.startsWith("."))return null;let O=w.slice(9),N=st.resolve(st.dirname(O),d),G=r.has(N)?N:`${N}.d.ts`;return r.has(G)?`\x00virtual:${G}`:null},load(d){return d.startsWith("\x00virtual:")?r.get(d.slice(9))||null:null}},m=M(s),E=D(e,m),vt=T(e),R;try{R=await Pt({input:c,onwarn(w,O){if(["UNRESOLVED_IMPORT","CIRCULAR_DEPENDENCY","EMPTY_BUNDLE"].includes(w.code??""))return;O(w)},plugins:[p,St({tsconfig:o.path,compilerOptions:{...l?W.parseJsonConfigFileContent({compilerOptions:l},W.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:W.ScriptTarget.ESNext}})],external:(w)=>E.some((O)=>O.test(w))&&!vt.some((O)=>O.test(w))});let{output:d}=await R.generate({format:n});if(!d[0]?.code)throw new g("Generated bundle is empty");return d[0].code}catch(d){throw new g(`DTS bundling failed: ${u(d)}`)}finally{if(R)await R.close()}}import ct from"node:fs";import lt from"node:path";import k from"node:path";function j(t){let r=k.dirname(t.path||"");return t.data?.compilerOptions?.baseUrl?k.resolve(r,t.data.compilerOptions.baseUrl):r}function it(t){let r=new Map,n=t.data?.compilerOptions?.paths;if(!n)return r;let e=j(t);for(let[s,o]of Object.entries(n))if(Array.isArray(o)&&o.length){let i=s.replace(/\*/g,"(.*)"),a=o[0].replace(/\*/g,"$1");r.set(`^${i}$`,k.join(e,a))}return r}function at(t,r,n){for(let[e,s]of r){let o=new RegExp(e),i=t.match(o);if(i)return s.replace("$1",i[1]||"")}return n?k.join(n,t):null}var Dt=/(?:import|export)(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*|[\s\n]+)(["'`])([^'"]+)\1/g,Tt=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;async function ft(t,r){let n=new Set([t]),e=[t],s=it(r),o=j(r);while(e.length){let i=e.pop();if(!i)continue;try{let a=await ct.promises.readFile(i,"utf8"),c=bt(a);for(let l of c){let p=l.startsWith(".")?lt.resolve(lt.dirname(i),l):at(l,s,o);if(!p)continue;let m=Mt(p);if(m&&!n.has(m))n.add(m),e.push(m)}}catch(a){f.warn(`Error processing ${i}: ${u(a)}`)}}return n}function bt(t){let r=new Set;for(let n of[Dt,Tt]){let e;while((e=n.exec(t))!==null)r.add(e[2])}return Array.from(r)}function Mt(t){let r=["",".ts",".tsx","/index.ts","/index.tsx"];for(let n of r){let e=`${t}${n}`;if(ct.existsSync(e)&&(e.endsWith(".ts")||e.endsWith(".tsx")))return e}return null}import kt from"node:fs";import At from"oxc-transform";async function ut(t){let r=new Map;return await Promise.all([...t].map(async(n)=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),s=await kt.promises.readFile(n,"utf8"),{code:o}=At.isolatedDeclaration(n,s);if(o)r.set(e,o)}catch(e){f.warn(`Failed to generate declaration for ${n}: ${u(e)}`)}})),r}async function mt(t,r,n,e){let{absoluteRootDir:s,absoluteEntry:o}=Ft(t,r),i=J(e.preferredTsconfigPath),a=await ft(o,i),c=await ut(a);return ot(o,c,n,e,s,i)}function Ft(t,r){let n=L.resolve(t),e=L.resolve(n,r);if(!pt.existsSync(n))throw new g(`Root directory does not exist: ${n}`);if(!pt.existsSync(e))throw new g(`Entry file does not exist: ${e}`);if(!e.endsWith(".ts"))throw new g(`Entry file must be a TypeScript file (.ts): ${e}`);if(L.relative(n,e).startsWith(".."))throw new g(`Entry file must be within rootDir: ${e}`);return{absoluteRootDir:n,absoluteEntry:e}}async function gt(t,r,n,e,s){return new Promise((o,i)=>{let a={rootDir:t,entries:r,formats:n,options:e,packageType:s},c=new It(new URL("./dtsWorker.js",import.meta.url),{workerData:a});c.on("message",(l)=>{if(l.success){if(l.timeMs){let p=S(l.timeMs);f.progress("DTS",`Bundled types in ${p}`)}o()}else i(new g(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",(l)=>{if(l!==0)i(new g(`DTS worker stopped with exit code ${l}`))})})}if(!Nt&&A){let{rootDir:t,entries:r,formats:n,options:e,packageType:s}=Wt,o=performance.now();f.progress("DTS","Bundling types");try{let i=n.flatMap((a)=>r.map(async(c)=>{let l=await mt(t,c.path,a,e),p=V(a,s),m=`${e.outDir}/${c.name}${p}`,E=`${t}/${m}`;await Bun.write(E,l),f.progress("DTS",m)}));Promise.all(i).then(()=>{let a=performance.now()-o;A?.postMessage({success:!0,timeMs:a})}).catch((a)=>{A?.postMessage({success:!1,error:u(a)})})}catch(i){A?.postMessage({success:!1,error:u(i)})}}function jt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function B(t){let r=[],n=new Set;function e(s,o){if(n.has(s)){let i=K();r.push({name:`${s}_${i}`,path:o})}else r.push({name:s,path:o}),n.add(s)}if(Array.isArray(t))for(let s of t){let o=jt(s);e(o,s)}else Object.entries(t).forEach(([s,o])=>{e(s,o)});return r}function dt(t,r){return`[dir]/${t}${r}`}function ht(t,r){return{name:"bunup:external-plugin",setup(n){n.onResolve({filter:/.*/},(e)=>{let s=e.path;if(t.some((i)=>i.test(s))&&!r.some((i)=>i.test(s)))return{path:s,external:!0};return null})}}}async function F(t,r){if(!t.entry||t.entry.length===0||!t.outDir)throw new x("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");let n=performance.now();f.cli("Build started");let e=M(r),s=e?.type,o=D(t,e),i=T(t),a=[ht(o,i)],c=B(t.entry),l=t.format.flatMap((p)=>c.map((m)=>Lt(t,r,m,p,s,a)));try{await Promise.all(l);let p=performance.now()-n,m=S(p);f.cli(`⚡ Build success in ${m}`)}catch{throw new x("Build process encountered errors")}if(t.dts){f.progress("DTS","Bundling types");let p=t.format.filter((E)=>{if(E==="iife"&&!P(s)&&t.format.includes("cjs"))return!1;return!0}),m=t.dts===!0?c:B(t.dts.entry);try{await gt(r,m,p,t,s)}catch(E){throw new g(`DTS build process encountered errors: ${u(E)}`)}}}async function Lt(t,r,n,e,s,o){let i=Q(e,s),a=rt(t,r),c=await Bun.build({...a,entrypoints:[`${r}/${n.path}`],format:e,naming:{entry:dt(n.name,i)},splitting:z(t.splitting,e),plugins:o,throw:!1});if(!c.success)throw c.logs.forEach((l)=>{if(l.level==="error")f.error(l.message);else if(l.level==="warning")f.warn(l.message);else if(l.level==="info")f.info(l.message)}),new x(`Build failed for ${n} (${e})`);f.progress(Y(e,t.name),`${t.outDir}/${n.name}${i}`)}function y(t){return(r,n)=>{n[t]=r===!0?!0:r==="true"}}function U(t){return(r,n)=>{if(typeof r==="string")n[t]=r;else throw new h(`Option --${t} requires a string value`)}}function xt(t){return(r,n)=>{if(typeof r==="string")n[t]=r.split(",");else throw new h(`Option --${t} requires a string value`)}}var Ut={name:{flags:["n","name"],handler:U("name")},format:{flags:["f","format"],handler:(t,r)=>{if(typeof t==="string")r.format=t.split(",");else throw new h("Option --format requires a string value")}},outDir:{flags:["o","out-dir"],handler:U("outDir")},minify:{flags:["m","minify"],handler:y("minify")},watch:{flags:["w","watch"],handler:y("watch")},dts:{flags:["d","dts"],handler:y("dts")},external:{flags:["e","external"],handler:xt("external")},target:{flags:["t","target"],handler:U("target")},minifyWhitespace:{flags:["mw","minify-whitespace"],handler:y("minifyWhitespace")},minifyIdentifiers:{flags:["mi","minify-identifiers"],handler:y("minifyIdentifiers")},minifySyntax:{flags:["ms","minify-syntax"],handler:y("minifySyntax")},clean:{flags:["c","clean"],handler:y("clean")},splitting:{flags:["s","splitting"],handler:y("splitting")},noExternal:{flags:["ne","no-external"],handler:xt("noExternal")}},_={};for(let t of Object.values(Ut))if(t)for(let r of t.flags)_[r]=t.handler;function wt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function yt(t){let r={},n={},e=0;while(e<t.length){let s=t[e];if(s.startsWith("--")){let o,i;if(s.includes("=")){let[a,c]=s.slice(2).split("=",2);o=a,i=c}else{o=s.slice(2);let a=t[e+1];if(i=a&&!a.startsWith("-")?a:!0,typeof i==="string")e++}if(o==="entry")if(typeof i==="string"){let a=wt(i);if(n[a])f.warn(`Duplicate entry name '${a}' derived from '${i}'. Overwriting previous entry.`);n[a]=i}else throw new h("Option --entry requires a string value");else if(o.startsWith("entry.")){let a=o.slice(6);if(typeof i==="string"){if(n[a])f.warn(`Duplicate entry name '${a}' provided via --entry.${a}. Overwriting previous entry.`);n[a]=i}else throw new h(`Option --entry.${a} requires a string value`)}else{let a=_[o];if(a)a(i,r);else throw new h(`Unknown option: --${o}`)}}else if(s.startsWith("-")){let o=s.slice(1),i=t[e+1],a=i&&!i.startsWith("-")?i:!0;if(typeof a==="string")e++;let c=_[o];if(c)c(a,r);else throw new h(`Unknown option: -${o}`)}else{let o=wt(s);if(n[o])f.warn(`Duplicate entry name '${o}' derived from positional argument '${s}'. Overwriting previous entry.`);n[o]=s}e++}if(Object.keys(n).length>0)r.entry=n;return r}(()=>{if(typeof Bun==="undefined")throw new h(`Bunup requires Bun to run.
6
+ To install Bun, visit https://bun.sh/docs/installation`)})();import H from"node:path";import _t from"chokidar";async function Et(t,r){let n=new Set;B(t.entry).forEach((c)=>{let l=H.resolve(r,c.path),p=H.dirname(l);n.add(p)});let s=_t.watch(Array.from(n),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),o=null,i=!1,a=async(c)=>{if(i)return;i=!0;try{await F({...t,entry:[c],clean:!1},r)}catch(l){throw new C(`Build failed: ${u(l)}`)}finally{i=!1}};s.on("change",(c)=>{let l=H.relative(r,c);if(f.cli(`File changed: ${l}`),o)clearTimeout(o);o=setTimeout(()=>a(l),300)}),s.on("error",(c)=>{throw new C(`Watcher error: ${u(c)}`)})}async function qt(t=Bun.argv.slice(2)){let r=yt(t),n=await et(process.cwd()),e=process.cwd();if(r.watch)f.cli("Starting watch mode"),f.cli("Watching for file changes");if(n.length===0){let s={...v,...r};if(s.clean)$t(e,s.outDir);await Ot(s,e)}else{for(let{options:s,rootDir:o}of n)if(s.clean)$t(o,s.outDir);await Promise.all(n.map(async({options:s,rootDir:o})=>{let i={...v,...s,...r};await Ot(i,o)}))}if(!r.watch)process.exit(0)}async function Ot(t,r){if(t.watch)await Et(t,r);else await F(t,r)}function $t(t,r){let n=Ht.join(t,r);if(q.existsSync(n))try{q.rmSync(n,{recursive:!0,force:!0})}catch(e){throw new x(`Failed to clean output directory: ${e}`)}q.mkdirSync(n,{recursive:!0})}qt().catch((t)=>X(t));export{qt 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
+ var ft=require("node:module");var it=Object.create;var{getPrototypeOf:at,defineProperty:P,getOwnPropertyNames:L,getOwnPropertyDescriptor:ct}=Object,A=Object.prototype.hasOwnProperty;var u=(t,r,e)=>{e=t!=null?it(at(t)):{};let o=r||!t||!t.__esModule?P(e,"default",{value:t,enumerable:!0}):e;for(let n of L(t))if(!A.call(o,n))P(o,n,{get:()=>t[n],enumerable:!0});return o},N=new WeakMap,lt=(t)=>{var r=N.get(t),e;if(r)return r;if(r=P({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")L(t).map((o)=>!A.call(r,o)&&P(r,o,{get:()=>t[o],enumerable:!(e=ct(t,o))||e.enumerable}));return N.set(t,r),r};var pt=(t,r)=>{for(var e in r)P(t,e,{get:r[e],enumerable:!0,configurable:!0,set:(o)=>r[e]=()=>o})};var wt={};pt(wt,{runDtsInWorker:()=>Et});module.exports=lt(wt);var d=require("node:worker_threads");var k=u(require("node:fs")),y=u(require("node:path"));class I extends Error{constructor(t){super(t);this.name="BunupError"}}class g extends I{constructor(t){super(t);this.name="BunupDTSBuildError"}}var l=(t)=>{if(t instanceof Error)return t.message;return String(t)};var U=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,e){let o=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-r.length));return`\x1B[38;5;${t}m[${r}]\x1B[0m ${o}${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),o=this.colors.default;for(let[n,s]of Object.entries(this.colors.progress))if(e.includes(n)){o=s;break}console.log(this.formatMessage(o,e,r))}};function W(t){try{return U.loadTsConfig(".",t)}catch(r){return m.warn(`Failed to load tsconfig: ${l(r)}`),{path:t,data:{},files:[]}}}var v=u(require("node:path")),z=require("rollup"),K=u(require("rollup-plugin-dts")),$=u(require("typescript"));function B(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function j(t,r){switch(t){case"esm":return".d.mts";case"cjs":return ut(r)?".d.cts":".d.ts";case"iife":return".d.ts"}}function ut(t){return t==="module"}function _(t){return t>=1000?`${(t/1000).toFixed(2)}s`:`${Math.round(t)}ms`}function G(t){if(!t)return[];return Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})]))}function J(t){return t.map((r)=>typeof r==="string"?new RegExp(`^${B(r)}($|\\/|\\\\)`):r)}function X(t,r){return J(t.external||[]).concat(G(r).map((e)=>new RegExp(`^${B(e)}($|\\/|\\\\)`)))}function H(t){return J(t.noExternal||[])}var O=u(require("node:fs")),Y=u(require("node:path"));function q(t){let r=Y.default.join(t,"package.json");try{if(!O.default.existsSync(r))return null;let e=O.default.readFileSync(r,"utf8");return JSON.parse(e)}catch(e){return m.warn(`Failed to load package.json at ${r}: ${l(e)}`),null}}async function Q(t,r,e,o,n,s){let p=`\x00virtual:${t.replace(/\.tsx?$/,".d.ts")}`,c=s.data?.compilerOptions,h={name:"bunup:virtual-dts",resolveId(f,E){if(f.startsWith("\x00virtual:"))return f;if(!E?.startsWith("\x00virtual:")||!f.startsWith("."))return null;let w=E.slice(9),T=v.default.resolve(v.default.dirname(w),f),F=r.has(T)?T:`${T}.d.ts`;return r.has(F)?`\x00virtual:${F}`:null},load(f){return f.startsWith("\x00virtual:")?r.get(f.slice(9))||null:null}},x=q(n),C=X(o,x),nt=H(o),R;try{R=await z.rollup({input:p,onwarn(E,w){if(["UNRESOLVED_IMPORT","CIRCULAR_DEPENDENCY","EMPTY_BUNDLE"].includes(E.code??""))return;w(E)},plugins:[h,K.default({tsconfig:s.path,compilerOptions:{...c?$.default.parseJsonConfigFileContent({compilerOptions:c},$.default.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:$.default.ScriptTarget.ESNext}})],external:(E)=>C.some((w)=>w.test(E))&&!nt.some((w)=>w.test(E))});let{output:f}=await R.generate({format:e});if(!f[0]?.code)throw new g("Generated bundle is empty");return f[0].code}catch(f){throw new g(`DTS bundling failed: ${l(f)}`)}finally{if(R)await R.close()}}var b=u(require("node:fs")),M=u(require("node:path"));var D=u(require("node:path"));function S(t){let r=D.default.dirname(t.path||"");return t.data?.compilerOptions?.baseUrl?D.default.resolve(r,t.data.compilerOptions.baseUrl):r}function V(t){let r=new Map,e=t.data?.compilerOptions?.paths;if(!e)return r;let o=S(t);for(let[n,s]of Object.entries(e))if(Array.isArray(s)&&s.length){let i=n.replace(/\*/g,"(.*)"),a=s[0].replace(/\*/g,"$1");r.set(`^${i}$`,D.default.join(o,a))}return r}function Z(t,r,e){for(let[o,n]of r){let s=new RegExp(o),i=t.match(s);if(i)return n.replace("$1",i[1]||"")}return e?D.default.join(e,t):null}var gt=/(?:import|export)(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*|[\s\n]+)(["'`])([^'"]+)\1/g,mt=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;async function tt(t,r){let e=new Set([t]),o=[t],n=V(r),s=S(r);while(o.length){let i=o.pop();if(!i)continue;try{let a=await b.default.promises.readFile(i,"utf8"),p=dt(a);for(let c of p){let h=c.startsWith(".")?M.default.resolve(M.default.dirname(i),c):Z(c,n,s);if(!h)continue;let x=xt(h);if(x&&!e.has(x))e.add(x),o.push(x)}}catch(a){m.warn(`Error processing ${i}: ${l(a)}`)}}return e}function dt(t){let r=new Set;for(let e of[gt,mt]){let o;while((o=e.exec(t))!==null)r.add(o[2])}return Array.from(r)}function xt(t){let r=["",".ts",".tsx","/index.ts","/index.tsx"];for(let e of r){let o=`${t}${e}`;if(b.default.existsSync(o)&&(o.endsWith(".ts")||o.endsWith(".tsx")))return o}return null}var rt=u(require("node:fs")),ot=u(require("oxc-transform"));async function et(t){let r=new Map;return await Promise.all([...t].map(async(e)=>{try{let o=e.replace(/\.tsx?$/,".d.ts"),n=await rt.default.promises.readFile(e,"utf8"),{code:s}=ot.default.isolatedDeclaration(e,n);if(s)r.set(o,s)}catch(o){m.warn(`Failed to generate declaration for ${e}: ${l(o)}`)}})),r}async function st(t,r,e,o){let{absoluteRootDir:n,absoluteEntry:s}=ht(t,r),i=W(o.preferredTsconfigPath),a=await tt(s,i),p=await et(a);return Q(s,p,e,o,n,i)}function ht(t,r){let e=y.default.resolve(t),o=y.default.resolve(e,r);if(!k.default.existsSync(e))throw new g(`Root directory does not exist: ${e}`);if(!k.default.existsSync(o))throw new g(`Entry file does not exist: ${o}`);if(!o.endsWith(".ts"))throw new g(`Entry file must be a TypeScript file (.ts): ${o}`);if(y.default.relative(e,o).startsWith(".."))throw new g(`Entry file must be within rootDir: ${o}`);return{absoluteRootDir:e,absoluteEntry:o}}async function Et(t,r,e,o,n){return new Promise((s,i)=>{let a={rootDir:t,entries:r,formats:e,options:o,packageType:n},p=new d.Worker(new URL("./dtsWorker.js",import.meta.url),{workerData:a});p.on("message",(c)=>{if(c.success){if(c.timeMs){let h=_(c.timeMs);m.progress("DTS",`Bundled types in ${h}`)}s()}else i(new g(c.error||"Unknown DTS worker error"))}),p.on("error",i),p.on("exit",(c)=>{if(c!==0)i(new g(`DTS worker stopped with exit code ${c}`))})})}if(!d.isMainThread&&d.parentPort){let{rootDir:t,entries:r,formats:e,options:o,packageType:n}=d.workerData,s=performance.now();m.progress("DTS","Bundling types");try{let i=e.flatMap((a)=>r.map(async(p)=>{let c=await st(t,p.path,a,o),h=j(a,n),x=`${o.outDir}/${p.name}${h}`,C=`${t}/${x}`;await Bun.write(C,c),m.progress("DTS",x)}));Promise.all(i).then(()=>{let a=performance.now()-s;d.parentPort?.postMessage({success:!0,timeMs:a})}).catch((a)=>{d.parentPort?.postMessage({success:!1,error:l(a)})})}catch(i){d.parentPort?.postMessage({success:!1,error:l(i)})}}
package/build/index.d.mts CHANGED
@@ -1,143 +1,146 @@
1
- type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
1
+ type WithOptional<
2
+ T,
3
+ K extends keyof T
4
+ > = Omit<T, K> & Partial<Pick<T, K>>;
2
5
 
3
- type Format = 'esm' | 'cjs' | 'iife';
4
- type Target = 'bun' | 'node' | 'browser';
6
+ type Format = "esm" | "cjs" | "iife";
7
+ type Target = "bun" | "node" | "browser";
5
8
  type External = string[];
6
9
  type Entry = string[] | Record<string, string>;
7
10
  type DtsOptions = {
8
- /**
9
- * Entry point files for TypeScript declaration file generation
10
- *
11
- * This can be:
12
- * - An array of file paths
13
- * - An object where keys are output names and values are input file paths
14
- *
15
- * The key names are used for the generated declaration files.
16
- * For example, {custom: './src/index.ts'} will generate custom.d.ts
17
- *
18
- * If not specified, the main entry points will be used for declaration file generation.
19
- *
20
- * If a string path is provided in an array, the file name (without extension)
21
- * will be used as the name for the output declaration file.
22
- *
23
- * @example
24
- * // Using string paths in an array
25
- * entry: ['./src/index.ts'] // Generates index.d.ts
26
- *
27
- * // Using named outputs as an object
28
- * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
29
- */
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;
11
+ /**
12
+ * Entry point files for TypeScript declaration file generation
13
+ *
14
+ * This can be:
15
+ * - An array of file paths
16
+ * - An object where keys are output names and values are input file paths
17
+ *
18
+ * The key names are used for the generated declaration files.
19
+ * For example, {custom: './src/index.ts'} will generate custom.d.ts
20
+ *
21
+ * If not specified, the main entry points will be used for declaration file generation.
22
+ *
23
+ * If a string path is provided in an array, the file name (without extension)
24
+ * will be used as the name for the output declaration file.
25
+ *
26
+ * @example
27
+ * // Using string paths in an array
28
+ * entry: ['./src/index.ts'] // Generates index.d.ts
29
+ *
30
+ * // Using named outputs as an object
31
+ * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
32
+ */
33
+ entry: Entry
42
34
  };
43
35
  interface BunupOptions {
44
- /**
45
- * Name of the build configuration
46
- * Used for logging and identification purposes
47
- */
48
- name?: string;
49
- /**
50
- * Entry point files for the build
51
- *
52
- * This can be:
53
- * - An array of file paths
54
- * - An object where keys are output names and values are input file paths
55
- *
56
- * The key names are used for the generated output files.
57
- * For example, {custom: './src/index.ts'} will generate custom.js
58
- *
59
- * If a string path is provided in an array, the file name (without extension)
60
- * will be used as the name for the output file.
61
- *
62
- * @example
63
- * // Using string paths in an array
64
- * entry: ['./src/index.ts'] // Generates index.js
65
- *
66
- * // Using named outputs as an object
67
- * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.js and utils.js
68
- */
69
- entry: Entry;
70
- /**
71
- * Output directory for the bundled files
72
- * Defaults to 'dist' if not specified
73
- */
74
- outDir: string;
75
- /**
76
- * Output formats for the bundle
77
- * Can include 'esm', 'cjs', and/or 'iife'
78
- * Defaults to ['cjs'] if not specified
79
- */
80
- format: Format[];
81
- /**
82
- * Whether to enable all minification options
83
- * When true, enables minifyWhitespace, minifyIdentifiers, and minifySyntax
84
- */
85
- minify?: boolean;
86
- /**
87
- * Whether to enable code splitting
88
- * Defaults to true for ESM format, false for CJS format
89
- */
90
- splitting?: boolean;
91
- /**
92
- * Whether to minify whitespace in the output
93
- * Removes unnecessary whitespace to reduce file size
94
- */
95
- minifyWhitespace?: boolean;
96
- /**
97
- * Whether to minify identifiers in the output
98
- * Renames variables and functions to shorter names
99
- */
100
- minifyIdentifiers?: boolean;
101
- /**
102
- * Whether to minify syntax in the output
103
- * Optimizes code structure for smaller file size
104
- */
105
- minifySyntax?: boolean;
106
- /**
107
- * Whether to watch for file changes and rebuild automatically
108
- */
109
- watch?: boolean;
110
- /**
111
- * Whether to generate TypeScript declaration files (.d.ts)
112
- * When set to true, generates declaration files for all entry points
113
- * Can also be configured with DtsOptions for more control
114
- */
115
- dts?: boolean | DtsOptions;
116
- /**
117
- * External packages that should not be bundled
118
- * Useful for dependencies that should be kept as external imports
119
- */
120
- external?: External;
121
- /**
122
- * Packages that should be bundled even if they are in external
123
- * Useful for dependencies that should be included in the bundle
124
- */
125
- noExternal?: External;
126
- /**
127
- * The target environment for the bundle
128
- * Can be 'browser', 'bun', 'node', etc.
129
- * Defaults to 'node' if not specified
130
- */
131
- target?: Target;
132
- /**
133
- * Whether to clean the output directory before building
134
- * When true, removes all files in the outDir before starting a new build
135
- * Defaults to true if not specified
136
- */
137
- clean?: boolean;
36
+ /**
37
+ * Name of the build configuration
38
+ * Used for logging and identification purposes
39
+ */
40
+ name?: string;
41
+ /**
42
+ * Entry point files for the build
43
+ *
44
+ * This can be:
45
+ * - An array of file paths
46
+ * - An object where keys are output names and values are input file paths
47
+ *
48
+ * The key names are used for the generated output files.
49
+ * For example, {custom: './src/index.ts'} will generate custom.js
50
+ *
51
+ * If a string path is provided in an array, the file name (without extension)
52
+ * will be used as the name for the output file.
53
+ *
54
+ * @example
55
+ * // Using string paths in an array
56
+ * entry: ['./src/index.ts'] // Generates index.js
57
+ *
58
+ * // Using named outputs as an object
59
+ * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.js and utils.js
60
+ */
61
+ entry: Entry;
62
+ /**
63
+ * Output directory for the bundled files
64
+ * Defaults to 'dist' if not specified
65
+ */
66
+ outDir: string;
67
+ /**
68
+ * Output formats for the bundle
69
+ * Can include 'esm', 'cjs', and/or 'iife'
70
+ * Defaults to ['cjs'] if not specified
71
+ */
72
+ format: Format[];
73
+ /**
74
+ * Whether to enable all minification options
75
+ * When true, enables minifyWhitespace, minifyIdentifiers, and minifySyntax
76
+ */
77
+ minify?: boolean;
78
+ /**
79
+ * Whether to enable code splitting
80
+ * Defaults to true for ESM format, false for CJS format
81
+ */
82
+ splitting?: boolean;
83
+ /**
84
+ * Whether to minify whitespace in the output
85
+ * Removes unnecessary whitespace to reduce file size
86
+ */
87
+ minifyWhitespace?: boolean;
88
+ /**
89
+ * Whether to minify identifiers in the output
90
+ * Renames variables and functions to shorter names
91
+ */
92
+ minifyIdentifiers?: boolean;
93
+ /**
94
+ * Whether to minify syntax in the output
95
+ * Optimizes code structure for smaller file size
96
+ */
97
+ minifySyntax?: boolean;
98
+ /**
99
+ * Whether to watch for file changes and rebuild automatically
100
+ */
101
+ watch?: boolean;
102
+ /**
103
+ * Whether to generate TypeScript declaration files (.d.ts)
104
+ * When set to true, generates declaration files for all entry points
105
+ * Can also be configured with DtsOptions for more control
106
+ */
107
+ dts?: boolean | DtsOptions;
108
+ /**
109
+ * Path to a preferred tsconfig.json file to use for declaration generation
110
+ *
111
+ * If not specified, the tsconfig.json in the project root will be used.
112
+ * This option allows you to use a different TypeScript configuration
113
+ * specifically for declaration file generation.
114
+ *
115
+ * @example
116
+ * preferredTsconfigPath: './tsconfig.build.json'
117
+ */
118
+ preferredTsconfigPath?: string;
119
+ /**
120
+ * External packages that should not be bundled
121
+ * Useful for dependencies that should be kept as external imports
122
+ */
123
+ external?: External;
124
+ /**
125
+ * Packages that should be bundled even if they are in external
126
+ * Useful for dependencies that should be included in the bundle
127
+ */
128
+ noExternal?: External;
129
+ /**
130
+ * The target environment for the bundle
131
+ * Can be 'browser', 'bun', 'node', etc.
132
+ * Defaults to 'node' if not specified
133
+ */
134
+ target?: Target;
135
+ /**
136
+ * Whether to clean the output directory before building
137
+ * When true, removes all files in the outDir before starting a new build
138
+ * Defaults to true if not specified
139
+ */
140
+ clean?: boolean;
138
141
  }
139
142
 
140
- type DefineConfigOption = WithOptional<BunupOptions, 'outDir' | 'format'>;
143
+ type DefineConfigOption = WithOptional<BunupOptions, "outDir" | "format">;
141
144
  type DefineConfigOptions = DefineConfigOption | DefineConfigOption[];
142
145
  declare function defineConfig(options: DefineConfigOptions): DefineConfigOptions;
143
146
 
package/build/index.d.ts CHANGED
@@ -1,143 +1,146 @@
1
- type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
1
+ type WithOptional<
2
+ T,
3
+ K extends keyof T
4
+ > = Omit<T, K> & Partial<Pick<T, K>>;
2
5
 
3
- type Format = 'esm' | 'cjs' | 'iife';
4
- type Target = 'bun' | 'node' | 'browser';
6
+ type Format = "esm" | "cjs" | "iife";
7
+ type Target = "bun" | "node" | "browser";
5
8
  type External = string[];
6
9
  type Entry = string[] | Record<string, string>;
7
10
  type DtsOptions = {
8
- /**
9
- * Entry point files for TypeScript declaration file generation
10
- *
11
- * This can be:
12
- * - An array of file paths
13
- * - An object where keys are output names and values are input file paths
14
- *
15
- * The key names are used for the generated declaration files.
16
- * For example, {custom: './src/index.ts'} will generate custom.d.ts
17
- *
18
- * If not specified, the main entry points will be used for declaration file generation.
19
- *
20
- * If a string path is provided in an array, the file name (without extension)
21
- * will be used as the name for the output declaration file.
22
- *
23
- * @example
24
- * // Using string paths in an array
25
- * entry: ['./src/index.ts'] // Generates index.d.ts
26
- *
27
- * // Using named outputs as an object
28
- * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
29
- */
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;
11
+ /**
12
+ * Entry point files for TypeScript declaration file generation
13
+ *
14
+ * This can be:
15
+ * - An array of file paths
16
+ * - An object where keys are output names and values are input file paths
17
+ *
18
+ * The key names are used for the generated declaration files.
19
+ * For example, {custom: './src/index.ts'} will generate custom.d.ts
20
+ *
21
+ * If not specified, the main entry points will be used for declaration file generation.
22
+ *
23
+ * If a string path is provided in an array, the file name (without extension)
24
+ * will be used as the name for the output declaration file.
25
+ *
26
+ * @example
27
+ * // Using string paths in an array
28
+ * entry: ['./src/index.ts'] // Generates index.d.ts
29
+ *
30
+ * // Using named outputs as an object
31
+ * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
32
+ */
33
+ entry: Entry
42
34
  };
43
35
  interface BunupOptions {
44
- /**
45
- * Name of the build configuration
46
- * Used for logging and identification purposes
47
- */
48
- name?: string;
49
- /**
50
- * Entry point files for the build
51
- *
52
- * This can be:
53
- * - An array of file paths
54
- * - An object where keys are output names and values are input file paths
55
- *
56
- * The key names are used for the generated output files.
57
- * For example, {custom: './src/index.ts'} will generate custom.js
58
- *
59
- * If a string path is provided in an array, the file name (without extension)
60
- * will be used as the name for the output file.
61
- *
62
- * @example
63
- * // Using string paths in an array
64
- * entry: ['./src/index.ts'] // Generates index.js
65
- *
66
- * // Using named outputs as an object
67
- * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.js and utils.js
68
- */
69
- entry: Entry;
70
- /**
71
- * Output directory for the bundled files
72
- * Defaults to 'dist' if not specified
73
- */
74
- outDir: string;
75
- /**
76
- * Output formats for the bundle
77
- * Can include 'esm', 'cjs', and/or 'iife'
78
- * Defaults to ['cjs'] if not specified
79
- */
80
- format: Format[];
81
- /**
82
- * Whether to enable all minification options
83
- * When true, enables minifyWhitespace, minifyIdentifiers, and minifySyntax
84
- */
85
- minify?: boolean;
86
- /**
87
- * Whether to enable code splitting
88
- * Defaults to true for ESM format, false for CJS format
89
- */
90
- splitting?: boolean;
91
- /**
92
- * Whether to minify whitespace in the output
93
- * Removes unnecessary whitespace to reduce file size
94
- */
95
- minifyWhitespace?: boolean;
96
- /**
97
- * Whether to minify identifiers in the output
98
- * Renames variables and functions to shorter names
99
- */
100
- minifyIdentifiers?: boolean;
101
- /**
102
- * Whether to minify syntax in the output
103
- * Optimizes code structure for smaller file size
104
- */
105
- minifySyntax?: boolean;
106
- /**
107
- * Whether to watch for file changes and rebuild automatically
108
- */
109
- watch?: boolean;
110
- /**
111
- * Whether to generate TypeScript declaration files (.d.ts)
112
- * When set to true, generates declaration files for all entry points
113
- * Can also be configured with DtsOptions for more control
114
- */
115
- dts?: boolean | DtsOptions;
116
- /**
117
- * External packages that should not be bundled
118
- * Useful for dependencies that should be kept as external imports
119
- */
120
- external?: External;
121
- /**
122
- * Packages that should be bundled even if they are in external
123
- * Useful for dependencies that should be included in the bundle
124
- */
125
- noExternal?: External;
126
- /**
127
- * The target environment for the bundle
128
- * Can be 'browser', 'bun', 'node', etc.
129
- * Defaults to 'node' if not specified
130
- */
131
- target?: Target;
132
- /**
133
- * Whether to clean the output directory before building
134
- * When true, removes all files in the outDir before starting a new build
135
- * Defaults to true if not specified
136
- */
137
- clean?: boolean;
36
+ /**
37
+ * Name of the build configuration
38
+ * Used for logging and identification purposes
39
+ */
40
+ name?: string;
41
+ /**
42
+ * Entry point files for the build
43
+ *
44
+ * This can be:
45
+ * - An array of file paths
46
+ * - An object where keys are output names and values are input file paths
47
+ *
48
+ * The key names are used for the generated output files.
49
+ * For example, {custom: './src/index.ts'} will generate custom.js
50
+ *
51
+ * If a string path is provided in an array, the file name (without extension)
52
+ * will be used as the name for the output file.
53
+ *
54
+ * @example
55
+ * // Using string paths in an array
56
+ * entry: ['./src/index.ts'] // Generates index.js
57
+ *
58
+ * // Using named outputs as an object
59
+ * entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.js and utils.js
60
+ */
61
+ entry: Entry;
62
+ /**
63
+ * Output directory for the bundled files
64
+ * Defaults to 'dist' if not specified
65
+ */
66
+ outDir: string;
67
+ /**
68
+ * Output formats for the bundle
69
+ * Can include 'esm', 'cjs', and/or 'iife'
70
+ * Defaults to ['cjs'] if not specified
71
+ */
72
+ format: Format[];
73
+ /**
74
+ * Whether to enable all minification options
75
+ * When true, enables minifyWhitespace, minifyIdentifiers, and minifySyntax
76
+ */
77
+ minify?: boolean;
78
+ /**
79
+ * Whether to enable code splitting
80
+ * Defaults to true for ESM format, false for CJS format
81
+ */
82
+ splitting?: boolean;
83
+ /**
84
+ * Whether to minify whitespace in the output
85
+ * Removes unnecessary whitespace to reduce file size
86
+ */
87
+ minifyWhitespace?: boolean;
88
+ /**
89
+ * Whether to minify identifiers in the output
90
+ * Renames variables and functions to shorter names
91
+ */
92
+ minifyIdentifiers?: boolean;
93
+ /**
94
+ * Whether to minify syntax in the output
95
+ * Optimizes code structure for smaller file size
96
+ */
97
+ minifySyntax?: boolean;
98
+ /**
99
+ * Whether to watch for file changes and rebuild automatically
100
+ */
101
+ watch?: boolean;
102
+ /**
103
+ * Whether to generate TypeScript declaration files (.d.ts)
104
+ * When set to true, generates declaration files for all entry points
105
+ * Can also be configured with DtsOptions for more control
106
+ */
107
+ dts?: boolean | DtsOptions;
108
+ /**
109
+ * Path to a preferred tsconfig.json file to use for declaration generation
110
+ *
111
+ * If not specified, the tsconfig.json in the project root will be used.
112
+ * This option allows you to use a different TypeScript configuration
113
+ * specifically for declaration file generation.
114
+ *
115
+ * @example
116
+ * preferredTsconfigPath: './tsconfig.build.json'
117
+ */
118
+ preferredTsconfigPath?: string;
119
+ /**
120
+ * External packages that should not be bundled
121
+ * Useful for dependencies that should be kept as external imports
122
+ */
123
+ external?: External;
124
+ /**
125
+ * Packages that should be bundled even if they are in external
126
+ * Useful for dependencies that should be included in the bundle
127
+ */
128
+ noExternal?: External;
129
+ /**
130
+ * The target environment for the bundle
131
+ * Can be 'browser', 'bun', 'node', etc.
132
+ * Defaults to 'node' if not specified
133
+ */
134
+ target?: Target;
135
+ /**
136
+ * Whether to clean the output directory before building
137
+ * When true, removes all files in the outDir before starting a new build
138
+ * Defaults to true if not specified
139
+ */
140
+ clean?: boolean;
138
141
  }
139
142
 
140
- type DefineConfigOption = WithOptional<BunupOptions, 'outDir' | 'format'>;
143
+ type DefineConfigOption = WithOptional<BunupOptions, "outDir" | "format">;
141
144
  type DefineConfigOptions = DefineConfigOption | DefineConfigOption[];
142
145
  declare function defineConfig(options: DefineConfigOptions): DefineConfigOptions;
143
146
 
package/build/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});function n(i){return i}exports.defineConfig = n;
1
+ var D=require("node:module");var{defineProperty:e,getOwnPropertyNames:r,getOwnPropertyDescriptor:O}=Object,g=Object.prototype.hasOwnProperty;var f=new WeakMap,C=(i)=>{var n=f.get(i),o;if(n)return n;if(n=e({},"__esModule",{value:!0}),i&&typeof i==="object"||typeof i==="function")r(i).map((t)=>!g.call(n,t)&&e(n,t,{get:()=>i[t],enumerable:!(o=O(i,t))||o.enumerable}));return f.set(i,n),n};var u=(i,n)=>{for(var o in n)e(i,o,{get:n[o],enumerable:!0,configurable:!0,set:(t)=>n[o]=()=>t})};var m={};u(m,{defineConfig:()=>p});module.exports=C(m);function p(i){return i}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bunup",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
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",
@@ -18,7 +18,7 @@
18
18
  "@types/bun": "^1.2.5",
19
19
  "@typescript-eslint/eslint-plugin": "^7.3.1",
20
20
  "bumpp": "^10.1.0",
21
- "bunup": "^0.1.16",
21
+ "bunup": "^0.1.18",
22
22
  "eslint": "^8.57.0",
23
23
  "husky": "^9.1.6",
24
24
  "prettier": "^3.2.5",
@@ -54,13 +54,14 @@
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"
60
61
  },
61
62
  "scripts": {
62
- "build": "tsup",
63
- "dev": "tsup --watch",
63
+ "build": "bunup",
64
+ "dev": "bunup --watch",
64
65
  "build:docs": "pnpm -C docs build",
65
66
  "dev:docs": "pnpm -C docs dev",
66
67
  "test-build": "pnpm -C tests build",
@@ -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 publish --access public --no-git-checks"
74
75
  }
75
76
  }