bunup 0.1.8 → 0.1.9
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.js +5 -4
- package/build/cli.mjs +5 -4
- package/build/dtsWorker.js +1 -0
- package/build/index.d.mts +11 -0
- package/build/index.d.ts +11 -0
- package/package.json +1 -1
- package/build/dtsWorker.mjs +0 -1
package/build/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun @bun-cjs
|
|
3
|
+
(function(exports, require, module, __filename, __dirname) {var ar=require("node:module");var er=Object.create;var{getPrototypeOf:nr,defineProperty:j,getOwnPropertyNames:or}=Object;var ir=Object.prototype.hasOwnProperty;var m=(r,t,s)=>{s=r!=null?er(nr(r)):{};let n=t||!r||!r.__esModule?j(s,"default",{value:r,enumerable:!0}):s;for(let e of or(r))if(!ir.call(n,e))j(n,e,{get:()=>r[e],enumerable:!0});return n};var v=m(require("fs")),Z=m(require("path"));var A=require("node:os"),b=m(require("node:path")),N=require("node:worker_threads");var p=(r)=>{if(r instanceof Error)return r.message;return String(r)},R=(r,t)=>{let s=p(r),n=t?`[${t}] `:"";if(console.error(`\x1B[31m[ERROR]\x1B[0m ${n}${s}`),r instanceof Error&&r.stack)console.error("\x1B[2m"+r.stack.split(`
|
|
3
4
|
`).slice(1).join(`
|
|
4
|
-
`)+"\x1B[0m")};function H(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Y(r=8){return Math.random().toString(36).substring(2,2+r)}function Z(r,s){switch(r){case"esm":return".mjs";case"cjs":return E(s)?".cjs":".js";case"iife":return".global.js"}}function D(r,s){switch(r){case"esm":return".d.mts";case"cjs":return E(s)?".d.cts":".d.ts";case"iife":return".d.ts"}}function E(r){return r==="module"}function q(r){return r>=1000?`${(r/1000).toFixed(2)}s`:`${Math.round(r)}ms`}function F(r){if(!r)return[];return Array.from(new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{})]))}function J(r,s){return r===void 0?s==="esm":r}function V(r){return r.map((s)=>typeof s==="string"?new RegExp(`^${H(s)}($|\\/|\\\\)`):s)}function B(r,s){return V(r.external||[]).concat(F(s).map((e)=>new RegExp(`^${H(e)}($|\\/|\\\\)`)))}function C(r){return V(r.noExternal||[])}var k=g(require("fs")),U=g(require("path"));var c={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(r,s,e){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-s.length));return`\x1B[38;5;${r}m[${s}]\x1B[0m ${n}${e}`},cli(r){let s=this.labels.cli;console.log(this.formatMessage(this.colors.cli,s,r))},info(r){let s=this.labels.info;console.log(this.formatMessage(this.colors.info,s,r))},warn(r){let s=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,s,r))},error(r){let s=this.labels.error;console.error(this.formatMessage(this.colors.error,s,r))},progress(r,s){let e=String(r),n=this.colors.default;for(let[t,i]of Object.entries(this.colors.progress))if(e.includes(t)){n=i;break}console.log(this.formatMessage(n,e,s))}};function y(r,s){return`${s?`${s.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}var W={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function P(r,s){return{outdir:`${s}/${r.outDir}`,minify:dr(r),target:r.target,splitting:r.splitting}}function dr(r){let{minify:s,minifyWhitespace:e,minifyIdentifiers:n,minifySyntax:t}=r,i=s===!0;return{whitespace:e??i,identifiers:n??i,syntax:t??i}}async function b(r){let s=[];for(let e of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=U.default.join(r,`bunup.config${e}`);try{if(!k.default.existsSync(n))continue;let t;if(e===".json"||e===".jsonc"){let i=k.default.readFileSync(n,"utf8");t=JSON.parse(i)}else{let i=await import(`file://${n}`);if(t=i.default||i,!t)c.warn(`No default export found in ${n}`),t={}}if(Array.isArray(t))for(let i of t)s.push({options:{...W,...i},rootDir:r});else s.push({options:{...W,...t},rootDir:r});break}catch(t){c.error(`Failed to load config from ${n}: ${x(t)}`)}if(s.length>0)break}return s}function j(r){let s=U.default.join(r,"package.json");try{if(!k.default.existsSync(s))return null;let e=k.default.readFileSync(s,"utf8");return JSON.parse(e)}catch(e){return c.error(`Failed to load package.json at ${s}: ${x(e)}`),null}}async function nr(r,s,e,n){let{absoluteRootDir:t,absoluteEntry:i}=vr(r,s),o=await Wr(i),u=await Sr(o);return kr(i,u,e,n,t)}async function Wr(r){let s=new Set,e=[r];while(e.length>0){let n=e.pop();if(!n||s.has(n))continue;s.add(n);try{let t=await $.default.promises.readFile(n,"utf8"),i=$r(t);for(let o of i){let u=d.default.dirname(n),a=d.default.resolve(u,o),f=[a,`${a}.ts`,`${a}.tsx`,`${a}/index.ts`,`${a}/index.tsx`];for(let l of f)if($.default.existsSync(l)&&l.endsWith(".ts")&&!s.has(l)){e.push(l);break}}}catch(t){c.warn(`Error processing ${n}: ${t instanceof Error?t.message:String(t)}`)}}return s}function $r(r){let s=new Set;try{let e=/(?:import|export)(?:(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*)|[\s\n]+)(["'`])([^'"]+)\1/g,n;while((n=e.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}let t=/import\s+(["'`])([^'"]+)\1\s*;?/g;while((n=t.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}let i=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;while((n=i.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}}catch(e){c.warn(`Error extracting imports: ${e instanceof Error?e.message:String(e)}`)}return Array.from(s)}async function Sr(r){let s=new Map;return await Promise.all(Array.from(r).map(async(e)=>{try{let n=e.replace(/\.tsx?$/,".d.ts"),t=await $.default.promises.readFile(e,"utf8"),{code:i}=T.default.isolatedDeclaration(e,t);if(i)s.set(n,i)}catch(n){c.warn(`Failed to generate declaration for ${e}: ${n instanceof Error?n.message:String(n)}`)}})),s}async function kr(r,s,e,n,t){let u=`\x00virtual:${r.replace(/\.tsx?$/,".d.ts")}`,a={name:"virtual-dts",resolveId(m,h){if(m.startsWith("\x00virtual:"))return m;if(h?.startsWith("\x00virtual:")){let w=h.slice(9),L=d.default.dirname(w);if(m.startsWith(".")){let _=d.default.resolve(L,m);for(let M of["",".d.ts","/index.d.ts"]){let G=`${_}${M}`;if(s.has(G))return`\x00virtual:${G}`}}}return null},load(m){if(m.startsWith("\x00virtual:")){let h=m.slice(9);return s.get(h)||null}return null}},f=j(t),l=B(n,f),O=C(n),p;try{p=await rr.rollup({input:u,onwarn(h,w){if(h.code==="UNRESOLVED_IMPORT"||h.code==="CIRCULAR_DEPENDENCY"||h.code==="EMPTY_BUNDLE")return;w(h)},plugins:[a,sr.default()],external:(h)=>l.some((w)=>w.test(h))&&!O.some((w)=>w.test(h))});let{output:m}=await p.generate({format:e});if(!m[0]?.code)throw new Error("Generated bundle is empty");return m[0].code}catch(m){throw new Error(`DTS bundling failed: ${x(m)}`)}finally{if(p)await p.close()}}function vr(r,s){let e=d.default.resolve(r),n=d.default.resolve(e,s);if(!$.default.existsSync(e))throw new Error(`Root directory does not exist: ${e}`);if(!$.default.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(d.default.relative(e,n).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${n}`);return{absoluteRootDir:e,absoluteEntry:n}}var __dirname="/home/runner/work/bunup/bunup/src/dts";self.onmessage=async(r)=>{let{name:s,rootDir:e,outDir:n,entry:t,format:i,packageType:o,options:u}=r.data;try{let a=await nr(e,t.path,i,u),f=D(i,o),l=`${n}/${t.name}${f}`,O=`${e}/${l}`;await Bun.write(O,a);let p={name:s,success:!0,outputRelativePath:l};self.postMessage(p)}catch(a){let f={success:!1,error:x(a)};self.postMessage(f)}};class Q{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=navigator.hardwareConcurrency||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((s,e)=>{this.queue.push({task:r,resolve:s,reject:e}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new Worker(er.default.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((s)=>!this.busyWorkers.has(s));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let s=this.queue.shift();if(!s)return;let{task:e,resolve:n,reject:t}=s;this.busyWorkers.add(r);let i=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.onmessage=(o)=>{if(o.data.success)c.progress(y("DTS",o.data.name),o.data.outputRelativePath),n();else c.error(`DTS generation failed: ${o.data.error}`),t(new Error(o.data.error));i()},r.onerror=(o)=>{let u=x(o);c.error(`Worker error: ${u}`),t(o),i()},r.postMessage(e)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(s){c.error(`Error terminating worker: ${x(s)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let s=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(s),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(s),this.terminateAllWorkers(),r()},5000)})}}function Er(r){return r.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function v(r){let s=[],e=new Set;function n(t,i){if(e.has(t)){let o=Y();s.push({name:`${t}_${o}`,path:i})}else s.push({name:t,path:i}),e.add(t)}if(Array.isArray(r))for(let t of r){let i=Er(t);n(i,t)}else Object.entries(r).forEach(([t,i])=>{n(t,i)});return s}function tr(r,s){return`[dir]/${r}${s}`}function ir(r,s){return{name:"bunup:external-plugin",setup(e){e.onResolve({filter:/.*/},(n)=>{let t=n.path;if(r.some((o)=>o.test(t))&&!s.some((o)=>o.test(t)))return{path:t,external:!0};return null})}}}async function A(r,s){if(!r.entry||r.entry.length===0||!r.outDir){c.cli("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");return}let e=performance.now();c.cli("Build started");let n=j(s),t=n?.type,i=B(r,n),o=C(r),u=[ir(i,o)],a=v(r.entry),f=r.format.flatMap((l)=>a.map((O)=>Cr(r,s,O,l,t,u)));try{await Promise.all(f);let l=performance.now()-e,O=q(l);c.cli(`⚡ Build success in ${O}`)}catch(l){c.error("Build process encountered errors."),process.exit(1)}if(r.dts){let l=performance.now();c.progress("DTS","Bundling types");let O=r.format.filter((h)=>{if(h==="iife"&&!E(t)&&r.format.includes("cjs"))return!1;return!0}),p=r.dts===!0?a:v(r.dts.entry),m=new Q;try{let h=O.flatMap((_)=>p.map((M)=>Br(r,s,M,_,t,m)));await Promise.all(h);let w=performance.now()-l,L=q(w);c.progress("DTS",`Bundled types in ${L}`)}catch(h){await m.cleanup()}await m.cleanup()}}async function Br(r,s,e,n,t,i){let o={name:r.name,rootDir:s,outDir:r.outDir,entry:e,format:n,packageType:t,options:r};await i.process(o)}async function Cr(r,s,e,n,t,i){let o=Z(n,t),u=P(r,s),a=await Bun.build({...u,entrypoints:[`${s}/${e.path}`],format:n,naming:{entry:tr(e.name,o)},splitting:J(r.splitting,n),plugins:i});if(!a.success)throw a.logs.forEach((f)=>{if(f.level==="error")c.error(f.message);else if(f.level==="warning")c.warn(f.message);else if(f.level==="info")c.info(f.message)}),new Error(`Build failed for ${e} (${n})`);c.progress(y(n,r.name),`${r.outDir}/${e.name}${o}`)}var yr={n:"name",f:"format",o:"outDir",m:"minify",w:"watch",d:"dts",e:"external",t:"target",mw:"minifyWhitespace",mi:"minifyIdentifiers",ms:"minifySyntax",c:"clean",s:"splitting",ne:"noExternal"},jr={name:(r,s)=>{s.name=r},format:(r,s)=>{s.format=r.split(",")},outDir:(r,s)=>{s.outDir=r},minify:(r,s)=>{s.minify=!!r},watch:(r,s)=>{s.watch=!!r},dts:(r,s)=>{s.dts=!!r},external:(r,s)=>{s.external=r.split(",")},minifyWhitespace:(r,s)=>{s.minifyWhitespace=!!r},minifyIdentifiers:(r,s)=>{s.minifyIdentifiers=!!r},minifySyntax:(r,s)=>{s.minifySyntax=!!r},target:(r,s)=>{s.target=r},clean:(r,s)=>{s.clean=!!r},splitting:(r,s)=>{s.splitting=!!r},noExternal:(r,s)=>{s.noExternal=r.split(",")}};function or(r){let s={};for(let e=0;e<r.length;e++){let n=r[e];if(n.startsWith("--")||n.startsWith("-")){let t=n.startsWith("-")&&!n.startsWith("--"),i=t?n.slice(1):n.slice(2),o=t?yr[i]:i,u=jr[o];if(!u){c.error(`Unknown option: ${i}`);continue}let a=r[e+1],f=a&&!a.startsWith("-")?a:!0;if(u(f,s),typeof f==="string")e++}else{if(!s.entry)s.entry=[];if(Array.isArray(s.entry))s.entry.push(n)}}return s}(()=>{if(typeof Bun==="undefined")c.error(`Bunup requires Bun to run.
|
|
5
|
-
To install Bun, visit https://bun.sh/docs/installation`),process.exit(1)})();var
|
|
5
|
+
`)+"\x1B[0m")};var i={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(r,t,s){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-t.length));return`\x1B[38;5;${r}m[${t}]\x1B[0m ${n}${s}`},cli(r){let t=this.labels.cli;console.log(this.formatMessage(this.colors.cli,t,r))},info(r){let t=this.labels.info;console.log(this.formatMessage(this.colors.info,t,r))},warn(r){let t=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,t,r))},error(r){let t=this.labels.error;console.error(this.formatMessage(this.colors.error,t,r))},progress(r,t){let s=String(r),n=this.colors.default;for(let[e,o]of Object.entries(this.colors.progress))if(s.includes(e)){n=o;break}console.log(this.formatMessage(n,s,t))}};function E(r,t){return`${t?`${t.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}var __dirname="/home/runner/work/bunup/bunup/src/dts";class W{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=A.cpus().length||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((t,s)=>{this.queue.push({task:r,resolve:t,reject:s}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new N.Worker(b.default.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((t)=>!this.busyWorkers.has(t));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let t=this.queue.shift();if(!t)return;let{task:s,resolve:n,reject:e}=t;this.busyWorkers.add(r);let o=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.on("message",(a)=>{if(a.success)i.progress(E("DTS",a.name),a.outputRelativePath),n();else i.error(`DTS generation failed: ${a.error}`),e(new Error(a.error));o()}),r.on("error",(a)=>{let l=p(a);i.error(`Worker error: ${l}`),e(a),o()}),r.postMessage(s)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(t){i.error(`Error terminating worker: ${p(t)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let t=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(t),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(t),this.terminateAllWorkers(),r()},5000)})}}function k(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function F(r=8){return Math.random().toString(36).substring(2,2+r)}function M(r,t){switch(r){case"esm":return".mjs";case"cjs":return $(t)?".cjs":".js";case"iife":return".global.js"}}function $(r){return r==="module"}function C(r){return r>=1000?`${(r/1000).toFixed(2)}s`:`${Math.round(r)}ms`}function I(r){if(!r)return[];return Array.from(new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{})]))}function L(r,t){return r===void 0?t==="esm":r}function cr(r){return r.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function d(r){let t=[],s=new Set;function n(e,o){if(s.has(e)){let a=F();t.push({name:`${e}_${a}`,path:o})}else t.push({name:e,path:o}),s.add(e)}if(Array.isArray(r))for(let e of r){let o=cr(e);n(o,e)}else Object.entries(r).forEach(([e,o])=>{n(e,o)});return t}function P(r,t){return`[dir]/${r}${t}`}function _(r){return r.map((t)=>typeof t==="string"?new RegExp(`^${k(t)}($|\\/|\\\\)`):t)}function H(r,t){return _(r.external||[]).concat(I(t).map((s)=>new RegExp(`^${k(s)}($|\\/|\\\\)`)))}function q(r){return _(r.noExternal||[])}var x=m(require("node:fs")),B=m(require("node:path"));var h={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function D(r,t){return{outdir:`${t}/${r.outDir}`,minify:ur(r),target:r.target,splitting:r.splitting}}function ur(r){let{minify:t,minifyWhitespace:s,minifyIdentifiers:n,minifySyntax:e}=r,o=t===!0;return{whitespace:s??o,identifiers:n??o,syntax:e??o}}async function U(r){let t=[];for(let s of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=B.default.join(r,`bunup.config${s}`);try{if(!x.default.existsSync(n))continue;let e;if(s===".json"||s===".jsonc"){let o=x.default.readFileSync(n,"utf8");e=JSON.parse(o)}else{let o=await import(`file://${n}`);if(e=o.default||o,!e)i.warn(`No default export found in ${n}`),e={}}if(Array.isArray(e))for(let o of e)t.push({options:{...h,...o},rootDir:r});else t.push({options:{...h,...e},rootDir:r});break}catch(e){i.error(`Failed to load config from ${n}: ${p(e)}`)}if(t.length>0)break}return t}function Q(r){let t=B.default.join(r,"package.json");try{if(!x.default.existsSync(t))return null;let s=x.default.readFileSync(t,"utf8");return JSON.parse(s)}catch(s){return i.error(`Failed to load package.json at ${t}: ${p(s)}`),null}}function G(r,t){return{name:"bunup:external-plugin",setup(s){s.onResolve({filter:/.*/},(n)=>{let e=n.path;if(r.some((a)=>a.test(e))&&!t.some((a)=>a.test(e)))return{path:e,external:!0};return null})}}}async function O(r,t){if(!r.entry||r.entry.length===0||!r.outDir){i.cli("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");return}let s=performance.now();i.cli("Build started");let n=Q(t),e=n?.type,o=H(r,n),a=q(r),l=[G(o,a)],u=d(r.entry),c=r.format.flatMap((f)=>u.map((g)=>fr(r,t,g,f,e,l)));try{await Promise.all(c);let f=performance.now()-s,g=C(f);i.cli(`⚡ Build success in ${g}`)}catch(f){i.error("Build process encountered errors."),process.exit(1)}if(r.dts){let f=performance.now();i.progress("DTS","Bundling types");let g=r.format.filter((w)=>{if(w==="iife"&&!$(e)&&r.format.includes("cjs"))return!1;return!0}),J=r.dts===!0?u:d(r.dts.entry),S=new W;try{let w=g.flatMap((tr)=>J.map((sr)=>lr(r,t,sr,tr,e,S)));await Promise.all(w);let V=performance.now()-f,rr=C(V);i.progress("DTS",`Bundled types in ${rr}`)}catch(w){await S.cleanup()}await S.cleanup()}}async function lr(r,t,s,n,e,o){let a={name:r.name,rootDir:t,outDir:r.outDir,entry:s,format:n,packageType:e,options:r};await o.process(a)}async function fr(r,t,s,n,e,o){let a=M(n,e),l=D(r,t),u=await Bun.build({...l,entrypoints:[`${t}/${s.path}`],format:n,naming:{entry:P(s.name,a)},splitting:L(r.splitting,n),plugins:o,throw:!1});if(!u.success)throw u.logs.forEach((c)=>{if(c.level==="error")i.error(c.message);else if(c.level==="warning")i.warn(c.message);else if(c.level==="info")i.info(c.message)}),new Error(`Build failed for ${s} (${n})`);i.progress(E(n,r.name),`${r.outDir}/${s.name}${a}`)}var mr={n:"name",f:"format",o:"outDir",m:"minify",w:"watch",d:"dts",e:"external",t:"target",mw:"minifyWhitespace",mi:"minifyIdentifiers",ms:"minifySyntax",c:"clean",s:"splitting",ne:"noExternal"},pr={name:(r,t)=>{t.name=r},format:(r,t)=>{t.format=r.split(",")},outDir:(r,t)=>{t.outDir=r},minify:(r,t)=>{t.minify=!!r},watch:(r,t)=>{t.watch=!!r},dts:(r,t)=>{t.dts=!!r},external:(r,t)=>{t.external=r.split(",")},minifyWhitespace:(r,t)=>{t.minifyWhitespace=!!r},minifyIdentifiers:(r,t)=>{t.minifyIdentifiers=!!r},minifySyntax:(r,t)=>{t.minifySyntax=!!r},target:(r,t)=>{t.target=r},clean:(r,t)=>{t.clean=!!r},splitting:(r,t)=>{t.splitting=!!r},noExternal:(r,t)=>{t.noExternal=r.split(",")}};function X(r){let t={};for(let s=0;s<r.length;s++){let n=r[s];if(n.startsWith("--")||n.startsWith("-")){let e=n.startsWith("-")&&!n.startsWith("--"),o=e?n.slice(1):n.slice(2),a=e?mr[o]:o,l=pr[a];if(!l){i.error(`Unknown option: ${o}`);continue}let u=r[s+1],c=u&&!u.startsWith("-")?u:!0;if(l(c,t),typeof c==="string")s++}else{if(!t.entry)t.entry=[];if(Array.isArray(t.entry))t.entry.push(n)}}return t}(()=>{if(typeof Bun==="undefined")i.error(`Bunup requires Bun to run.
|
|
6
|
+
To install Bun, visit https://bun.sh/docs/installation`),process.exit(1)})();var y=m(require("node:path")),z=m(require("chokidar"));async function K(r,t){let s=new Set;d(r.entry).forEach((u)=>{let c=y.default.resolve(t,u.path),f=y.default.dirname(c);s.add(f)});let e=z.default.watch(Array.from(s),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,r.outDir]}),o=null,a=!1,l=async(u)=>{if(a)return;a=!0;try{await O({...r,entry:[u],clean:!1},t)}catch(c){i.error(`Build failed: ${c}`)}finally{a=!1}};e.on("change",(u)=>{let c=y.default.relative(t,u);if(i.cli(`File changed: ${c}`),o)clearTimeout(o);o=setTimeout(()=>l(c),300)}),e.on("error",(u)=>{i.error(`Watcher error: ${u}`)})}async function hr(r=Bun.argv.slice(2)){let t=X(r),s=await U(process.cwd()),n=process.cwd();if(t.watch)i.cli("Starting watch mode"),i.cli("Watching for file changes");if(s.length===0){let e={...h,...t};if(e.clean)Y(n,e.outDir);await T(e,n)}else{for(let{options:e,rootDir:o}of s)if(e.clean)Y(o,e.outDir);await Promise.all(s.map(async({options:e,rootDir:o})=>{let a={...h,...e,...t};await T(a,o)}))}if(!t.watch)process.exit(0)}async function T(r,t){if(r.watch)await K(r,t);else await O(r,t)}function Y(r,t){let s=Z.default.join(r,t);if(v.default.existsSync(s))try{v.default.rmSync(s,{recursive:!0,force:!0})}catch(n){i.error(`Failed to clean output directory: ${n}`)}v.default.mkdirSync(s,{recursive:!0})}hr().catch((r)=>{R(r),process.exit(1)});})
|
package/build/cli.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
import $ from"fs";import ir from"path";import{cpus as Y}from"node:os";import Z from"node:path";import{Worker as J}from"node:worker_threads";var m=(r)=>{if(r instanceof Error)return r.message;return String(r)},C=(r,t)=>{let s=m(r),n=t?`[${t}] `:"";if(console.error(`\x1B[31m[ERROR]\x1B[0m ${n}${s}`),r instanceof Error&&r.stack)console.error("\x1B[2m"+r.stack.split(`
|
|
3
4
|
`).slice(1).join(`
|
|
4
|
-
`)+"\x1B[0m")};function R(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Q(r=8){return Math.random().toString(36).substring(2,2+r)}function G(r,s){switch(r){case"esm":return".mjs";case"cjs":return S(s)?".cjs":".js";case"iife":return".global.js"}}function I(r,s){switch(r){case"esm":return".d.mts";case"cjs":return S(s)?".d.cts":".d.ts";case"iife":return".d.ts"}}function S(r){return r==="module"}function L(r){return r>=1000?`${(r/1000).toFixed(2)}s`:`${Math.round(r)}ms`}function X(r){if(!r)return[];return Array.from(new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{})]))}function z(r,s){return r===void 0?s==="esm":r}function K(r){return r.map((s)=>typeof s==="string"?new RegExp(`^${R(s)}($|\\/|\\\\)`):s)}function k(r,s){return K(r.external||[]).concat(X(s).map((e)=>new RegExp(`^${R(e)}($|\\/|\\\\)`)))}function v(r){return K(r.noExternal||[])}import B from"fs";import Z from"path";var c={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(r,s,e){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-s.length));return`\x1B[38;5;${r}m[${s}]\x1B[0m ${n}${e}`},cli(r){let s=this.labels.cli;console.log(this.formatMessage(this.colors.cli,s,r))},info(r){let s=this.labels.info;console.log(this.formatMessage(this.colors.info,s,r))},warn(r){let s=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,s,r))},error(r){let s=this.labels.error;console.error(this.formatMessage(this.colors.error,s,r))},progress(r,s){let e=String(r),n=this.colors.default;for(let[t,i]of Object.entries(this.colors.progress))if(e.includes(t)){n=i;break}console.log(this.formatMessage(n,e,s))}};function E(r,s){return`${s?`${s.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}var d={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function Y(r,s){return{outdir:`${s}/${r.outDir}`,minify:sr(r),target:r.target,splitting:r.splitting}}function sr(r){let{minify:s,minifyWhitespace:e,minifyIdentifiers:n,minifySyntax:t}=r,i=s===!0;return{whitespace:e??i,identifiers:n??i,syntax:t??i}}async function D(r){let s=[];for(let e of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=Z.join(r,`bunup.config${e}`);try{if(!B.existsSync(n))continue;let t;if(e===".json"||e===".jsonc"){let i=B.readFileSync(n,"utf8");t=JSON.parse(i)}else{let i=await import(`file://${n}`);if(t=i.default||i,!t)c.warn(`No default export found in ${n}`),t={}}if(Array.isArray(t))for(let i of t)s.push({options:{...d,...i},rootDir:r});else s.push({options:{...d,...t},rootDir:r});break}catch(t){c.error(`Failed to load config from ${n}: ${g(t)}`)}if(s.length>0)break}return s}function C(r){let s=Z.join(r,"package.json");try{if(!B.existsSync(s))return null;let e=B.readFileSync(s,"utf8");return JSON.parse(e)}catch(e){return c.error(`Failed to load package.json at ${s}: ${g(e)}`),null}}async function F(r,s,e,n){let{absoluteRootDir:t,absoluteEntry:i}=fr(r,s),o=await ir(i),u=await cr(o);return ar(i,u,e,n,t)}async function ir(r){let s=new Set,e=[r];while(e.length>0){let n=e.pop();if(!n||s.has(n))continue;s.add(n);try{let t=await W.promises.readFile(n,"utf8"),i=or(t);for(let o of i){let u=p.dirname(n),a=p.resolve(u,o),f=[a,`${a}.ts`,`${a}.tsx`,`${a}/index.ts`,`${a}/index.tsx`];for(let l of f)if(W.existsSync(l)&&l.endsWith(".ts")&&!s.has(l)){e.push(l);break}}}catch(t){c.warn(`Error processing ${n}: ${t instanceof Error?t.message:String(t)}`)}}return s}function or(r){let s=new Set;try{let e=/(?:import|export)(?:(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*)|[\s\n]+)(["'`])([^'"]+)\1/g,n;while((n=e.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}let t=/import\s+(["'`])([^'"]+)\1\s*;?/g;while((n=t.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}let i=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;while((n=i.exec(r))!==null){let o=n[2];if(o.startsWith("."))s.add(o)}}catch(e){c.warn(`Error extracting imports: ${e instanceof Error?e.message:String(e)}`)}return Array.from(s)}async function cr(r){let s=new Map;return await Promise.all(Array.from(r).map(async(e)=>{try{let n=e.replace(/\.tsx?$/,".d.ts"),t=await W.promises.readFile(e,"utf8"),{code:i}=nr.isolatedDeclaration(e,t);if(i)s.set(n,i)}catch(n){c.warn(`Failed to generate declaration for ${e}: ${n instanceof Error?n.message:String(n)}`)}})),s}async function ar(r,s,e,n,t){let u=`\x00virtual:${r.replace(/\.tsx?$/,".d.ts")}`,a={name:"virtual-dts",resolveId(m,h){if(m.startsWith("\x00virtual:"))return m;if(h?.startsWith("\x00virtual:")){let O=h.slice(9),j=p.dirname(O);if(m.startsWith(".")){let A=p.resolve(j,m);for(let N of["",".d.ts","/index.d.ts"]){let q=`${A}${N}`;if(s.has(q))return`\x00virtual:${q}`}}}return null},load(m){if(m.startsWith("\x00virtual:")){let h=m.slice(9);return s.get(h)||null}return null}},f=C(t),l=k(n,f),x=v(n),w;try{w=await er({input:u,onwarn(h,O){if(h.code==="UNRESOLVED_IMPORT"||h.code==="CIRCULAR_DEPENDENCY"||h.code==="EMPTY_BUNDLE")return;O(h)},plugins:[a,tr()],external:(h)=>l.some((O)=>O.test(h))&&!x.some((O)=>O.test(h))});let{output:m}=await w.generate({format:e});if(!m[0]?.code)throw new Error("Generated bundle is empty");return m[0].code}catch(m){throw new Error(`DTS bundling failed: ${g(m)}`)}finally{if(w)await w.close()}}function fr(r,s){let e=p.resolve(r),n=p.resolve(e,s);if(!W.existsSync(e))throw new Error(`Root directory does not exist: ${e}`);if(!W.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(p.relative(e,n).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${n}`);return{absoluteRootDir:e,absoluteEntry:n}}var __dirname="/home/runner/work/bunup/bunup/src/dts";self.onmessage=async(r)=>{let{name:s,rootDir:e,outDir:n,entry:t,format:i,packageType:o,options:u}=r.data;try{let a=await F(e,t.path,i,u),f=I(i,o),l=`${n}/${t.name}${f}`,x=`${e}/${l}`;await Bun.write(x,a);let w={name:s,success:!0,outputRelativePath:l};self.postMessage(w)}catch(a){let f={success:!1,error:g(a)};self.postMessage(f)}};class _{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=navigator.hardwareConcurrency||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((s,e)=>{this.queue.push({task:r,resolve:s,reject:e}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new Worker(ur.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((s)=>!this.busyWorkers.has(s));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let s=this.queue.shift();if(!s)return;let{task:e,resolve:n,reject:t}=s;this.busyWorkers.add(r);let i=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.onmessage=(o)=>{if(o.data.success)c.progress(E("DTS",o.data.name),o.data.outputRelativePath),n();else c.error(`DTS generation failed: ${o.data.error}`),t(new Error(o.data.error));i()},r.onerror=(o)=>{let u=g(o);c.error(`Worker error: ${u}`),t(o),i()},r.postMessage(e)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(s){c.error(`Error terminating worker: ${g(s)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let s=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(s),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(s),this.terminateAllWorkers(),r()},5000)})}}function lr(r){return r.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function $(r){let s=[],e=new Set;function n(t,i){if(e.has(t)){let o=Q();s.push({name:`${t}_${o}`,path:i})}else s.push({name:t,path:i}),e.add(t)}if(Array.isArray(r))for(let t of r){let i=lr(t);n(i,t)}else Object.entries(r).forEach(([t,i])=>{n(t,i)});return s}function J(r,s){return`[dir]/${r}${s}`}function V(r,s){return{name:"bunup:external-plugin",setup(e){e.onResolve({filter:/.*/},(n)=>{let t=n.path;if(r.some((o)=>o.test(t))&&!s.some((o)=>o.test(t)))return{path:t,external:!0};return null})}}}async function y(r,s){if(!r.entry||r.entry.length===0||!r.outDir){c.cli("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");return}let e=performance.now();c.cli("Build started");let n=C(s),t=n?.type,i=k(r,n),o=v(r),u=[V(i,o)],a=$(r.entry),f=r.format.flatMap((l)=>a.map((x)=>mr(r,s,x,l,t,u)));try{await Promise.all(f);let l=performance.now()-e,x=L(l);c.cli(`⚡ Build success in ${x}`)}catch(l){c.error("Build process encountered errors."),process.exit(1)}if(r.dts){let l=performance.now();c.progress("DTS","Bundling types");let x=r.format.filter((h)=>{if(h==="iife"&&!S(t)&&r.format.includes("cjs"))return!1;return!0}),w=r.dts===!0?a:$(r.dts.entry),m=new _;try{let h=x.flatMap((A)=>w.map((N)=>hr(r,s,N,A,t,m)));await Promise.all(h);let O=performance.now()-l,j=L(O);c.progress("DTS",`Bundled types in ${j}`)}catch(h){await m.cleanup()}await m.cleanup()}}async function hr(r,s,e,n,t,i){let o={name:r.name,rootDir:s,outDir:r.outDir,entry:e,format:n,packageType:t,options:r};await i.process(o)}async function mr(r,s,e,n,t,i){let o=G(n,t),u=Y(r,s),a=await Bun.build({...u,entrypoints:[`${s}/${e.path}`],format:n,naming:{entry:J(e.name,o)},splitting:z(r.splitting,n),plugins:i});if(!a.success)throw a.logs.forEach((f)=>{if(f.level==="error")c.error(f.message);else if(f.level==="warning")c.warn(f.message);else if(f.level==="info")c.info(f.message)}),new Error(`Build failed for ${e} (${n})`);c.progress(E(n,r.name),`${r.outDir}/${e.name}${o}`)}var gr={n:"name",f:"format",o:"outDir",m:"minify",w:"watch",d:"dts",e:"external",t:"target",mw:"minifyWhitespace",mi:"minifyIdentifiers",ms:"minifySyntax",c:"clean",s:"splitting",ne:"noExternal"},xr={name:(r,s)=>{s.name=r},format:(r,s)=>{s.format=r.split(",")},outDir:(r,s)=>{s.outDir=r},minify:(r,s)=>{s.minify=!!r},watch:(r,s)=>{s.watch=!!r},dts:(r,s)=>{s.dts=!!r},external:(r,s)=>{s.external=r.split(",")},minifyWhitespace:(r,s)=>{s.minifyWhitespace=!!r},minifyIdentifiers:(r,s)=>{s.minifyIdentifiers=!!r},minifySyntax:(r,s)=>{s.minifySyntax=!!r},target:(r,s)=>{s.target=r},clean:(r,s)=>{s.clean=!!r},splitting:(r,s)=>{s.splitting=!!r},noExternal:(r,s)=>{s.noExternal=r.split(",")}};function P(r){let s={};for(let e=0;e<r.length;e++){let n=r[e];if(n.startsWith("--")||n.startsWith("-")){let t=n.startsWith("-")&&!n.startsWith("--"),i=t?n.slice(1):n.slice(2),o=t?gr[i]:i,u=xr[o];if(!u){c.error(`Unknown option: ${i}`);continue}let a=r[e+1],f=a&&!a.startsWith("-")?a:!0;if(u(f,s),typeof f==="string")e++}else{if(!s.entry)s.entry=[];if(Array.isArray(s.entry))s.entry.push(n)}}return s}(()=>{if(typeof Bun==="undefined")c.error(`Bunup requires Bun to run.
|
|
5
|
-
To install Bun, visit https://bun.sh/docs/installation`),process.exit(1)})();import
|
|
5
|
+
`)+"\x1B[0m")};var i={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(r,t,s){let n=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-t.length));return`\x1B[38;5;${r}m[${t}]\x1B[0m ${n}${s}`},cli(r){let t=this.labels.cli;console.log(this.formatMessage(this.colors.cli,t,r))},info(r){let t=this.labels.info;console.log(this.formatMessage(this.colors.info,t,r))},warn(r){let t=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,t,r))},error(r){let t=this.labels.error;console.error(this.formatMessage(this.colors.error,t,r))},progress(r,t){let s=String(r),n=this.colors.default;for(let[e,o]of Object.entries(this.colors.progress))if(s.includes(e)){n=o;break}console.log(this.formatMessage(n,s,t))}};function x(r,t){return`${t?`${t.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}var __dirname="/home/runner/work/bunup/bunup/src/dts";class y{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=Y().length||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((t,s)=>{this.queue.push({task:r,resolve:t,reject:s}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new J(Z.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((t)=>!this.busyWorkers.has(t));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let t=this.queue.shift();if(!t)return;let{task:s,resolve:n,reject:e}=t;this.busyWorkers.add(r);let o=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.on("message",(a)=>{if(a.success)i.progress(x("DTS",a.name),a.outputRelativePath),n();else i.error(`DTS generation failed: ${a.error}`),e(new Error(a.error));o()}),r.on("error",(a)=>{let l=m(a);i.error(`Worker error: ${l}`),e(a),o()}),r.postMessage(s)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(t){i.error(`Error terminating worker: ${m(t)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let t=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(t),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(t),this.terminateAllWorkers(),r()},5000)})}}function v(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function B(r=8){return Math.random().toString(36).substring(2,2+r)}function j(r,t){switch(r){case"esm":return".mjs";case"cjs":return S(t)?".cjs":".js";case"iife":return".global.js"}}function S(r){return r==="module"}function W(r){return r>=1000?`${(r/1000).toFixed(2)}s`:`${Math.round(r)}ms`}function R(r){if(!r)return[];return Array.from(new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{})]))}function A(r,t){return r===void 0?t==="esm":r}function V(r){return r.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function g(r){let t=[],s=new Set;function n(e,o){if(s.has(e)){let a=B();t.push({name:`${e}_${a}`,path:o})}else t.push({name:e,path:o}),s.add(e)}if(Array.isArray(r))for(let e of r){let o=V(e);n(o,e)}else Object.entries(r).forEach(([e,o])=>{n(e,o)});return t}function b(r,t){return`[dir]/${r}${t}`}function N(r){return r.map((t)=>typeof t==="string"?new RegExp(`^${v(t)}($|\\/|\\\\)`):t)}function F(r,t){return N(r.external||[]).concat(R(t).map((s)=>new RegExp(`^${v(s)}($|\\/|\\\\)`)))}function M(r){return N(r.noExternal||[])}import w from"node:fs";import L from"node:path";var p={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function I(r,t){return{outdir:`${t}/${r.outDir}`,minify:rr(r),target:r.target,splitting:r.splitting}}function rr(r){let{minify:t,minifyWhitespace:s,minifyIdentifiers:n,minifySyntax:e}=r,o=t===!0;return{whitespace:s??o,identifiers:n??o,syntax:e??o}}async function P(r){let t=[];for(let s of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let n=L.join(r,`bunup.config${s}`);try{if(!w.existsSync(n))continue;let e;if(s===".json"||s===".jsonc"){let o=w.readFileSync(n,"utf8");e=JSON.parse(o)}else{let o=await import(`file://${n}`);if(e=o.default||o,!e)i.warn(`No default export found in ${n}`),e={}}if(Array.isArray(e))for(let o of e)t.push({options:{...p,...o},rootDir:r});else t.push({options:{...p,...e},rootDir:r});break}catch(e){i.error(`Failed to load config from ${n}: ${m(e)}`)}if(t.length>0)break}return t}function _(r){let t=L.join(r,"package.json");try{if(!w.existsSync(t))return null;let s=w.readFileSync(t,"utf8");return JSON.parse(s)}catch(s){return i.error(`Failed to load package.json at ${t}: ${m(s)}`),null}}function H(r,t){return{name:"bunup:external-plugin",setup(s){s.onResolve({filter:/.*/},(n)=>{let e=n.path;if(r.some((a)=>a.test(e))&&!t.some((a)=>a.test(e)))return{path:e,external:!0};return null})}}}async function E(r,t){if(!r.entry||r.entry.length===0||!r.outDir){i.cli("Nothing to build. Please make sure you have provided a proper bunup configuration or cli arguments.");return}let s=performance.now();i.cli("Build started");let n=_(t),e=n?.type,o=F(r,n),a=M(r),l=[H(o,a)],u=g(r.entry),c=r.format.flatMap((f)=>u.map((h)=>sr(r,t,h,f,e,l)));try{await Promise.all(c);let f=performance.now()-s,h=W(f);i.cli(`⚡ Build success in ${h}`)}catch(f){i.error("Build process encountered errors."),process.exit(1)}if(r.dts){let f=performance.now();i.progress("DTS","Bundling types");let h=r.format.filter((d)=>{if(d==="iife"&&!S(e)&&r.format.includes("cjs"))return!1;return!0}),G=r.dts===!0?u:g(r.dts.entry),O=new y;try{let d=h.flatMap((K)=>G.map((T)=>tr(r,t,T,K,e,O)));await Promise.all(d);let X=performance.now()-f,z=W(X);i.progress("DTS",`Bundled types in ${z}`)}catch(d){await O.cleanup()}await O.cleanup()}}async function tr(r,t,s,n,e,o){let a={name:r.name,rootDir:t,outDir:r.outDir,entry:s,format:n,packageType:e,options:r};await o.process(a)}async function sr(r,t,s,n,e,o){let a=j(n,e),l=I(r,t),u=await Bun.build({...l,entrypoints:[`${t}/${s.path}`],format:n,naming:{entry:b(s.name,a)},splitting:A(r.splitting,n),plugins:o,throw:!1});if(!u.success)throw u.logs.forEach((c)=>{if(c.level==="error")i.error(c.message);else if(c.level==="warning")i.warn(c.message);else if(c.level==="info")i.info(c.message)}),new Error(`Build failed for ${s} (${n})`);i.progress(x(n,r.name),`${r.outDir}/${s.name}${a}`)}var er={n:"name",f:"format",o:"outDir",m:"minify",w:"watch",d:"dts",e:"external",t:"target",mw:"minifyWhitespace",mi:"minifyIdentifiers",ms:"minifySyntax",c:"clean",s:"splitting",ne:"noExternal"},nr={name:(r,t)=>{t.name=r},format:(r,t)=>{t.format=r.split(",")},outDir:(r,t)=>{t.outDir=r},minify:(r,t)=>{t.minify=!!r},watch:(r,t)=>{t.watch=!!r},dts:(r,t)=>{t.dts=!!r},external:(r,t)=>{t.external=r.split(",")},minifyWhitespace:(r,t)=>{t.minifyWhitespace=!!r},minifyIdentifiers:(r,t)=>{t.minifyIdentifiers=!!r},minifySyntax:(r,t)=>{t.minifySyntax=!!r},target:(r,t)=>{t.target=r},clean:(r,t)=>{t.clean=!!r},splitting:(r,t)=>{t.splitting=!!r},noExternal:(r,t)=>{t.noExternal=r.split(",")}};function q(r){let t={};for(let s=0;s<r.length;s++){let n=r[s];if(n.startsWith("--")||n.startsWith("-")){let e=n.startsWith("-")&&!n.startsWith("--"),o=e?n.slice(1):n.slice(2),a=e?er[o]:o,l=nr[a];if(!l){i.error(`Unknown option: ${o}`);continue}let u=r[s+1],c=u&&!u.startsWith("-")?u:!0;if(l(c,t),typeof c==="string")s++}else{if(!t.entry)t.entry=[];if(Array.isArray(t.entry))t.entry.push(n)}}return t}(()=>{if(typeof Bun==="undefined")i.error(`Bunup requires Bun to run.
|
|
6
|
+
To install Bun, visit https://bun.sh/docs/installation`),process.exit(1)})();import k from"node:path";import or from"chokidar";async function D(r,t){let s=new Set;g(r.entry).forEach((u)=>{let c=k.resolve(t,u.path),f=k.dirname(c);s.add(f)});let e=or.watch(Array.from(s),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,r.outDir]}),o=null,a=!1,l=async(u)=>{if(a)return;a=!0;try{await E({...r,entry:[u],clean:!1},t)}catch(c){i.error(`Build failed: ${c}`)}finally{a=!1}};e.on("change",(u)=>{let c=k.relative(t,u);if(i.cli(`File changed: ${c}`),o)clearTimeout(o);o=setTimeout(()=>l(c),300)}),e.on("error",(u)=>{i.error(`Watcher error: ${u}`)})}async function ar(r=Bun.argv.slice(2)){let t=q(r),s=await P(process.cwd()),n=process.cwd();if(t.watch)i.cli("Starting watch mode"),i.cli("Watching for file changes");if(s.length===0){let e={...p,...t};if(e.clean)Q(n,e.outDir);await U(e,n)}else{for(let{options:e,rootDir:o}of s)if(e.clean)Q(o,e.outDir);await Promise.all(s.map(async({options:e,rootDir:o})=>{let a={...p,...e,...t};await U(a,o)}))}if(!t.watch)process.exit(0)}async function U(r,t){if(r.watch)await D(r,t);else await E(r,t)}function Q(r,t){let s=ir.join(r,t);if($.existsSync(s))try{$.rmSync(s,{recursive:!0,force:!0})}catch(n){i.error(`Failed to clean output directory: ${n}`)}$.mkdirSync(s,{recursive:!0})}ar().catch((r)=>{C(r),process.exit(1)});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var C=require("node:module");var v=Object.create;var{getPrototypeOf:b,defineProperty:n,getOwnPropertyNames:u,getOwnPropertyDescriptor:E}=Object,h=Object.prototype.hasOwnProperty;var w=(r,e,s)=>{s=r!=null?v(b(r)):{};let o=e||!r||!r.__esModule?n(s,"default",{value:r,enumerable:!0}):s;for(let t of u(r))if(!h.call(o,t))n(o,t,{get:()=>r[t],enumerable:!0});return o},g=new WeakMap,y=(r)=>{var e=g.get(r),s;if(e)return e;if(e=n({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")u(r).map((o)=>!h.call(e,o)&&n(e,o,{get:()=>r[o],enumerable:!(s=E(r,o))||s.enumerable}));return g.set(r,e),e};var D=(r,e)=>{for(var s in e)n(r,s,{get:e[s],enumerable:!0,configurable:!0,set:(o)=>e[s]=()=>o})};var M={};D(M,{DtsWorker:()=>d});module.exports=y(M);var m=require("node:os"),f=w(require("node:path")),k=require("node:worker_threads");var c=(r)=>{if(r instanceof Error)return r.message;return String(r)};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(r,e,s){let o=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-e.length));return`\x1B[38;5;${r}m[${e}]\x1B[0m ${o}${s}`},cli(r){let e=this.labels.cli;console.log(this.formatMessage(this.colors.cli,e,r))},info(r){let e=this.labels.info;console.log(this.formatMessage(this.colors.info,e,r))},warn(r){let e=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,e,r))},error(r){let e=this.labels.error;console.error(this.formatMessage(this.colors.error,e,r))},progress(r,e){let s=String(r),o=this.colors.default;for(let[t,l]of Object.entries(this.colors.progress))if(s.includes(t)){o=l;break}console.log(this.formatMessage(o,s,e))}};function p(r,e){return`${e?`${e.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}var __dirname="/home/runner/work/bunup/bunup/src/dts";class d{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=m.cpus().length||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((e,s)=>{this.queue.push({task:r,resolve:e,reject:s}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new k.Worker(f.default.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((e)=>!this.busyWorkers.has(e));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let e=this.queue.shift();if(!e)return;let{task:s,resolve:o,reject:t}=e;this.busyWorkers.add(r);let l=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.on("message",(i)=>{if(i.success)a.progress(p("DTS",i.name),i.outputRelativePath),o();else a.error(`DTS generation failed: ${i.error}`),t(new Error(i.error));l()}),r.on("error",(i)=>{let W=c(i);a.error(`Worker error: ${W}`),t(i),l()}),r.postMessage(s)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(e){a.error(`Error terminating worker: ${c(e)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let e=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(e),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(e),this.terminateAllWorkers(),r()},5000)})}}
|
package/build/index.d.mts
CHANGED
|
@@ -31,6 +31,17 @@ type DtsOptions = {
|
|
|
31
31
|
* entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
|
|
32
32
|
*/
|
|
33
33
|
entry: Entry
|
|
34
|
+
/**
|
|
35
|
+
* Path to a preferred tsconfig.json file to use for declaration generation
|
|
36
|
+
*
|
|
37
|
+
* If not specified, the tsconfig.json in the project root will be used.
|
|
38
|
+
* This option allows you to use a different TypeScript configuration
|
|
39
|
+
* specifically for declaration file generation.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* preferredTsconfigPath: './tsconfig.build.json'
|
|
43
|
+
*/
|
|
44
|
+
preferredTsconfigPath?: string
|
|
34
45
|
};
|
|
35
46
|
interface BunupOptions {
|
|
36
47
|
/**
|
package/build/index.d.ts
CHANGED
|
@@ -31,6 +31,17 @@ type DtsOptions = {
|
|
|
31
31
|
* entry: { myModule: './src/index.ts', utils: './src/utility-functions.ts' } // Generates myModule.d.ts and utils.d.ts
|
|
32
32
|
*/
|
|
33
33
|
entry: Entry
|
|
34
|
+
/**
|
|
35
|
+
* Path to a preferred tsconfig.json file to use for declaration generation
|
|
36
|
+
*
|
|
37
|
+
* If not specified, the tsconfig.json in the project root will be used.
|
|
38
|
+
* This option allows you to use a different TypeScript configuration
|
|
39
|
+
* specifically for declaration file generation.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* preferredTsconfigPath: './tsconfig.build.json'
|
|
43
|
+
*/
|
|
44
|
+
preferredTsconfigPath?: string
|
|
34
45
|
};
|
|
35
46
|
interface BunupOptions {
|
|
36
47
|
/**
|
package/package.json
CHANGED
package/build/dtsWorker.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import X from"path";import E from"fs";import $ from"path";import _ from"oxc-transform";import{rollup as T}from"rollup";import q from"rollup-plugin-dts";var h=(r)=>{if(r instanceof Error)return r.message;return String(r)};function v(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function p(r,s){switch(r){case"esm":return".d.mts";case"cjs":return N(s)?".d.cts":".d.ts";case"iife":return".d.ts"}}function N(r){return r==="module"}function x(r){if(!r)return[];return Array.from(new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{})]))}function C(r){return r.map((s)=>typeof s==="string"?new RegExp(`^${v(s)}($|\\/|\\\\)`):s)}function j(r,s){return C(r.external||[]).concat(x(s).map((e)=>new RegExp(`^${v(e)}($|\\/|\\\\)`)))}function m(r){return C(r.noExternal||[])}import B from"fs";import y from"path";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(r,s,e){let o=" ".repeat(Math.max(0,this.MAX_LABEL_LENGTH-s.length));return`\x1B[38;5;${r}m[${s}]\x1B[0m ${o}${e}`},cli(r){let s=this.labels.cli;console.log(this.formatMessage(this.colors.cli,s,r))},info(r){let s=this.labels.info;console.log(this.formatMessage(this.colors.info,s,r))},warn(r){let s=this.labels.warn;console.warn(this.formatMessage(this.colors.warn,s,r))},error(r){let s=this.labels.error;console.error(this.formatMessage(this.colors.error,s,r))},progress(r,s){let e=String(r),o=this.colors.default;for(let[t,i]of Object.entries(this.colors.progress))if(e.includes(t)){o=i;break}console.log(this.formatMessage(o,e,s))}};function O(r,s){return`${s?`${s.replace(/-/g,"_")}_`:""}${r}`.toUpperCase()}function D(r){let s=y.join(r,"package.json");try{if(!B.existsSync(s))return null;let e=B.readFileSync(s,"utf8");return JSON.parse(e)}catch(e){return f.error(`Failed to load package.json at ${s}: ${h(e)}`),null}}async function A(r,s,e,o){let{absoluteRootDir:t,absoluteEntry:i}=H(r,s),n=await U(i),k=await Q(n);return G(i,k,e,o,t)}async function U(r){let s=new Set,e=[r];while(e.length>0){let o=e.pop();if(!o||s.has(o))continue;s.add(o);try{let t=await E.promises.readFile(o,"utf8"),i=z(t);for(let n of i){let k=$.dirname(o),g=$.resolve(k,n),l=[g,`${g}.ts`,`${g}.tsx`,`${g}/index.ts`,`${g}/index.tsx`];for(let u of l)if(E.existsSync(u)&&u.endsWith(".ts")&&!s.has(u)){e.push(u);break}}}catch(t){f.warn(`Error processing ${o}: ${t instanceof Error?t.message:String(t)}`)}}return s}function z(r){let s=new Set;try{let e=/(?:import|export)(?:(?:[\s\n]*(?:type[\s\n]+)?(?:\*|\{[^}]*\}|[\w$]+)[\s\n]+from[\s\n]*)|[\s\n]+)(["'`])([^'"]+)\1/g,o;while((o=e.exec(r))!==null){let n=o[2];if(n.startsWith("."))s.add(n)}let t=/import\s+(["'`])([^'"]+)\1\s*;?/g;while((o=t.exec(r))!==null){let n=o[2];if(n.startsWith("."))s.add(n)}let i=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;while((o=i.exec(r))!==null){let n=o[2];if(n.startsWith("."))s.add(n)}}catch(e){f.warn(`Error extracting imports: ${e instanceof Error?e.message:String(e)}`)}return Array.from(s)}async function Q(r){let s=new Map;return await Promise.all(Array.from(r).map(async(e)=>{try{let o=e.replace(/\.tsx?$/,".d.ts"),t=await E.promises.readFile(e,"utf8"),{code:i}=_.isolatedDeclaration(e,t);if(i)s.set(o,i)}catch(o){f.warn(`Failed to generate declaration for ${e}: ${o instanceof Error?o.message:String(o)}`)}})),s}async function G(r,s,e,o,t){let k=`\x00virtual:${r.replace(/\.tsx?$/,".d.ts")}`,g={name:"virtual-dts",resolveId(c,a){if(c.startsWith("\x00virtual:"))return c;if(a?.startsWith("\x00virtual:")){let W=a.slice(9),M=$.dirname(W);if(c.startsWith(".")){let R=$.resolve(M,c);for(let L of["",".d.ts","/index.d.ts"]){let d=`${R}${L}`;if(s.has(d))return`\x00virtual:${d}`}}}return null},load(c){if(c.startsWith("\x00virtual:")){let a=c.slice(9);return s.get(a)||null}return null}},l=D(t),u=j(o,l),S=m(o),w;try{w=await T({input:k,onwarn(a,W){if(a.code==="UNRESOLVED_IMPORT"||a.code==="CIRCULAR_DEPENDENCY"||a.code==="EMPTY_BUNDLE")return;W(a)},plugins:[g,q()],external:(a)=>u.some((W)=>W.test(a))&&!S.some((W)=>W.test(a))});let{output:c}=await w.generate({format:e});if(!c[0]?.code)throw new Error("Generated bundle is empty");return c[0].code}catch(c){throw new Error(`DTS bundling failed: ${h(c)}`)}finally{if(w)await w.close()}}function H(r,s){let e=$.resolve(r),o=$.resolve(e,s);if(!E.existsSync(e))throw new Error(`Root directory does not exist: ${e}`);if(!E.existsSync(o))throw new Error(`Entry file does not exist: ${o}`);if(!o.endsWith(".ts"))throw new Error(`Entry file must be a TypeScript file (.ts): ${o}`);if($.relative(e,o).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${o}`);return{absoluteRootDir:e,absoluteEntry:o}}var __dirname="/home/runner/work/bunup/bunup/src/dts";self.onmessage=async(r)=>{let{name:s,rootDir:e,outDir:o,entry:t,format:i,packageType:n,options:k}=r.data;try{let g=await A(e,t.path,i,k),l=p(i,n),u=`${o}/${t.name}${l}`,S=`${e}/${u}`;await Bun.write(S,g);let w={name:s,success:!0,outputRelativePath:u};self.postMessage(w)}catch(g){let l={success:!1,error:h(g)};self.postMessage(l)}};class K{workers=[];queue=[];maxWorkers;busyWorkers=new Set;isShuttingDown=!1;constructor(r=navigator.hardwareConcurrency||4){this.maxWorkers=r}async process(r){if(this.isShuttingDown)throw new Error("Worker pool is shutting down");return new Promise((s,e)=>{this.queue.push({task:r,resolve:s,reject:e}),this.processQueue()})}processQueue(){if(this.queue.length===0||this.isShuttingDown)return;if(this.workers.length<this.maxWorkers){let r=new Worker(X.join(__dirname,"./dtsWorker.js"));this.workers.push(r),this.assignTaskToWorker(r)}else{let r=this.workers.find((s)=>!this.busyWorkers.has(s));if(r)this.assignTaskToWorker(r)}}assignTaskToWorker(r){let s=this.queue.shift();if(!s)return;let{task:e,resolve:o,reject:t}=s;this.busyWorkers.add(r);let i=()=>{if(this.busyWorkers.delete(r),this.isShuttingDown&&this.busyWorkers.size===0)this.terminateAllWorkers();else this.processQueue()};r.onmessage=(n)=>{if(n.data.success)f.progress(O("DTS",n.data.name),n.data.outputRelativePath),o();else f.error(`DTS generation failed: ${n.data.error}`),t(new Error(n.data.error));i()},r.onerror=(n)=>{let k=h(n);f.error(`Worker error: ${k}`),t(n),i()},r.postMessage(e)}terminateAllWorkers(){this.workers.forEach((r)=>{try{r.terminate()}catch(s){f.error(`Error terminating worker: ${h(s)}`)}}),this.workers=[],this.busyWorkers.clear()}async cleanup(){if(this.isShuttingDown=!0,this.busyWorkers.size===0){this.terminateAllWorkers();return}return new Promise((r)=>{let s=setInterval(()=>{if(this.busyWorkers.size===0)clearInterval(s),this.terminateAllWorkers(),r()},100);setTimeout(()=>{clearInterval(s),this.terminateAllWorkers(),r()},5000)})}}export{K as DtsWorker};
|