@seedcord/utils 0.3.4 → 0.3.6

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.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var promises = require('fs/promises');
4
4
  var path = require('path');
5
+ var services = require('@seedcord/services');
5
6
 
6
7
  function _interopNamespace(e) {
7
8
  if (e && e.__esModule) return e;
@@ -79,19 +80,17 @@ function generateCode(digits) {
79
80
  return Math.floor(Math.random() * (max - min + 1) + min);
80
81
  }
81
82
  __name(generateCode, "generateCode");
82
-
83
- // src/numbers/hexToNumber.ts
84
83
  function hexToNumber(hex) {
85
84
  if (typeof hex !== "string") {
86
- throw new TypeError("hexToNumber expects a string input");
85
+ throw new services.SeedcordTypeError(services.SeedcordErrorCode.UtilHexInputType);
87
86
  }
88
87
  const normalized = hex.replace(/^#/, "");
89
88
  if (!/^[0-9a-fA-F]+$/.test(normalized)) {
90
- throw new Error("Invalid hex string");
89
+ throw new services.SeedcordError(services.SeedcordErrorCode.UtilHexInvalid);
91
90
  }
92
91
  const converted = parseInt(normalized, 16);
93
92
  if (Number.isNaN(converted)) {
94
- throw new Error("Invalid hex string");
93
+ throw new services.SeedcordError(services.SeedcordErrorCode.UtilHexInvalid);
95
94
  }
96
95
  return converted;
97
96
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/misc/directory.ts","../src/misc/fyShuffle.ts","../src/numbers/currentTime.ts","../src/numbers/generateCode.ts","../src/numbers/hexToNumber.ts","../src/numbers/ordinal.ts","../src/numbers/percentage.ts","../src/numbers/round.ts","../src/numbers/roundToDenomination.ts","../src/objects/filterCirculars.ts","../src/objects/keepDefined.ts","../src/strings/capitalize.ts","../src/strings/longestStringLength.ts","../src/strings/generateAsciiTable.ts","../src/strings/prettify.ts","../src/strings/prettyDifference.ts"],"names":["isTsOrJsFile","entry","isFile","name","endsWith","traverseDirectory","dir","callback","logger","entries","readdir","withFileTypes","error","fullPath","join","relativePath","relative","process","cwd","isDirectory","imported","fyShuffle","items","array","slice","i","length","j","Math","floor","random","currentTime","Date","now","generateCode","digits","min","pow","max","hexToNumber","hex","TypeError","normalized","replace","test","Error","converted","parseInt","Number","isNaN","ordinal","n","s","v","index","suffix","percentage","num1","num2","toFixed","round","num","precision","factor","EPSILON","roundToDenomination","opts","suffixes","toString","temp","result","adjustedTemp","ceil","substring","filterCirculars","value","options","marker","mode","json","decycle","seen","WeakSet","JSON","stringify","_k","obj","has","add","Object","keys","parse","input","recur","val","t","toISOString","RegExp","Array","isArray","map","item","Map","from","k","Set","out","keepDefined","source","selectedKeys","key","undefined","capitalize","word","charAt","toUpperCase","toLowerCase","longestStringLength","arr","el","generateAsciiTable","data","firstRow","table","columnWidths","maxWidth","row","cell","push","createLine","char","left","intersect","right","line","forEach","width","repeat","rowIndex","columnIndex","columnWidth","padEnd","prettify","trim","prettyDifference","numBefore","numAfter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAASA,aAAaC,KAAAA,EAAgB;AACzC,EAAA,OACIA,KAAAA,CAAMC,QAAM,KACXD,KAAAA,CAAME,KAAKC,QAAAA,CAAS,KAAA,CAAA,IAAUH,KAAAA,CAAME,IAAAA,CAAKC,QAAAA,CAAS,KAAA,CAAA,CAAA,IACnD,CAACH,KAAAA,CAAME,IAAAA,CAAKC,QAAAA,CAAS,OAAA,KACrB,CAACH,KAAAA,CAAME,IAAAA,CAAKC,QAAAA,CAAS,MAAA,CAAA;AAE7B;AAPgBJ,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAgBhB,eAAsBK,iBAAAA,CAClBC,GAAAA,EACAC,QAAAA,EACAC,MAAAA,EAAc;AAEd,EAAA,IAAIC,OAAAA;AAEJ,EAAA,IAAI;AACAA,IAAAA,OAAAA,GAAU,MAAMC,iBAAQJ,GAAAA,EAAK;MAAEK,aAAAA,EAAe;KAAK,CAAA;EACvD,CAAA,CAAA,MAAQ;AACJH,IAAAA,MAAAA,CAAOI,MAAM,+BAAA,CAAA;AACbH,IAAAA,OAAAA,GAAU,EAAA;AACd,EAAA;AAEA,EAAA,KAAA,MAAWR,SAASQ,OAAAA,EAAS;AACzB,IAAA,MAAMI,QAAAA,GAAgBC,eAAAA,CAAAA,IAAAA,CAAKR,GAAAA,EAAKL,KAAAA,CAAME,IAAI,CAAA;AAC1C,IAAA,MAAMY,YAAAA,GAAoBC,eAAAA,CAAAA,QAAAA,CAASC,OAAAA,CAAQC,GAAAA,IAAOL,QAAAA,CAAAA;AAElD,IAAA,IAAIZ,KAAAA,CAAMkB,aAAW,EAAI;AACrB,MAAA,MAAMd,iBAAAA,CAAkBQ,QAAAA,EAAUN,QAAAA,EAAUC,MAAAA,CAAAA;IAChD,CAAA,MAAA,IAAWR,YAAAA,CAAaC,KAAAA,CAAAA,EAAQ;AAC5B,MAAA,MAAMmB,QAAAA,GAAY,MAAM,OAAOP,QAAAA,CAAAA;AAC/B,MAAA,MAAMN,QAAAA,CAASM,QAAAA,EAAUE,YAAAA,EAAcK,QAAAA,CAAAA;AAC3C,IAAA;AACJ,EAAA;AACJ;AAzBsBf,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;ACVf,SAASgB,UAAkBC,KAAAA,EAAe;AAC7C,EAAA,MAAMC,KAAAA,GAAQD,MAAME,KAAAA,EAAK;AACzB,EAAA,KAAA,IAASC,IAAIF,KAAAA,CAAMG,MAAAA,GAAS,CAAA,EAAGD,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,EAAK;AACvC,IAAA,MAAME,IAAIC,IAAAA,CAAKC,KAAAA,CAAMD,KAAKE,MAAAA,EAAM,IAAML,IAAI,CAAA,CAAA,CAAA;AAE1C,IAAA,CAACF,MAAME,CAAAA,CAAAA,EAAIF,KAAAA,CAAMI,CAAAA,CAAE,CAAA,GAAI;AAACJ,MAAAA,KAAAA,CAAMI,CAAAA,CAAAA;AAAIJ,MAAAA,KAAAA,CAAME,CAAAA;;AAC5C,EAAA;AACA,EAAA,OAAOF,KAAAA;AACX;AARgBF,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;;;ACdT,SAASU,WAAAA,GAAAA;AACZ,EAAA,OAAOH,IAAAA,CAAKC,KAAAA,CAAMG,IAAAA,CAAKC,GAAAA,KAAQ,GAAA,CAAA;AACnC;AAFgBF,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;;;ACGT,SAASG,aAAaC,MAAAA,EAAc;AACvC,EAAA,MAAMC,GAAAA,GAAMR,IAAAA,CAAKS,GAAAA,CAAI,EAAA,EAAIF,SAAS,CAAA,CAAA;AAClC,EAAA,MAAMG,GAAAA,GAAMV,IAAAA,CAAKS,GAAAA,CAAI,EAAA,EAAIF,MAAAA,CAAAA,GAAU,CAAA;AACnC,EAAA,OAAOP,IAAAA,CAAKC,MAAMD,IAAAA,CAAKE,MAAAA,MAAYQ,GAAAA,GAAMF,GAAAA,GAAM,KAAKA,GAAAA,CAAAA;AACxD;AAJgBF,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;;;ACAT,SAASK,YAAYC,GAAAA,EAAW;AACnC,EAAA,IAAI,OAAOA,QAAQ,QAAA,EAAU;AACzB,IAAA,MAAM,IAAIC,UAAU,oCAAA,CAAA;AACxB,EAAA;AAEA,EAAA,MAAMC,UAAAA,GAAaF,GAAAA,CAAIG,OAAAA,CAAQ,IAAA,EAAM,EAAA,CAAA;AACrC,EAAA,IAAI,CAAC,gBAAA,CAAiBC,IAAAA,CAAKF,UAAAA,CAAAA,EAAa;AACpC,IAAA,MAAM,IAAIG,MAAM,oBAAA,CAAA;AACpB,EAAA;AAEA,EAAA,MAAMC,SAAAA,GAAYC,QAAAA,CAASL,UAAAA,EAAY,EAAA,CAAA;AACvC,EAAA,IAAIM,MAAAA,CAAOC,KAAAA,CAAMH,SAAAA,CAAAA,EAAY;AACzB,IAAA,MAAM,IAAID,MAAM,oBAAA,CAAA;AACpB,EAAA;AAEA,EAAA,OAAOC,SAAAA;AACX;AAhBgBP,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;;;ACKT,SAASW,QAAQC,CAAAA,EAAS;AAC7B,EAAA,MAAMC,CAAAA,GAAI;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;;AAC7B,EAAA,MAAMC,IAAIF,CAAAA,GAAI,GAAA;AACd,EAAA,MAAMG,KAAAA,GAAAA,CAASD,IAAI,EAAA,IAAM,EAAA;AACzB,EAAA,MAAME,MAAAA,GAASH,EAAEE,KAAAA,CAAAA,IAAUF,EAAEC,CAAAA,CAAAA,IAAMD,EAAE,CAAA,CAAA;AACrC,EAAA,IAAI,CAACG,MAAAA,EAAQ,OAAO,CAAA,EAAGJ,CAAAA,CAAAA,EAAAA,CAAAA;AAEvB,EAAA,OAAO,CAAA,EAAGA,CAAAA,CAAAA,EAAII,MAAAA,CAAAA,CAAAA;AAClB;AARgBL,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;;;ACFT,SAASM,UAAAA,CAAWC,MAAcC,IAAAA,EAAY;AACjD,EAAA,OAAOV,QAASS,IAAAA,GAAOC,IAAAA,GAAQ,GAAA,EAAKC,OAAAA,CAAQ,CAAA,CAAA,CAAA;AAChD;AAFgBH,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;;;ACDT,SAASI,KAAAA,CAAMC,KAAaC,SAAAA,EAAiB;AAChD,EAAA,MAAMC,MAAAA,GAASnC,IAAAA,CAAKS,GAAAA,CAAI,EAAA,EAAIyB,SAAAA,CAAAA;AAC5B,EAAA,OAAOlC,KAAKgC,KAAAA,CAAAA,CAAOC,GAAAA,GAAMb,MAAAA,CAAOgB,OAAAA,IAAWD,MAAAA,CAAAA,GAAUA,MAAAA;AACzD;AAHgBH,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;;;ACcT,SAASK,mBAAAA,CAAoBJ,KAAaK,IAAAA,EAA0B;AACvE,EAAA,MAAM,EAAEC,QAAAA,GAAW;AAAC,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA;KAAML,SAAAA,GAAY,CAAA,EAAC,GAAKI,IAAAA,IAAQ,EAAC;AAEzE,EAAA,IAAIL,MAAM,GAAA,EAAO;AACb,IAAA,OAAOA,IAAIO,QAAAA,EAAQ;AACvB,EAAA;AAEA,EAAA,IAAId,KAAAA,GAAQ,EAAA;AACZ,EAAA,IAAIe,IAAAA,GAAOR,GAAAA;AAEX,EAAA,OAAOQ,IAAAA,IAAQ,GAAA,IAAQf,KAAAA,GAAQa,QAAAA,CAASzC,SAAS,CAAA,EAAG;AAChD2C,IAAAA,IAAAA,IAAQ,GAAA;AACRf,IAAAA,KAAAA,EAAAA;AACJ,EAAA;AAEA,EAAA,IAAIgB,MAAAA;AAEJ,EAAA,IAAID,IAAAA,GAAO,MAAM,CAAA,EAAG;AAChBC,IAAAA,MAAAA,GAASD,KAAKD,QAAAA,EAAQ;EAC1B,CAAA,MAAO;AACH,IAAA,MAAMG,YAAAA,GAAe3C,IAAAA,CAAKgC,KAAAA,CAAMS,IAAAA,GAAOzC,KAAKS,GAAAA,CAAI,EAAA,EAAIyB,SAAAA,GAAY,CAAA,CAAA,CAAA,GAAMlC,IAAAA,CAAKS,GAAAA,CAAI,EAAA,EAAIyB,YAAY,CAAA,CAAA;AAC/FQ,IAAAA,MAAAA,GAASC,YAAAA,CAAaZ,QAAQG,SAAAA,CAAAA;AAClC,EAAA;AAEA,EAAA,IAAIQ,MAAAA,CAAOlE,QAAAA,CAAS,IAAA,CAAA,EAAO;AACvBkE,IAAAA,MAAAA,GAAS1C,KAAK4C,IAAAA,CAAKxB,MAAAA,CAAOsB,MAAAA,CAAAA,EAASF,QAAAA,EAAQ;AAC/C,EAAA;AAEA,EAAA,IAAIE,MAAAA,CAAOlE,QAAAA,CAAS,IAAA,CAAA,EAAO;AACvBkE,IAAAA,MAAAA,GAASA,MAAAA,CAAOG,SAAAA,CAAU,CAAA,EAAGH,MAAAA,CAAO5C,SAAS,CAAA,CAAA;AACjD,EAAA;AAEA,EAAA,IAAI4C,WAAW,MAAA,EAAQ;AACnBhB,IAAAA,KAAAA,IAAS,CAAA;AACTgB,IAAAA,MAAAA,GAAS,GAAA;AACb,EAAA;AAEA,EAAA,OAAOA,MAAAA,IAAUhB,KAAAA,IAAS,CAAA,GAAIa,QAAAA,CAASb,KAAAA,CAAAA,GAAS,EAAA,CAAA;AACpD;AAtCgBW,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACgET,SAASS,eAAAA,CACZC,OACAC,OAAAA,EAAwC;AAExC,EAAA,MAAMpE,SAASoE,OAAAA,EAASpE,MAAAA;AACxB,EAAA,MAAMqE,MAAAA,GAAUD,SAASC,MAAAA,IAAU,YAAA;AACnC,EAAA,MAAMC,IAAAA,GAAOF,SAASE,IAAAA,IAAQ,SAAA;AAE9B,EAAA,IAAIA,SAAS,MAAA,EAAQ,OAAOC,IAAAA,CAAKJ,KAAAA,EAAOE,QAAQrE,MAAAA,CAAAA;AAEhD,EAAA,IAAI;AACA,IAAA,OAAOwE,OAAAA,CAAQL,OAAOE,MAAAA,CAAAA;AAC1B,EAAA,CAAA,CAAA,OAASjE,KAAAA,EAAO;AACZJ,IAAAA,MAAAA,EAAQI,KAAAA,CAAM,iCAAiCA,KAAAA,CAAAA;AAC/C,IAAA,OAAO+D,KAAAA;AACX,EAAA;AACJ;AAhBgBD,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAuBhB,SAASK,IAAAA,CACLJ,KAAAA,EACAE,MAAAA,EACArE,MAAAA,EAAgB;AAEhB,EAAA,MAAMyE,IAAAA,uBAAWC,OAAAA,EAAAA;AACjB,EAAA,IAAIH,KAAAA;AAEJ,EAAA,IAAI;AACAA,IAAAA,QAAOI,IAAAA,CAAKC,SAAAA,CAAUT,KAAAA,EAAO,CAACU,IAAYhC,CAAAA,KAAAA;AACtC,MAAA,IAAI,OAAOA,CAAAA,KAAM,QAAA,EAAU,OAAOA,EAAEe,QAAAA,EAAQ;AAC5C,MAAA,IAAI,OAAOf,CAAAA,KAAM,QAAA,IAAYA,CAAAA,KAAM,IAAA,EAAM;AACrC,QAAA,MAAMiC,GAAAA,GAAMjC,CAAAA;AACZ,QAAA,IAAI4B,IAAAA,CAAKM,GAAAA,CAAID,GAAAA,CAAAA,EAAM,OAAOT,MAAAA;AAC1BI,QAAAA,IAAAA,CAAKO,IAAIF,GAAAA,CAAAA;AACb,MAAA;AACA,MAAA,OAAOjC,CAAAA;IACX,CAAA,CAAA;AACJ,EAAA,CAAA,CAAA,OAASzC,KAAAA,EAAO;AACZJ,IAAAA,MAAAA,EAAQI,KAAAA,CAAM,mCAAmCA,KAAAA,CAAAA;AACjD,IAAA,IAAI,OAAO+D,KAAAA,KAAU,QAAA,IAAYA,KAAAA,KAAU,IAAA,EAAM;AAC7CnE,MAAAA,MAAAA,EAAQI,KAAAA,CAAM,gBAAA,EAAkB6E,MAAAA,CAAOC,IAAAA,CAAKf,KAAAA,CAAAA,CAAAA;AAChD,IAAA;AACA,IAAA,OAAOA,KAAAA;AACX,EAAA;AAEA,EAAA,IAAI,OAAOI,UAAS,QAAA,EAAU;AAC1B,IAAA,OAAOJ,KAAAA;AACX,EAAA;AAEA,EAAA,IAAI;AACA,IAAA,OAAOQ,IAAAA,CAAKQ,MAAMZ,KAAAA,CAAAA;AACtB,EAAA,CAAA,CAAA,OAASnE,KAAAA,EAAO;AACZJ,IAAAA,MAAAA,EAAQI,KAAAA,CAAM,+BAA+BA,KAAAA,CAAAA;AAC7CJ,IAAAA,MAAAA,EAAQI,KAAAA,CAAM,YAAYmE,KAAAA,CAAAA;AAC1B,IAAA,OAAOJ,KAAAA;AACX,EAAA;AACJ;AArCSI,MAAAA,CAAAA,IAAAA,EAAAA,MAAAA,CAAAA;AA4CT,SAASC,QACLY,KAAAA,EACAf,MAAAA,EACAI,IAAAA,mBAAO,IAAIC,SAAAA,EAAiB;AAE5B,EAAA,MAAMW,KAAAA,2BAASC,GAAAA,KAAAA;AACX,IAAA,IAAIA,GAAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,IAAA,MAAMC,IAAI,OAAOD,GAAAA;AAGjB,IAAA,IAAIC,CAAAA,KAAM,QAAA,EAAU,OAAQD,GAAAA,CAAe1B,QAAAA,EAAQ;AAGnD,IAAA,IAAI2B,CAAAA,KAAM,UAAU,OAAOD,GAAAA;AAE3B,IAAA,MAAMR,GAAAA,GAAMQ,GAAAA;AAEZ,IAAA,IAAIb,IAAAA,CAAKM,GAAAA,CAAID,GAAAA,CAAAA,EAAM,OAAOT,MAAAA;AAC1BI,IAAAA,IAAAA,CAAKO,IAAIF,GAAAA,CAAAA;AAGT,IAAA,IAAIA,GAAAA,YAAetD,IAAAA,EAAM,OAAOsD,GAAAA,CAAIU,WAAAA,EAAW;AAG/C,IAAA,IAAIV,GAAAA,YAAeW,MAAAA,EAAQ,OAAOX,GAAAA,CAAIlB,QAAAA,EAAQ;AAG9C,IAAA,IAAI8B,KAAAA,CAAMC,OAAAA,CAAQb,GAAAA,CAAAA,EAAM;AACpB,MAAA,OAAOA,IAAIc,GAAAA,CAAI,CAACC,IAAAA,KAASR,KAAAA,CAAMQ,IAAAA,CAAAA,CAAAA;AACnC,IAAA;AAGA,IAAA,IAAIf,eAAegB,GAAAA,EAAK;AACpB,MAAA,OAAOJ,MAAMK,IAAAA,CAAKjB,GAAAA,EAAK,CAAC,CAACkB,CAAAA,EAAGnD,CAAAA,CAAAA,KAAO;AAACwC,QAAAA,KAAAA,CAAMW,CAAAA,CAAAA;AAAIX,QAAAA,KAAAA,CAAMxC,CAAAA;AAAG,OAAA,CAAA;AAC3D,IAAA;AAGA,IAAA,IAAIiC,eAAemB,GAAAA,EAAK;AACpB,MAAA,OAAOP,MAAMK,IAAAA,CAAKjB,GAAAA,EAAK,CAACjC,CAAAA,KAAMwC,KAAAA,CAAMxC,CAAAA,CAAAA,CAAAA;AACxC,IAAA;AAEA,IAAA,MAAMqD,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAACF,CAAAA,EAAGnD,CAAAA,KAAMoC,MAAAA,CAAOhF,OAAAA,CAAQ6E,GAAAA,CAAAA,EAAM;AACtC,MAAA,IAAI,OAAOjC,MAAM,UAAA,EAAY;AAC7BqD,MAAAA,GAAAA,CAAIF,CAAAA,CAAAA,GAAKX,KAAAA,CAAMxC,CAAAA,CAAAA;AACnB,IAAA;AAEA,IAAA,OAAOqD,GAAAA;EACX,CAAA,EA3Cc,OAAA,CAAA;AA6Cd,EAAA,OAAOb,MAAMD,KAAAA,CAAAA;AACjB;AAnDSZ,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;;;AC7HF,SAAS2B,WAAAA,CACZC,WACGlB,IAAAA,EAAqB;AAExB,EAAA,MAAMmB,eAAenB,IAAAA,CAAKhE,MAAAA,GAAS,IAAIgE,IAAAA,GAAQD,MAAAA,CAAOC,KAAKkB,MAAAA,CAAAA;AAC3D,EAAA,MAAMtC,SAA2B,EAAC;AAElC,EAAA,KAAA,MAAWwC,OAAOD,YAAAA,EAAc;AAC5B,IAAA,MAAMlC,KAAAA,GAAQiC,OAAOE,GAAAA,CAAAA;AACrB,IAAA,IAAInC,KAAAA,KAAUoC,MAAAA,IAAapC,KAAAA,KAAU,IAAA,EAAM;AACvCL,MAAAA,MAAAA,CAAOwC,GAAAA,CAAAA,GAAOnC,KAAAA;AAClB,IAAA;AACJ,EAAA;AACA,EAAA,OAAOL,MAAAA;AACX;AAdgBqC,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;;;ACvBT,SAASK,WAAWC,IAAAA,EAAY;AACnC,EAAA,OAAOA,IAAAA,CAAKC,MAAAA,CAAO,CAAA,CAAA,CAAGC,WAAAA,KAAgBF,IAAAA,CAAKzF,KAAAA,CAAM,CAAA,CAAA,CAAG4F,WAAAA,EAAW;AACnE;AAFgBJ,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;;;ACET,SAASK,oBAAoBC,GAAAA,EAAwB;AACxD,EAAA,OAAO1F,IAAAA,CAAKU,GAAAA,CAAG,GAAIgF,GAAAA,CAAIlB,GAAAA,CAAI,CAACmB,EAAAA,KAAOA,EAAAA,CAAGnD,QAAAA,EAAQ,CAAG1C,MAAM,CAAA,CAAA;AAC3D;AAFgB2F,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACAT,SAASG,mBAAmBC,IAAAA,EAAgB;AAC/C,EAAA,IAAIA,IAAAA,CAAK/F,MAAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE9B,EAAA,MAAMgG,QAAAA,GAAWD,KAAK,CAAA,CAAA;AACtB,EAAA,IAAI,CAACC,QAAAA,IAAYA,QAAAA,CAAShG,MAAAA,KAAW,GAAG,OAAO,EAAA;AAE/C,EAAA,IAAIiG,KAAAA,GAAQ,EAAA;AACZ,EAAA,MAAMC,eAAyB,EAAA;AAG/B,EAAA,KAAA,IAASnG,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIiG,QAAAA,CAAShG,QAAQD,CAAAA,EAAAA,EAAK;AACtC,IAAA,IAAIoG,QAAAA,GAAW,CAAA;AACf,IAAA,KAAA,MAAWC,OAAOL,IAAAA,EAAM;AACpB,MAAA,MAAMM,IAAAA,GAAOD,IAAIrG,CAAAA,CAAAA;AACjB,MAAA,IAAIsG,SAAShB,MAAAA,EAAWc,QAAAA,GAAWjG,KAAKU,GAAAA,CAAIuF,QAAAA,EAAUE,KAAKrG,MAAM,CAAA;AACrE,IAAA;AACAkG,IAAAA,YAAAA,CAAaI,KAAKH,QAAAA,CAAAA;AACtB,EAAA;AAGA,EAAA,MAAMI,UAAAA,mBAAa,MAAA,CAAA,CAACC,IAAAA,EAAcC,IAAAA,EAAcC,WAAmBC,KAAAA,KAAAA;AAC/D,IAAA,IAAIC,IAAAA,GAAOH,IAAAA;AACXP,IAAAA,YAAAA,CAAaW,OAAAA,CAAQ,CAACC,KAAAA,EAAOlF,KAAAA,KAAAA;AACzBgF,MAAAA,IAAAA,IAAQJ,IAAAA,CAAKO,MAAAA,CAAOD,KAAAA,GAAQ,CAAA,CAAA;AAC5B,MAAA,IAAIlF,KAAAA,GAAQsE,YAAAA,CAAalG,MAAAA,GAAS,CAAA,EAAG4G,IAAAA,IAAQF,SAAAA;WACxCE,IAAAA,IAAQD,KAAAA;IACjB,CAAA,CAAA;AACAC,IAAAA,IAAAA,IAAQ,IAAA;AACR,IAAA,OAAOA,IAAAA;EACX,CAAA,EATmB,YAAA,CAAA;AAYnBX,EAAAA,KAAAA,IAASM,UAAAA,CAAW,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,CAAA;AAEnCR,EAAAA,IAAAA,CAAKc,OAAAA,CAAQ,CAACT,GAAAA,EAAKY,QAAAA,KAAAA;AAEff,IAAAA,KAAAA,IAAS,QAAA;AACTG,IAAAA,GAAAA,CAAIS,OAAAA,CAAQ,CAACR,IAAAA,EAAMY,WAAAA,KAAAA;AACf,MAAA,MAAMC,WAAAA,GAAchB,aAAae,WAAAA,CAAAA;AACjC,MAAA,IAAIC,gBAAgB7B,MAAAA,EAAWY,KAAAA,IAAS,IAAII,IAAAA,CAAKc,MAAAA,CAAOD,WAAAA,CAAAA,CAAAA,OAAAA,CAAAA;IAC5D,CAAA,CAAA;AACAjB,IAAAA,KAAAA,IAAS,IAAA;AAGT,IAAA,IAAIe,QAAAA,GAAWjB,KAAK/F,MAAAA,GAAS,CAAA,WAAYuG,UAAAA,CAAW,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,CAAA;AAC9DN,SAAAA,KAAAA,IAASM,UAAAA,CAAW,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,CAAA;EAC5C,CAAA,CAAA;AAEA,EAAA,OAAON,KAAAA;AACX;AAjDgBH,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;ACiBT,SAASsB,QAAAA,CAAShC,KAAa5C,IAAAA,EAAsB;AACxD,EAAA,MAAMI,MAAAA,GAASwC,GAAAA,CACVnE,OAAAA,CAAQ,iBAAA,EAAmB,OAAA,EAC3BA,OAAAA,CAAQ,OAAA,EAAS,GAAA,CAAA,CACjBoG,IAAAA,EAAI;AAET,EAAA,IAAI7E,IAAAA,EAAM8C,UAAAA,EAAY,OAAOA,UAAAA,CAAW1C,MAAAA,CAAAA;AAExC,EAAA,OAAOA,MAAAA;AACX;AATgBwE,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;;;ACRT,SAASE,gBAAAA,CAAiBC,WAAmBC,QAAAA,EAAgB;AAChE,EAAA,OAAA,CAAQA,QAAAA,GAAWD,YAAY,CAAA,GAAI,CAAA,CAAA,EAAIC,WAAWD,SAAAA,CAAAA,CAAAA,GAAcC,QAAAA,GAAWD,SAAAA,EAAW7E,QAAAA,EAAQ;AAClG;AAFgB4E,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA","file":"index.cjs","sourcesContent":["import { readdir } from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport type { Logger } from '@seedcord/services';\nimport type * as fs from 'node:fs';\n/**\n * Determines if a directory entry is a TypeScript or JavaScript file.\n *\n * @param entry - The directory entry to check.\n * @returns True if the entry is a file ending with .ts or .js.\n */\nexport function isTsOrJsFile(entry: fs.Dirent): boolean {\n return (\n entry.isFile() &&\n (entry.name.endsWith('.ts') || entry.name.endsWith('.js')) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.map')\n );\n}\n\n/**\n * Recursively traverses through a directory, importing all .ts and .js files and applying a callback to each import.\n *\n * @param dir - The directory path to traverse.\n * @param callback - A function that will be called for each imported module. It receives the full file path, the file's relative path, and the imported module as arguments.\n * @returns A Promise that resolves when the traversal is complete.\n */\nexport async function traverseDirectory(\n dir: string,\n callback: (fullPath: string, relativePath: string, imported: Record<string, unknown>) => Promise<void> | void,\n logger: Logger\n): Promise<void> {\n let entries: fs.Dirent[];\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n logger.error('Failed to read this directory');\n entries = [];\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, callback, logger);\n } else if (isTsOrJsFile(entry)) {\n const imported = (await import(fullPath)) as Record<string, unknown>;\n await callback(fullPath, relativePath, imported);\n }\n }\n}\n","/**\n * Shuffles an array using the Fisher-Yates algorithm.\n * This function creates a new array with the same elements in a random order,\n * without modifying the original array.\n *\n * @typeParam TArray - The type of elements in the array\n * @param items - The array to shuffle\n * @returns A new array with the same elements in a random order\n *\n * @example\n * ```typescript\n * const numbers = [1, 2, 3, 4, 5];\n * const shuffled = fyShuffle(numbers);\n * // shuffled might be [3, 1, 5, 2, 4]\n * // numbers is still [1, 2, 3, 4, 5]\n * ```\n */\nexport function fyShuffle<TArray>(items: TArray[]): TArray[] {\n const array = items.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // @ts-expect-error - TypeScript doesn't recognize that TArray can be swapped\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n","/**\n * Return current time in seconds\n */\nexport function currentTime(): number {\n return Math.floor(Date.now() / 1000);\n}\n","/**\n * Generates a random numeric code with the specified number of digits.\n *\n * @param digits - The number of digits for the generated code.\n * @returns A random numeric code with the specified number of digits.\n */\nexport function generateCode(digits: number): number {\n const min = Math.pow(10, digits - 1);\n const max = Math.pow(10, digits) - 1;\n return Math.floor(Math.random() * (max - min + 1) + min);\n}\n","/**\n * Converts hexcode to number\n *\n * @param hex - The hex code to convert.\n * @returns The converted number.\n */\nexport function hexToNumber(hex: string): number {\n if (typeof hex !== 'string') {\n throw new TypeError('hexToNumber expects a string input');\n }\n\n const normalized = hex.replace(/^#/, '');\n if (!/^[0-9a-fA-F]+$/.test(normalized)) {\n throw new Error('Invalid hex string');\n }\n\n const converted = parseInt(normalized, 16);\n if (Number.isNaN(converted)) {\n throw new Error('Invalid hex string');\n }\n\n return converted;\n}\n","/**\n * Returns the ordinal suffix for a given number.\n *\n * @param n - The number to get the ordinal for\n * @returns The number with its ordinal suffix\n *\n * @example\n * ordinal(1); // \"1st\"\n * ordinal(22); // \"22nd\"\n * ordinal(13); // \"13th\"\n */\nexport function ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n const index = (v - 20) % 10;\n const suffix = s[index] ?? s[v] ?? s[0];\n if (!suffix) return `${n}th`;\n\n return `${n}${suffix}`;\n}\n","/**\n * Takes two numbers and returns the percentage of the first number in the second number with two decimal places.\n *\n * @param num1 - The first number.\n * @param num2 - The second number.\n *\n * @returns The percentage of the first number in the second number with two decimal places.\n */\n\nexport function percentage(num1: number, num2: number): number {\n return Number(((num1 / num2) * 100).toFixed(2));\n}\n","/**\n * Rounds a number to a specified number of decimal places.\n *\n * @param num - The number to be rounded.\n * @param precision - The number of decimal places to round to.\n * @returns The rounded number.\n */\n\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round((num + Number.EPSILON) * factor) / factor;\n}\n","import type { TupleOf } from 'type-fest';\n\nexport interface RoundToDenomOptions {\n /**\n * Suffixes to use for each denomination level. Defaults to `['K', 'M', 'B', 'T', 'Q']`.\n */\n suffixes?: TupleOf<5, string>;\n /** Number of decimal places to include in the rounded result. Defaults to `1`. */\n precision?: number;\n}\n\n/**\n * Rounds a number to a string representation with a denomination suffix.\n * @param num - The number to round.\n * @example\n * ```ts\n * roundToDenomination(1234); // \"1.2K\"\n * roundToDenomination(10000, ['k', 'm', 'b', 't', 'q']); // \"10k\"\n * roundToDenomination(12345678); // \"12.3M\"\n * ```\n * @returns The rounded number as a string with a denomination suffix.\n */\nexport function roundToDenomination(num: number, opts?: RoundToDenomOptions): string {\n const { suffixes = ['K', 'M', 'B', 'T', 'Q'], precision = 1 } = opts ?? {};\n\n if (num < 10000) {\n return num.toString();\n }\n\n let index = -1;\n let temp = num;\n\n while (temp >= 1000 && index < suffixes.length - 1) {\n temp /= 1000;\n index++;\n }\n\n let result;\n\n if (temp % 1 === 0) {\n result = temp.toString();\n } else {\n const adjustedTemp = Math.round(temp * Math.pow(10, precision + 1)) / Math.pow(10, precision + 1);\n result = adjustedTemp.toFixed(precision);\n }\n\n if (result.endsWith('.9')) {\n result = Math.ceil(Number(result)).toString();\n }\n\n if (result.endsWith('.0')) {\n result = result.substring(0, result.length - 2);\n }\n\n if (result === '1000') {\n index += 1;\n result = '1';\n }\n\n return result + (index >= 0 ? suffixes[index] : '');\n}\n","import type { ILogger } from '@seedcord/types';\nimport type { JsonPrimitive } from 'type-fest';\n\n/**\n * JSONify an arbitrary type while allowing any object position to be replaced\n * by a circular marker. Optional keys stay optional.\n */\nexport type JsonifyWithCirculars<BaseType, Marker extends string = '[Circular]'> = BaseType extends JsonPrimitive\n ? BaseType\n : BaseType extends bigint\n ? string\n : BaseType extends Date\n ? string\n : BaseType extends { toJSON(): infer J }\n ? unknown extends J\n ? JsonifyObject<BaseType, Marker>\n : JsonifyWithCirculars<J, Marker>\n : BaseType extends readonly (infer U)[]\n ? (JsonifyWithCirculars<U, Marker> | Marker)[]\n : BaseType extends Map<infer K, infer V>\n ? [JsonifyWithCirculars<K, Marker> | Marker, JsonifyWithCirculars<V, Marker> | Marker][]\n : BaseType extends Set<infer U2>\n ? (JsonifyWithCirculars<U2, Marker> | Marker)[]\n : BaseType extends (...args: unknown[]) => unknown\n ? never\n : BaseType extends object\n ? JsonifyObject<BaseType, Marker>\n : never;\n\n/**\n * Helper to JSONify object types with circular markers.\n *\n * @internal\n */\nexport type JsonifyObject<BaseType, Marker extends string> = {\n [K in keyof BaseType as K extends symbol\n ? never\n : BaseType[K] extends (...args: unknown[]) => unknown\n ? never\n : K]:\n | JsonifyWithCirculars<Exclude<BaseType[K], undefined>, Marker>\n | Extract<BaseType[K], undefined>\n | Marker;\n};\n\n/**\n * Configuration for {@link filterCirculars}.\n */\nexport interface FilterCircularsOptions<Marker extends string = '[Circular]'> {\n /** Optional {@link ILogger} used to log stringify or parse errors. */\n logger?: ILogger;\n /** Override the circular placeholder. Default is `[Circular]`. */\n marker?: Marker;\n /** Processing mode. `json` uses stringify and parse (might end up using a `toJSON()` if found). `decycle` builds a safe clone first. Default is `decycle`. */\n mode?: 'json' | 'decycle';\n}\n\n/**\n * Creates a clean, JSON safe copy of a value and replaces circular references with a marker.\n *\n * In `json` mode it behaves like stringify then parse with a replacer that handles cycles and BigInt.\n * In `decycle` mode it first clones without using toJSON, then you can stringify the result later.\n *\n * @typeParam ObjType - Type of the input value.\n * @typeParam Marker - Marker string used for circular references.\n *\n * @param value - The value to clone safely.\n * @param options - Optional configuration.\n *\n * @returns A JSON safe structure with circular references replaced by the marker.\n *\n * @example\n * ```ts\n * interface Test {\n * name: string;\n * self?: Test;\n * }\n *\n * const obj: Test = { name: 'seedcord' };\n * obj.self = obj;\n *\n * const clean = filterCirculars(obj);\n * // ^? { name: string; self?: \"[Circular]\" | { ... } }\n * console.log(clean.self); // \"[Circular]\"\n * ```\n */\nexport function filterCirculars<ObjType, Marker extends string = '[Circular]'>(\n value: ObjType,\n options?: FilterCircularsOptions<Marker>\n): JsonifyWithCirculars<ObjType, Marker> {\n const logger = options?.logger;\n const marker = (options?.marker ?? '[Circular]') as Marker;\n const mode = options?.mode ?? 'decycle';\n\n if (mode === 'json') return json(value, marker, logger);\n\n try {\n return decycle(value, marker);\n } catch (error) {\n logger?.error('filterCirculars decycle error', error);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Attempts to build a JSONified object using JSON.stringify and JSON.parse.\n *\n * @internal\n */\nfunction json<ObjType, Marker extends string>(\n value: ObjType,\n marker: Marker,\n logger?: ILogger\n): JsonifyWithCirculars<ObjType, Marker> {\n const seen = new WeakSet<object>();\n let json: string | undefined;\n\n try {\n json = JSON.stringify(value, (_k: string, v: unknown) => {\n if (typeof v === 'bigint') return v.toString();\n if (typeof v === 'object' && v !== null) {\n const obj = v;\n if (seen.has(obj)) return marker;\n seen.add(obj);\n }\n return v;\n });\n } catch (error) {\n logger?.error('filterCirculars stringify error', error);\n if (typeof value === 'object' && value !== null) {\n logger?.error('top level keys', Object.keys(value as Record<string, unknown>));\n }\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n if (typeof json !== 'string') {\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n try {\n return JSON.parse(json) as JsonifyWithCirculars<ObjType, Marker>;\n } catch (error) {\n logger?.error('filterCirculars parse error', error);\n logger?.error('bad JSON', json);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Builds a JSON safe clone without calling toJSON on class instances.\n *\n * @internal\n */\nfunction decycle<ObjType, Marker extends string = '[Circular]'>(\n input: ObjType,\n marker: Marker,\n seen = new WeakSet<object>()\n): JsonifyWithCirculars<ObjType, Marker> {\n const recur = (val: unknown): unknown => {\n if (val === null) return null;\n const t = typeof val;\n\n // if bigint, return string representation\n if (t === 'bigint') return (val as bigint).toString();\n\n // if primitive, return as is\n if (t !== 'object') return val;\n\n const obj = val as Record<string | number | symbol, unknown>;\n\n if (seen.has(obj)) return marker;\n seen.add(obj);\n\n // if Date, return ISO string\n if (obj instanceof Date) return obj.toISOString();\n\n // if RegExp, return string representation\n if (obj instanceof RegExp) return obj.toString();\n\n // if array, recur on each item\n if (Array.isArray(obj)) {\n return obj.map((item) => recur(item));\n }\n\n // if Map, recur on entries/values\n if (obj instanceof Map) {\n return Array.from(obj, ([k, v]) => [recur(k), recur(v)]);\n }\n\n // if Set, recur on values\n if (obj instanceof Set) {\n return Array.from(obj, (v) => recur(v));\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'function') continue;\n out[k] = recur(v);\n }\n\n return out;\n };\n\n return recur(input) as JsonifyWithCirculars<ObjType, Marker>;\n}\n","/**\n * Pulls out only the keys from an object that actually have values.\n *\n * @typeParam TObject - the original object type you're pulling from\n * @typeParam TKey - the specific keys you want to copy if they're defined\n * @param source - the object to read values from\n * @param keys - optional list of keys you want to include if they exist. If omitted, all keys are considered\n *\n * @example\n * ```ts\n * interface Config {\n * host?: string;\n * port?: number;\n * user?: string;\n * password?: string;\n * }\n *\n * const config: Config = {\n * host: 'localhost',\n * port: undefined,\n * user: 'admin',\n * password: undefined\n * };\n *\n * const definedConfig = keepDefined(config, 'host', 'port', 'user', 'password');\n * // Result: { host: 'localhost', user: 'admin' }\n * ```\n */\nexport function keepDefined<TObject extends object, TKey extends keyof TObject>(\n source: TObject,\n ...keys: readonly TKey[]\n): Partial<Pick<TObject, TKey extends never ? keyof TObject : TKey>> {\n const selectedKeys = keys.length > 0 ? keys : (Object.keys(source) as TKey[]);\n const result: Partial<TObject> = {};\n\n for (const key of selectedKeys) {\n const value = source[key];\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Returns the word with its first letter capitalized and the rest in lowercase.\n * @param word - The word to be formatted.\n * @returns The formatted word.\n */\nexport function capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n","/**\n * Function takes an array of strings or numbers and returns the number of characters in the longest string/number\n *\n * @param arr - The array of strings or numbers\n * @returns The length of the longest element when converted to string\n */\n\nexport function longestStringLength(arr: (string | number)[]): number {\n return Math.max(...arr.map((el) => el.toString().length));\n}\n","/**\n * Generates an ASCII table from the provided data.\n *\n * @param data - The data to be displayed in the table.\n * @returns The generated ASCII table as a string.\n */\n\nexport function generateAsciiTable(data: string[][]): string {\n if (data.length === 0) return '';\n\n const firstRow = data[0];\n if (!firstRow || firstRow.length === 0) return '';\n\n let table = '';\n const columnWidths: number[] = [];\n\n // Determine the maximum width for each column\n for (let i = 0; i < firstRow.length; i++) {\n let maxWidth = 0;\n for (const row of data) {\n const cell = row[i];\n if (cell !== undefined) maxWidth = Math.max(maxWidth, cell.length);\n }\n columnWidths.push(maxWidth);\n }\n\n // Function to create a horizontal line\n const createLine = (char: string, left: string, intersect: string, right: string): string => {\n let line = left;\n columnWidths.forEach((width, index) => {\n line += char.repeat(width + 2);\n if (index < columnWidths.length - 1) line += intersect;\n else line += right;\n });\n line += '\\n';\n return line;\n };\n\n // Top border\n table += createLine('═', '╔', '╦', '╗');\n\n data.forEach((row, rowIndex) => {\n // Row content\n table += '║';\n row.forEach((cell, columnIndex) => {\n const columnWidth = columnWidths[columnIndex];\n if (columnWidth !== undefined) table += ` ${cell.padEnd(columnWidth)} ║`;\n });\n table += '\\n';\n\n // Separator or bottom border\n if (rowIndex < data.length - 1) table += createLine('─', '╠', '╬', '╣');\n else table += createLine('═', '╚', '╩', '╝');\n });\n\n return table;\n}\n","import { capitalize } from './capitalize';\n\n/**\n * Options for the `prettify` function.\n */\nexport interface PrettifyOptions {\n capitalize?: boolean;\n}\n/**\n * Converts a string from any common naming convention to human-readable format.\n * Handles camelCase, PascalCase, snake_case, and kebab-case.\n *\n * @param key - The string to convert\n * @param opts - Optional configuration\n * @returns A space-separated, human-readable string\n *\n * @example\n * prettify(\"camelCaseString\") // \"camel Case String\"\n * prettify(\"PascalCaseString\") // \"Pascal Case String\"\n * prettify(\"snake_case_string\") // \"snake case string\"\n * prettify(\"kebab-case-string\") // \"kebab case string\"\n * prettify(\"mixedCase_string-name\") // \"mixed Case string name\"\n */\n\nexport function prettify(key: string, opts?: PrettifyOptions): string {\n const result = key\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase/PascalCase\n .replace(/[_-]/g, ' ') // snake_case and kebab-case\n .trim();\n\n if (opts?.capitalize) return capitalize(result);\n\n return result;\n}\n","/**\n * Calculates the difference between two numbers and formats it as a string with a '+' prefix for positive differences.\n *\n * @param numBefore - The initial number value\n * @param numAfter - The final number value\n * @returns A string representing the difference, with a '+' sign for positive differences\n *\n * @example\n * // Returns \"+5\"\n * prettyDifference(10, 15);\n *\n * @example\n * // Returns \"-3\"\n * prettyDifference(10, 7);\n */\n\nexport function prettyDifference(numBefore: number, numAfter: number): string {\n return (numAfter - numBefore > 0 ? `+${numAfter - numBefore}` : numAfter - numBefore).toString();\n}\n"]}
1
+ {"version":3,"sources":["../src/misc/directory.ts","../src/misc/fyShuffle.ts","../src/numbers/currentTime.ts","../src/numbers/generateCode.ts","../src/numbers/hexToNumber.ts","../src/numbers/ordinal.ts","../src/numbers/percentage.ts","../src/numbers/round.ts","../src/numbers/roundToDenomination.ts","../src/objects/filterCirculars.ts","../src/objects/keepDefined.ts","../src/strings/capitalize.ts","../src/strings/longestStringLength.ts","../src/strings/generateAsciiTable.ts","../src/strings/prettify.ts","../src/strings/prettyDifference.ts"],"names":["isTsOrJsFile","entry","isFile","name","endsWith","traverseDirectory","dir","callback","logger","entries","readdir","withFileTypes","error","fullPath","join","relativePath","relative","process","cwd","isDirectory","imported","fyShuffle","items","array","slice","i","length","j","Math","floor","random","currentTime","Date","now","generateCode","digits","min","pow","max","hexToNumber","hex","SeedcordTypeError","SeedcordErrorCode","UtilHexInputType","normalized","replace","test","SeedcordError","UtilHexInvalid","converted","parseInt","Number","isNaN","ordinal","n","s","v","index","suffix","percentage","num1","num2","toFixed","round","num","precision","factor","EPSILON","roundToDenomination","opts","suffixes","toString","temp","result","adjustedTemp","ceil","substring","filterCirculars","value","options","marker","mode","json","decycle","seen","WeakSet","JSON","stringify","_k","obj","has","add","Object","keys","parse","input","recur","val","t","toISOString","RegExp","Array","isArray","map","item","Map","from","k","Set","out","keepDefined","source","selectedKeys","key","undefined","capitalize","word","charAt","toUpperCase","toLowerCase","longestStringLength","arr","el","generateAsciiTable","data","firstRow","table","columnWidths","maxWidth","row","cell","push","createLine","char","left","intersect","right","line","forEach","width","repeat","rowIndex","columnIndex","columnWidth","padEnd","prettify","trim","prettyDifference","numBefore","numAfter"],"mappings":"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","file":"index.cjs","sourcesContent":["import { readdir } from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport type { Logger } from '@seedcord/services';\nimport type * as fs from 'node:fs';\n/**\n * Determines if a directory entry is a TypeScript or JavaScript file.\n *\n * @param entry - The directory entry to check.\n * @returns True if the entry is a file ending with .ts or .js.\n */\nexport function isTsOrJsFile(entry: fs.Dirent): boolean {\n return (\n entry.isFile() &&\n (entry.name.endsWith('.ts') || entry.name.endsWith('.js')) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.map')\n );\n}\n\n/**\n * Recursively traverses through a directory, importing all .ts and .js files and applying a callback to each import.\n *\n * @param dir - The directory path to traverse.\n * @param callback - A function that will be called for each imported module. It receives the full file path, the file's relative path, and the imported module as arguments.\n * @returns A Promise that resolves when the traversal is complete.\n */\nexport async function traverseDirectory(\n dir: string,\n callback: (fullPath: string, relativePath: string, imported: Record<string, unknown>) => Promise<void> | void,\n logger: Logger\n): Promise<void> {\n let entries: fs.Dirent[];\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n logger.error('Failed to read this directory');\n entries = [];\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, callback, logger);\n } else if (isTsOrJsFile(entry)) {\n const imported = (await import(fullPath)) as Record<string, unknown>;\n await callback(fullPath, relativePath, imported);\n }\n }\n}\n","/**\n * Shuffles an array using the Fisher-Yates algorithm.\n * This function creates a new array with the same elements in a random order,\n * without modifying the original array.\n *\n * @typeParam TArray - The type of elements in the array\n * @param items - The array to shuffle\n * @returns A new array with the same elements in a random order\n *\n * @example\n * ```typescript\n * const numbers = [1, 2, 3, 4, 5];\n * const shuffled = fyShuffle(numbers);\n * // shuffled might be [3, 1, 5, 2, 4]\n * // numbers is still [1, 2, 3, 4, 5]\n * ```\n */\nexport function fyShuffle<TArray>(items: TArray[]): TArray[] {\n const array = items.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // @ts-expect-error - TypeScript doesn't recognize that TArray can be swapped\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n","/**\n * Return current time in seconds\n */\nexport function currentTime(): number {\n return Math.floor(Date.now() / 1000);\n}\n","/**\n * Generates a random numeric code with the specified number of digits.\n *\n * @param digits - The number of digits for the generated code.\n * @returns A random numeric code with the specified number of digits.\n */\nexport function generateCode(digits: number): number {\n const min = Math.pow(10, digits - 1);\n const max = Math.pow(10, digits) - 1;\n return Math.floor(Math.random() * (max - min + 1) + min);\n}\n","import { SeedcordError, SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\n\n/**\n * Converts hexcode to number\n *\n * @param hex - The hex code to convert.\n * @returns The converted number.\n */\nexport function hexToNumber(hex: string): number {\n if (typeof hex !== 'string') {\n throw new SeedcordTypeError(SeedcordErrorCode.UtilHexInputType);\n }\n\n const normalized = hex.replace(/^#/, '');\n if (!/^[0-9a-fA-F]+$/.test(normalized)) {\n throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);\n }\n\n const converted = parseInt(normalized, 16);\n if (Number.isNaN(converted)) {\n throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);\n }\n\n return converted;\n}\n","/**\n * Returns the ordinal suffix for a given number.\n *\n * @param n - The number to get the ordinal for\n * @returns The number with its ordinal suffix\n *\n * @example\n * ordinal(1); // \"1st\"\n * ordinal(22); // \"22nd\"\n * ordinal(13); // \"13th\"\n */\nexport function ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n const index = (v - 20) % 10;\n const suffix = s[index] ?? s[v] ?? s[0];\n if (!suffix) return `${n}th`;\n\n return `${n}${suffix}`;\n}\n","/**\n * Takes two numbers and returns the percentage of the first number in the second number with two decimal places.\n *\n * @param num1 - The first number.\n * @param num2 - The second number.\n *\n * @returns The percentage of the first number in the second number with two decimal places.\n */\nexport function percentage(num1: number, num2: number): number {\n return Number(((num1 / num2) * 100).toFixed(2));\n}\n","/**\n * Rounds a number to a specified number of decimal places.\n *\n * @param num - The number to be rounded.\n * @param precision - The number of decimal places to round to.\n * @returns The rounded number.\n */\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round((num + Number.EPSILON) * factor) / factor;\n}\n","import type { TupleOf } from 'type-fest';\n\nexport interface RoundToDenomOptions {\n /**\n * Suffixes to use for each denomination level. Defaults to `['K', 'M', 'B', 'T', 'Q']`.\n */\n suffixes?: TupleOf<5, string>;\n /** Number of decimal places to include in the rounded result. Defaults to `1`. */\n precision?: number;\n}\n\n/**\n * Rounds a number to a string representation with a denomination suffix.\n * @param num - The number to round.\n * @example\n * ```ts\n * roundToDenomination(1234); // \"1.2K\"\n * roundToDenomination(10000, ['k', 'm', 'b', 't', 'q']); // \"10k\"\n * roundToDenomination(12345678); // \"12.3M\"\n * ```\n * @returns The rounded number as a string with a denomination suffix.\n */\nexport function roundToDenomination(num: number, opts?: RoundToDenomOptions): string {\n const { suffixes = ['K', 'M', 'B', 'T', 'Q'], precision = 1 } = opts ?? {};\n\n if (num < 10000) {\n return num.toString();\n }\n\n let index = -1;\n let temp = num;\n\n while (temp >= 1000 && index < suffixes.length - 1) {\n temp /= 1000;\n index++;\n }\n\n let result;\n\n if (temp % 1 === 0) {\n result = temp.toString();\n } else {\n const adjustedTemp = Math.round(temp * Math.pow(10, precision + 1)) / Math.pow(10, precision + 1);\n result = adjustedTemp.toFixed(precision);\n }\n\n if (result.endsWith('.9')) {\n result = Math.ceil(Number(result)).toString();\n }\n\n if (result.endsWith('.0')) {\n result = result.substring(0, result.length - 2);\n }\n\n if (result === '1000') {\n index += 1;\n result = '1';\n }\n\n return result + (index >= 0 ? suffixes[index] : '');\n}\n","import type { ILogger } from '@seedcord/types';\nimport type { JsonPrimitive } from 'type-fest';\n\n/**\n * JSONify an arbitrary type while allowing any object position to be replaced\n * by a circular marker. Optional keys stay optional.\n */\nexport type JsonifyWithCirculars<BaseType, Marker extends string = '[Circular]'> = BaseType extends JsonPrimitive\n ? BaseType\n : BaseType extends bigint\n ? string\n : BaseType extends Date\n ? string\n : BaseType extends { toJSON(): infer J }\n ? unknown extends J\n ? JsonifyObject<BaseType, Marker>\n : JsonifyWithCirculars<J, Marker>\n : BaseType extends readonly (infer U)[]\n ? (JsonifyWithCirculars<U, Marker> | Marker)[]\n : BaseType extends Map<infer K, infer V>\n ? [JsonifyWithCirculars<K, Marker> | Marker, JsonifyWithCirculars<V, Marker> | Marker][]\n : BaseType extends Set<infer U2>\n ? (JsonifyWithCirculars<U2, Marker> | Marker)[]\n : BaseType extends (...args: unknown[]) => unknown\n ? never\n : BaseType extends object\n ? JsonifyObject<BaseType, Marker>\n : never;\n\n/**\n * Helper to JSONify object types with circular markers.\n *\n * @internal\n */\nexport type JsonifyObject<BaseType, Marker extends string> = {\n [K in keyof BaseType as K extends symbol\n ? never\n : BaseType[K] extends (...args: unknown[]) => unknown\n ? never\n : K]:\n | JsonifyWithCirculars<Exclude<BaseType[K], undefined>, Marker>\n | Extract<BaseType[K], undefined>\n | Marker;\n};\n\n/**\n * Configuration for {@link filterCirculars}.\n */\nexport interface FilterCircularsOptions<Marker extends string = '[Circular]'> {\n /** Optional {@link ILogger} used to log stringify or parse errors. */\n logger?: ILogger;\n /** Override the circular placeholder. Default is `[Circular]`. */\n marker?: Marker;\n /** Processing mode. `json` uses stringify and parse (might end up using a `toJSON()` if found). `decycle` builds a safe clone first. Default is `decycle`. */\n mode?: 'json' | 'decycle';\n}\n\n/**\n * Creates a clean, JSON safe copy of a value and replaces circular references with a marker.\n *\n * In `json` mode it behaves like stringify then parse with a replacer that handles cycles and BigInt.\n * In `decycle` mode it first clones without using toJSON, then you can stringify the result later.\n *\n * @typeParam ObjType - Type of the input value.\n * @typeParam Marker - Marker string used for circular references.\n *\n * @param value - The value to clone safely.\n * @param options - Optional configuration.\n *\n * @returns A JSON safe structure with circular references replaced by the marker.\n *\n * @example\n * ```ts\n * interface Test {\n * name: string;\n * self?: Test;\n * }\n *\n * const obj: Test = { name: 'seedcord' };\n * obj.self = obj;\n *\n * const clean = filterCirculars(obj);\n * // ^? { name: string; self?: \"[Circular]\" | { ... } }\n * console.log(clean.self); // \"[Circular]\"\n * ```\n */\nexport function filterCirculars<ObjType, Marker extends string = '[Circular]'>(\n value: ObjType,\n options?: FilterCircularsOptions<Marker>\n): JsonifyWithCirculars<ObjType, Marker> {\n const logger = options?.logger;\n const marker = (options?.marker ?? '[Circular]') as Marker;\n const mode = options?.mode ?? 'decycle';\n\n if (mode === 'json') return json(value, marker, logger);\n\n try {\n return decycle(value, marker);\n } catch (error) {\n logger?.error('filterCirculars decycle error', error);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Attempts to build a JSONified object using JSON.stringify and JSON.parse.\n *\n * @internal\n */\nfunction json<ObjType, Marker extends string>(\n value: ObjType,\n marker: Marker,\n logger?: ILogger\n): JsonifyWithCirculars<ObjType, Marker> {\n const seen = new WeakSet<object>();\n let json: string | undefined;\n\n try {\n json = JSON.stringify(value, (_k: string, v: unknown) => {\n if (typeof v === 'bigint') return v.toString();\n if (typeof v === 'object' && v !== null) {\n const obj = v;\n if (seen.has(obj)) return marker;\n seen.add(obj);\n }\n return v;\n });\n } catch (error) {\n logger?.error('filterCirculars stringify error', error);\n if (typeof value === 'object' && value !== null) {\n logger?.error('top level keys', Object.keys(value as Record<string, unknown>));\n }\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n if (typeof json !== 'string') {\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n try {\n return JSON.parse(json) as JsonifyWithCirculars<ObjType, Marker>;\n } catch (error) {\n logger?.error('filterCirculars parse error', error);\n logger?.error('bad JSON', json);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Builds a JSON safe clone without calling toJSON on class instances.\n *\n * @internal\n */\nfunction decycle<ObjType, Marker extends string = '[Circular]'>(\n input: ObjType,\n marker: Marker,\n seen = new WeakSet<object>()\n): JsonifyWithCirculars<ObjType, Marker> {\n const recur = (val: unknown): unknown => {\n if (val === null) return null;\n const t = typeof val;\n\n // if bigint, return string representation\n if (t === 'bigint') return (val as bigint).toString();\n\n // if primitive, return as is\n if (t !== 'object') return val;\n\n const obj = val as Record<string | number | symbol, unknown>;\n\n if (seen.has(obj)) return marker;\n seen.add(obj);\n\n // if Date, return ISO string\n if (obj instanceof Date) return obj.toISOString();\n\n // if RegExp, return string representation\n if (obj instanceof RegExp) return obj.toString();\n\n // if array, recur on each item\n if (Array.isArray(obj)) {\n return obj.map((item) => recur(item));\n }\n\n // if Map, recur on entries/values\n if (obj instanceof Map) {\n return Array.from(obj, ([k, v]) => [recur(k), recur(v)]);\n }\n\n // if Set, recur on values\n if (obj instanceof Set) {\n return Array.from(obj, (v) => recur(v));\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'function') continue;\n out[k] = recur(v);\n }\n\n return out;\n };\n\n return recur(input) as JsonifyWithCirculars<ObjType, Marker>;\n}\n","/**\n * Pulls out only the keys from an object that actually have values.\n *\n * @typeParam TObject - the original object type you're pulling from\n * @typeParam TKey - the specific keys you want to copy if they're defined\n * @param source - the object to read values from\n * @param keys - optional list of keys you want to include if they exist. If omitted, all keys are considered\n *\n * @example\n * ```ts\n * interface Config {\n * host?: string;\n * port?: number;\n * user?: string;\n * password?: string;\n * }\n *\n * const config: Config = {\n * host: 'localhost',\n * port: undefined,\n * user: 'admin',\n * password: undefined\n * };\n *\n * const definedConfig = keepDefined(config, 'host', 'port', 'user', 'password');\n * // Result: { host: 'localhost', user: 'admin' }\n * ```\n */\nexport function keepDefined<TObject extends object, TKey extends keyof TObject>(\n source: TObject,\n ...keys: readonly TKey[]\n): Partial<Pick<TObject, TKey extends never ? keyof TObject : TKey>> {\n const selectedKeys = keys.length > 0 ? keys : (Object.keys(source) as TKey[]);\n const result: Partial<TObject> = {};\n\n for (const key of selectedKeys) {\n const value = source[key];\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Returns the word with its first letter capitalized and the rest in lowercase.\n * @param word - The word to be formatted.\n * @returns The formatted word.\n */\nexport function capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n","/**\n * Function takes an array of strings or numbers and returns the number of characters in the longest string/number\n *\n * @param arr - The array of strings or numbers\n * @returns The length of the longest element when converted to string\n */\nexport function longestStringLength(arr: (string | number)[]): number {\n return Math.max(...arr.map((el) => el.toString().length));\n}\n","/**\n * Generates an ASCII table from the provided data.\n *\n * @param data - The data to be displayed in the table.\n * @returns The generated ASCII table as a string.\n */\nexport function generateAsciiTable(data: string[][]): string {\n if (data.length === 0) return '';\n\n const firstRow = data[0];\n if (!firstRow || firstRow.length === 0) return '';\n\n let table = '';\n const columnWidths: number[] = [];\n\n // Determine the maximum width for each column\n for (let i = 0; i < firstRow.length; i++) {\n let maxWidth = 0;\n for (const row of data) {\n const cell = row[i];\n if (cell !== undefined) maxWidth = Math.max(maxWidth, cell.length);\n }\n columnWidths.push(maxWidth);\n }\n\n // Function to create a horizontal line\n const createLine = (char: string, left: string, intersect: string, right: string): string => {\n let line = left;\n columnWidths.forEach((width, index) => {\n line += char.repeat(width + 2);\n if (index < columnWidths.length - 1) line += intersect;\n else line += right;\n });\n line += '\\n';\n return line;\n };\n\n // Top border\n table += createLine('═', '╔', '╦', '╗');\n\n data.forEach((row, rowIndex) => {\n // Row content\n table += '║';\n row.forEach((cell, columnIndex) => {\n const columnWidth = columnWidths[columnIndex];\n if (columnWidth !== undefined) table += ` ${cell.padEnd(columnWidth)} ║`;\n });\n table += '\\n';\n\n // Separator or bottom border\n if (rowIndex < data.length - 1) table += createLine('─', '╠', '╬', '╣');\n else table += createLine('═', '╚', '╩', '╝');\n });\n\n return table;\n}\n","import { capitalize } from './capitalize';\n\n/**\n * Options for the `prettify` function.\n */\nexport interface PrettifyOptions {\n capitalize?: boolean;\n}\n/**\n * Converts a string from any common naming convention to human-readable format.\n * Handles camelCase, PascalCase, snake_case, and kebab-case.\n *\n * @param key - The string to convert\n * @param opts - Optional configuration\n * @returns A space-separated, human-readable string\n *\n * @example\n * prettify(\"camelCaseString\") // \"camel Case String\"\n * prettify(\"PascalCaseString\") // \"Pascal Case String\"\n * prettify(\"snake_case_string\") // \"snake case string\"\n * prettify(\"kebab-case-string\") // \"kebab case string\"\n * prettify(\"mixedCase_string-name\") // \"mixed Case string name\"\n */\n\nexport function prettify(key: string, opts?: PrettifyOptions): string {\n const result = key\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase/PascalCase\n .replace(/[_-]/g, ' ') // snake_case and kebab-case\n .trim();\n\n if (opts?.capitalize) return capitalize(result);\n\n return result;\n}\n","/**\n * Calculates the difference between two numbers and formats it as a string with a '+' prefix for positive differences.\n *\n * @param numBefore - The initial number value\n * @param numAfter - The final number value\n * @returns A string representing the difference, with a '+' sign for positive differences\n *\n * @example\n * // Returns \"+5\"\n * prettyDifference(10, 15);\n *\n * @example\n * // Returns \"-3\"\n * prettyDifference(10, 7);\n */\nexport function prettyDifference(numBefore: number, numAfter: number): string {\n return (numAfter - numBefore > 0 ? `+${numAfter - numBefore}` : numAfter - numBefore).toString();\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { readdir } from 'fs/promises';
2
2
  import * as path from 'path';
3
+ import { SeedcordTypeError, SeedcordErrorCode, SeedcordError } from '@seedcord/services';
3
4
 
4
5
  var __defProp = Object.defineProperty;
5
6
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -57,19 +58,17 @@ function generateCode(digits) {
57
58
  return Math.floor(Math.random() * (max - min + 1) + min);
58
59
  }
59
60
  __name(generateCode, "generateCode");
60
-
61
- // src/numbers/hexToNumber.ts
62
61
  function hexToNumber(hex) {
63
62
  if (typeof hex !== "string") {
64
- throw new TypeError("hexToNumber expects a string input");
63
+ throw new SeedcordTypeError(SeedcordErrorCode.UtilHexInputType);
65
64
  }
66
65
  const normalized = hex.replace(/^#/, "");
67
66
  if (!/^[0-9a-fA-F]+$/.test(normalized)) {
68
- throw new Error("Invalid hex string");
67
+ throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);
69
68
  }
70
69
  const converted = parseInt(normalized, 16);
71
70
  if (Number.isNaN(converted)) {
72
- throw new Error("Invalid hex string");
71
+ throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);
73
72
  }
74
73
  return converted;
75
74
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/misc/directory.ts","../src/misc/fyShuffle.ts","../src/numbers/currentTime.ts","../src/numbers/generateCode.ts","../src/numbers/hexToNumber.ts","../src/numbers/ordinal.ts","../src/numbers/percentage.ts","../src/numbers/round.ts","../src/numbers/roundToDenomination.ts","../src/objects/filterCirculars.ts","../src/objects/keepDefined.ts","../src/strings/capitalize.ts","../src/strings/longestStringLength.ts","../src/strings/generateAsciiTable.ts","../src/strings/prettify.ts","../src/strings/prettyDifference.ts"],"names":["isTsOrJsFile","entry","isFile","name","endsWith","traverseDirectory","dir","callback","logger","entries","readdir","withFileTypes","error","fullPath","join","relativePath","relative","process","cwd","isDirectory","imported","fyShuffle","items","array","slice","i","length","j","Math","floor","random","currentTime","Date","now","generateCode","digits","min","pow","max","hexToNumber","hex","TypeError","normalized","replace","test","Error","converted","parseInt","Number","isNaN","ordinal","n","s","v","index","suffix","percentage","num1","num2","toFixed","round","num","precision","factor","EPSILON","roundToDenomination","opts","suffixes","toString","temp","result","adjustedTemp","ceil","substring","filterCirculars","value","options","marker","mode","json","decycle","seen","WeakSet","JSON","stringify","_k","obj","has","add","Object","keys","parse","input","recur","val","t","toISOString","RegExp","Array","isArray","map","item","Map","from","k","Set","out","keepDefined","source","selectedKeys","key","undefined","capitalize","word","charAt","toUpperCase","toLowerCase","longestStringLength","arr","el","generateAsciiTable","data","firstRow","table","columnWidths","maxWidth","row","cell","push","createLine","char","left","intersect","right","line","forEach","width","repeat","rowIndex","columnIndex","columnWidth","padEnd","prettify","trim","prettyDifference","numBefore","numAfter"],"mappings":"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","file":"index.mjs","sourcesContent":["import { readdir } from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport type { Logger } from '@seedcord/services';\nimport type * as fs from 'node:fs';\n/**\n * Determines if a directory entry is a TypeScript or JavaScript file.\n *\n * @param entry - The directory entry to check.\n * @returns True if the entry is a file ending with .ts or .js.\n */\nexport function isTsOrJsFile(entry: fs.Dirent): boolean {\n return (\n entry.isFile() &&\n (entry.name.endsWith('.ts') || entry.name.endsWith('.js')) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.map')\n );\n}\n\n/**\n * Recursively traverses through a directory, importing all .ts and .js files and applying a callback to each import.\n *\n * @param dir - The directory path to traverse.\n * @param callback - A function that will be called for each imported module. It receives the full file path, the file's relative path, and the imported module as arguments.\n * @returns A Promise that resolves when the traversal is complete.\n */\nexport async function traverseDirectory(\n dir: string,\n callback: (fullPath: string, relativePath: string, imported: Record<string, unknown>) => Promise<void> | void,\n logger: Logger\n): Promise<void> {\n let entries: fs.Dirent[];\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n logger.error('Failed to read this directory');\n entries = [];\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, callback, logger);\n } else if (isTsOrJsFile(entry)) {\n const imported = (await import(fullPath)) as Record<string, unknown>;\n await callback(fullPath, relativePath, imported);\n }\n }\n}\n","/**\n * Shuffles an array using the Fisher-Yates algorithm.\n * This function creates a new array with the same elements in a random order,\n * without modifying the original array.\n *\n * @typeParam TArray - The type of elements in the array\n * @param items - The array to shuffle\n * @returns A new array with the same elements in a random order\n *\n * @example\n * ```typescript\n * const numbers = [1, 2, 3, 4, 5];\n * const shuffled = fyShuffle(numbers);\n * // shuffled might be [3, 1, 5, 2, 4]\n * // numbers is still [1, 2, 3, 4, 5]\n * ```\n */\nexport function fyShuffle<TArray>(items: TArray[]): TArray[] {\n const array = items.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // @ts-expect-error - TypeScript doesn't recognize that TArray can be swapped\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n","/**\n * Return current time in seconds\n */\nexport function currentTime(): number {\n return Math.floor(Date.now() / 1000);\n}\n","/**\n * Generates a random numeric code with the specified number of digits.\n *\n * @param digits - The number of digits for the generated code.\n * @returns A random numeric code with the specified number of digits.\n */\nexport function generateCode(digits: number): number {\n const min = Math.pow(10, digits - 1);\n const max = Math.pow(10, digits) - 1;\n return Math.floor(Math.random() * (max - min + 1) + min);\n}\n","/**\n * Converts hexcode to number\n *\n * @param hex - The hex code to convert.\n * @returns The converted number.\n */\nexport function hexToNumber(hex: string): number {\n if (typeof hex !== 'string') {\n throw new TypeError('hexToNumber expects a string input');\n }\n\n const normalized = hex.replace(/^#/, '');\n if (!/^[0-9a-fA-F]+$/.test(normalized)) {\n throw new Error('Invalid hex string');\n }\n\n const converted = parseInt(normalized, 16);\n if (Number.isNaN(converted)) {\n throw new Error('Invalid hex string');\n }\n\n return converted;\n}\n","/**\n * Returns the ordinal suffix for a given number.\n *\n * @param n - The number to get the ordinal for\n * @returns The number with its ordinal suffix\n *\n * @example\n * ordinal(1); // \"1st\"\n * ordinal(22); // \"22nd\"\n * ordinal(13); // \"13th\"\n */\nexport function ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n const index = (v - 20) % 10;\n const suffix = s[index] ?? s[v] ?? s[0];\n if (!suffix) return `${n}th`;\n\n return `${n}${suffix}`;\n}\n","/**\n * Takes two numbers and returns the percentage of the first number in the second number with two decimal places.\n *\n * @param num1 - The first number.\n * @param num2 - The second number.\n *\n * @returns The percentage of the first number in the second number with two decimal places.\n */\n\nexport function percentage(num1: number, num2: number): number {\n return Number(((num1 / num2) * 100).toFixed(2));\n}\n","/**\n * Rounds a number to a specified number of decimal places.\n *\n * @param num - The number to be rounded.\n * @param precision - The number of decimal places to round to.\n * @returns The rounded number.\n */\n\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round((num + Number.EPSILON) * factor) / factor;\n}\n","import type { TupleOf } from 'type-fest';\n\nexport interface RoundToDenomOptions {\n /**\n * Suffixes to use for each denomination level. Defaults to `['K', 'M', 'B', 'T', 'Q']`.\n */\n suffixes?: TupleOf<5, string>;\n /** Number of decimal places to include in the rounded result. Defaults to `1`. */\n precision?: number;\n}\n\n/**\n * Rounds a number to a string representation with a denomination suffix.\n * @param num - The number to round.\n * @example\n * ```ts\n * roundToDenomination(1234); // \"1.2K\"\n * roundToDenomination(10000, ['k', 'm', 'b', 't', 'q']); // \"10k\"\n * roundToDenomination(12345678); // \"12.3M\"\n * ```\n * @returns The rounded number as a string with a denomination suffix.\n */\nexport function roundToDenomination(num: number, opts?: RoundToDenomOptions): string {\n const { suffixes = ['K', 'M', 'B', 'T', 'Q'], precision = 1 } = opts ?? {};\n\n if (num < 10000) {\n return num.toString();\n }\n\n let index = -1;\n let temp = num;\n\n while (temp >= 1000 && index < suffixes.length - 1) {\n temp /= 1000;\n index++;\n }\n\n let result;\n\n if (temp % 1 === 0) {\n result = temp.toString();\n } else {\n const adjustedTemp = Math.round(temp * Math.pow(10, precision + 1)) / Math.pow(10, precision + 1);\n result = adjustedTemp.toFixed(precision);\n }\n\n if (result.endsWith('.9')) {\n result = Math.ceil(Number(result)).toString();\n }\n\n if (result.endsWith('.0')) {\n result = result.substring(0, result.length - 2);\n }\n\n if (result === '1000') {\n index += 1;\n result = '1';\n }\n\n return result + (index >= 0 ? suffixes[index] : '');\n}\n","import type { ILogger } from '@seedcord/types';\nimport type { JsonPrimitive } from 'type-fest';\n\n/**\n * JSONify an arbitrary type while allowing any object position to be replaced\n * by a circular marker. Optional keys stay optional.\n */\nexport type JsonifyWithCirculars<BaseType, Marker extends string = '[Circular]'> = BaseType extends JsonPrimitive\n ? BaseType\n : BaseType extends bigint\n ? string\n : BaseType extends Date\n ? string\n : BaseType extends { toJSON(): infer J }\n ? unknown extends J\n ? JsonifyObject<BaseType, Marker>\n : JsonifyWithCirculars<J, Marker>\n : BaseType extends readonly (infer U)[]\n ? (JsonifyWithCirculars<U, Marker> | Marker)[]\n : BaseType extends Map<infer K, infer V>\n ? [JsonifyWithCirculars<K, Marker> | Marker, JsonifyWithCirculars<V, Marker> | Marker][]\n : BaseType extends Set<infer U2>\n ? (JsonifyWithCirculars<U2, Marker> | Marker)[]\n : BaseType extends (...args: unknown[]) => unknown\n ? never\n : BaseType extends object\n ? JsonifyObject<BaseType, Marker>\n : never;\n\n/**\n * Helper to JSONify object types with circular markers.\n *\n * @internal\n */\nexport type JsonifyObject<BaseType, Marker extends string> = {\n [K in keyof BaseType as K extends symbol\n ? never\n : BaseType[K] extends (...args: unknown[]) => unknown\n ? never\n : K]:\n | JsonifyWithCirculars<Exclude<BaseType[K], undefined>, Marker>\n | Extract<BaseType[K], undefined>\n | Marker;\n};\n\n/**\n * Configuration for {@link filterCirculars}.\n */\nexport interface FilterCircularsOptions<Marker extends string = '[Circular]'> {\n /** Optional {@link ILogger} used to log stringify or parse errors. */\n logger?: ILogger;\n /** Override the circular placeholder. Default is `[Circular]`. */\n marker?: Marker;\n /** Processing mode. `json` uses stringify and parse (might end up using a `toJSON()` if found). `decycle` builds a safe clone first. Default is `decycle`. */\n mode?: 'json' | 'decycle';\n}\n\n/**\n * Creates a clean, JSON safe copy of a value and replaces circular references with a marker.\n *\n * In `json` mode it behaves like stringify then parse with a replacer that handles cycles and BigInt.\n * In `decycle` mode it first clones without using toJSON, then you can stringify the result later.\n *\n * @typeParam ObjType - Type of the input value.\n * @typeParam Marker - Marker string used for circular references.\n *\n * @param value - The value to clone safely.\n * @param options - Optional configuration.\n *\n * @returns A JSON safe structure with circular references replaced by the marker.\n *\n * @example\n * ```ts\n * interface Test {\n * name: string;\n * self?: Test;\n * }\n *\n * const obj: Test = { name: 'seedcord' };\n * obj.self = obj;\n *\n * const clean = filterCirculars(obj);\n * // ^? { name: string; self?: \"[Circular]\" | { ... } }\n * console.log(clean.self); // \"[Circular]\"\n * ```\n */\nexport function filterCirculars<ObjType, Marker extends string = '[Circular]'>(\n value: ObjType,\n options?: FilterCircularsOptions<Marker>\n): JsonifyWithCirculars<ObjType, Marker> {\n const logger = options?.logger;\n const marker = (options?.marker ?? '[Circular]') as Marker;\n const mode = options?.mode ?? 'decycle';\n\n if (mode === 'json') return json(value, marker, logger);\n\n try {\n return decycle(value, marker);\n } catch (error) {\n logger?.error('filterCirculars decycle error', error);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Attempts to build a JSONified object using JSON.stringify and JSON.parse.\n *\n * @internal\n */\nfunction json<ObjType, Marker extends string>(\n value: ObjType,\n marker: Marker,\n logger?: ILogger\n): JsonifyWithCirculars<ObjType, Marker> {\n const seen = new WeakSet<object>();\n let json: string | undefined;\n\n try {\n json = JSON.stringify(value, (_k: string, v: unknown) => {\n if (typeof v === 'bigint') return v.toString();\n if (typeof v === 'object' && v !== null) {\n const obj = v;\n if (seen.has(obj)) return marker;\n seen.add(obj);\n }\n return v;\n });\n } catch (error) {\n logger?.error('filterCirculars stringify error', error);\n if (typeof value === 'object' && value !== null) {\n logger?.error('top level keys', Object.keys(value as Record<string, unknown>));\n }\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n if (typeof json !== 'string') {\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n try {\n return JSON.parse(json) as JsonifyWithCirculars<ObjType, Marker>;\n } catch (error) {\n logger?.error('filterCirculars parse error', error);\n logger?.error('bad JSON', json);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Builds a JSON safe clone without calling toJSON on class instances.\n *\n * @internal\n */\nfunction decycle<ObjType, Marker extends string = '[Circular]'>(\n input: ObjType,\n marker: Marker,\n seen = new WeakSet<object>()\n): JsonifyWithCirculars<ObjType, Marker> {\n const recur = (val: unknown): unknown => {\n if (val === null) return null;\n const t = typeof val;\n\n // if bigint, return string representation\n if (t === 'bigint') return (val as bigint).toString();\n\n // if primitive, return as is\n if (t !== 'object') return val;\n\n const obj = val as Record<string | number | symbol, unknown>;\n\n if (seen.has(obj)) return marker;\n seen.add(obj);\n\n // if Date, return ISO string\n if (obj instanceof Date) return obj.toISOString();\n\n // if RegExp, return string representation\n if (obj instanceof RegExp) return obj.toString();\n\n // if array, recur on each item\n if (Array.isArray(obj)) {\n return obj.map((item) => recur(item));\n }\n\n // if Map, recur on entries/values\n if (obj instanceof Map) {\n return Array.from(obj, ([k, v]) => [recur(k), recur(v)]);\n }\n\n // if Set, recur on values\n if (obj instanceof Set) {\n return Array.from(obj, (v) => recur(v));\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'function') continue;\n out[k] = recur(v);\n }\n\n return out;\n };\n\n return recur(input) as JsonifyWithCirculars<ObjType, Marker>;\n}\n","/**\n * Pulls out only the keys from an object that actually have values.\n *\n * @typeParam TObject - the original object type you're pulling from\n * @typeParam TKey - the specific keys you want to copy if they're defined\n * @param source - the object to read values from\n * @param keys - optional list of keys you want to include if they exist. If omitted, all keys are considered\n *\n * @example\n * ```ts\n * interface Config {\n * host?: string;\n * port?: number;\n * user?: string;\n * password?: string;\n * }\n *\n * const config: Config = {\n * host: 'localhost',\n * port: undefined,\n * user: 'admin',\n * password: undefined\n * };\n *\n * const definedConfig = keepDefined(config, 'host', 'port', 'user', 'password');\n * // Result: { host: 'localhost', user: 'admin' }\n * ```\n */\nexport function keepDefined<TObject extends object, TKey extends keyof TObject>(\n source: TObject,\n ...keys: readonly TKey[]\n): Partial<Pick<TObject, TKey extends never ? keyof TObject : TKey>> {\n const selectedKeys = keys.length > 0 ? keys : (Object.keys(source) as TKey[]);\n const result: Partial<TObject> = {};\n\n for (const key of selectedKeys) {\n const value = source[key];\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Returns the word with its first letter capitalized and the rest in lowercase.\n * @param word - The word to be formatted.\n * @returns The formatted word.\n */\nexport function capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n","/**\n * Function takes an array of strings or numbers and returns the number of characters in the longest string/number\n *\n * @param arr - The array of strings or numbers\n * @returns The length of the longest element when converted to string\n */\n\nexport function longestStringLength(arr: (string | number)[]): number {\n return Math.max(...arr.map((el) => el.toString().length));\n}\n","/**\n * Generates an ASCII table from the provided data.\n *\n * @param data - The data to be displayed in the table.\n * @returns The generated ASCII table as a string.\n */\n\nexport function generateAsciiTable(data: string[][]): string {\n if (data.length === 0) return '';\n\n const firstRow = data[0];\n if (!firstRow || firstRow.length === 0) return '';\n\n let table = '';\n const columnWidths: number[] = [];\n\n // Determine the maximum width for each column\n for (let i = 0; i < firstRow.length; i++) {\n let maxWidth = 0;\n for (const row of data) {\n const cell = row[i];\n if (cell !== undefined) maxWidth = Math.max(maxWidth, cell.length);\n }\n columnWidths.push(maxWidth);\n }\n\n // Function to create a horizontal line\n const createLine = (char: string, left: string, intersect: string, right: string): string => {\n let line = left;\n columnWidths.forEach((width, index) => {\n line += char.repeat(width + 2);\n if (index < columnWidths.length - 1) line += intersect;\n else line += right;\n });\n line += '\\n';\n return line;\n };\n\n // Top border\n table += createLine('═', '╔', '╦', '╗');\n\n data.forEach((row, rowIndex) => {\n // Row content\n table += '║';\n row.forEach((cell, columnIndex) => {\n const columnWidth = columnWidths[columnIndex];\n if (columnWidth !== undefined) table += ` ${cell.padEnd(columnWidth)} ║`;\n });\n table += '\\n';\n\n // Separator or bottom border\n if (rowIndex < data.length - 1) table += createLine('─', '╠', '╬', '╣');\n else table += createLine('═', '╚', '╩', '╝');\n });\n\n return table;\n}\n","import { capitalize } from './capitalize';\n\n/**\n * Options for the `prettify` function.\n */\nexport interface PrettifyOptions {\n capitalize?: boolean;\n}\n/**\n * Converts a string from any common naming convention to human-readable format.\n * Handles camelCase, PascalCase, snake_case, and kebab-case.\n *\n * @param key - The string to convert\n * @param opts - Optional configuration\n * @returns A space-separated, human-readable string\n *\n * @example\n * prettify(\"camelCaseString\") // \"camel Case String\"\n * prettify(\"PascalCaseString\") // \"Pascal Case String\"\n * prettify(\"snake_case_string\") // \"snake case string\"\n * prettify(\"kebab-case-string\") // \"kebab case string\"\n * prettify(\"mixedCase_string-name\") // \"mixed Case string name\"\n */\n\nexport function prettify(key: string, opts?: PrettifyOptions): string {\n const result = key\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase/PascalCase\n .replace(/[_-]/g, ' ') // snake_case and kebab-case\n .trim();\n\n if (opts?.capitalize) return capitalize(result);\n\n return result;\n}\n","/**\n * Calculates the difference between two numbers and formats it as a string with a '+' prefix for positive differences.\n *\n * @param numBefore - The initial number value\n * @param numAfter - The final number value\n * @returns A string representing the difference, with a '+' sign for positive differences\n *\n * @example\n * // Returns \"+5\"\n * prettyDifference(10, 15);\n *\n * @example\n * // Returns \"-3\"\n * prettyDifference(10, 7);\n */\n\nexport function prettyDifference(numBefore: number, numAfter: number): string {\n return (numAfter - numBefore > 0 ? `+${numAfter - numBefore}` : numAfter - numBefore).toString();\n}\n"]}
1
+ {"version":3,"sources":["../src/misc/directory.ts","../src/misc/fyShuffle.ts","../src/numbers/currentTime.ts","../src/numbers/generateCode.ts","../src/numbers/hexToNumber.ts","../src/numbers/ordinal.ts","../src/numbers/percentage.ts","../src/numbers/round.ts","../src/numbers/roundToDenomination.ts","../src/objects/filterCirculars.ts","../src/objects/keepDefined.ts","../src/strings/capitalize.ts","../src/strings/longestStringLength.ts","../src/strings/generateAsciiTable.ts","../src/strings/prettify.ts","../src/strings/prettyDifference.ts"],"names":["isTsOrJsFile","entry","isFile","name","endsWith","traverseDirectory","dir","callback","logger","entries","readdir","withFileTypes","error","fullPath","join","relativePath","relative","process","cwd","isDirectory","imported","fyShuffle","items","array","slice","i","length","j","Math","floor","random","currentTime","Date","now","generateCode","digits","min","pow","max","hexToNumber","hex","SeedcordTypeError","SeedcordErrorCode","UtilHexInputType","normalized","replace","test","SeedcordError","UtilHexInvalid","converted","parseInt","Number","isNaN","ordinal","n","s","v","index","suffix","percentage","num1","num2","toFixed","round","num","precision","factor","EPSILON","roundToDenomination","opts","suffixes","toString","temp","result","adjustedTemp","ceil","substring","filterCirculars","value","options","marker","mode","json","decycle","seen","WeakSet","JSON","stringify","_k","obj","has","add","Object","keys","parse","input","recur","val","t","toISOString","RegExp","Array","isArray","map","item","Map","from","k","Set","out","keepDefined","source","selectedKeys","key","undefined","capitalize","word","charAt","toUpperCase","toLowerCase","longestStringLength","arr","el","generateAsciiTable","data","firstRow","table","columnWidths","maxWidth","row","cell","push","createLine","char","left","intersect","right","line","forEach","width","repeat","rowIndex","columnIndex","columnWidth","padEnd","prettify","trim","prettyDifference","numBefore","numAfter"],"mappings":"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","file":"index.mjs","sourcesContent":["import { readdir } from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport type { Logger } from '@seedcord/services';\nimport type * as fs from 'node:fs';\n/**\n * Determines if a directory entry is a TypeScript or JavaScript file.\n *\n * @param entry - The directory entry to check.\n * @returns True if the entry is a file ending with .ts or .js.\n */\nexport function isTsOrJsFile(entry: fs.Dirent): boolean {\n return (\n entry.isFile() &&\n (entry.name.endsWith('.ts') || entry.name.endsWith('.js')) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.map')\n );\n}\n\n/**\n * Recursively traverses through a directory, importing all .ts and .js files and applying a callback to each import.\n *\n * @param dir - The directory path to traverse.\n * @param callback - A function that will be called for each imported module. It receives the full file path, the file's relative path, and the imported module as arguments.\n * @returns A Promise that resolves when the traversal is complete.\n */\nexport async function traverseDirectory(\n dir: string,\n callback: (fullPath: string, relativePath: string, imported: Record<string, unknown>) => Promise<void> | void,\n logger: Logger\n): Promise<void> {\n let entries: fs.Dirent[];\n\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n logger.error('Failed to read this directory');\n entries = [];\n }\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(process.cwd(), fullPath);\n\n if (entry.isDirectory()) {\n await traverseDirectory(fullPath, callback, logger);\n } else if (isTsOrJsFile(entry)) {\n const imported = (await import(fullPath)) as Record<string, unknown>;\n await callback(fullPath, relativePath, imported);\n }\n }\n}\n","/**\n * Shuffles an array using the Fisher-Yates algorithm.\n * This function creates a new array with the same elements in a random order,\n * without modifying the original array.\n *\n * @typeParam TArray - The type of elements in the array\n * @param items - The array to shuffle\n * @returns A new array with the same elements in a random order\n *\n * @example\n * ```typescript\n * const numbers = [1, 2, 3, 4, 5];\n * const shuffled = fyShuffle(numbers);\n * // shuffled might be [3, 1, 5, 2, 4]\n * // numbers is still [1, 2, 3, 4, 5]\n * ```\n */\nexport function fyShuffle<TArray>(items: TArray[]): TArray[] {\n const array = items.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n // @ts-expect-error - TypeScript doesn't recognize that TArray can be swapped\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\n","/**\n * Return current time in seconds\n */\nexport function currentTime(): number {\n return Math.floor(Date.now() / 1000);\n}\n","/**\n * Generates a random numeric code with the specified number of digits.\n *\n * @param digits - The number of digits for the generated code.\n * @returns A random numeric code with the specified number of digits.\n */\nexport function generateCode(digits: number): number {\n const min = Math.pow(10, digits - 1);\n const max = Math.pow(10, digits) - 1;\n return Math.floor(Math.random() * (max - min + 1) + min);\n}\n","import { SeedcordError, SeedcordErrorCode, SeedcordTypeError } from '@seedcord/services';\n\n/**\n * Converts hexcode to number\n *\n * @param hex - The hex code to convert.\n * @returns The converted number.\n */\nexport function hexToNumber(hex: string): number {\n if (typeof hex !== 'string') {\n throw new SeedcordTypeError(SeedcordErrorCode.UtilHexInputType);\n }\n\n const normalized = hex.replace(/^#/, '');\n if (!/^[0-9a-fA-F]+$/.test(normalized)) {\n throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);\n }\n\n const converted = parseInt(normalized, 16);\n if (Number.isNaN(converted)) {\n throw new SeedcordError(SeedcordErrorCode.UtilHexInvalid);\n }\n\n return converted;\n}\n","/**\n * Returns the ordinal suffix for a given number.\n *\n * @param n - The number to get the ordinal for\n * @returns The number with its ordinal suffix\n *\n * @example\n * ordinal(1); // \"1st\"\n * ordinal(22); // \"22nd\"\n * ordinal(13); // \"13th\"\n */\nexport function ordinal(n: number): string {\n const s = ['th', 'st', 'nd', 'rd'];\n const v = n % 100;\n const index = (v - 20) % 10;\n const suffix = s[index] ?? s[v] ?? s[0];\n if (!suffix) return `${n}th`;\n\n return `${n}${suffix}`;\n}\n","/**\n * Takes two numbers and returns the percentage of the first number in the second number with two decimal places.\n *\n * @param num1 - The first number.\n * @param num2 - The second number.\n *\n * @returns The percentage of the first number in the second number with two decimal places.\n */\nexport function percentage(num1: number, num2: number): number {\n return Number(((num1 / num2) * 100).toFixed(2));\n}\n","/**\n * Rounds a number to a specified number of decimal places.\n *\n * @param num - The number to be rounded.\n * @param precision - The number of decimal places to round to.\n * @returns The rounded number.\n */\nexport function round(num: number, precision: number): number {\n const factor = Math.pow(10, precision);\n return Math.round((num + Number.EPSILON) * factor) / factor;\n}\n","import type { TupleOf } from 'type-fest';\n\nexport interface RoundToDenomOptions {\n /**\n * Suffixes to use for each denomination level. Defaults to `['K', 'M', 'B', 'T', 'Q']`.\n */\n suffixes?: TupleOf<5, string>;\n /** Number of decimal places to include in the rounded result. Defaults to `1`. */\n precision?: number;\n}\n\n/**\n * Rounds a number to a string representation with a denomination suffix.\n * @param num - The number to round.\n * @example\n * ```ts\n * roundToDenomination(1234); // \"1.2K\"\n * roundToDenomination(10000, ['k', 'm', 'b', 't', 'q']); // \"10k\"\n * roundToDenomination(12345678); // \"12.3M\"\n * ```\n * @returns The rounded number as a string with a denomination suffix.\n */\nexport function roundToDenomination(num: number, opts?: RoundToDenomOptions): string {\n const { suffixes = ['K', 'M', 'B', 'T', 'Q'], precision = 1 } = opts ?? {};\n\n if (num < 10000) {\n return num.toString();\n }\n\n let index = -1;\n let temp = num;\n\n while (temp >= 1000 && index < suffixes.length - 1) {\n temp /= 1000;\n index++;\n }\n\n let result;\n\n if (temp % 1 === 0) {\n result = temp.toString();\n } else {\n const adjustedTemp = Math.round(temp * Math.pow(10, precision + 1)) / Math.pow(10, precision + 1);\n result = adjustedTemp.toFixed(precision);\n }\n\n if (result.endsWith('.9')) {\n result = Math.ceil(Number(result)).toString();\n }\n\n if (result.endsWith('.0')) {\n result = result.substring(0, result.length - 2);\n }\n\n if (result === '1000') {\n index += 1;\n result = '1';\n }\n\n return result + (index >= 0 ? suffixes[index] : '');\n}\n","import type { ILogger } from '@seedcord/types';\nimport type { JsonPrimitive } from 'type-fest';\n\n/**\n * JSONify an arbitrary type while allowing any object position to be replaced\n * by a circular marker. Optional keys stay optional.\n */\nexport type JsonifyWithCirculars<BaseType, Marker extends string = '[Circular]'> = BaseType extends JsonPrimitive\n ? BaseType\n : BaseType extends bigint\n ? string\n : BaseType extends Date\n ? string\n : BaseType extends { toJSON(): infer J }\n ? unknown extends J\n ? JsonifyObject<BaseType, Marker>\n : JsonifyWithCirculars<J, Marker>\n : BaseType extends readonly (infer U)[]\n ? (JsonifyWithCirculars<U, Marker> | Marker)[]\n : BaseType extends Map<infer K, infer V>\n ? [JsonifyWithCirculars<K, Marker> | Marker, JsonifyWithCirculars<V, Marker> | Marker][]\n : BaseType extends Set<infer U2>\n ? (JsonifyWithCirculars<U2, Marker> | Marker)[]\n : BaseType extends (...args: unknown[]) => unknown\n ? never\n : BaseType extends object\n ? JsonifyObject<BaseType, Marker>\n : never;\n\n/**\n * Helper to JSONify object types with circular markers.\n *\n * @internal\n */\nexport type JsonifyObject<BaseType, Marker extends string> = {\n [K in keyof BaseType as K extends symbol\n ? never\n : BaseType[K] extends (...args: unknown[]) => unknown\n ? never\n : K]:\n | JsonifyWithCirculars<Exclude<BaseType[K], undefined>, Marker>\n | Extract<BaseType[K], undefined>\n | Marker;\n};\n\n/**\n * Configuration for {@link filterCirculars}.\n */\nexport interface FilterCircularsOptions<Marker extends string = '[Circular]'> {\n /** Optional {@link ILogger} used to log stringify or parse errors. */\n logger?: ILogger;\n /** Override the circular placeholder. Default is `[Circular]`. */\n marker?: Marker;\n /** Processing mode. `json` uses stringify and parse (might end up using a `toJSON()` if found). `decycle` builds a safe clone first. Default is `decycle`. */\n mode?: 'json' | 'decycle';\n}\n\n/**\n * Creates a clean, JSON safe copy of a value and replaces circular references with a marker.\n *\n * In `json` mode it behaves like stringify then parse with a replacer that handles cycles and BigInt.\n * In `decycle` mode it first clones without using toJSON, then you can stringify the result later.\n *\n * @typeParam ObjType - Type of the input value.\n * @typeParam Marker - Marker string used for circular references.\n *\n * @param value - The value to clone safely.\n * @param options - Optional configuration.\n *\n * @returns A JSON safe structure with circular references replaced by the marker.\n *\n * @example\n * ```ts\n * interface Test {\n * name: string;\n * self?: Test;\n * }\n *\n * const obj: Test = { name: 'seedcord' };\n * obj.self = obj;\n *\n * const clean = filterCirculars(obj);\n * // ^? { name: string; self?: \"[Circular]\" | { ... } }\n * console.log(clean.self); // \"[Circular]\"\n * ```\n */\nexport function filterCirculars<ObjType, Marker extends string = '[Circular]'>(\n value: ObjType,\n options?: FilterCircularsOptions<Marker>\n): JsonifyWithCirculars<ObjType, Marker> {\n const logger = options?.logger;\n const marker = (options?.marker ?? '[Circular]') as Marker;\n const mode = options?.mode ?? 'decycle';\n\n if (mode === 'json') return json(value, marker, logger);\n\n try {\n return decycle(value, marker);\n } catch (error) {\n logger?.error('filterCirculars decycle error', error);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Attempts to build a JSONified object using JSON.stringify and JSON.parse.\n *\n * @internal\n */\nfunction json<ObjType, Marker extends string>(\n value: ObjType,\n marker: Marker,\n logger?: ILogger\n): JsonifyWithCirculars<ObjType, Marker> {\n const seen = new WeakSet<object>();\n let json: string | undefined;\n\n try {\n json = JSON.stringify(value, (_k: string, v: unknown) => {\n if (typeof v === 'bigint') return v.toString();\n if (typeof v === 'object' && v !== null) {\n const obj = v;\n if (seen.has(obj)) return marker;\n seen.add(obj);\n }\n return v;\n });\n } catch (error) {\n logger?.error('filterCirculars stringify error', error);\n if (typeof value === 'object' && value !== null) {\n logger?.error('top level keys', Object.keys(value as Record<string, unknown>));\n }\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n if (typeof json !== 'string') {\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n\n try {\n return JSON.parse(json) as JsonifyWithCirculars<ObjType, Marker>;\n } catch (error) {\n logger?.error('filterCirculars parse error', error);\n logger?.error('bad JSON', json);\n return value as JsonifyWithCirculars<ObjType, Marker>;\n }\n}\n\n/**\n * Builds a JSON safe clone without calling toJSON on class instances.\n *\n * @internal\n */\nfunction decycle<ObjType, Marker extends string = '[Circular]'>(\n input: ObjType,\n marker: Marker,\n seen = new WeakSet<object>()\n): JsonifyWithCirculars<ObjType, Marker> {\n const recur = (val: unknown): unknown => {\n if (val === null) return null;\n const t = typeof val;\n\n // if bigint, return string representation\n if (t === 'bigint') return (val as bigint).toString();\n\n // if primitive, return as is\n if (t !== 'object') return val;\n\n const obj = val as Record<string | number | symbol, unknown>;\n\n if (seen.has(obj)) return marker;\n seen.add(obj);\n\n // if Date, return ISO string\n if (obj instanceof Date) return obj.toISOString();\n\n // if RegExp, return string representation\n if (obj instanceof RegExp) return obj.toString();\n\n // if array, recur on each item\n if (Array.isArray(obj)) {\n return obj.map((item) => recur(item));\n }\n\n // if Map, recur on entries/values\n if (obj instanceof Map) {\n return Array.from(obj, ([k, v]) => [recur(k), recur(v)]);\n }\n\n // if Set, recur on values\n if (obj instanceof Set) {\n return Array.from(obj, (v) => recur(v));\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'function') continue;\n out[k] = recur(v);\n }\n\n return out;\n };\n\n return recur(input) as JsonifyWithCirculars<ObjType, Marker>;\n}\n","/**\n * Pulls out only the keys from an object that actually have values.\n *\n * @typeParam TObject - the original object type you're pulling from\n * @typeParam TKey - the specific keys you want to copy if they're defined\n * @param source - the object to read values from\n * @param keys - optional list of keys you want to include if they exist. If omitted, all keys are considered\n *\n * @example\n * ```ts\n * interface Config {\n * host?: string;\n * port?: number;\n * user?: string;\n * password?: string;\n * }\n *\n * const config: Config = {\n * host: 'localhost',\n * port: undefined,\n * user: 'admin',\n * password: undefined\n * };\n *\n * const definedConfig = keepDefined(config, 'host', 'port', 'user', 'password');\n * // Result: { host: 'localhost', user: 'admin' }\n * ```\n */\nexport function keepDefined<TObject extends object, TKey extends keyof TObject>(\n source: TObject,\n ...keys: readonly TKey[]\n): Partial<Pick<TObject, TKey extends never ? keyof TObject : TKey>> {\n const selectedKeys = keys.length > 0 ? keys : (Object.keys(source) as TKey[]);\n const result: Partial<TObject> = {};\n\n for (const key of selectedKeys) {\n const value = source[key];\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * Returns the word with its first letter capitalized and the rest in lowercase.\n * @param word - The word to be formatted.\n * @returns The formatted word.\n */\nexport function capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n","/**\n * Function takes an array of strings or numbers and returns the number of characters in the longest string/number\n *\n * @param arr - The array of strings or numbers\n * @returns The length of the longest element when converted to string\n */\nexport function longestStringLength(arr: (string | number)[]): number {\n return Math.max(...arr.map((el) => el.toString().length));\n}\n","/**\n * Generates an ASCII table from the provided data.\n *\n * @param data - The data to be displayed in the table.\n * @returns The generated ASCII table as a string.\n */\nexport function generateAsciiTable(data: string[][]): string {\n if (data.length === 0) return '';\n\n const firstRow = data[0];\n if (!firstRow || firstRow.length === 0) return '';\n\n let table = '';\n const columnWidths: number[] = [];\n\n // Determine the maximum width for each column\n for (let i = 0; i < firstRow.length; i++) {\n let maxWidth = 0;\n for (const row of data) {\n const cell = row[i];\n if (cell !== undefined) maxWidth = Math.max(maxWidth, cell.length);\n }\n columnWidths.push(maxWidth);\n }\n\n // Function to create a horizontal line\n const createLine = (char: string, left: string, intersect: string, right: string): string => {\n let line = left;\n columnWidths.forEach((width, index) => {\n line += char.repeat(width + 2);\n if (index < columnWidths.length - 1) line += intersect;\n else line += right;\n });\n line += '\\n';\n return line;\n };\n\n // Top border\n table += createLine('═', '╔', '╦', '╗');\n\n data.forEach((row, rowIndex) => {\n // Row content\n table += '║';\n row.forEach((cell, columnIndex) => {\n const columnWidth = columnWidths[columnIndex];\n if (columnWidth !== undefined) table += ` ${cell.padEnd(columnWidth)} ║`;\n });\n table += '\\n';\n\n // Separator or bottom border\n if (rowIndex < data.length - 1) table += createLine('─', '╠', '╬', '╣');\n else table += createLine('═', '╚', '╩', '╝');\n });\n\n return table;\n}\n","import { capitalize } from './capitalize';\n\n/**\n * Options for the `prettify` function.\n */\nexport interface PrettifyOptions {\n capitalize?: boolean;\n}\n/**\n * Converts a string from any common naming convention to human-readable format.\n * Handles camelCase, PascalCase, snake_case, and kebab-case.\n *\n * @param key - The string to convert\n * @param opts - Optional configuration\n * @returns A space-separated, human-readable string\n *\n * @example\n * prettify(\"camelCaseString\") // \"camel Case String\"\n * prettify(\"PascalCaseString\") // \"Pascal Case String\"\n * prettify(\"snake_case_string\") // \"snake case string\"\n * prettify(\"kebab-case-string\") // \"kebab case string\"\n * prettify(\"mixedCase_string-name\") // \"mixed Case string name\"\n */\n\nexport function prettify(key: string, opts?: PrettifyOptions): string {\n const result = key\n .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase/PascalCase\n .replace(/[_-]/g, ' ') // snake_case and kebab-case\n .trim();\n\n if (opts?.capitalize) return capitalize(result);\n\n return result;\n}\n","/**\n * Calculates the difference between two numbers and formats it as a string with a '+' prefix for positive differences.\n *\n * @param numBefore - The initial number value\n * @param numAfter - The final number value\n * @returns A string representing the difference, with a '+' sign for positive differences\n *\n * @example\n * // Returns \"+5\"\n * prettyDifference(10, 15);\n *\n * @example\n * // Returns \"-3\"\n * prettyDifference(10, 7);\n */\nexport function prettyDifference(numBefore: number, numAfter: number): string {\n return (numAfter - numBefore > 0 ? `+${numAfter - numBefore}` : numAfter - numBefore).toString();\n}\n"]}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@seedcord/utils",
3
3
  "type": "module",
4
- "version": "0.3.4",
4
+ "version": "0.3.6",
5
5
  "description": "Utility functions for Seedcord packages",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/materwelondhruv/seedcord.git",
8
+ "url": "https://github.com/materwelonDhruv/seedcord.git",
9
9
  "directory": "packages/utils"
10
10
  },
11
11
  "types": "./dist/index.d.ts",
@@ -30,13 +30,17 @@
30
30
  "type-fest": "5.1.0",
31
31
  "discord.js": "14.24.2",
32
32
  "@seedcord/types": "^0.3.3",
33
- "@seedcord/services": "^0.3.3"
33
+ "@seedcord/services": "^0.5.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@seedcord/eslint-config": "^1.3.1",
37
- "@seedcord/tsconfig": "^1.0.5",
37
+ "@seedcord/tsconfig": "^1.0.6",
38
38
  "@seedcord/tsup-config": "^1.0.5"
39
39
  },
40
+ "publishConfig": {
41
+ "access": "public",
42
+ "provenance": true
43
+ },
40
44
  "scripts": {
41
45
  "build": "tsup",
42
46
  "clean": "rm -rf dist",