@turboforge/cli-kit 1.0.0 → 1.0.1

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/dist/index.d.mts CHANGED
@@ -237,6 +237,7 @@ declare const safeRename: (from: string, to: string) => Promise<void>;
237
237
  * @param concurrency - Maximum concurrent tasks (must be ≥1).
238
238
  */
239
239
  declare const createLimiter: (concurrency: number) => <T>(task: () => Promise<T>) => Promise<T>;
240
+ declare const isCLI: () => boolean;
240
241
 
241
242
  /**
242
243
  * Detects workspace packages in a monorepo.
@@ -248,4 +249,4 @@ declare const getWorkspacePackages: (root: string) => Promise<string[]>;
248
249
  */
249
250
  declare const isMonorepo: (cwd?: string) => Promise<boolean>;
250
251
 
251
- export { type LogLevel, type Logger, type LoggerConfig, type ParsingOptions, type ResolveConfigOptions, atomicWrite, createLimiter, createLogger, deepMerge, defineConfig, execAsync, execFileAsync, existsAsync, findProjectRoot, findUp, getWorkspacePackages, isMonorepo, parseYaml, readJson, resolveConfig, safeRename, tryImport };
252
+ export { type LogLevel, type Logger, type LoggerConfig, type ParsingOptions, type ResolveConfigOptions, atomicWrite, createLimiter, createLogger, deepMerge, defineConfig, execAsync, execFileAsync, existsAsync, findProjectRoot, findUp, getWorkspacePackages, isCLI, isMonorepo, parseYaml, readJson, resolveConfig, safeRename, tryImport };
package/dist/index.d.ts CHANGED
@@ -237,6 +237,7 @@ declare const safeRename: (from: string, to: string) => Promise<void>;
237
237
  * @param concurrency - Maximum concurrent tasks (must be ≥1).
238
238
  */
239
239
  declare const createLimiter: (concurrency: number) => <T>(task: () => Promise<T>) => Promise<T>;
240
+ declare const isCLI: () => boolean;
240
241
 
241
242
  /**
242
243
  * Detects workspace packages in a monorepo.
@@ -248,4 +249,4 @@ declare const getWorkspacePackages: (root: string) => Promise<string[]>;
248
249
  */
249
250
  declare const isMonorepo: (cwd?: string) => Promise<boolean>;
250
251
 
