bunup 0.1.13 → 0.1.14
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/README.md +0 -27
- package/build/cli.js +1 -1
- package/build/cli.mjs +3 -3
- package/build/dtsWorker.js +1 -1
- package/build/index.d.mts +1 -1
- package/build/index.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,30 +16,3 @@ Bunup outperforms other popular bundlers by a significant margin:
|
|
|
16
16
|
| tsup (+ dts) | esm, cjs | 745.23ms | baseline |
|
|
17
17
|
|
|
18
18
|
_Lower build time is better. Benchmark run on the same code with identical output formats._
|
|
19
|
-
|
|
20
|
-
## Advanced Features
|
|
21
|
-
|
|
22
|
-
### Worker-based DTS Generation
|
|
23
|
-
|
|
24
|
-
For large projects, you can enable worker-based DTS generation to improve build performance:
|
|
25
|
-
|
|
26
|
-
```js
|
|
27
|
-
// bunup.config.js
|
|
28
|
-
import {defineConfig} from 'bunup';
|
|
29
|
-
|
|
30
|
-
export default defineConfig({
|
|
31
|
-
// ... other options
|
|
32
|
-
dts: true,
|
|
33
|
-
dtsWorker: true, // Run DTS generation in a worker thread
|
|
34
|
-
});
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Or via CLI:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
bunup src/index.ts --dts --dts-worker
|
|
41
|
-
# or using the short alias
|
|
42
|
-
bunup src/index.ts -d -dw
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
This runs TypeScript declaration file generation in a separate worker thread, which can significantly improve build times for large projects by parallelizing the work and keeping the main thread responsive.
|
package/build/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);var _path = require('path'); var _path2 = _interopRequireDefault(_path);var _worker_threads = require('worker_threads');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 d=t=>t instanceof Error?t.message:String(t),j=(t,r)=>{let n=d(t),e=r?`[${r}] `:"";console.error(`\x1B[31m[ERROR]\x1B[0m ${e}${n}`),process.env.NODE_ENV!=="production"&&t instanceof Error&&t.stack&&console.error("\x1B[2m"+t.stack.split(`
|
|
3
3
|
`).slice(1).join(`
|
|
4
|
-
`)+"\x1B[0m")};function v(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function N(t=8){return Math.random().toString(36).substring(2,2+t)}function I(t,r){switch(t){case"esm":return".mjs";case"cjs":return $(r)?".cjs":".js";case"iife":return".global.js"}}function A(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 D(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function L(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function _(t,r){return t===void 0?r==="esm":t}function U(t){return t.map(r=>typeof r=="string"?new RegExp(`^${v(r)}($|\\/|\\\\)`):r)}function B(t,r){return U(t.external||[]).concat(L(r).map(n=>new RegExp(`^${v(n)}($|\\/|\\\\)`)))}function S(t){return U(t.noExternal||[])}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,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[o,s]of Object.entries(this.colors.progress))if(n.includes(o)){e=s;break}console.log(this.formatMessage(e,n,r))}};function J(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}var E={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function H(t,r){return{outdir:`${r}/${t.outDir}`,minify:ct(t),target:t.target,splitting:t.splitting}}function ct(t){let{minify:r,minifyWhitespace:n,minifyIdentifiers:e,minifySyntax:o}=t,s=r===!0;return{whitespace:_nullishCoalesce(n, () => (s)),identifiers:_nullishCoalesce(e, () => (s)),syntax:_nullishCoalesce(o, () => (s))}}async function V(t){let r=[];for(let n of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let e=_path2.default.join(t,`bunup.config${n}`);try{if(!_fs2.default.existsSync(e))continue;let o;if(n===".json"||n===".jsonc"){let s=_fs2.default.readFileSync(e,"utf8");o=JSON.parse(s)}else{let s=await Promise.resolve().then(() => _interopRequireWildcard(require(`file://${e}`)));o=s.default||s,o||(a.warn(`No default export found in ${e}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...E,...s},rootDir:t});else r.push({options:{...E,...o},rootDir:t});break}catch(o){a.error(`Failed to load config from ${e}: ${d(o)}`)}if(r.length>0)break}return r}function T(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 a.error(`Failed to load package.json at ${r}: ${d(n)}`),null}}function G(t){try{if(!_fs2.default.existsSync(t))return{};let r=_fs2.default.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return a.warn(`Failed to parse tsconfig at ${t}: ${d(r)}`),{}}}async function X(t,r,n,e){let{absoluteRootDir:o,absoluteEntry:s}=yt(t,r),i=await ft(s),p=await gt(i);return dt(s,p,n,e,o)}async function ft(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 o=await _fs2.default.promises.readFile(e,"utf8"),s=mt(o);for(let i of s){let p=_path2.default.dirname(e),c=_path2.default.resolve(p,i),l=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let u of l)if(_fs2.default.existsSync(u)&&u.endsWith(".ts")&&!r.has(u)){n.push(u);break}}}catch(o){a.warn(`Error processing ${e}: ${o instanceof Error?o.message:String(o)}`)}}}return r}function mt(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 i=e[2];i.startsWith(".")&&r.add(i)}let o=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(e=o.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(e=s.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}}catch(n){a.warn(`Error extracting imports: ${n instanceof Error?n.message:String(n)}`)}return Array.from(r)}async function gt(t){let r=new Map;return await Promise.all(Array.from(t).map(async n=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),o=await _fs2.default.promises.readFile(n,"utf8"),{code:s}=_oxctransform2.default.isolatedDeclaration(n,o);s&&r.set(e,s)}catch(e){a.warn(`Failed to generate declaration for ${n}: ${e instanceof Error?e.message:String(e)}`)}})),r}async function dt(t,r,n,e,o){let s="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),p=`${s}${i}`,c=typeof e.dts=="object"?e.dts:{},l=c.preferredTsconfigPath?_path2.default.resolve(c.preferredTsconfigPath):_path2.default.join(o,"tsconfig.json"),g=(await G(l)).compilerOptions,h={name:"bunup:virtual-dts",resolveId(f,m){if(f.startsWith(s))return f;if(_optionalChain([m, 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3(s)])){let x=m.slice(s.length),st=_path2.default.dirname(x);if(f.startsWith(".")){let it=_path2.default.resolve(st,f);for(let at of["",".d.ts","/index.d.ts"]){let W=`${it}${at}`;if(r.has(W))return`${s}${W}`}}}return null},load(f){if(f.startsWith(s)){let m=f.slice(s.length);return r.get(m)||null}return null}},et=T(o),nt=B(e,et),ot=S(e),O;try{O=await _rollup.rollup.call(void 0, {input:p,onwarn(m,x){m.code==="UNRESOLVED_IMPORT"||m.code==="CIRCULAR_DEPENDENCY"||m.code==="EMPTY_BUNDLE"||x(m)},plugins:[h,_rollupplugindts2.default.call(void 0, {tsconfig:l,compilerOptions:{...g?_typescript2.default.parseJsonConfigFileContent({compilerOptions:g},_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:m=>nt.some(x=>x.test(m))&&!ot.some(x=>x.test(m))});let{output:f}=await O.generate({format:n});if(!_optionalChain([f, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.code]))throw new Error("Generated bundle is empty");return f[0].code}catch(f){throw new Error(`DTS bundling failed: ${d(f)}`)}finally{O&&await O.close()}}function yt(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 Y(t,r,n,e,o){return new Promise((s,i)=>{let p={rootDir:t,entries:r,formats:n,options:e,packageType:o},c=new (0, _worker_threads.Worker)(new URL("./dtsWorker.js",import.meta.url),{workerData:p});c.on("message",l=>{if(l.success){if(l.timeMs){let u=D(l.timeMs);a.progress("DTS",`Bundled types in ${u}`)}s()}else i(new Error(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",l=>{l!==0&&i(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:o}=_worker_threads.workerData,s=performance.now();a.progress("DTS","Bundling types in worker thread");try{let i=n.flatMap(p=>r.map(async c=>{let l=await X(t,c.path,p,e),u=A(p,o),g=`${e.outDir}/${c.name}${u}`,h=`${t}/${g}`;await Bun.write(h,l),a.progress("DTS",g)}));Promise.all(i).then(()=>{let p=performance.now()-s;_optionalChain([_worker_threads.parentPort, 'optionalAccess', _6 => _6.postMessage, 'call', _7 => _7({success:!0,timeMs:p})])}).catch(p=>{_optionalChain([_worker_threads.parentPort, 'optionalAccess', _8 => _8.postMessage, 'call', _9 => _9({success:!1,error:p instanceof Error?p.message:String(p)})])})}catch(i){_optionalChain([_worker_threads.parentPort, 'optionalAccess', _10 => _10.postMessage, 'call', _11 => _11({success:!1,error:i instanceof Error?i.message:String(i)})])}}function wt(t){return _optionalChain([t, 'access', _12 => _12.split, 'call', _13 => _13("/"), 'access', _14 => _14.pop, 'call', _15 => _15(), 'optionalAccess', _16 => _16.split, 'call', _17 => _17("."), 'access', _18 => _18.slice, 'call', _19 => _19(0,-1), 'access', _20 => _20.join, 'call', _21 => _21(".")])||""}function b(t){let r=[],n=new Set;function e(o,s){if(n.has(o)){let i=N();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),n.add(o)}if(Array.isArray(t))for(let o of t){let s=wt(o);e(s,o)}else Object.entries(t).forEach(([o,s])=>{e(o,s)});return r}function q(t,r){return`[dir]/${t}${r}`}function K(t,r){return{name:"bunup:external-plugin",setup(n){n.onResolve({filter:/.*/},e=>{let o=e.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 n=performance.now();a.cli("Build started");let e=T(r),o=_optionalChain([e, 'optionalAccess', _22 => _22.type]),s=B(t,e),i=S(t),p=[K(s,i)],c=b(t.entry),l=t.format.flatMap(u=>c.map(g=>Pt(t,r,g,u,o,p)));try{await Promise.all(l);let u=performance.now()-n,g=D(u);a.cli(`\u26A1 Build success in ${g}`)}catch (e2){a.error("Build process encountered errors."),process.exit(1)}if(t.dts){a.progress("DTS","Bundling types");let u=t.format.filter(h=>!(h==="iife"&&!$(o)&&t.format.includes("cjs"))),g=t.dts===!0?c:b(t.dts.entry);try{await Y(r,g,u,t,o)}catch(h){a.error(`DTS build process encountered errors: ${d(h)}`)}}}async function Pt(t,r,n,e,o,s){let i=I(e,o),p=H(t,r),c=await Bun.build({...p,entrypoints:[`${r}/${n.path}`],format:e,naming:{entry:q(n.name,i)},splitting:_(t.splitting,e),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(l=>{l.level==="error"?a.error(l.message):l.level==="warning"?a.warn(l.message):l.level==="info"&&a.info(l.message)}),new Error(`Build failed for ${n} (${e})`);a.progress(J(e,t.name),`${t.outDir}/${n.name}${i}`)}var bt={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"},Ot={name:(t,r)=>{r.name=t},format:(t,r)=>{r.format=t.split(",")},outDir:(t,r)=>{r.outDir=t},minify:(t,r)=>{r.minify=!!t},watch:(t,r)=>{r.watch=!!t},dts:(t,r)=>{r.dts=!!t},external:(t,r)=>{r.external=t.split(",")},minifyWhitespace:(t,r)=>{r.minifyWhitespace=!!t},minifyIdentifiers:(t,r)=>{r.minifyIdentifiers=!!t},minifySyntax:(t,r)=>{r.minifySyntax=!!t},target:(t,r)=>{r.target=t},clean:(t,r)=>{r.clean=!!t},splitting:(t,r)=>{r.splitting=!!t},noExternal:(t,r)=>{r.noExternal=t.split(",")}};function Q(t){let r={};for(let n=0;n<t.length;n++){let e=t[n];if(e.startsWith("--")||e.startsWith("-")){let o=e.startsWith("-")&&!e.startsWith("--"),s=o?e.slice(1):e.slice(2),i=o?bt[s]:s,p=Ot[i];if(!p){a.error(`Unknown option: ${s}`);continue}let c=t[n+1],l=c&&!c.startsWith("-")?c:!0;p(l,r),typeof l=="string"&&n++}else r.entry||(r.entry=[]),Array.isArray(r.entry)&&r.entry.push(e)}return r}typeof Bun>"u"&&(a.error(`Bunup requires Bun to run.
|
|
4
|
+
`)+"\x1B[0m")};function v(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function N(t=8){return Math.random().toString(36).substring(2,2+t)}function I(t,r){switch(t){case"esm":return".mjs";case"cjs":return $(r)?".cjs":".js";case"iife":return".global.js"}}function A(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 D(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function L(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function _(t,r){return t===void 0?r==="esm":t}function U(t){return t.map(r=>typeof r=="string"?new RegExp(`^${v(r)}($|\\/|\\\\)`):r)}function B(t,r){return U(t.external||[]).concat(L(r).map(n=>new RegExp(`^${v(n)}($|\\/|\\\\)`)))}function S(t){return U(t.noExternal||[])}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,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[o,s]of Object.entries(this.colors.progress))if(n.includes(o)){e=s;break}console.log(this.formatMessage(e,n,r))}};function J(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}var E={entry:[],format:["cjs"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function H(t,r){return{outdir:`${r}/${t.outDir}`,minify:ct(t),target:t.target,splitting:t.splitting}}function ct(t){let{minify:r,minifyWhitespace:n,minifyIdentifiers:e,minifySyntax:o}=t,s=r===!0;return{whitespace:_nullishCoalesce(n, () => (s)),identifiers:_nullishCoalesce(e, () => (s)),syntax:_nullishCoalesce(o, () => (s))}}async function V(t){let r=[];for(let n of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let e=_path2.default.join(t,`bunup.config${n}`);try{if(!_fs2.default.existsSync(e))continue;let o;if(n===".json"||n===".jsonc"){let s=_fs2.default.readFileSync(e,"utf8");o=JSON.parse(s)}else{let s=await Promise.resolve().then(() => _interopRequireWildcard(require(`file://${e}`)));o=s.default||s,o||(a.warn(`No default export found in ${e}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...E,...s},rootDir:t});else r.push({options:{...E,...o},rootDir:t});break}catch(o){a.error(`Failed to load config from ${e}: ${d(o)}`)}if(r.length>0)break}return r}function T(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 a.error(`Failed to load package.json at ${r}: ${d(n)}`),null}}function G(t){try{if(!_fs2.default.existsSync(t))return{};let r=_fs2.default.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return a.warn(`Failed to parse tsconfig at ${t}: ${d(r)}`),{}}}async function X(t,r,n,e){let{absoluteRootDir:o,absoluteEntry:s}=yt(t,r),i=await ft(s),p=await gt(i);return dt(s,p,n,e,o)}async function ft(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 o=await _fs2.default.promises.readFile(e,"utf8"),s=mt(o);for(let i of s){let p=_path2.default.dirname(e),c=_path2.default.resolve(p,i),l=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let u of l)if(_fs2.default.existsSync(u)&&u.endsWith(".ts")&&!r.has(u)){n.push(u);break}}}catch(o){a.warn(`Error processing ${e}: ${o instanceof Error?o.message:String(o)}`)}}}return r}function mt(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 i=e[2];i.startsWith(".")&&r.add(i)}let o=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(e=o.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(e=s.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}}catch(n){a.warn(`Error extracting imports: ${n instanceof Error?n.message:String(n)}`)}return Array.from(r)}async function gt(t){let r=new Map;return await Promise.all(Array.from(t).map(async n=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),o=await _fs2.default.promises.readFile(n,"utf8"),{code:s}=_oxctransform2.default.isolatedDeclaration(n,o);s&&r.set(e,s)}catch(e){a.warn(`Failed to generate declaration for ${n}: ${e instanceof Error?e.message:String(e)}`)}})),r}async function dt(t,r,n,e,o){let s="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),p=`${s}${i}`,c=typeof e.dts=="object"?e.dts:{},l=c.preferredTsconfigPath?_path2.default.resolve(c.preferredTsconfigPath):_path2.default.join(o,"tsconfig.json"),g=(await G(l)).compilerOptions,h={name:"bunup:virtual-dts",resolveId(f,m){if(f.startsWith(s))return f;if(_optionalChain([m, 'optionalAccess', _2 => _2.startsWith, 'call', _3 => _3(s)])){let x=m.slice(s.length),st=_path2.default.dirname(x);if(f.startsWith(".")){let it=_path2.default.resolve(st,f);for(let at of["",".d.ts","/index.d.ts"]){let W=`${it}${at}`;if(r.has(W))return`${s}${W}`}}}return null},load(f){if(f.startsWith(s)){let m=f.slice(s.length);return r.get(m)||null}return null}},et=T(o),nt=B(e,et),ot=S(e),O;try{O=await _rollup.rollup.call(void 0, {input:p,onwarn(m,x){m.code==="UNRESOLVED_IMPORT"||m.code==="CIRCULAR_DEPENDENCY"||m.code==="EMPTY_BUNDLE"||x(m)},plugins:[h,_rollupplugindts2.default.call(void 0, {tsconfig:l,compilerOptions:{...g?_typescript2.default.parseJsonConfigFileContent({compilerOptions:g},_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:m=>nt.some(x=>x.test(m))&&!ot.some(x=>x.test(m))});let{output:f}=await O.generate({format:n});if(!_optionalChain([f, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.code]))throw new Error("Generated bundle is empty");return f[0].code}catch(f){throw new Error(`DTS bundling failed: ${d(f)}`)}finally{O&&await O.close()}}function yt(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 Y(t,r,n,e,o){return new Promise((s,i)=>{let p={rootDir:t,entries:r,formats:n,options:e,packageType:o},c=new (0, _worker_threads.Worker)(new URL("./dtsWorker.js",import.meta.url),{workerData:p});c.on("message",l=>{if(l.success){if(l.timeMs){let u=D(l.timeMs);a.progress("DTS",`Bundled types in ${u}`)}s()}else i(new Error(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",l=>{l!==0&&i(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:o}=_worker_threads.workerData,s=performance.now();a.progress("DTS","Bundling types");try{let i=n.flatMap(p=>r.map(async c=>{let l=await X(t,c.path,p,e),u=A(p,o),g=`${e.outDir}/${c.name}${u}`,h=`${t}/${g}`;await Bun.write(h,l),a.progress("DTS",g)}));Promise.all(i).then(()=>{let p=performance.now()-s;_optionalChain([_worker_threads.parentPort, 'optionalAccess', _6 => _6.postMessage, 'call', _7 => _7({success:!0,timeMs:p})])}).catch(p=>{_optionalChain([_worker_threads.parentPort, 'optionalAccess', _8 => _8.postMessage, 'call', _9 => _9({success:!1,error:p instanceof Error?p.message:String(p)})])})}catch(i){_optionalChain([_worker_threads.parentPort, 'optionalAccess', _10 => _10.postMessage, 'call', _11 => _11({success:!1,error:i instanceof Error?i.message:String(i)})])}}function wt(t){return _optionalChain([t, 'access', _12 => _12.split, 'call', _13 => _13("/"), 'access', _14 => _14.pop, 'call', _15 => _15(), 'optionalAccess', _16 => _16.split, 'call', _17 => _17("."), 'access', _18 => _18.slice, 'call', _19 => _19(0,-1), 'access', _20 => _20.join, 'call', _21 => _21(".")])||""}function b(t){let r=[],n=new Set;function e(o,s){if(n.has(o)){let i=N();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),n.add(o)}if(Array.isArray(t))for(let o of t){let s=wt(o);e(s,o)}else Object.entries(t).forEach(([o,s])=>{e(o,s)});return r}function q(t,r){return`[dir]/${t}${r}`}function K(t,r){return{name:"bunup:external-plugin",setup(n){n.onResolve({filter:/.*/},e=>{let o=e.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 n=performance.now();a.cli("Build started");let e=T(r),o=_optionalChain([e, 'optionalAccess', _22 => _22.type]),s=B(t,e),i=S(t),p=[K(s,i)],c=b(t.entry),l=t.format.flatMap(u=>c.map(g=>Pt(t,r,g,u,o,p)));try{await Promise.all(l);let u=performance.now()-n,g=D(u);a.cli(`\u26A1 Build success in ${g}`)}catch (e2){a.error("Build process encountered errors."),process.exit(1)}if(t.dts){a.progress("DTS","Bundling types");let u=t.format.filter(h=>!(h==="iife"&&!$(o)&&t.format.includes("cjs"))),g=t.dts===!0?c:b(t.dts.entry);try{await Y(r,g,u,t,o)}catch(h){a.error(`DTS build process encountered errors: ${d(h)}`)}}}async function Pt(t,r,n,e,o,s){let i=I(e,o),p=H(t,r),c=await Bun.build({...p,entrypoints:[`${r}/${n.path}`],format:e,naming:{entry:q(n.name,i)},splitting:_(t.splitting,e),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(l=>{l.level==="error"?a.error(l.message):l.level==="warning"?a.warn(l.message):l.level==="info"&&a.info(l.message)}),new Error(`Build failed for ${n} (${e})`);a.progress(J(e,t.name),`${t.outDir}/${n.name}${i}`)}var bt={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"},Ot={name:(t,r)=>{r.name=t},format:(t,r)=>{r.format=t.split(",")},outDir:(t,r)=>{r.outDir=t},minify:(t,r)=>{r.minify=!!t},watch:(t,r)=>{r.watch=!!t},dts:(t,r)=>{r.dts=!!t},external:(t,r)=>{r.external=t.split(",")},minifyWhitespace:(t,r)=>{r.minifyWhitespace=!!t},minifyIdentifiers:(t,r)=>{r.minifyIdentifiers=!!t},minifySyntax:(t,r)=>{r.minifySyntax=!!t},target:(t,r)=>{r.target=t},clean:(t,r)=>{r.clean=!!t},splitting:(t,r)=>{r.splitting=!!t},noExternal:(t,r)=>{r.noExternal=t.split(",")}};function Q(t){let r={};for(let n=0;n<t.length;n++){let e=t[n];if(e.startsWith("--")||e.startsWith("-")){let o=e.startsWith("-")&&!e.startsWith("--"),s=o?e.slice(1):e.slice(2),i=o?bt[s]:s,p=Ot[i];if(!p){a.error(`Unknown option: ${s}`);continue}let c=t[n+1],l=c&&!c.startsWith("-")?c:!0;p(l,r),typeof l=="string"&&n++}else r.entry||(r.entry=[]),Array.isArray(r.entry)&&r.entry.push(e)}return r}typeof Bun>"u"&&(a.error(`Bunup requires Bun to run.
|
|
5
5
|
To install Bun, visit https://bun.sh/docs/installation`),process.exit(1));var _chokidar = require('chokidar'); var _chokidar2 = _interopRequireDefault(_chokidar);async function Z(t,r){let n=new Set;b(t.entry).forEach(c=>{let l=_path2.default.resolve(r,c.path),u=_path2.default.dirname(l);n.add(u)});let o=_chokidar2.default.watch(Array.from(n),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),s=null,i=!1,p=async c=>{if(!i){i=!0;try{await R({...t,entry:[c],clean:!1},r)}catch(l){a.error(`Build failed: ${l}`)}finally{i=!1}}};o.on("change",c=>{let l=_path2.default.relative(r,c);a.cli(`File changed: ${l}`),s&&clearTimeout(s),s=setTimeout(()=>p(l),300)}),o.on("error",c=>{a.error(`Watcher error: ${c}`)})}async function Bt(t=Bun.argv.slice(2)){let r=Q(t),n=await V(process.cwd()),e=process.cwd();if(r.watch&&(a.cli("Starting watch mode"),a.cli("Watching for file changes")),n.length===0){let o={...E,...r};o.clean&&rt(e,o.outDir),await tt(o,e)}else{for(let{options:o,rootDir:s}of n)o.clean&&rt(s,o.outDir);await Promise.all(n.map(async({options:o,rootDir:s})=>{let i={...E,...o,...r};await tt(i,s)}))}r.watch||process.exit(0)}async function tt(t,r){t.watch?await Z(t,r):await R(t,r)}function rt(t,r){let n=_path2.default.join(t,r);if(_fs2.default.existsSync(n))try{_fs2.default.rmSync(n,{recursive:!0,force:!0})}catch(e){a.error(`Failed to clean output directory: ${e}`)}_fs2.default.mkdirSync(n,{recursive:!0})}Bt().catch(t=>{j(t),process.exit(1)});exports.main = Bt;
|
package/build/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
-
import C from"fs";import Dt from"path";import{isMainThread as ht,parentPort as k,Worker as xt,workerData as Et}from"worker_threads";import P from"fs";import y from"path";import lt from"oxc-transform";import{rollup as pt}from"rollup";import ut from"rollup-plugin-dts";import F from"typescript";var d=t=>t instanceof Error?t.message:String(t),j=(t,r)=>{let n=d(t),e=r?`[${r}] `:"";console.error(`\x1B[31m[ERROR]\x1B[0m ${e}${n}`),process.env.NODE_ENV!=="production"&&t instanceof Error&&t.stack&&console.error("\x1B[2m"+t.stack.split(`
|
|
2
|
+
import C from"node:fs";import Dt from"node:path";import{isMainThread as ht,parentPort as k,Worker as xt,workerData as Et}from"node:worker_threads";import P from"node:fs";import y from"node:path";import lt from"oxc-transform";import{rollup as pt}from"rollup";import ut from"rollup-plugin-dts";import F from"typescript";var d=t=>t instanceof Error?t.message:String(t),j=(t,r)=>{let n=d(t),e=r?`[${r}] `:"";console.error(`\x1B[31m[ERROR]\x1B[0m ${e}${n}`),process.env.NODE_ENV!=="production"&&t instanceof Error&&t.stack&&console.error("\x1B[2m"+t.stack.split(`
|
|
3
3
|
`).slice(1).join(`
|
|
4
|
-
`)+"\x1B[0m")};function v(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function N(t=8){return Math.random().toString(36).substring(2,2+t)}function I(t,r){switch(t){case"esm":return".mjs";case"cjs":return $(r)?".cjs":".js";case"iife":return".global.js"}}function A(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 D(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function L(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function _(t,r){return t===void 0?r==="esm":t}function U(t){return t.map(r=>typeof r=="string"?new RegExp(`^${v(r)}($|\\/|\\\\)`):r)}function B(t,r){return U(t.external||[]).concat(L(r).map(n=>new RegExp(`^${v(n)}($|\\/|\\\\)`)))}function S(t){return U(t.noExternal||[])}import w from"fs";import z from"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,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[o,s]of Object.entries(this.colors.progress))if(n.includes(o)){e=s;break}console.log(this.formatMessage(e,n,r))}};function J(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}var E={entry:[],format:["esm"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function H(t,r){return{outdir:`${r}/${t.outDir}`,minify:ct(t),target:t.target,splitting:t.splitting}}function ct(t){let{minify:r,minifyWhitespace:n,minifyIdentifiers:e,minifySyntax:o}=t,s=r===!0;return{whitespace:n??s,identifiers:e??s,syntax:o??s}}async function V(t){let r=[];for(let n of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let e=z.join(t,`bunup.config${n}`);try{if(!w.existsSync(e))continue;let o;if(n===".json"||n===".jsonc"){let s=w.readFileSync(e,"utf8");o=JSON.parse(s)}else{let s=await import(`file://${e}`);o=s.default||s,o||(a.warn(`No default export found in ${e}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...E,...s},rootDir:t});else r.push({options:{...E,...o},rootDir:t});break}catch(o){a.error(`Failed to load config from ${e}: ${d(o)}`)}if(r.length>0)break}return r}function T(t){let r=z.join(t,"package.json");try{if(!w.existsSync(r))return null;let n=w.readFileSync(r,"utf8");return JSON.parse(n)}catch(n){return a.error(`Failed to load package.json at ${r}: ${d(n)}`),null}}function G(t){try{if(!w.existsSync(t))return{};let r=w.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return a.warn(`Failed to parse tsconfig at ${t}: ${d(r)}`),{}}}async function X(t,r,n,e){let{absoluteRootDir:o,absoluteEntry:s}=yt(t,r),i=await ft(s),p=await gt(i);return dt(s,p,n,e,o)}async function ft(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 o=await P.promises.readFile(e,"utf8"),s=mt(o);for(let i of s){let p=y.dirname(e),c=y.resolve(p,i),l=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let u of l)if(P.existsSync(u)&&u.endsWith(".ts")&&!r.has(u)){n.push(u);break}}}catch(o){a.warn(`Error processing ${e}: ${o instanceof Error?o.message:String(o)}`)}}}return r}function mt(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 i=e[2];i.startsWith(".")&&r.add(i)}let o=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(e=o.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(e=s.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}}catch(n){a.warn(`Error extracting imports: ${n instanceof Error?n.message:String(n)}`)}return Array.from(r)}async function gt(t){let r=new Map;return await Promise.all(Array.from(t).map(async n=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),o=await P.promises.readFile(n,"utf8"),{code:s}=lt.isolatedDeclaration(n,o);s&&r.set(e,s)}catch(e){a.warn(`Failed to generate declaration for ${n}: ${e instanceof Error?e.message:String(e)}`)}})),r}async function dt(t,r,n,e,o){let s="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),p=`${s}${i}`,c=typeof e.dts=="object"?e.dts:{},l=c.preferredTsconfigPath?y.resolve(c.preferredTsconfigPath):y.join(o,"tsconfig.json"),g=(await G(l)).compilerOptions,h={name:"bunup:virtual-dts",resolveId(f,m){if(f.startsWith(s))return f;if(m?.startsWith(s)){let x=m.slice(s.length),st=y.dirname(x);if(f.startsWith(".")){let it=y.resolve(st,f);for(let at of["",".d.ts","/index.d.ts"]){let W=`${it}${at}`;if(r.has(W))return`${s}${W}`}}}return null},load(f){if(f.startsWith(s)){let m=f.slice(s.length);return r.get(m)||null}return null}},et=T(o),nt=B(e,et),ot=S(e),O;try{O=await pt({input:p,onwarn(m,x){m.code==="UNRESOLVED_IMPORT"||m.code==="CIRCULAR_DEPENDENCY"||m.code==="EMPTY_BUNDLE"||x(m)},plugins:[h,ut({tsconfig:l,compilerOptions:{...g?F.parseJsonConfigFileContent({compilerOptions:g},F.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:F.ScriptTarget.ESNext}})],external:m=>nt.some(x=>x.test(m))&&!ot.some(x=>x.test(m))});let{output:f}=await O.generate({format:n});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{O&&await O.close()}}function yt(t,r){let n=y.resolve(t),e=y.resolve(n,r);if(!P.existsSync(n))throw new Error(`Root directory does not exist: ${n}`);if(!P.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(y.relative(n,e).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${e}`);return{absoluteRootDir:n,absoluteEntry:e}}async function Y(t,r,n,e,o){return new Promise((s,i)=>{let p={rootDir:t,entries:r,formats:n,options:e,packageType:o},c=new xt(new URL("./dtsWorker.js",import.meta.url),{workerData:p});c.on("message",l=>{if(l.success){if(l.timeMs){let u=D(l.timeMs);a.progress("DTS",`Bundled types in ${u}`)}s()}else i(new Error(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",l=>{l!==0&&i(new Error(`DTS worker stopped with exit code ${l}`))})})}if(!ht&&k){let{rootDir:t,entries:r,formats:n,options:e,packageType:o}=Et,s=performance.now();a.progress("DTS","Bundling types in worker thread");try{let i=n.flatMap(p=>r.map(async c=>{let l=await X(t,c.path,p,e),u=A(p,o),g=`${e.outDir}/${c.name}${u}`,h=`${t}/${g}`;await Bun.write(h,l),a.progress("DTS",g)}));Promise.all(i).then(()=>{let p=performance.now()-s;k?.postMessage({success:!0,timeMs:p})}).catch(p=>{k?.postMessage({success:!1,error:p instanceof Error?p.message:String(p)})})}catch(i){k?.postMessage({success:!1,error:i instanceof Error?i.message:String(i)})}}function wt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function b(t){let r=[],n=new Set;function e(o,s){if(n.has(o)){let i=N();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),n.add(o)}if(Array.isArray(t))for(let o of t){let s=wt(o);e(s,o)}else Object.entries(t).forEach(([o,s])=>{e(o,s)});return r}function q(t,r){return`[dir]/${t}${r}`}function K(t,r){return{name:"bunup:external-plugin",setup(n){n.onResolve({filter:/.*/},e=>{let o=e.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 n=performance.now();a.cli("Build started");let e=T(r),o=e?.type,s=B(t,e),i=S(t),p=[K(s,i)],c=b(t.entry),l=t.format.flatMap(u=>c.map(g=>Pt(t,r,g,u,o,p)));try{await Promise.all(l);let u=performance.now()-n,g=D(u);a.cli(`\u26A1 Build success in ${g}`)}catch{a.error("Build process encountered errors."),process.exit(1)}if(t.dts){a.progress("DTS","Bundling types");let u=t.format.filter(h=>!(h==="iife"&&!$(o)&&t.format.includes("cjs"))),g=t.dts===!0?c:b(t.dts.entry);try{await Y(r,g,u,t,o)}catch(h){a.error(`DTS build process encountered errors: ${d(h)}`)}}}async function Pt(t,r,n,e,o,s){let i=I(e,o),p=H(t,r),c=await Bun.build({...p,entrypoints:[`${r}/${n.path}`],format:e,naming:{entry:q(n.name,i)},splitting:_(t.splitting,e),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(l=>{l.level==="error"?a.error(l.message):l.level==="warning"?a.warn(l.message):l.level==="info"&&a.info(l.message)}),new Error(`Build failed for ${n} (${e})`);a.progress(J(e,t.name),`${t.outDir}/${n.name}${i}`)}var bt={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"},Ot={name:(t,r)=>{r.name=t},format:(t,r)=>{r.format=t.split(",")},outDir:(t,r)=>{r.outDir=t},minify:(t,r)=>{r.minify=!!t},watch:(t,r)=>{r.watch=!!t},dts:(t,r)=>{r.dts=!!t},external:(t,r)=>{r.external=t.split(",")},minifyWhitespace:(t,r)=>{r.minifyWhitespace=!!t},minifyIdentifiers:(t,r)=>{r.minifyIdentifiers=!!t},minifySyntax:(t,r)=>{r.minifySyntax=!!t},target:(t,r)=>{r.target=t},clean:(t,r)=>{r.clean=!!t},splitting:(t,r)=>{r.splitting=!!t},noExternal:(t,r)=>{r.noExternal=t.split(",")}};function Q(t){let r={};for(let n=0;n<t.length;n++){let e=t[n];if(e.startsWith("--")||e.startsWith("-")){let o=e.startsWith("-")&&!e.startsWith("--"),s=o?e.slice(1):e.slice(2),i=o?bt[s]:s,p=Ot[i];if(!p){a.error(`Unknown option: ${s}`);continue}let c=t[n+1],l=c&&!c.startsWith("-")?c:!0;p(l,r),typeof l=="string"&&n++}else r.entry||(r.entry=[]),Array.isArray(r.entry)&&r.entry.push(e)}return 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 M from"path";import $t from"chokidar";async function Z(t,r){let n=new Set;b(t.entry).forEach(c=>{let l=M.resolve(r,c.path),u=M.dirname(l);n.add(u)});let o=$t.watch(Array.from(n),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),s=null,i=!1,p=async c=>{if(!i){i=!0;try{await R({...t,entry:[c],clean:!1},r)}catch(l){a.error(`Build failed: ${l}`)}finally{i=!1}}};o.on("change",c=>{let l=M.relative(r,c);a.cli(`File changed: ${l}`),s&&clearTimeout(s),s=setTimeout(()=>p(l),300)}),o.on("error",c=>{a.error(`Watcher error: ${c}`)})}async function Bt(t=Bun.argv.slice(2)){let r=Q(t),n=await V(process.cwd()),e=process.cwd();if(r.watch&&(a.cli("Starting watch mode"),a.cli("Watching for file changes")),n.length===0){let o={...E,...r};o.clean&&rt(e,o.outDir),await tt(o,e)}else{for(let{options:o,rootDir:s}of n)o.clean&&rt(s,o.outDir);await Promise.all(n.map(async({options:o,rootDir:s})=>{let i={...E,...o,...r};await tt(i,s)}))}r.watch||process.exit(0)}async function tt(t,r){t.watch?await Z(t,r):await R(t,r)}function rt(t,r){let n=Dt.join(t,r);if(C.existsSync(n))try{C.rmSync(n,{recursive:!0,force:!0})}catch(e){a.error(`Failed to clean output directory: ${e}`)}C.mkdirSync(n,{recursive:!0})}Bt().catch(t=>{j(t),process.exit(1)});export{Bt as main};
|
|
4
|
+
`)+"\x1B[0m")};function v(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function N(t=8){return Math.random().toString(36).substring(2,2+t)}function I(t,r){switch(t){case"esm":return".mjs";case"cjs":return $(r)?".cjs":".js";case"iife":return".global.js"}}function A(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 D(t){return t>=1e3?`${(t/1e3).toFixed(2)}s`:`${Math.round(t)}ms`}function L(t){return t?Array.from(new Set([...Object.keys(t.dependencies||{}),...Object.keys(t.peerDependencies||{})])):[]}function _(t,r){return t===void 0?r==="esm":t}function U(t){return t.map(r=>typeof r=="string"?new RegExp(`^${v(r)}($|\\/|\\\\)`):r)}function B(t,r){return U(t.external||[]).concat(L(r).map(n=>new RegExp(`^${v(n)}($|\\/|\\\\)`)))}function S(t){return U(t.noExternal||[])}import w from"node:fs";import z 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,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[o,s]of Object.entries(this.colors.progress))if(n.includes(o)){e=s;break}console.log(this.formatMessage(e,n,r))}};function J(t,r){return`${r?`${r.replace(/-/g,"_")}_`:""}${t}`.toUpperCase()}var E={entry:[],format:["cjs"],outDir:"dist",minify:!1,watch:!1,dts:!1,target:"node",external:[],clean:!0};function H(t,r){return{outdir:`${r}/${t.outDir}`,minify:ct(t),target:t.target,splitting:t.splitting}}function ct(t){let{minify:r,minifyWhitespace:n,minifyIdentifiers:e,minifySyntax:o}=t,s=r===!0;return{whitespace:n??s,identifiers:e??s,syntax:o??s}}async function V(t){let r=[];for(let n of[".ts",".js",".mjs",".cjs",".mts",".cts",".json",".jsonc"]){let e=z.join(t,`bunup.config${n}`);try{if(!w.existsSync(e))continue;let o;if(n===".json"||n===".jsonc"){let s=w.readFileSync(e,"utf8");o=JSON.parse(s)}else{let s=await import(`file://${e}`);o=s.default||s,o||(a.warn(`No default export found in ${e}`),o={})}if(Array.isArray(o))for(let s of o)r.push({options:{...E,...s},rootDir:t});else r.push({options:{...E,...o},rootDir:t});break}catch(o){a.error(`Failed to load config from ${e}: ${d(o)}`)}if(r.length>0)break}return r}function T(t){let r=z.join(t,"package.json");try{if(!w.existsSync(r))return null;let n=w.readFileSync(r,"utf8");return JSON.parse(n)}catch(n){return a.error(`Failed to load package.json at ${r}: ${d(n)}`),null}}function G(t){try{if(!w.existsSync(t))return{};let r=w.readFileSync(t,"utf8");return JSON.parse(r)||{}}catch(r){return a.warn(`Failed to parse tsconfig at ${t}: ${d(r)}`),{}}}async function X(t,r,n,e){let{absoluteRootDir:o,absoluteEntry:s}=yt(t,r),i=await ft(s),p=await gt(i);return dt(s,p,n,e,o)}async function ft(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 o=await P.promises.readFile(e,"utf8"),s=mt(o);for(let i of s){let p=y.dirname(e),c=y.resolve(p,i),l=[c,`${c}.ts`,`${c}.tsx`,`${c}/index.ts`,`${c}/index.tsx`];for(let u of l)if(P.existsSync(u)&&u.endsWith(".ts")&&!r.has(u)){n.push(u);break}}}catch(o){a.warn(`Error processing ${e}: ${o instanceof Error?o.message:String(o)}`)}}}return r}function mt(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 i=e[2];i.startsWith(".")&&r.add(i)}let o=/import\s+(["'`])([^'"]+)\1\s*;?/g;for(;(e=o.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}let s=/import\s*\(\s*(["'`])([^'"]+)\1\s*\)/g;for(;(e=s.exec(t))!==null;){let i=e[2];i.startsWith(".")&&r.add(i)}}catch(n){a.warn(`Error extracting imports: ${n instanceof Error?n.message:String(n)}`)}return Array.from(r)}async function gt(t){let r=new Map;return await Promise.all(Array.from(t).map(async n=>{try{let e=n.replace(/\.tsx?$/,".d.ts"),o=await P.promises.readFile(n,"utf8"),{code:s}=lt.isolatedDeclaration(n,o);s&&r.set(e,s)}catch(e){a.warn(`Failed to generate declaration for ${n}: ${e instanceof Error?e.message:String(e)}`)}})),r}async function dt(t,r,n,e,o){let s="\0virtual:",i=t.replace(/\.tsx?$/,".d.ts"),p=`${s}${i}`,c=typeof e.dts=="object"?e.dts:{},l=c.preferredTsconfigPath?y.resolve(c.preferredTsconfigPath):y.join(o,"tsconfig.json"),g=(await G(l)).compilerOptions,h={name:"bunup:virtual-dts",resolveId(f,m){if(f.startsWith(s))return f;if(m?.startsWith(s)){let x=m.slice(s.length),st=y.dirname(x);if(f.startsWith(".")){let it=y.resolve(st,f);for(let at of["",".d.ts","/index.d.ts"]){let W=`${it}${at}`;if(r.has(W))return`${s}${W}`}}}return null},load(f){if(f.startsWith(s)){let m=f.slice(s.length);return r.get(m)||null}return null}},et=T(o),nt=B(e,et),ot=S(e),O;try{O=await pt({input:p,onwarn(m,x){m.code==="UNRESOLVED_IMPORT"||m.code==="CIRCULAR_DEPENDENCY"||m.code==="EMPTY_BUNDLE"||x(m)},plugins:[h,ut({tsconfig:l,compilerOptions:{...g?F.parseJsonConfigFileContent({compilerOptions:g},F.sys,"./").options:{},declaration:!0,noEmit:!1,emitDeclarationOnly:!0,noEmitOnError:!0,checkJs:!1,declarationMap:!1,skipLibCheck:!0,preserveSymlinks:!1,target:F.ScriptTarget.ESNext}})],external:m=>nt.some(x=>x.test(m))&&!ot.some(x=>x.test(m))});let{output:f}=await O.generate({format:n});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{O&&await O.close()}}function yt(t,r){let n=y.resolve(t),e=y.resolve(n,r);if(!P.existsSync(n))throw new Error(`Root directory does not exist: ${n}`);if(!P.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(y.relative(n,e).startsWith(".."))throw new Error(`Entry file must be within rootDir: ${e}`);return{absoluteRootDir:n,absoluteEntry:e}}async function Y(t,r,n,e,o){return new Promise((s,i)=>{let p={rootDir:t,entries:r,formats:n,options:e,packageType:o},c=new xt(new URL("./dtsWorker.js",import.meta.url),{workerData:p});c.on("message",l=>{if(l.success){if(l.timeMs){let u=D(l.timeMs);a.progress("DTS",`Bundled types in ${u}`)}s()}else i(new Error(l.error||"Unknown DTS worker error"))}),c.on("error",i),c.on("exit",l=>{l!==0&&i(new Error(`DTS worker stopped with exit code ${l}`))})})}if(!ht&&k){let{rootDir:t,entries:r,formats:n,options:e,packageType:o}=Et,s=performance.now();a.progress("DTS","Bundling types");try{let i=n.flatMap(p=>r.map(async c=>{let l=await X(t,c.path,p,e),u=A(p,o),g=`${e.outDir}/${c.name}${u}`,h=`${t}/${g}`;await Bun.write(h,l),a.progress("DTS",g)}));Promise.all(i).then(()=>{let p=performance.now()-s;k?.postMessage({success:!0,timeMs:p})}).catch(p=>{k?.postMessage({success:!1,error:p instanceof Error?p.message:String(p)})})}catch(i){k?.postMessage({success:!1,error:i instanceof Error?i.message:String(i)})}}function wt(t){return t.split("/").pop()?.split(".").slice(0,-1).join(".")||""}function b(t){let r=[],n=new Set;function e(o,s){if(n.has(o)){let i=N();r.push({name:`${o}_${i}`,path:s})}else r.push({name:o,path:s}),n.add(o)}if(Array.isArray(t))for(let o of t){let s=wt(o);e(s,o)}else Object.entries(t).forEach(([o,s])=>{e(o,s)});return r}function q(t,r){return`[dir]/${t}${r}`}function K(t,r){return{name:"bunup:external-plugin",setup(n){n.onResolve({filter:/.*/},e=>{let o=e.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 n=performance.now();a.cli("Build started");let e=T(r),o=e?.type,s=B(t,e),i=S(t),p=[K(s,i)],c=b(t.entry),l=t.format.flatMap(u=>c.map(g=>Pt(t,r,g,u,o,p)));try{await Promise.all(l);let u=performance.now()-n,g=D(u);a.cli(`\u26A1 Build success in ${g}`)}catch{a.error("Build process encountered errors."),process.exit(1)}if(t.dts){a.progress("DTS","Bundling types");let u=t.format.filter(h=>!(h==="iife"&&!$(o)&&t.format.includes("cjs"))),g=t.dts===!0?c:b(t.dts.entry);try{await Y(r,g,u,t,o)}catch(h){a.error(`DTS build process encountered errors: ${d(h)}`)}}}async function Pt(t,r,n,e,o,s){let i=I(e,o),p=H(t,r),c=await Bun.build({...p,entrypoints:[`${r}/${n.path}`],format:e,naming:{entry:q(n.name,i)},splitting:_(t.splitting,e),plugins:s,throw:!1});if(!c.success)throw c.logs.forEach(l=>{l.level==="error"?a.error(l.message):l.level==="warning"?a.warn(l.message):l.level==="info"&&a.info(l.message)}),new Error(`Build failed for ${n} (${e})`);a.progress(J(e,t.name),`${t.outDir}/${n.name}${i}`)}var bt={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"},Ot={name:(t,r)=>{r.name=t},format:(t,r)=>{r.format=t.split(",")},outDir:(t,r)=>{r.outDir=t},minify:(t,r)=>{r.minify=!!t},watch:(t,r)=>{r.watch=!!t},dts:(t,r)=>{r.dts=!!t},external:(t,r)=>{r.external=t.split(",")},minifyWhitespace:(t,r)=>{r.minifyWhitespace=!!t},minifyIdentifiers:(t,r)=>{r.minifyIdentifiers=!!t},minifySyntax:(t,r)=>{r.minifySyntax=!!t},target:(t,r)=>{r.target=t},clean:(t,r)=>{r.clean=!!t},splitting:(t,r)=>{r.splitting=!!t},noExternal:(t,r)=>{r.noExternal=t.split(",")}};function Q(t){let r={};for(let n=0;n<t.length;n++){let e=t[n];if(e.startsWith("--")||e.startsWith("-")){let o=e.startsWith("-")&&!e.startsWith("--"),s=o?e.slice(1):e.slice(2),i=o?bt[s]:s,p=Ot[i];if(!p){a.error(`Unknown option: ${s}`);continue}let c=t[n+1],l=c&&!c.startsWith("-")?c:!0;p(l,r),typeof l=="string"&&n++}else r.entry||(r.entry=[]),Array.isArray(r.entry)&&r.entry.push(e)}return 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 M from"node:path";import $t from"chokidar";async function Z(t,r){let n=new Set;b(t.entry).forEach(c=>{let l=M.resolve(r,c.path),u=M.dirname(l);n.add(u)});let o=$t.watch(Array.from(n),{persistent:!0,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},atomic:!0,ignorePermissionErrors:!0,ignored:[/[\\/]\.git[\\/]/,/[\\/]node_modules[\\/]/,t.outDir]}),s=null,i=!1,p=async c=>{if(!i){i=!0;try{await R({...t,entry:[c],clean:!1},r)}catch(l){a.error(`Build failed: ${l}`)}finally{i=!1}}};o.on("change",c=>{let l=M.relative(r,c);a.cli(`File changed: ${l}`),s&&clearTimeout(s),s=setTimeout(()=>p(l),300)}),o.on("error",c=>{a.error(`Watcher error: ${c}`)})}async function Bt(t=Bun.argv.slice(2)){let r=Q(t),n=await V(process.cwd()),e=process.cwd();if(r.watch&&(a.cli("Starting watch mode"),a.cli("Watching for file changes")),n.length===0){let o={...E,...r};o.clean&&rt(e,o.outDir),await tt(o,e)}else{for(let{options:o,rootDir:s}of n)o.clean&&rt(s,o.outDir);await Promise.all(n.map(async({options:o,rootDir:s})=>{let i={...E,...o,...r};await tt(i,s)}))}r.watch||process.exit(0)}async function tt(t,r){t.watch?await Z(t,r):await R(t,r)}function rt(t,r){let n=Dt.join(t,r);if(C.existsSync(n))try{C.rmSync(n,{recursive:!0,force:!0})}catch(e){a.error(`Failed to clean output directory: ${e}`)}C.mkdirSync(n,{recursive:!0})}Bt().catch(t=>{j(t),process.exit(1)});export{Bt as main};
|
package/build/dtsWorker.js
CHANGED
|
@@ -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
|
|
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;
|
package/build/index.d.mts
CHANGED
package/build/index.d.ts
CHANGED