UNPKG

tochibuild

Version:

An extremely fast JavaScript/Typescript and CSS bundler with minimal configuration.

17 lines (13 loc) 10.2 kB
import{defineConfig as J,build as re}from"tsup";import L from"chalk";import b from"node:fs";import G from"node:path";import W from"deepmerge";import y from"chalk";import X from"node:path";var k="tochibuild",V=y.cyan(k),P=[V,y.blue("CLI")],O=class{static initialize(e,n){["log","debug","info","warn","error"].forEach(i=>{let d=console[i];console[i]=function(...r){let o=r?.[0]||"",s=r?.[1]||"",u=!!o&&typeof o=="string",a=!!s&&typeof s=="string";if(o&&u&&!o.includes("tochibuild")){let p=[];switch(i){case"error":p.push(y.red(k),y.red("CLI"));break;default:p.push(V);break}if(p.concat(r||[]),a&&s.toLowerCase().includes("using tsup config")){let l=r[1].split(": ")[1],f=X.relative(e,l);r[1]=`Using config: ${y.gray(f)}`}a&&s.toLowerCase().includes("tsup v")&&(r[1]=`tochibuild v${n}`),d.apply(console,[...p,...r]);return}d.apply(console,r)}})}};O.custom=(e,...n)=>{console[e](...P,...n)},O.log=(...e)=>{console.log(...P,...e)},O.debug=(...e)=>{console.debug(...P,...e)},O.info=(...e)=>{console.info(...P,...e)},O.warn=(...e)=>{console.warn(...P,...[...e].map(n=>y.yellow(n)))},O.error=(e,...n)=>{console.error(y.red(k),y.blue("CLI"),y.bgRed(...n),e?.stack?` ${y.gray(e.stack)}`:"")},O.success=(...e)=>{console.log(y.green(k),y.blue("CLI"),...e)};var g=O;import N from"node:path";function B(t){let e=N.resolve(process.cwd(),t||".");return t&&N.isAbsolute(t||".")?t:e}import I from"node:fs/promises";import v from"node:path";import{create as Z}from"tar";import _ from"@npmcli/arborist";import U from"npm-packlist";import h from"node:fs";import D from"node:path";var Y=(t,e)=>S(D.join(C(t,e),".tochibuild")),j=(t,e)=>{let n=Y(t,e);if(!n)return n;let i=D.join(n,"tmp");return h.existsSync(i)||h.mkdirSync(i,{recursive:!0}),i},ye=(t,e,n)=>{if(!t)return t;let i=j(e,n);return i&&D.join(i,t)};var Oe=(t,e)=>$(j(t,e));function C(t,e){let n=D.resolve(e||process.cwd(),t||".");return t&&D.isAbsolute(t||".")?t:n}function S(t){return t&&(h.existsSync(t)||h.mkdirSync(t,{recursive:!0}),t)}function he(t,e,n){if(!t)return t;let i=n?.overwrite??!0;return(!h.existsSync(t)||i)&&h.writeFileSync(t,e),t}function $(t){return t&&(h.existsSync(t)&&h.rmSync(t,{recursive:!0,force:!0}),t)}async function ee({packageDir:t,packageJsonData:e,outputTarballPath:n="tochibuild.package.tgz"}){let i=C(t),d=C(n).replace(/\\/g,"/"),o=await new _({path:i}).loadActual(),s=await U(o),u=j(t);if(!u)throw new Error("Could not get tmp dir");let a=S(v.join(u,`publish-${Date.now()}-`));if(!a)throw new Error("Could not create tmp dir");if(await Promise.all(s.filter(l=>e?l!=="package.json":!0).map(async l=>{let f=v.join(i,l),m=v.join(a,l);await I.mkdir(v.dirname(m),{recursive:!0}),await I.copyFile(f,m)})),e){let l=v.join(a,"package.json");await I.writeFile(l,JSON.stringify(e,null,2))}let p=v.relative(process.cwd(),d).replace(/\\/g,"/");return await Z({cwd:a,file:p,gzip:!0,prefix:"package/"},["."]),$(a),{name:e?.name||"unknown",tarballRelativePath:p,tarballPath:d,fileList:s}}var M=ee;import E from"node:fs";import x from"node:path";import A from"chalk";import ne from"fast-glob";async function z(t,e,n){let i=process.cwd();g.info("merging files..."),g.info("outFile:",A.gray(x.relative(i,e)));let d=C(e),r=x.relative(i,d).replace(/\\/g,"/"),o=await ne(t,{absolute:!0});if(!o.length)throw new Error(`no files found matching: ${t.join(", ")}`);let s=o.filter(l=>!E.existsSync(l));if(s.length)throw new Error(`files not found: ${s.join(", ")}`);n?.(o),g.info(`files to be merged: ${o.map(l=>x.relative(i,l)).map(l=>`- ${A.gray(l)}`).join(` `)}`),o.reduce((l,f)=>l&&x.extname(f)===x.extname(o[0]),!0)||g.warn("file extensions do not match!");let a=o.map(l=>{let f=E.readFileSync(l,"utf8");return`// ---- ${x.basename(l)} ---- ${f}`}).join(` `),p=x.dirname(d);E.existsSync(p)||E.mkdirSync(x.dirname(d),{recursive:!0}),E.writeFileSync(d,a,"utf8"),g.success(`successfully merged ${o.length} file(s) into ${A.gray(r)}`)}var te=(t,e)=>{let n=[];return n.push((e?.prefix??"")+t+(e?.suffix??"")),n.push((e?.prefix??"")+`**/${t}`+(e?.suffix??"")),n},c=class c{};c.defaultConfigOptions={tsconfig:"tsconfig.json",dts:!0,format:["esm"],minify:!0},c.ignoredEntries=[...["*.d.ts","{tochibuild,tsup}.*","build","build/**","dist","dist/**","node_modules","node_modules/**"].flatMap(e=>te(e,{prefix:"!"}))].sort().reverse(),c.entriesCommon=["*.{js,ts}","**/*.{js,ts}"],c.entriesIndex=["index.{js,ts}","**/index.{js,ts}"],c.defaultEntriesIndex=[...c.ignoredEntries,...c.entriesIndex],c.defaultEntriesCommon=[...c.ignoredEntries,...c.entriesCommon],c.handleOptions=(e,n,i,d)=>c.mergeBuildOptions(e,{overrideOptions:r=>{let o=F(r.entry,n?.excludeIgnoredEntries?[]:["ignoredEntries"]);return{...n?.defaultBuildOptions||c.defaultConfigOptions,...e,...r,noExternal:[...r.noExternal||[],...c.getPackageJsonDepsEntriesFromConfig(n)].filter(u=>!r?.external?.includes(u)),entry:o,tochibuildConfig:n}}},i,d),c.handleOptionsWithIndexEntries=(e,n,i,d)=>c.mergeBuildOptions(e,{overrideOptions:r=>{let o=n?.excludeIgnoredEntries?["entriesIndex"]:["ignoredEntries","entriesIndex"],s=F(r.entry,o);return{...n?.defaultBuildOptions||c.defaultConfigOptions,...e,...r,noExternal:[...r.noExternal||[],...c.getPackageJsonDepsEntriesFromConfig(n)].filter(a=>!r?.external?.includes(a)),entry:s,tochibuildConfig:n}}},i,d),c.handleOptionsWithCommonEntries=(e,n,i,d)=>c.mergeBuildOptions(e,{overrideOptions:r=>{let o=n?.excludeIgnoredEntries?["entriesCommon"]:["ignoredEntries","entriesCommon"],s=F(r.entry,o);return{...n?.defaultBuildOptions||c.defaultConfigOptions,...e,...r,noExternal:[...r.noExternal||[],...c.getPackageJsonDepsEntriesFromConfig(n)].filter(a=>!r?.external?.includes(a)),entry:s,tochibuildConfig:n}}},i,d),c.generateConfig=ie,c.ensureEntries=F,c.createTarball=M,c.mergeFiles=z,c.mergeBuildOptions=(e,n,i,d)=>{if(typeof e=="function")return async a=>{let p=await e(a);return s(p,n.overrideOptionsCustom)};return s(e,n.overrideOptionsCustom);function o(u,a){let p=n.overrideOptions(a||{}),l=Object.entries(p);for(let[f,m]of l)m===void 0&&delete p[f];return W(u,p)}function s(u,a){if(Array.isArray(u))return u.map(p=>o(p,a));if(typeof u!="object"){if(i)throw new Error(`Invalid configuration options type: ${typeof u}`);return g.error(void 0,`Invalid configuration options type: ${typeof u}`),d&&process.exit(1),{}}return o(u,a)}},c.mergeBuildOptionsAsync=async(e,n,i,d)=>{if(typeof e=="function")return n.execute?await e(n.overrideOptions):async u=>{let a=await e(u);return r(a,n.overrideOptionsCustom)};if(n.execute)return r(e,n.overrideOptions);return r(e,n.overrideOptionsCustom);function r(s,u){if(Array.isArray(s))return s.map(a=>o(a,u));if(typeof s!="object"){if(i)throw new Error(`Invalid configuration options type: ${typeof s}`);return g.error(void 0,`Invalid configuration options type: ${typeof s}`),d&&process.exit(1),{}}return o(s,u)}function o(s,u){if(n.execute){let l=u||{},f=Object.entries(l);for(let[m,w]of f)w===void 0&&delete l[m];return W(s,l)}let a=n.overrideOptions(u||{}),p=Object.entries(a);for(let[l,f]of p)f===void 0&&delete a[l];return W(s,a)}},c.getPackageJson=(e,n)=>{let i,d;try{return i=G.join(B(e),"package.json"),b.existsSync(i)&&(d=JSON.parse(b.readFileSync(i,"utf-8"))),{filePath:i,data:d}}catch(r){if(n)throw r;return{filePath:i,data:d}}},c.getPackageJsonDepsEntriesFromConfig=(e,n)=>{let i=e?.includePackageJsonDeps??!1,d=e?.includePackageJsonDevDeps??!1,r=e?.includePackageJsonPeerDeps??!1,o=[];return i&&o.push("dependencies"),d&&o.push("devDependencies"),r&&o.push("peerDependencies"),c.getPackageJsonDepsEntries(n??c.getPackageJson().filePath,o)},c.getPackageJsonDepsEntries=(e,n=["dependencies","devDependencies","peerDependencies"])=>c.getPackageJsonDeps(e).toArray(n),c.getPackageJsonDeps=e=>{let n={},i={},d={},r={dependencies:n,devDependencies:i,peerDependencies:d,toArray:(o=["dependencies","devDependencies","peerDependencies"])=>[]};try{if(!e)return r;if(!b.existsSync(e))return g.error(void 0,`could not find package.json at ${e}`),r;let o=b.readFileSync(e,"utf-8"),s=JSON.parse(o),u={dependencies:s.dependencies||{},devDependencies:s.devDependencies||{},peerDependencies:s.peerDependencies||{}};return{...u,toArray:(a=["dependencies","devDependencies","peerDependencies"])=>a.flatMap(p=>Object.keys(u[p]))}}catch(o){g.error(o,`could not read package.json at ${e}`);let s={dependencies:n||{},devDependencies:i||{},peerDependencies:d||{}};return{...s,toArray:(u=["dependencies","devDependencies","peerDependencies"])=>u.flatMap(a=>Object.keys(s[a]))}}};var R=c,T=R;function F(t,e){if(Array.isArray(t)){let n=[],i=[];return e.forEach(d=>i.push(...R[d])),n.push(...Array.from(new Set([...i,...t]))),n}return t}function ie(t,e,n,i){let d="";try{let r=e?.ext||".ts",s=`${e?.filename||"tochibuild.config"}${r}`;(e?.outDir?.length?e.outDir:["."]).forEach(a=>{d=B(a),b.existsSync(a)||b.mkdirSync(a,{recursive:!0});let p=G.join(d,s),l=b.existsSync(p);if(!e?.overwrite&&l){g.warn(`the config '${s}' file already exists for this project.`),i&&process.exit(1);return}let f=" ",m="",w={clean:!1,splitting:!0},q=K=>{m+=K==="esm"?`import build from '${t}'; `:`const build = require('${t}'); `,m+=K==="esm"?`export default build.defineConfigWithIndexEntries({ `:`cliModule.exports = build.defineConfigWithIndexEntries({ `,Object.entries(w).forEach(([H,Q])=>{m+=`${f}${H}: ${JSON.stringify(Q)}, `}),m+=`}); `};switch(r){case".ts":case".js":q("esm");break;case".cjs":q("cjs");break;case".json":m+=`${JSON.stringify({...w,entry:R.defaultEntriesIndex},null,2)} `;break;default:g.error(void 0,`unsupported extension: ${r}`),i&&process.exit(1);return}b.writeFileSync(p,m),g.success(L.cyan("the config file has been created at:"),L.gray(p))})}catch(r){if(n)throw r;g.error(r,r.message?`failed to generate config file in ${d}: ${r.message}`:`failed to generate config file in ${d}`),i&&process.exit(1)}}var Le=T,se=re,Ge={utils:T,build:se,defineConfig:oe,defineConfigWithIndexEntries:ae,defineConfigWithCommonEntries:ce};async function oe(t,e){return J(T.handleOptions(t,e,!1,!0))}async function ae(t,e){return J(T.handleOptionsWithIndexEntries(t,e,!1,!0))}async function ce(t,e){return J(T.handleOptionsWithCommonEntries(t,e,!1,!0))}export{g as a,ye as b,Oe as c,he as d,M as e,z as f,T as g,Le as h,se as i,Ge as j,oe as k,ae as l,ce as m};