251
- export { type LogLevel, type Logger, type LoggerConfig, type ParsingOptions, type ResolveConfigOptions, atomicWrite, createLimiter, createLogger, deepMerge, defineConfig, execAsync, execFileAsync, existsAsync, findProjectRoot, findUp, getWorkspacePackages, isMonorepo, parseYaml, readJson, resolveConfig, safeRename, tryImport };
252
+ export { type LogLevel, type Logger, type LoggerConfig, type ParsingOptions, type ResolveConfigOptions, atomicWrite, createLimiter, createLogger, deepMerge, defineConfig, execAsync, execFileAsync, existsAsync, findProjectRoot, findUp, getWorkspacePackages, isCLI, isMonorepo, parseYaml, readJson, resolveConfig, safeRename, tryImport };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var X=Object.create;var v=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var rr=(r,t)=>{for(var e in t)v(r,e,{get:t[e],enumerable:!0})},_=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of K(t))!Z.call(r,n)&&n!==e&&v(r,n,{get:()=>t[n],enumerable:!(o=H(t,n))||o.enumerable});return r};var T=(r,t,e)=>(e=r!=null?X(Q(r)):{},_(t||!r||!r.__esModule?v(e,"default",{value:r,enumerable:!0}):e,r)),tr=r=>_(v({},"__esModule",{value:!0}),r);var lr={};rr(lr,{atomicWrite:()=>nr,createLimiter:()=>J,createLogger:()=>ar,deepMerge:()=>R,defineConfig:()=>ir,execAsync:()=>er,execFileAsync:()=>or,existsAsync:()=>m,findProjectRoot:()=>M,findUp:()=>D,getWorkspacePackages:()=>cr,isMonorepo:()=>pr,parseYaml:()=>O,readJson:()=>h,resolveConfig:()=>sr,safeRename:()=>Y,tryImport:()=>I});module.exports=tr(lr);var G=require("fs/promises"),b=T(require("path"));var P=T(require("path"));var L=require("child_process"),U=require("crypto"),f=require("fs/promises"),u=require("path"),N=require("util");async function O(r){try{let n=await import("yaml").then(i=>i.default||i).catch(()=>null);if(n&&typeof n.parse=="function")return n.parse(r)}catch{}let t={},o=r.replace(/#.*$/gm,"").match(/packages:\s*\n((?:\s*-\s*.*\n?)*)/);if(o?.[1]){let n=[],i=/^\s*-\s*["']?([^"'\s]+)["']?/gm,a;for(;(a=i.exec(o[1]))!==null;)n.push(a[1]);t.packages=n}return t}var er=(0,N.promisify)(L.exec),or=(0,N.promisify)(L.execFile),m=async r=>{try{return await(0,f.access)(r),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}},y=new Map,W=200,D=async(r,t)=>{let e=(0,u.resolve)(r),o=`${e}:${[...t].sort().join(",")}`;if(y.has(o))return y.get(o);let n=e,{root:i}=(0,u.parse)(n);for(;;){for(let a of t)if(await m((0,u.join)(n,a)))return y.set(o,n),y.size>W&&y.clear(),n;if(n===i)break;n=(0,u.dirname)(n)}return y.set(o,null),y.size>W&&y.clear(),null},h=async(r,t={})=>{try{let e=await(0,f.readFile)(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return null;if(t.strict)throw e;return null}},I=async(r,t={})=>{if(!await m(r))return null;try{let e=await import("jiti"),n=(e.createJiti?e.createJiti(process.cwd()):e.default(process.cwd()))(r);return n.default??n}catch{try{let e=await import(r);return e.default??e}catch(e){if(t.strict)throw/\.(ts|mts)$/.test(r)?new Error(`Failed to load TypeScript config at ${r}. Install 'jiti' to load TS configs. Original error: ${e}`):e;return null}}},R=(r,t)=>{if(typeof r!="object"||r===null||typeof t!="object"||t===null||Array.isArray(r)&&Array.isArray(t))return t;let e={...r};for(let o of Object.keys(t))o==="__proto__"||o==="constructor"||o==="prototype"||Object.hasOwn(t,o)&&(e[o]=o in r?R(r[o],t[o]):t[o]);return e},nr=async(r,t)=>{let e=(0,u.join)((0,u.dirname)(r),`${(0,U.randomUUID)()}.tmp`);try{await(0,f.writeFile)(e,t,"utf-8"),await Y(e,r)}catch(o){throw await(0,f.rm)(e,{force:!0}).catch(()=>{}),o}},Y=async(r,t)=>{if(await m(r))try{await(0,f.rename)(r,t)}catch(e){let o=e;if(o.code==="EEXIST"||o.code==="EPERM"){await(0,f.rm)(t,{recursive:!0,force:!0}),await(0,f.rename)(r,t);return}throw e}},J=r=>{if(r<1)throw new Error("createLimiter: concurrency must be >= 1");let t=0,e=[],o=()=>{t--,e.shift()?.()};return async n=>{t>=r&&await new Promise(i=>e.push(i)),t++;try{return await n()}finally{o()}}};var $=new Map,M=async(r=process.cwd())=>{let t=P.default.resolve(r);if($.has(t))return $.get(t);let e=await D(t,[".git",".changeset","pnpm-workspace.yaml"]);if(e)return $.set(t,e),e;let o=P.default.resolve(r),{root:n}=P.default.parse(o);for(;;){let i=P.default.join(o,"package.json"),a=await h(i);if(a?.workspaces&&Array.isArray(a.workspaces))return $.set(t,o),o;if(o===n)break;o=P.default.dirname(o)}return $.set(t,t),t};var sr=async({name:r,cwd:t=process.cwd(),defaults:e={},envVars:o={},cliArgs:n={},configFile:i,strict:a=!1})=>{let E=await M(t),l=[];if(i)l.push(b.default.resolve(t,i));else{let s=b.default.resolve(t),g=new RegExp(`^${r}\\.config\\.(ts|mts|js|mjs|json)$`);for(;;){try{let j=(await(0,G.readdir)(s)).find(F=>g.test(F));j&&l.push(b.default.join(s,j))}catch{}if(s===E)break;let x=b.default.dirname(s);if(x===s)break;s=x}}let c=[];for(let s of l.reverse())if(s.endsWith(".json")){let g=await h(s,{strict:a});g&&c.push(g)}else{let g=await I(s,{strict:a});g&&c.push(g)}let d=R;try{let s=await import("defu");s?.defu&&(d=(g,x)=>s.defu(x,g))}catch{}let p=e;for(let s of c)p=d(p,s);return p=d(p,o),p=d(p,n),p},ir=r=>r;var B=require("fs"),V=T(require("os")),k="\x1B[",A={gray:r=>`${k}90m${r}${k}39m`,blue:r=>`${k}34m${r}${k}39m`,yellow:r=>`${k}33m${r}${k}39m`,red:r=>`${k}31m${r}${k}39m`},q={debug:20,info:30,warn:40,error:50},z={debug:A.gray,info:A.blue,warn:A.yellow,error:A.red},ar=r=>{let t=q[r.level],e=r.logFormat??"text",o=r.name,n=o?{debug:`${o}:DEBUG`,info:`${o}:INFO`,warn:`${o}:WARN`,error:`${r.name}:ERROR`}:{debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR"},i=null,a=!1,E=process.stdout.isTTY&&!process.env.NO_COLOR||!!process.env.FORCE_COLOR;if(r.logFile)try{i=(0,B.createWriteStream)(r.logFile,{flags:"a"}),i.on("error",()=>{i=null})}catch{i=null}let l=()=>{if(!a&&(a=!0,i)){try{i.end()}catch{}i=null}};process.once("exit",l),process.once("SIGINT",()=>{l(),process.exit(0)}),process.once("SIGTERM",()=>{l(),process.exit(0)});let c=process.pid,d=V.default.hostname(),p=(s,...g)=>{if(q[s]<t)return;let x=new Date().toISOString(),C=g.map(String).join(" "),j=e==="json"?JSON.stringify({ts:x,level:s,message:C,pid:c,hostname:d,name:o}):`[${x}] [${n[s]}] ${C}`,F=E&&z[s]?z[s](j):j;if((s==="warn"||s==="error"?process.stderr:process.stdout).write(`${F}
2
- `),i)try{i.write(`${j}
3
- `)}catch{i=null}};return{debug:(...s)=>p("debug",...s),info:(...s)=>p("info",...s),warn:(...s)=>p("warn",...s),error:(...s)=>p("error",...s),close:l}};var S=require("fs/promises"),w=T(require("path"));var cr=async r=>{let t=[],e=w.default.join(r,"package.json"),o=await h(e);o?.workspaces&&(Array.isArray(o.workspaces)?t.push(...o.workspaces):Array.isArray(o.workspaces.packages)&&t.push(...o.workspaces.packages));let n=w.default.join(r,"pnpm-workspace.yaml");if(await m(n))try{let l=await(0,S.readFile)(n,"utf-8"),c=await O(l);c?.packages&&t.push(...c.packages)}catch{}let i=J(10),a=[],E=[...new Set(t)];return await Promise.all(E.map(l=>i(async()=>{if(l.endsWith("/*")){let c=w.default.join(r,l.slice(0,-2));if(await m(c))try{let d=await(0,S.readdir)(c,{withFileTypes:!0});for(let p of d)p.isDirectory()&&await m(w.default.join(c,p.name,"package.json"))&&a.push(w.default.join(c,p.name))}catch{}}else{let c=w.default.join(r,l);await m(w.default.join(c,"package.json"))&&a.push(c)}}))),[...new Set(a)]},pr=async(r=process.cwd())=>{let t=w.default.join(r,"package.json");return!!((await h(t))?.workspaces||await m(w.default.join(r,"pnpm-workspace.yaml")))};0&&(module.exports={atomicWrite,createLimiter,createLogger,deepMerge,defineConfig,execAsync,execFileAsync,existsAsync,findProjectRoot,findUp,getWorkspacePackages,isMonorepo,parseYaml,readJson,resolveConfig,safeRename,tryImport});
1
+ "use strict";var K=Object.create;var v=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var rr=Object.getPrototypeOf,tr=Object.prototype.hasOwnProperty;var er=(r,t)=>{for(var e in t)v(r,e,{get:t[e],enumerable:!0})},_=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Z(t))!tr.call(r,n)&&n!==e&&v(r,n,{get:()=>t[n],enumerable:!(o=Q(t,n))||o.enumerable});return r};var T=(r,t,e)=>(e=r!=null?K(rr(r)):{},_(t||!r||!r.__esModule?v(e,"default",{value:r,enumerable:!0}):e,r)),or=r=>_(v({},"__esModule",{value:!0}),r);var ur={};er(ur,{atomicWrite:()=>ir,createLimiter:()=>J,createLogger:()=>fr,deepMerge:()=>R,defineConfig:()=>lr,execAsync:()=>nr,execFileAsync:()=>sr,existsAsync:()=>u,findProjectRoot:()=>M,findUp:()=>I,getWorkspacePackages:()=>gr,isCLI:()=>ar,isMonorepo:()=>mr,parseYaml:()=>L,readJson:()=>h,resolveConfig:()=>pr,safeRename:()=>q,tryImport:()=>D});module.exports=or(ur);var z=require("fs/promises"),b=T(require("path"));var j=T(require("path"));var O=require("child_process"),W=require("crypto"),Y=require("fs"),f=require("fs/promises"),m=require("path"),G=require("url"),N=require("util");async function L(r){try{let n=await import("yaml").then(i=>i.default||i).catch(()=>null);if(n&&typeof n.parse=="function")return n.parse(r)}catch{}let t={},o=r.replace(/#.*$/gm,"").match(/packages:\s*\n((?:\s*-\s*.*\n?)*)/);if(o?.[1]){let n=[],i=/^\s*-\s*["']?([^"'\s]+)["']?/gm,a;for(;(a=i.exec(o[1]))!==null;)n.push(a[1]);t.packages=n}return t}var cr={},nr=(0,N.promisify)(O.exec),sr=(0,N.promisify)(O.execFile),u=async r=>{try{return await(0,f.access)(r),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}},y=new Map,U=200,I=async(r,t)=>{let e=(0,m.resolve)(r),o=`${e}:${[...t].sort().join(",")}`;if(y.has(o))return y.get(o);let n=e,{root:i}=(0,m.parse)(n);for(;;){for(let a of t)if(await u((0,m.join)(n,a)))return y.set(o,n),y.size>U&&y.clear(),n;if(n===i)break;n=(0,m.dirname)(n)}return y.set(o,null),y.size>U&&y.clear(),null},h=async(r,t={})=>{try{let e=await(0,f.readFile)(r,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return null;if(t.strict)throw e;return null}},D=async(r,t={})=>{if(!await u(r))return null;try{let e=await import("jiti"),n=(e.createJiti?e.createJiti(process.cwd()):e.default(process.cwd()))(r);return n.default??n}catch{try{let e=await import(r);return e.default??e}catch(e){if(t.strict)throw/\.(ts|mts)$/.test(r)?new Error(`Failed to load TypeScript config at ${r}. Install 'jiti' to load TS configs. Original error: ${e}`):e;return null}}},R=(r,t)=>{if(typeof r!="object"||r===null||typeof t!="object"||t===null||Array.isArray(r)&&Array.isArray(t))return t;let e={...r};for(let o of Object.keys(t))o==="__proto__"||o==="constructor"||o==="prototype"||Object.hasOwn(t,o)&&(e[o]=o in r?R(r[o],t[o]):t[o]);return e},ir=async(r,t)=>{let e=(0,m.join)((0,m.dirname)(r),`${(0,W.randomUUID)()}.tmp`);try{await(0,f.writeFile)(e,t,"utf-8"),await q(e,r)}catch(o){throw await(0,f.rm)(e,{force:!0}).catch(()=>{}),o}},q=async(r,t)=>{if(await u(r))try{await(0,f.rename)(r,t)}catch(e){let o=e;if(o.code==="EEXIST"||o.code==="EPERM"){await(0,f.rm)(t,{recursive:!0,force:!0}),await(0,f.rename)(r,t);return}throw e}},J=r=>{if(r<1)throw new Error("createLimiter: concurrency must be >= 1");let t=0,e=[],o=()=>{t--,e.shift()?.()};return async n=>{t>=r&&await new Promise(i=>e.push(i)),t++;try{return await n()}finally{o()}}},ar=()=>(0,Y.realpathSync)(process.argv[1])===(0,G.fileURLToPath)(cr.url);var $=new Map,M=async(r=process.cwd())=>{let t=j.default.resolve(r);if($.has(t))return $.get(t);let e=await I(t,[".git",".changeset","pnpm-workspace.yaml"]);if(e)return $.set(t,e),e;let o=j.default.resolve(r),{root:n}=j.default.parse(o);for(;;){let i=j.default.join(o,"package.json"),a=await h(i);if(a?.workspaces&&Array.isArray(a.workspaces))return $.set(t,o),o;if(o===n)break;o=j.default.dirname(o)}return $.set(t,t),t};var pr=async({name:r,cwd:t=process.cwd(),defaults:e={},envVars:o={},cliArgs:n={},configFile:i,strict:a=!1})=>{let E=await M(t),l=[];if(i)l.push(b.default.resolve(t,i));else{let s=b.default.resolve(t),g=new RegExp(`^${r}\\.config\\.(ts|mts|js|mjs|json)$`);for(;;){try{let P=(await(0,z.readdir)(s)).find(F=>g.test(F));P&&l.push(b.default.join(s,P))}catch{}if(s===E)break;let x=b.default.dirname(s);if(x===s)break;s=x}}let c=[];for(let s of l.reverse())if(s.endsWith(".json")){let g=await h(s,{strict:a});g&&c.push(g)}else{let g=await D(s,{strict:a});g&&c.push(g)}let d=R;try{let s=await import("defu");s?.defu&&(d=(g,x)=>s.defu(x,g))}catch{}let p=e;for(let s of c)p=d(p,s);return p=d(p,o),p=d(p,n),p},lr=r=>r;var X=require("fs"),H=T(require("os")),k="\x1B[",S={gray:r=>`${k}90m${r}${k}39m`,blue:r=>`${k}34m${r}${k}39m`,yellow:r=>`${k}33m${r}${k}39m`,red:r=>`${k}31m${r}${k}39m`},B={debug:20,info:30,warn:40,error:50},V={debug:S.gray,info:S.blue,warn:S.yellow,error:S.red},fr=r=>{let t=B[r.level],e=r.logFormat??"text",o=r.name,n=o?{debug:`${o}:DEBUG`,info:`${o}:INFO`,warn:`${o}:WARN`,error:`${r.name}:ERROR`}:{debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR"},i=null,a=!1,E=process.stdout.isTTY&&!process.env.NO_COLOR||!!process.env.FORCE_COLOR;if(r.logFile)try{i=(0,X.createWriteStream)(r.logFile,{flags:"a"}),i.on("error",()=>{i=null})}catch{i=null}let l=()=>{if(!a&&(a=!0,i)){try{i.end()}catch{}i=null}};process.once("exit",l),process.once("SIGINT",()=>{l(),process.exit(0)}),process.once("SIGTERM",()=>{l(),process.exit(0)});let c=process.pid,d=H.default.hostname(),p=(s,...g)=>{if(B[s]<t)return;let x=new Date().toISOString(),C=g.map(String).join(" "),P=e==="json"?JSON.stringify({ts:x,level:s,message:C,pid:c,hostname:d,name:o}):`[${x}] [${n[s]}] ${C}`,F=E&&V[s]?V[s](P):P;if((s==="warn"||s==="error"?process.stderr:process.stdout).write(`${F}
2
+ `),i)try{i.write(`${P}
3
+ `)}catch{i=null}};return{debug:(...s)=>p("debug",...s),info:(...s)=>p("info",...s),warn:(...s)=>p("warn",...s),error:(...s)=>p("error",...s),close:l}};var A=require("fs/promises"),w=T(require("path"));var gr=async r=>{let t=[],e=w.default.join(r,"package.json"),o=await h(e);o?.workspaces&&(Array.isArray(o.workspaces)?t.push(...o.workspaces):Array.isArray(o.workspaces.packages)&&t.push(...o.workspaces.packages));let n=w.default.join(r,"pnpm-workspace.yaml");if(await u(n))try{let l=await(0,A.readFile)(n,"utf-8"),c=await L(l);c?.packages&&t.push(...c.packages)}catch{}let i=J(10),a=[],E=[...new Set(t)];return await Promise.all(E.map(l=>i(async()=>{if(l.endsWith("/*")){let c=w.default.join(r,l.slice(0,-2));if(await u(c))try{let d=await(0,A.readdir)(c,{withFileTypes:!0});for(let p of d)p.isDirectory()&&await u(w.default.join(c,p.name,"package.json"))&&a.push(w.default.join(c,p.name))}catch{}}else{let c=w.default.join(r,l);await u(w.default.join(c,"package.json"))&&a.push(c)}}))),[...new Set(a)]},mr=async(r=process.cwd())=>{let t=w.default.join(r,"package.json");return!!((await h(t))?.workspaces||await u(w.default.join(r,"pnpm-workspace.yaml")))};0&&(module.exports={atomicWrite,createLimiter,createLogger,deepMerge,defineConfig,execAsync,execFileAsync,existsAsync,findProjectRoot,findUp,getWorkspacePackages,isCLI,isMonorepo,parseYaml,readJson,resolveConfig,safeRename,tryImport});
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import{readdir as H}from"fs/promises";import P from"path";import T from"path";import{exec as W,execFile as U}from"child_process";import{randomUUID as Y}from"crypto";import{access as G,readFile as q,rename as L,rm as A,writeFile as z}from"fs/promises";import{dirname as S,join as C,parse as B,resolve as V}from"path";import{promisify as F}from"util";async function v(r){try{let s=await import("yaml").then(i=>i.default||i).catch(()=>null);if(s&&typeof s.parse=="function")return s.parse(r)}catch{}let t={},e=r.replace(/#.*$/gm,"").match(/packages:\s*\n((?:\s*-\s*.*\n?)*)/);if(e?.[1]){let s=[],i=/^\s*-\s*["']?([^"'\s]+)["']?/gm,a;for(;(a=i.exec(e[1]))!==null;)s.push(a[1]);t.packages=s}return t}var cr=F(W),pr=F(U),g=async r=>{try{return await G(r),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}},w=new Map,R=200,N=async(r,t)=>{let o=V(r),e=`${o}:${[...t].sort().join(",")}`;if(w.has(e))return w.get(e);let s=o,{root:i}=B(s);for(;;){for(let a of t)if(await g(C(s,a)))return w.set(e,s),w.size>R&&w.clear(),s;if(s===i)break;s=S(s)}return w.set(e,null),w.size>R&&w.clear(),null},h=async(r,t={})=>{try{let o=await q(r,"utf-8");return JSON.parse(o)}catch(o){if(o.code==="ENOENT")return null;if(t.strict)throw o;return null}},D=async(r,t={})=>{if(!await g(r))return null;try{let o=await import("jiti"),s=(o.createJiti?o.createJiti(process.cwd()):o.default(process.cwd()))(r);return s.default??s}catch{try{let o=await import(r);return o.default??o}catch(o){if(t.strict)throw/\.(ts|mts)$/.test(r)?new Error(`Failed to load TypeScript config at ${r}. Install 'jiti' to load TS configs. Original error: ${o}`):o;return null}}},O=(r,t)=>{if(typeof r!="object"||r===null||typeof t!="object"||t===null||Array.isArray(r)&&Array.isArray(t))return t;let o={...r};for(let e of Object.keys(t))e==="__proto__"||e==="constructor"||e==="prototype"||Object.hasOwn(t,e)&&(o[e]=e in r?O(r[e],t[e]):t[e]);return o},lr=async(r,t)=>{let o=C(S(r),`${Y()}.tmp`);try{await z(o,t,"utf-8"),await X(o,r)}catch(e){throw await A(o,{force:!0}).catch(()=>{}),e}},X=async(r,t)=>{if(await g(r))try{await L(r,t)}catch(o){let e=o;if(e.code==="EEXIST"||e.code==="EPERM"){await A(t,{recursive:!0,force:!0}),await L(r,t);return}throw o}},I=r=>{if(r<1)throw new Error("createLimiter: concurrency must be >= 1");let t=0,o=[],e=()=>{t--,o.shift()?.()};return async s=>{t>=r&&await new Promise(i=>o.push(i)),t++;try{return await s()}finally{e()}}};var j=new Map,J=async(r=process.cwd())=>{let t=T.resolve(r);if(j.has(t))return j.get(t);let o=await N(t,[".git",".changeset","pnpm-workspace.yaml"]);if(o)return j.set(t,o),o;let e=T.resolve(r),{root:s}=T.parse(e);for(;;){let i=T.join(e,"package.json"),a=await h(i);if(a?.workspaces&&Array.isArray(a.workspaces))return j.set(t,e),e;if(e===s)break;e=T.dirname(e)}return j.set(t,t),t};var xr=async({name:r,cwd:t=process.cwd(),defaults:o={},envVars:e={},cliArgs:s={},configFile:i,strict:a=!1})=>{let x=await J(t),l=[];if(i)l.push(P.resolve(t,i));else{let n=P.resolve(t),f=new RegExp(`^${r}\\.config\\.(ts|mts|js|mjs|json)$`);for(;;){try{let k=(await H(n)).find(b=>f.test(b));k&&l.push(P.join(n,k))}catch{}if(n===x)break;let y=P.dirname(n);if(y===n)break;n=y}}let c=[];for(let n of l.reverse())if(n.endsWith(".json")){let f=await h(n,{strict:a});f&&c.push(f)}else{let f=await D(n,{strict:a});f&&c.push(f)}let m=O;try{let n=await import("defu");n?.defu&&(m=(f,y)=>n.defu(y,f))}catch{}let p=o;for(let n of c)p=m(p,n);return p=m(p,e),p=m(p,s),p},Tr=r=>r;import{createWriteStream as K}from"fs";import Q from"os";var d="\x1B[",E={gray:r=>`${d}90m${r}${d}39m`,blue:r=>`${d}34m${r}${d}39m`,yellow:r=>`${d}33m${r}${d}39m`,red:r=>`${d}31m${r}${d}39m`},M={debug:20,info:30,warn:40,error:50},_={debug:E.gray,info:E.blue,warn:E.yellow,error:E.red},$r=r=>{let t=M[r.level],o=r.logFormat??"text",e=r.name,s=e?{debug:`${e}:DEBUG`,info:`${e}:INFO`,warn:`${e}:WARN`,error:`${r.name}:ERROR`}:{debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR"},i=null,a=!1,x=process.stdout.isTTY&&!process.env.NO_COLOR||!!process.env.FORCE_COLOR;if(r.logFile)try{i=K(r.logFile,{flags:"a"}),i.on("error",()=>{i=null})}catch{i=null}let l=()=>{if(!a&&(a=!0,i)){try{i.end()}catch{}i=null}};process.once("exit",l),process.once("SIGINT",()=>{l(),process.exit(0)}),process.once("SIGTERM",()=>{l(),process.exit(0)});let c=process.pid,m=Q.hostname(),p=(n,...f)=>{if(M[n]<t)return;let y=new Date().toISOString(),$=f.map(String).join(" "),k=o==="json"?JSON.stringify({ts:y,level:n,message:$,pid:c,hostname:m,name:e}):`[${y}] [${s[n]}] ${$}`,b=x&&_[n]?_[n](k):k;if((n==="warn"||n==="error"?process.stderr:process.stdout).write(`${b}
1
+ import{readdir as Q}from"fs/promises";import j from"path";import T from"path";import{exec as U,execFile as W}from"child_process";import{randomUUID as Y}from"crypto";import{realpathSync as G}from"fs";import{access as q,readFile as z,rename as O,rm as S,writeFile as B}from"fs/promises";import{dirname as A,join as C,parse as V,resolve as X}from"path";import{fileURLToPath as H}from"url";import{promisify as F}from"util";async function v(r){try{let s=await import("yaml").then(i=>i.default||i).catch(()=>null);if(s&&typeof s.parse=="function")return s.parse(r)}catch{}let t={},e=r.replace(/#.*$/gm,"").match(/packages:\s*\n((?:\s*-\s*.*\n?)*)/);if(e?.[1]){let s=[],i=/^\s*-\s*["']?([^"'\s]+)["']?/gm,a;for(;(a=i.exec(e[1]))!==null;)s.push(a[1]);t.packages=s}return t}var gr=F(U),mr=F(W),g=async r=>{try{return await q(r),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}},w=new Map,R=200,N=async(r,t)=>{let o=X(r),e=`${o}:${[...t].sort().join(",")}`;if(w.has(e))return w.get(e);let s=o,{root:i}=V(s);for(;;){for(let a of t)if(await g(C(s,a)))return w.set(e,s),w.size>R&&w.clear(),s;if(s===i)break;s=A(s)}return w.set(e,null),w.size>R&&w.clear(),null},h=async(r,t={})=>{try{let o=await z(r,"utf-8");return JSON.parse(o)}catch(o){if(o.code==="ENOENT")return null;if(t.strict)throw o;return null}},I=async(r,t={})=>{if(!await g(r))return null;try{let o=await import("jiti"),s=(o.createJiti?o.createJiti(process.cwd()):o.default(process.cwd()))(r);return s.default??s}catch{try{let o=await import(r);return o.default??o}catch(o){if(t.strict)throw/\.(ts|mts)$/.test(r)?new Error(`Failed to load TypeScript config at ${r}. Install 'jiti' to load TS configs. Original error: ${o}`):o;return null}}},L=(r,t)=>{if(typeof r!="object"||r===null||typeof t!="object"||t===null||Array.isArray(r)&&Array.isArray(t))return t;let o={...r};for(let e of Object.keys(t))e==="__proto__"||e==="constructor"||e==="prototype"||Object.hasOwn(t,e)&&(o[e]=e in r?L(r[e],t[e]):t[e]);return o},ur=async(r,t)=>{let o=C(A(r),`${Y()}.tmp`);try{await B(o,t,"utf-8"),await K(o,r)}catch(e){throw await S(o,{force:!0}).catch(()=>{}),e}},K=async(r,t)=>{if(await g(r))try{await O(r,t)}catch(o){let e=o;if(e.code==="EEXIST"||e.code==="EPERM"){await S(t,{recursive:!0,force:!0}),await O(r,t);return}throw o}},D=r=>{if(r<1)throw new Error("createLimiter: concurrency must be >= 1");let t=0,o=[],e=()=>{t--,o.shift()?.()};return async s=>{t>=r&&await new Promise(i=>o.push(i)),t++;try{return await s()}finally{e()}}},wr=()=>G(process.argv[1])===H(import.meta.url);var P=new Map,J=async(r=process.cwd())=>{let t=T.resolve(r);if(P.has(t))return P.get(t);let o=await N(t,[".git",".changeset","pnpm-workspace.yaml"]);if(o)return P.set(t,o),o;let e=T.resolve(r),{root:s}=T.parse(e);for(;;){let i=T.join(e,"package.json"),a=await h(i);if(a?.workspaces&&Array.isArray(a.workspaces))return P.set(t,e),e;if(e===s)break;e=T.dirname(e)}return P.set(t,t),t};var $r=async({name:r,cwd:t=process.cwd(),defaults:o={},envVars:e={},cliArgs:s={},configFile:i,strict:a=!1})=>{let x=await J(t),l=[];if(i)l.push(j.resolve(t,i));else{let n=j.resolve(t),f=new RegExp(`^${r}\\.config\\.(ts|mts|js|mjs|json)$`);for(;;){try{let k=(await Q(n)).find(b=>f.test(b));k&&l.push(j.join(n,k))}catch{}if(n===x)break;let y=j.dirname(n);if(y===n)break;n=y}}let c=[];for(let n of l.reverse())if(n.endsWith(".json")){let f=await h(n,{strict:a});f&&c.push(f)}else{let f=await I(n,{strict:a});f&&c.push(f)}let u=L;try{let n=await import("defu");n?.defu&&(u=(f,y)=>n.defu(y,f))}catch{}let p=o;for(let n of c)p=u(p,n);return p=u(p,e),p=u(p,s),p},br=r=>r;import{createWriteStream as Z}from"fs";import rr from"os";var d="\x1B[",E={gray:r=>`${d}90m${r}${d}39m`,blue:r=>`${d}34m${r}${d}39m`,yellow:r=>`${d}33m${r}${d}39m`,red:r=>`${d}31m${r}${d}39m`},M={debug:20,info:30,warn:40,error:50},_={debug:E.gray,info:E.blue,warn:E.yellow,error:E.red},Rr=r=>{let t=M[r.level],o=r.logFormat??"text",e=r.name,s=e?{debug:`${e}:DEBUG`,info:`${e}:INFO`,warn:`${e}:WARN`,error:`${r.name}:ERROR`}:{debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR"},i=null,a=!1,x=process.stdout.isTTY&&!process.env.NO_COLOR||!!process.env.FORCE_COLOR;if(r.logFile)try{i=Z(r.logFile,{flags:"a"}),i.on("error",()=>{i=null})}catch{i=null}let l=()=>{if(!a&&(a=!0,i)){try{i.end()}catch{}i=null}};process.once("exit",l),process.once("SIGINT",()=>{l(),process.exit(0)}),process.once("SIGTERM",()=>{l(),process.exit(0)});let c=process.pid,u=rr.hostname(),p=(n,...f)=>{if(M[n]<t)return;let y=new Date().toISOString(),$=f.map(String).join(" "),k=o==="json"?JSON.stringify({ts:y,level:n,message:$,pid:c,hostname:u,name:e}):`[${y}] [${s[n]}] ${$}`,b=x&&_[n]?_[n](k):k;if((n==="warn"||n==="error"?process.stderr:process.stdout).write(`${b}
2
2
  `),i)try{i.write(`${k}
3
- `)}catch{i=null}};return{debug:(...n)=>p("debug",...n),info:(...n)=>p("info",...n),warn:(...n)=>p("warn",...n),error:(...n)=>p("error",...n),close:l}};import{readdir as Z,readFile as rr}from"fs/promises";import u from"path";var Rr=async r=>{let t=[],o=u.join(r,"package.json"),e=await h(o);e?.workspaces&&(Array.isArray(e.workspaces)?t.push(...e.workspaces):Array.isArray(e.workspaces.packages)&&t.push(...e.workspaces.packages));let s=u.join(r,"pnpm-workspace.yaml");if(await g(s))try{let l=await rr(s,"utf-8"),c=await v(l);c?.packages&&t.push(...c.packages)}catch{}let i=I(10),a=[],x=[...new Set(t)];return await Promise.all(x.map(l=>i(async()=>{if(l.endsWith("/*")){let c=u.join(r,l.slice(0,-2));if(await g(c))try{let m=await Z(c,{withFileTypes:!0});for(let p of m)p.isDirectory()&&await g(u.join(c,p.name,"package.json"))&&a.push(u.join(c,p.name))}catch{}}else{let c=u.join(r,l);await g(u.join(c,"package.json"))&&a.push(c)}}))),[...new Set(a)]},Ar=async(r=process.cwd())=>{let t=u.join(r,"package.json");return!!((await h(t))?.workspaces||await g(u.join(r,"pnpm-workspace.yaml")))};export{lr as atomicWrite,I as createLimiter,$r as createLogger,O as deepMerge,Tr as defineConfig,cr as execAsync,pr as execFileAsync,g as existsAsync,J as findProjectRoot,N as findUp,Rr as getWorkspacePackages,Ar as isMonorepo,v as parseYaml,h as readJson,xr as resolveConfig,X as safeRename,D as tryImport};
3
+ `)}catch{i=null}};return{debug:(...n)=>p("debug",...n),info:(...n)=>p("info",...n),warn:(...n)=>p("warn",...n),error:(...n)=>p("error",...n),close:l}};import{readdir as tr,readFile as er}from"fs/promises";import m from"path";var Nr=async r=>{let t=[],o=m.join(r,"package.json"),e=await h(o);e?.workspaces&&(Array.isArray(e.workspaces)?t.push(...e.workspaces):Array.isArray(e.workspaces.packages)&&t.push(...e.workspaces.packages));let s=m.join(r,"pnpm-workspace.yaml");if(await g(s))try{let l=await er(s,"utf-8"),c=await v(l);c?.packages&&t.push(...c.packages)}catch{}let i=D(10),a=[],x=[...new Set(t)];return await Promise.all(x.map(l=>i(async()=>{if(l.endsWith("/*")){let c=m.join(r,l.slice(0,-2));if(await g(c))try{let u=await tr(c,{withFileTypes:!0});for(let p of u)p.isDirectory()&&await g(m.join(c,p.name,"package.json"))&&a.push(m.join(c,p.name))}catch{}}else{let c=m.join(r,l);await g(m.join(c,"package.json"))&&a.push(c)}}))),[...new Set(a)]},Ir=async(r=process.cwd())=>{let t=m.join(r,"package.json");return!!((await h(t))?.workspaces||await g(m.join(r,"pnpm-workspace.yaml")))};export{ur as atomicWrite,D as createLimiter,Rr as createLogger,L as deepMerge,br as defineConfig,gr as execAsync,mr as execFileAsync,g as existsAsync,J as findProjectRoot,N as findUp,Nr as getWorkspacePackages,wr as isCLI,Ir as isMonorepo,v as parseYaml,h as readJson,$r as resolveConfig,K as safeRename,I as tryImport};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@turboforge/cli-kit",
3
3
  "author": "Mayank Kumar Chaudhari <https://mayankchaudhari.com>",
4
4
  "private": false,
5
- "version": "1.0.0",
5
+ "version": "1.0.1",
6
6
  "description": "Low-level utilities and configuration resolution for building high-performance CLI tools in monorepos.",
7
7
  "license": "MIT",
8
8
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "icon": "Terminal",
26
26
  "description": "CLI & Config Utilities",
27
27
  "aliases": [
28
- "@turbo-forge/cli-kit"
28
+ "@turboforge/cli-kit"
29
29
  ]
30
30
  },
31
31
  "repository": {
@@ -40,11 +40,11 @@
40
40
  "dist/**"
41
41
  ],
42
42
  "devDependencies": {
43
- "@types/node": "^25.5.0",
44
- "defu": "^6.1.4",
45
- "jiti": "^2.6.1",
43
+ "@types/node": "^25.7.0",
44
+ "defu": "^6.1.7",
45
+ "jiti": "^2.7.0",
46
46
  "tsup": "^8.5.1",
47
- "typescript": "^5.9.3"
47
+ "typescript": "^6.0.3"
48
48
  },
49
49
  "funding": [
50
50
  {
@@ -84,7 +84,7 @@
84
84
  "tooling"
85
85
  ],
86
86
  "scripts": {
87
- "build": "tsup && gzip -c dist/index.js | wc -c",
87
+ "build": "tsup",
88
88
  "clean": "rm -rf dist",
89
89
  "dev": "tsup --watch"
90
90
  }