@kubb/core 4.28.0 → 4.29.0

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.
Files changed (66) hide show
  1. package/dist/{chunk-C1_xRkKa.cjs → chunk-CNbaEX1y.cjs} +1 -1
  2. package/dist/{chunk-iVr_oF3V.js → chunk-DKWOrOAv.js} +1 -1
  3. package/dist/fs.cjs +8 -7
  4. package/dist/fs.d.ts +1 -1
  5. package/dist/fs.js +1 -1
  6. package/dist/{getBarrelFiles-gRyVPFBP.js → getBarrelFiles-BBDOJ2lV.js} +20 -20
  7. package/dist/getBarrelFiles-BBDOJ2lV.js.map +1 -0
  8. package/dist/{getBarrelFiles-DCNjiX2W.cjs → getBarrelFiles-BttXy8Sp.cjs} +22 -28
  9. package/dist/getBarrelFiles-BttXy8Sp.cjs.map +1 -0
  10. package/dist/{getBarrelFiles-CHL9_Obd.d.ts → getBarrelFiles-C7gz90HF.d.ts} +5 -8
  11. package/dist/{getBarrelFiles-CmpI3rrq.d.cts → getBarrelFiles-DAhlPFXC.d.ts} +5 -8
  12. package/dist/hooks.cjs +2 -1
  13. package/dist/hooks.cjs.map +1 -1
  14. package/dist/hooks.d.ts +2 -2
  15. package/dist/hooks.js +1 -1
  16. package/dist/index.cjs +33 -211
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +5 -8
  19. package/dist/index.js +26 -202
  20. package/dist/index.js.map +1 -1
  21. package/dist/{transformers-B8kXgG3q.cjs → toRegExp-DGgAWZ_m.cjs} +15 -117
  22. package/dist/toRegExp-DGgAWZ_m.cjs.map +1 -0
  23. package/dist/{transformers-8ju9ixkG.js → toRegExp-DdJ1Kgbf.js} +16 -112
  24. package/dist/toRegExp-DdJ1Kgbf.js.map +1 -0
  25. package/dist/transformers.cjs +45 -36
  26. package/dist/transformers.cjs.map +1 -0
  27. package/dist/transformers.d.ts +2 -6
  28. package/dist/transformers.js +26 -2
  29. package/dist/transformers.js.map +1 -0
  30. package/dist/{types-Cn3Gwsf3.d.ts → types-CiePC9Y3.d.ts} +6 -11
  31. package/dist/{types-ulibr7zw.d.cts → types-Ciz0gIX7.d.ts} +6 -11
  32. package/dist/utils.cjs +36 -20
  33. package/dist/utils.cjs.map +1 -1
  34. package/dist/utils.d.ts +8 -5
  35. package/dist/utils.js +34 -20
  36. package/dist/utils.js.map +1 -1
  37. package/dist/write-CwpeNfTd.cjs +108 -0
  38. package/dist/write-CwpeNfTd.cjs.map +1 -0
  39. package/dist/write-DiGboRXI.js +72 -0
  40. package/dist/write-DiGboRXI.js.map +1 -0
  41. package/package.json +22 -27
  42. package/src/PackageManager.ts +3 -3
  43. package/src/fs/clean.ts +2 -2
  44. package/src/fs/exists.ts +10 -30
  45. package/src/fs/read.ts +7 -30
  46. package/src/fs/write.ts +38 -55
  47. package/src/transformers/casing.ts +22 -4
  48. package/src/transformers/index.ts +0 -7
  49. package/src/utils/FunctionParams.ts +5 -18
  50. package/src/utils/formatters.ts +2 -2
  51. package/src/utils/index.ts +1 -0
  52. package/src/utils/linters.ts +2 -2
  53. package/src/utils/tokenize.ts +23 -0
  54. package/dist/fs-Parec-wn.js +0 -105
  55. package/dist/fs-Parec-wn.js.map +0 -1
  56. package/dist/fs-jxNCXQUq.cjs +0 -141
  57. package/dist/fs-jxNCXQUq.cjs.map +0 -1
  58. package/dist/fs.d.cts +0 -23
  59. package/dist/getBarrelFiles-DCNjiX2W.cjs.map +0 -1
  60. package/dist/getBarrelFiles-gRyVPFBP.js.map +0 -1
  61. package/dist/hooks.d.cts +0 -15
  62. package/dist/index.d.cts +0 -119
  63. package/dist/transformers-8ju9ixkG.js.map +0 -1
  64. package/dist/transformers-B8kXgG3q.cjs.map +0 -1
  65. package/dist/transformers.d.cts +0 -112
  66. package/dist/utils.d.cts +0 -287
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toRegExp-DdJ1Kgbf.js","names":[],"sources":["../src/transformers/transformReservedWord.ts","../src/transformers/trim.ts","../src/transformers/casing.ts","../src/transformers/combineCodes.ts","../src/transformers/createJSDocBlockText.ts","../src/transformers/escape.ts","../src/transformers/indent.ts","../src/transformers/nameSorter.ts","../src/transformers/searchAndReplace.ts","../src/transformers/stringify.ts","../src/transformers/toRegExp.ts"],"sourcesContent":["/**\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n\n 'Array',\n 'Date',\n 'eval',\n 'function',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\nexport function transformReservedWord(word: string): string {\n if ((word && reservedWords.includes(word)) || word?.match(/^\\d/)) {\n return `_${word}`\n }\n\n return word\n}\n\nexport function isValidVarName(name: string) {\n try {\n Function(`var ${name}`)\n } catch (_e) {\n return false\n }\n return true\n}\n","export function trim(text: string): string {\n return text.trim()\n}\n\nexport function trimQuotes(text: string): string {\n if (text.match(/^\"(.*)\"$/)) {\n return text.replace(/^\"(.*)\"$/, '$1')\n }\n if (text.match(/^'(.*)'$/)) {\n return text.replace(/^'(.*)'$/, '$1')\n }\n\n if (text.match(/^`(.*)`$/)) {\n return text.replace(/^`(.*)`$/, '$1')\n }\n\n return text\n}\n","type Options = {\n /**\n * When set it will replace all `.` with `/`.\n */\n isFile?: boolean\n prefix?: string\n suffix?: string\n}\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const normalized = text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n\n const words = normalized.split(/[\\s\\-_./\\\\:]+/).filter(Boolean)\n\n return words\n .map((word, i) => {\n const allUpper = word.length > 1 && word === word.toUpperCase()\n if (allUpper) return word\n if (i === 0 && !pascal) return word[0]!.toLowerCase() + word.slice(1)\n return word[0]!.toUpperCase() + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\nexport function camelCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n const splitArray = text.split('.')\n return splitArray.map((item, i) => (i === splitArray.length - 1 ? camelCase(item, { prefix, suffix }) : camelCase(item))).join('/')\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\nexport function pascalCase(text: string, { isFile, prefix = '', suffix = '' }: Options = {}): string {\n if (isFile) {\n const splitArray = text.split('.')\n return splitArray.map((item, i) => (i === splitArray.length - 1 ? pascalCase(item, { prefix, suffix }) : camelCase(item))).join('/')\n }\n\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n\nexport function snakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n const processed = `${prefix} ${text} ${suffix}`.trim()\n // Convert to lowercase and replace non-alphanumeric characters with underscores\n return processed\n .replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase to snake_case\n .replace(/[\\s\\-.]+/g, '_') // spaces, hyphens, dots to underscores\n .replace(/[^a-zA-Z0-9_]/g, '') // remove other special chars\n .toLowerCase()\n .replace(/_+/g, '_') // collapse multiple underscores\n .replace(/^_|_$/g, '') // trim underscores from start and end\n}\n\nexport function screamingSnakeCase(text: string, { prefix = '', suffix = '' }: Omit<Options, 'isFile'> = {}): string {\n return snakeCase(text, { prefix, suffix }).toUpperCase()\n}\n","export function combineCodes(codes: string[]): string {\n return codes.join('\\n')\n}\n","export function createJSDocBlockText({ comments }: { comments: Array<string> }): string {\n const filteredComments = comments.filter(Boolean)\n\n if (!filteredComments.length) {\n return ''\n }\n\n return `/**\\n * ${filteredComments.join('\\n * ')}\\n */`\n}\n","export function escape(text?: string): string {\n return text ? text.replaceAll('`', '\\\\`') : ''\n}\n\n/**\n * Escape all characters not included in SingleStringCharacters and DoubleStringCharacters on\n * @link http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n * @link https://github.com/joliss/js-string-escape/blob/master/index.js\n */\n\nexport function jsStringEscape(input: any): string {\n return `${input}`.replace(/[\"'\\\\\\n\\r\\u2028\\u2029]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n return `\\\\${character}`\n // Four possible LineTerminator characters need to be escaped:\n case '\\n':\n return '\\\\n'\n case '\\r':\n return '\\\\r'\n case '\\u2028':\n return '\\\\u2028'\n case '\\u2029':\n return '\\\\u2029'\n default:\n return ''\n }\n })\n}\n","export function createIndent(size: number): string {\n return Array.from({ length: size + 1 }).join(' ')\n}\n","export function nameSorter<T extends { name: string }>(a: T, b: T): 0 | 1 | -1 {\n if (a.name < b.name) {\n return -1\n }\n if (a.name > b.name) {\n return 1\n }\n return 0\n}\n","type Options = {\n text: string\n replaceBy: string\n prefix?: string\n key: string\n searchValues?: (prefix: string, key: string) => Array<RegExp | string>\n}\n\nexport function searchAndReplace(options: Options): string {\n const { text, replaceBy, prefix = '', key } = options\n\n const searchValues = options.searchValues?.(prefix, key) || [\n `${prefix}[\"${key}\"]`,\n `${prefix}['${key}']`,\n `${prefix}[\\`${key}\\`]`,\n `${prefix}\"${key}\"`,\n `${prefix}'${key}'`,\n `${prefix}\\`${key}\\``,\n new RegExp(`${prefix}${key}`, 'g'),\n ]\n\n return searchValues.reduce((prev, searchValue) => {\n return prev.toString().replaceAll(searchValue, replaceBy)\n }, text) as string\n}\n","import { trimQuotes } from './trim'\n\nexport function stringify(value: string | number | boolean | undefined): string {\n if (value === undefined || value === null) {\n return '\"\"'\n }\n\n return JSON.stringify(trimQuotes(value.toString()))\n}\n\nexport function stringifyObject(value: object): string {\n const items = Object.entries(value)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n return `${key}: {\n ${stringifyObject(value)}\n }`\n }\n\n return `${key}: ${value}`\n })\n .filter(Boolean)\n\n return items.join(',\\n')\n}\n","import { trimQuotes } from './trim'\n\nexport function toRegExpString(text: string, func: string | null = 'RegExp'): string {\n const raw = trimQuotes(text)\n\n const [, replacementTarget = '', matchedFlags] = raw.match(/^\\^(\\(\\?([igmsuy]+)\\))/i) ?? []\n const cleaned = raw\n .replace(/^\\\\?\\//, '')\n .replace(/\\\\?\\/$/, '')\n .replace(replacementTarget, '')\n\n const regex = new RegExp(cleaned, matchedFlags)\n const source = regex.source\n const flags = regex.flags\n\n if (func === null) {\n return `/${source}/${flags}`\n }\n\n // return as constructor → new RegExp(\"pattern\", \"flags\")\n return `new ${func}(${JSON.stringify(source)}${flags ? `, ${JSON.stringify(flags)}` : ''})`\n}\n"],"mappings":"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"}
@@ -1,37 +1,46 @@
1
- Object.defineProperty(exports, '__esModule', { value: true });
2
- const require_chunk = require('./chunk-C1_xRkKa.cjs');
3
- const require_transformers = require('./transformers-B8kXgG3q.cjs');
4
- let natural_orderby = require("natural-orderby");
5
- let remeda = require("remeda");
1
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
+ const require_toRegExp = require('./toRegExp-DGgAWZ_m.cjs');
6
3
 
7
- exports.camelCase = require_transformers.camelCase;
8
- exports.combineCodes = require_transformers.combineCodes;
9
- exports.createIndent = require_transformers.createIndent;
10
- exports.createJSDocBlockText = require_transformers.createJSDocBlockText;
11
- exports.default = require_transformers.transformers_default;
12
- exports.escape = require_transformers.escape;
13
- exports.isValidVarName = require_transformers.isValidVarName;
14
- exports.jsStringEscape = require_transformers.jsStringEscape;
15
- Object.defineProperty(exports, 'merge', {
16
- enumerable: true,
17
- get: function () {
18
- return remeda.merge;
19
- }
20
- });
21
- exports.nameSorter = require_transformers.nameSorter;
22
- Object.defineProperty(exports, 'orderBy', {
23
- enumerable: true,
24
- get: function () {
25
- return natural_orderby.orderBy;
26
- }
27
- });
28
- exports.pascalCase = require_transformers.pascalCase;
29
- exports.screamingSnakeCase = require_transformers.screamingSnakeCase;
30
- exports.searchAndReplace = require_transformers.searchAndReplace;
31
- exports.snakeCase = require_transformers.snakeCase;
32
- exports.stringify = require_transformers.stringify;
33
- exports.stringifyObject = require_transformers.stringifyObject;
34
- exports.toRegExpString = require_transformers.toRegExpString;
35
- exports.transformReservedWord = require_transformers.transformReservedWord;
36
- exports.trim = require_transformers.trim;
37
- exports.trimQuotes = require_transformers.trimQuotes;
4
+ //#region src/transformers/index.ts
5
+ var transformers_default = {
6
+ combineCodes: require_toRegExp.combineCodes,
7
+ escape: require_toRegExp.escape,
8
+ jsStringEscape: require_toRegExp.jsStringEscape,
9
+ createIndent: require_toRegExp.createIndent,
10
+ transformReservedWord: require_toRegExp.transformReservedWord,
11
+ isValidVarName: require_toRegExp.isValidVarName,
12
+ nameSorter: require_toRegExp.nameSorter,
13
+ searchAndReplace: require_toRegExp.searchAndReplace,
14
+ stringify: require_toRegExp.stringify,
15
+ stringifyObject: require_toRegExp.stringifyObject,
16
+ toRegExpString: require_toRegExp.toRegExpString,
17
+ trim: require_toRegExp.trim,
18
+ trimQuotes: require_toRegExp.trimQuotes,
19
+ JSDoc: { createJSDocBlockText: require_toRegExp.createJSDocBlockText },
20
+ camelCase: require_toRegExp.camelCase,
21
+ pascalCase: require_toRegExp.pascalCase,
22
+ snakeCase: require_toRegExp.snakeCase,
23
+ screamingSnakeCase: require_toRegExp.screamingSnakeCase
24
+ };
25
+
26
+ //#endregion
27
+ exports.camelCase = require_toRegExp.camelCase;
28
+ exports.combineCodes = require_toRegExp.combineCodes;
29
+ exports.createIndent = require_toRegExp.createIndent;
30
+ exports.createJSDocBlockText = require_toRegExp.createJSDocBlockText;
31
+ exports.default = transformers_default;
32
+ exports.escape = require_toRegExp.escape;
33
+ exports.isValidVarName = require_toRegExp.isValidVarName;
34
+ exports.jsStringEscape = require_toRegExp.jsStringEscape;
35
+ exports.nameSorter = require_toRegExp.nameSorter;
36
+ exports.pascalCase = require_toRegExp.pascalCase;
37
+ exports.screamingSnakeCase = require_toRegExp.screamingSnakeCase;
38
+ exports.searchAndReplace = require_toRegExp.searchAndReplace;
39
+ exports.snakeCase = require_toRegExp.snakeCase;
40
+ exports.stringify = require_toRegExp.stringify;
41
+ exports.stringifyObject = require_toRegExp.stringifyObject;
42
+ exports.toRegExpString = require_toRegExp.toRegExpString;
43
+ exports.transformReservedWord = require_toRegExp.transformReservedWord;
44
+ exports.trim = require_toRegExp.trim;
45
+ exports.trimQuotes = require_toRegExp.trimQuotes;
46
+ //# sourceMappingURL=transformers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers.cjs","names":[],"sources":["../src/transformers/index.ts"],"sourcesContent":["import { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nimport { combineCodes } from './combineCodes.ts'\nimport { createJSDocBlockText } from './createJSDocBlockText.ts'\nimport { escape, jsStringEscape } from './escape.ts'\nimport { createIndent } from './indent.ts'\nimport { nameSorter } from './nameSorter.ts'\nimport { searchAndReplace } from './searchAndReplace.ts'\nimport { stringify, stringifyObject } from './stringify.ts'\nimport { toRegExpString } from './toRegExp.ts'\nimport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nimport { trim, trimQuotes } from './trim.ts'\n\nexport { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nexport { combineCodes } from './combineCodes.ts'\nexport { createJSDocBlockText } from './createJSDocBlockText.ts'\nexport { escape, jsStringEscape } from './escape.ts'\nexport { createIndent } from './indent.ts'\nexport { nameSorter } from './nameSorter.ts'\nexport { searchAndReplace } from './searchAndReplace.ts'\nexport { stringify, stringifyObject } from './stringify.ts'\nexport { toRegExpString } from './toRegExp.ts'\nexport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nexport { trim, trimQuotes } from './trim.ts'\n\nexport default {\n combineCodes,\n escape,\n jsStringEscape,\n createIndent,\n transformReservedWord,\n isValidVarName,\n nameSorter,\n searchAndReplace,\n stringify,\n stringifyObject,\n toRegExpString,\n trim,\n trimQuotes,\n JSDoc: {\n createJSDocBlockText,\n },\n camelCase,\n pascalCase,\n snakeCase,\n screamingSnakeCase,\n} as const\n"],"mappings":";;;;AAwBA,2BAAe;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,OAAO,EACL,6DACD;CACD;CACA;CACA;CACA;CACD"}
@@ -1,6 +1,4 @@
1
- import { t as __name } from "./chunk-iVr_oF3V.js";
2
- import { orderBy, orderBy as orderBy$1 } from "natural-orderby";
3
- import { merge, merge as merge$1 } from "remeda";
1
+ import { t as __name } from "./chunk-cy2TeOE5.cjs";
4
2
 
5
3
  //#region src/transformers/casing.d.ts
6
4
  type Options$1 = {
@@ -100,13 +98,11 @@ declare const _default: {
100
98
  readonly JSDoc: {
101
99
  readonly createJSDocBlockText: typeof createJSDocBlockText;
102
100
  };
103
- readonly orderBy: typeof orderBy$1;
104
- readonly merge: typeof merge$1;
105
101
  readonly camelCase: typeof camelCase;
106
102
  readonly pascalCase: typeof pascalCase;
107
103
  readonly snakeCase: typeof snakeCase;
108
104
  readonly screamingSnakeCase: typeof screamingSnakeCase;
109
105
  };
110
106
  //#endregion
111
- export { camelCase, combineCodes, createIndent, createJSDocBlockText, _default as default, escape, isValidVarName, jsStringEscape, merge, nameSorter, orderBy, pascalCase, screamingSnakeCase, searchAndReplace, snakeCase, stringify, stringifyObject, toRegExpString, transformReservedWord, trim, trimQuotes };
107
+ export { camelCase, combineCodes, createIndent, createJSDocBlockText, _default as default, escape, isValidVarName, jsStringEscape, nameSorter, pascalCase, screamingSnakeCase, searchAndReplace, snakeCase, stringify, stringifyObject, toRegExpString, transformReservedWord, trim, trimQuotes };
112
108
  //# sourceMappingURL=transformers.d.ts.map
@@ -1,3 +1,27 @@
1
- import { _ as snakeCase, a as stringify, b as isValidVarName, c as nameSorter, d as jsStringEscape, f as createJSDocBlockText, g as screamingSnakeCase, h as pascalCase, i as toRegExpString, l as createIndent, m as camelCase, n as orderBy, o as stringifyObject, p as combineCodes, r as transformers_default, s as searchAndReplace, t as merge, u as escape, v as trim, x as transformReservedWord, y as trimQuotes } from "./transformers-8ju9ixkG.js";
1
+ import { _ as isValidVarName, a as nameSorter, c as jsStringEscape, d as camelCase, f as pascalCase, g as trimQuotes, h as trim, i as searchAndReplace, l as createJSDocBlockText, m as snakeCase, n as stringify, o as createIndent, p as screamingSnakeCase, r as stringifyObject, s as escape, t as toRegExpString, u as combineCodes, v as transformReservedWord } from "./toRegExp-DdJ1Kgbf.js";
2
2
 
3
- export { camelCase, combineCodes, createIndent, createJSDocBlockText, transformers_default as default, escape, isValidVarName, jsStringEscape, merge, nameSorter, orderBy, pascalCase, screamingSnakeCase, searchAndReplace, snakeCase, stringify, stringifyObject, toRegExpString, transformReservedWord, trim, trimQuotes };
3
+ //#region src/transformers/index.ts
4
+ var transformers_default = {
5
+ combineCodes,
6
+ escape,
7
+ jsStringEscape,
8
+ createIndent,
9
+ transformReservedWord,
10
+ isValidVarName,
11
+ nameSorter,
12
+ searchAndReplace,
13
+ stringify,
14
+ stringifyObject,
15
+ toRegExpString,
16
+ trim,
17
+ trimQuotes,
18
+ JSDoc: { createJSDocBlockText },
19
+ camelCase,
20
+ pascalCase,
21
+ snakeCase,
22
+ screamingSnakeCase
23
+ };
24
+
25
+ //#endregion
26
+ export { camelCase, combineCodes, createIndent, createJSDocBlockText, transformers_default as default, escape, isValidVarName, jsStringEscape, nameSorter, pascalCase, screamingSnakeCase, searchAndReplace, snakeCase, stringify, stringifyObject, toRegExpString, transformReservedWord, trim, trimQuotes };
27
+ //# sourceMappingURL=transformers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformers.js","names":[],"sources":["../src/transformers/index.ts"],"sourcesContent":["import { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nimport { combineCodes } from './combineCodes.ts'\nimport { createJSDocBlockText } from './createJSDocBlockText.ts'\nimport { escape, jsStringEscape } from './escape.ts'\nimport { createIndent } from './indent.ts'\nimport { nameSorter } from './nameSorter.ts'\nimport { searchAndReplace } from './searchAndReplace.ts'\nimport { stringify, stringifyObject } from './stringify.ts'\nimport { toRegExpString } from './toRegExp.ts'\nimport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nimport { trim, trimQuotes } from './trim.ts'\n\nexport { camelCase, pascalCase, screamingSnakeCase, snakeCase } from './casing.ts'\nexport { combineCodes } from './combineCodes.ts'\nexport { createJSDocBlockText } from './createJSDocBlockText.ts'\nexport { escape, jsStringEscape } from './escape.ts'\nexport { createIndent } from './indent.ts'\nexport { nameSorter } from './nameSorter.ts'\nexport { searchAndReplace } from './searchAndReplace.ts'\nexport { stringify, stringifyObject } from './stringify.ts'\nexport { toRegExpString } from './toRegExp.ts'\nexport { isValidVarName, transformReservedWord } from './transformReservedWord.ts'\nexport { trim, trimQuotes } from './trim.ts'\n\nexport default {\n combineCodes,\n escape,\n jsStringEscape,\n createIndent,\n transformReservedWord,\n isValidVarName,\n nameSorter,\n searchAndReplace,\n stringify,\n stringifyObject,\n toRegExpString,\n trim,\n trimQuotes,\n JSDoc: {\n createJSDocBlockText,\n },\n camelCase,\n pascalCase,\n snakeCase,\n screamingSnakeCase,\n} as const\n"],"mappings":";;;AAwBA,2BAAe;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,OAAO,EACL,sBACD;CACD;CACA;CACA;CACA;CACD"}
@@ -1,4 +1,4 @@
1
- import { t as __name } from "./chunk-iVr_oF3V.js";
1
+ import { t as __name } from "./chunk-DKWOrOAv.js";
2
2
  import { Fabric } from "@kubb/react-fabric";
3
3
  import { KubbFile } from "@kubb/fabric-core/types";
4
4
 
@@ -293,15 +293,10 @@ interface KubbEvents {
293
293
  * Contains processed count, total count, percentage, and file details.
294
294
  */
295
295
  'file:processing:update': [{
296
- /** Number of files processed so far */
297
- processed: number;
298
- /** Total number of files to process */
299
- total: number;
300
- /** Processing percentage (0-100) */
301
- percentage: number;
302
- /** Optional source identifier */
303
- source?: string;
304
- /** The file being processed */
296
+ /** Number of files processed so far */processed: number; /** Total number of files to process */
297
+ total: number; /** Processing percentage (0-100) */
298
+ percentage: number; /** Optional source identifier */
299
+ source?: string; /** The file being processed */
305
300
  file: KubbFile.ResolvedFile;
306
301
  /**
307
302
  * Kubb configuration (not present in Fabric).
@@ -708,4 +703,4 @@ type Logger<TOptions extends LoggerOptions = LoggerOptions> = {
708
703
  type UserLogger<TOptions extends LoggerOptions = LoggerOptions> = Omit<Logger<TOptions>, 'logLevel'>;
709
704
  //#endregion
710
705
  export { AsyncEventEmitter as A, UserLogger as C, KubbEvents as D, PossiblePromise as E, PluginManager as O, UserConfig as S, UserPluginWithLifeCycle as T, PluginLifecycleHooks as _, InputData as a, ResolveNameParams as b, Logger as c, Output as d, Plugin as f, PluginLifecycle as g, PluginKey as h, Group as i, getMode as k, LoggerContext as l, PluginFactoryOptions as m, Config as n, InputPath as o, PluginContext as p, GetPluginFactoryOptions as r, LogLevel as s, BarrelType as t, LoggerOptions as u, PluginParameter as v, UserPlugin as w, ResolvePathParams as x, PluginWithLifeCycle as y };
711
- //# sourceMappingURL=types-Cn3Gwsf3.d.ts.map
706
+ //# sourceMappingURL=types-CiePC9Y3.d.ts.map
@@ -1,4 +1,4 @@
1
- import { t as __name } from "./chunk-DlpkT3g-.cjs";
1
+ import { t as __name } from "./chunk-cy2TeOE5.cjs";
2
2
  import { KubbFile } from "@kubb/fabric-core/types";
3
3
  import { Fabric } from "@kubb/react-fabric";
4
4
 
@@ -293,15 +293,10 @@ interface KubbEvents {
293
293
  * Contains processed count, total count, percentage, and file details.
294
294
  */
295
295
  'file:processing:update': [{
296
- /** Number of files processed so far */
297
- processed: number;
298
- /** Total number of files to process */
299
- total: number;
300
- /** Processing percentage (0-100) */
301
- percentage: number;
302
- /** Optional source identifier */
303
- source?: string;
304
- /** The file being processed */
296
+ /** Number of files processed so far */processed: number; /** Total number of files to process */
297
+ total: number; /** Processing percentage (0-100) */
298
+ percentage: number; /** Optional source identifier */
299
+ source?: string; /** The file being processed */
305
300
  file: KubbFile.ResolvedFile;
306
301
  /**
307
302
  * Kubb configuration (not present in Fabric).
@@ -708,4 +703,4 @@ type Logger<TOptions extends LoggerOptions = LoggerOptions> = {
708
703
  type UserLogger<TOptions extends LoggerOptions = LoggerOptions> = Omit<Logger<TOptions>, 'logLevel'>;
709
704
  //#endregion
710
705
  export { AsyncEventEmitter as A, UserLogger as C, KubbEvents as D, PossiblePromise as E, PluginManager as O, UserConfig as S, UserPluginWithLifeCycle as T, PluginLifecycleHooks as _, InputData as a, ResolveNameParams as b, Logger as c, Output as d, Plugin as f, PluginLifecycle as g, PluginKey as h, Group as i, getMode as k, LoggerContext as l, PluginFactoryOptions as m, Config as n, InputPath as o, PluginContext as p, GetPluginFactoryOptions as r, LogLevel as s, BarrelType as t, LoggerOptions as u, PluginParameter as v, UserPlugin as w, ResolvePathParams as x, PluginWithLifeCycle as y };
711
- //# sourceMappingURL=types-ulibr7zw.d.cts.map
706
+ //# sourceMappingURL=types-Ciz0gIX7.d.ts.map
package/dist/utils.cjs CHANGED
@@ -1,10 +1,11 @@
1
- const require_chunk = require('./chunk-C1_xRkKa.cjs');
2
- const require_getBarrelFiles = require('./getBarrelFiles-DCNjiX2W.cjs');
3
- const require_transformers = require('./transformers-B8kXgG3q.cjs');
4
- let natural_orderby = require("natural-orderby");
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_chunk = require('./chunk-CNbaEX1y.cjs');
3
+ const require_getBarrelFiles = require('./getBarrelFiles-BttXy8Sp.cjs');
4
+ const require_toRegExp = require('./toRegExp-DGgAWZ_m.cjs');
5
5
  let node_dns = require("node:dns");
6
6
  node_dns = require_chunk.__toESM(node_dns);
7
- let execa = require("execa");
7
+ let remeda = require("remeda");
8
+ let tinyexec = require("tinyexec");
8
9
 
9
10
  //#region src/utils/buildJSDoc.ts
10
11
  /**
@@ -98,13 +99,7 @@ var FunctionParams = class FunctionParams {
98
99
  return this;
99
100
  }
100
101
  static #orderItems(items) {
101
- return (0, natural_orderby.orderBy)(items.filter(Boolean), [(v) => {
102
- if (Array.isArray(v)) return;
103
- return !v.default;
104
- }, (v) => {
105
- if (Array.isArray(v)) return;
106
- return v.required ?? true;
107
- }], ["desc", "desc"]);
102
+ return (0, remeda.sortBy)(items.filter(Boolean), [(item) => Array.isArray(item), "desc"], [(item) => !Array.isArray(item) && item.default !== void 0, "asc"], [(item) => Array.isArray(item) || (item.required ?? true), "desc"]);
108
103
  }
109
104
  static #addParams(acc, item) {
110
105
  const { enabled = true, name, type, required = true, ...rest } = item;
@@ -113,7 +108,7 @@ var FunctionParams = class FunctionParams {
113
108
  acc.push(`${type}${rest.default ? ` = ${rest.default}` : ""}`);
114
109
  return acc;
115
110
  }
116
- const parameterName = name.startsWith("{") ? name : require_transformers.camelCase(name);
111
+ const parameterName = name.startsWith("{") ? name : require_toRegExp.camelCase(name);
117
112
  if (type) if (required) acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ""}`);
118
113
  else acc.push(`${parameterName}?: ${type}`);
119
114
  else acc.push(`${parameterName}`);
@@ -129,7 +124,7 @@ var FunctionParams = class FunctionParams {
129
124
  ...item,
130
125
  type: void 0
131
126
  });
132
- if (items.some((item$1) => item$1.type)) type = FunctionParams.#addParams(type, item);
127
+ if (items.some((item) => item.type)) type = FunctionParams.#addParams(type, item);
133
128
  });
134
129
  return {
135
130
  name: `{ ${name.join(", ")} }`,
@@ -198,7 +193,7 @@ const formatters = {
198
193
  */
199
194
  async function isFormatterAvailable(formatter) {
200
195
  try {
201
- await (0, execa.execaCommand)(`${formatter} --version`, { stdio: "ignore" });
196
+ await (0, tinyexec.x)(formatter, ["--version"], { nodeOptions: { stdio: "ignore" } });
202
197
  return true;
203
198
  } catch {
204
199
  return false;
@@ -336,7 +331,7 @@ const linters = {
336
331
  };
337
332
  async function isLinterAvailable(linter) {
338
333
  try {
339
- await (0, execa.execaCommand)(`${linter} --version`, { stdio: "ignore" });
334
+ await (0, tinyexec.x)(linter, ["--version"], { nodeOptions: { stdio: "ignore" } });
340
335
  return true;
341
336
  } catch {
342
337
  return false;
@@ -389,15 +384,35 @@ function serializePluginOptions(options) {
389
384
  //#region src/utils/timeout.ts
390
385
  async function timeout(ms) {
391
386
  return new Promise((resolve) => {
392
- const timeout$1 = setTimeout(() => {
393
- resolve(timeout$1);
387
+ const timeout = setTimeout(() => {
388
+ resolve(timeout);
394
389
  }, ms);
395
- }).then((timeout$1) => {
396
- clearTimeout(timeout$1);
390
+ }).then((timeout) => {
391
+ clearTimeout(timeout);
397
392
  return true;
398
393
  });
399
394
  }
400
395
 
396
+ //#endregion
397
+ //#region src/utils/tokenize.ts
398
+ /** Shell-like tokenizer: splits a command string respecting single/double quotes. */
399
+ function tokenize(command) {
400
+ const args = [];
401
+ let current = "";
402
+ let quote = "";
403
+ for (const ch of command) if (quote) if (ch === quote) quote = "";
404
+ else current += ch;
405
+ else if (ch === "\"" || ch === "'") quote = ch;
406
+ else if (ch === " " || ch === " ") {
407
+ if (current) {
408
+ args.push(current);
409
+ current = "";
410
+ }
411
+ } else current += ch;
412
+ if (current) args.push(current);
413
+ return args;
414
+ }
415
+
401
416
  //#endregion
402
417
  exports.AsyncEventEmitter = require_getBarrelFiles.AsyncEventEmitter;
403
418
  exports.Cache = Cache;
@@ -424,4 +439,5 @@ exports.renderTemplate = renderTemplate;
424
439
  exports.serializePluginOptions = serializePluginOptions;
425
440
  exports.setUniqueName = require_getBarrelFiles.setUniqueName;
426
441
  exports.timeout = timeout;
442
+ exports.tokenize = tokenize;
427
443
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["#buffer","dns","#items","#orderItems","#addParams","camelCase","item","timeout"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/checkOnlineStatus.ts","../src/utils/FunctionParams.ts","../src/utils/formatters.ts","../src/utils/getPlugins.ts","../src/utils/promise.ts","../src/utils/getConfigs.ts","../src/utils/getNestedAccessor.ts","../src/utils/linters.ts","../src/utils/renderTemplate.ts","../src/utils/serializePluginOptions.ts","../src/utils/timeout.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import dns from 'node:dns'\n\n/**\n * Check if the system has internet connectivity\n * Uses DNS lookup to well-known stable domains as a lightweight connectivity test\n */\nexport async function isOnline(): Promise<boolean> {\n const testDomains = [\n 'dns.google.com', // Google Public DNS\n 'cloudflare.com', // Cloudflare\n 'one.one.one.one', // Cloudflare DNS\n ]\n\n for (const domain of testDomains) {\n try {\n await dns.promises.resolve(domain)\n return true\n } catch {\n // Try next domain\n }\n }\n\n return false\n}\n\n/**\n * Execute a function only if online, otherwise silently skip\n */\nexport async function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null> {\n const online = await isOnline()\n if (!online) {\n return null\n }\n\n try {\n return await fn()\n } catch {\n return null\n }\n}\n","import { orderBy } from 'natural-orderby'\n\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return orderBy(\n items.filter(Boolean),\n [\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return !v.default\n },\n (v) => {\n if (Array.isArray(v)) {\n return undefined\n }\n return v.required ?? true\n },\n ],\n ['desc', 'desc'],\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","import { execaCommand } from 'execa'\n\nexport const formatters = {\n prettier: {\n command: 'prettier',\n args: (outputPath: string) => ['--ignore-unknown', '--write', outputPath],\n errorMessage: 'Prettier not found',\n },\n biome: {\n command: 'biome',\n args: (outputPath: string) => ['format', '--write', outputPath],\n errorMessage: 'Biome not found',\n },\n oxfmt: {\n command: 'oxfmt',\n args: (outputPath: string) => [outputPath],\n errorMessage: 'Oxfmt not found',\n },\n} as const\n\ntype Formatter = keyof typeof formatters\n\n/**\n * Check if a formatter command is available in the system.\n *\n * @param formatter - The formatter to check ('biome', 'prettier', or 'oxfmt')\n * @returns Promise that resolves to true if the formatter is available, false otherwise\n *\n * @remarks\n * This function checks availability by running `<formatter> --version` command.\n * All supported formatters (biome, prettier, oxfmt) implement the --version flag.\n */\nasync function isFormatterAvailable(formatter: Formatter): Promise<boolean> {\n try {\n // Try to get the version of the formatter to check if it's installed\n await execaCommand(`${formatter} --version`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Detect which formatter is available in the system.\n *\n * @returns Promise that resolves to the first available formatter or undefined if none are found\n *\n * @remarks\n * Checks in order of preference: biome, oxfmt, prettier.\n * Uses the `--version` flag to detect if each formatter command is available.\n * This is a reliable method as all supported formatters implement this flag.\n *\n * @example\n * ```typescript\n * const formatter = await detectFormatter()\n * if (formatter) {\n * console.log(`Using ${formatter} for formatting`)\n * } else {\n * console.log('No formatter found')\n * }\n * ```\n */\nexport async function detectFormatter(): Promise<Formatter | undefined> {\n const formatters: Formatter[] = ['biome', 'oxfmt', 'prettier']\n\n for (const formatter of formatters) {\n if (await isFormatterAvailable(formatter)) {\n return formatter\n }\n }\n\n return undefined\n}\n","import type { UserConfig } from '../types.ts'\n\nfunction isJSONPlugins(plugins: UserConfig['plugins']) {\n return !!(plugins as any)?.some((plugin: any) => {\n return Array.isArray(plugin) && typeof plugin?.at(0) === 'string'\n })\n}\n\nfunction isObjectPlugins(plugins: UserConfig['plugins']): plugins is any {\n return plugins instanceof Object && !Array.isArray(plugins)\n}\n\nexport function getPlugins(plugins: UserConfig['plugins']): Promise<UserConfig['plugins']> {\n if (isObjectPlugins(plugins)) {\n throw new Error('Object plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n }\n\n if (isJSONPlugins(plugins)) {\n throw new Error('JSON plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n }\n\n return Promise.resolve(plugins)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","import type { CLIOptions, defineConfig } from '../config.ts'\nimport type { Config, UserConfig } from '../types.ts'\nimport { getPlugins } from './getPlugins.ts'\nimport { isPromise } from './promise.ts'\n\n/**\n * Converting UserConfig to Config Array without a change in the object beside the JSON convert.\n */\nexport async function getConfigs(config: ReturnType<typeof defineConfig> | UserConfig, args: CLIOptions): Promise<Array<Config>> {\n let kubbUserConfig = Promise.resolve(config) as Promise<UserConfig | Array<UserConfig>>\n\n // for ts or js files\n if (typeof config === 'function') {\n const possiblePromise = config(args as CLIOptions)\n if (isPromise(possiblePromise)) {\n kubbUserConfig = possiblePromise\n }\n kubbUserConfig = Promise.resolve(possiblePromise)\n }\n\n let JSONConfig = await kubbUserConfig\n\n if (!Array.isArray(JSONConfig)) {\n JSONConfig = [JSONConfig]\n }\n\n const results: Array<Config> = []\n\n for (const item of JSONConfig) {\n const plugins = item.plugins ? await getPlugins(item.plugins) : undefined\n\n results.push({\n ...item,\n plugins,\n } as Config)\n }\n\n return results\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import { execaCommand } from 'execa'\n\nexport const linters = {\n eslint: {\n command: 'eslint',\n args: (outputPath: string) => [outputPath, '--fix'],\n errorMessage: 'Eslint not found',\n },\n biome: {\n command: 'biome',\n args: (outputPath: string) => ['lint', '--fix', outputPath],\n errorMessage: 'Biome not found',\n },\n oxlint: {\n command: 'oxlint',\n args: (outputPath: string) => ['--fix', outputPath],\n errorMessage: 'Oxlint not found',\n },\n} as const\n\ntype Linter = keyof typeof linters\n\nasync function isLinterAvailable(linter: Linter): Promise<boolean> {\n try {\n await execaCommand(`${linter} --version`, { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n\nexport async function detectLinter(): Promise<Linter | undefined> {\n const linters: Linter[] = ['biome', 'oxlint', 'eslint']\n\n for (const linter of linters) {\n if (await isLinterAvailable(linter)) {\n return linter\n }\n }\n\n return undefined\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","/**\n * Serialize plugin options for safe JSON transport.\n * Strips functions, symbols, and undefined values recursively.\n */\nexport function serializePluginOptions(options: unknown): unknown {\n if (options === null || options === undefined) {\n return {}\n }\n if (typeof options !== 'object') {\n return options\n }\n if (Array.isArray(options)) {\n return options.map(serializePluginOptions)\n }\n\n const serialized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (typeof value === 'function' || typeof value === 'symbol' || value === undefined) {\n continue\n }\n if (typeof value === 'object' && value !== null) {\n serialized[key] = serializePluginOptions(value)\n } else {\n serialized[key] = value\n }\n }\n return serialized\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;AAMA,SAAgB,WACd,UACA,UAgBI,EAAE,EACE;CACR,MAAM,EAAE,SAAS,SAAS,SAAS,QAAQ,WAAW,SAAS;AAE/D,KAAI,SAAS,WAAW,EACtB,QAAO;AAGT,QAAO,QAAQ,SAAS,KAAK,MAAM,GAAG,SAAS,IAAI,CAAC,KAAK,KAAK,CAAC,SAAS;;;;;AChC1E,IAAa,QAAb,MAAsB;CACpB,0BAAU,IAAI,KAAgB;CAE9B,MAAM,IAAI,KAAgC;AACxC,SAAO,MAAKA,OAAQ,IAAI,IAAI,IAAI;;CAGlC,MAAM,IAAI,KAAa,OAAyB;AAC9C,QAAKA,OAAQ,IAAI,KAAK,MAAM;;CAG9B,MAAM,OAAO,KAA4B;AACvC,QAAKA,OAAQ,OAAO,IAAI;;CAG1B,MAAM,QAAuB;AAC3B,QAAKA,OAAQ,OAAO;;CAGtB,MAAM,OAA0B;AAC9B,SAAO,CAAC,GAAG,MAAKA,OAAQ,MAAM,CAAC;;CAGjC,MAAM,SAAuB;AAC3B,SAAO,CAAC,GAAG,MAAKA,OAAQ,QAAQ,CAAC;;CAGnC,MAAM,QAAuB;;;;;;;;;ACrB/B,eAAsB,WAA6B;AAOjD,MAAK,MAAM,UANS;EAClB;EACA;EACA;EACD,CAGC,KAAI;AACF,QAAMC,iBAAI,SAAS,QAAQ,OAAO;AAClC,SAAO;SACD;AAKV,QAAO;;;;;AAMT,eAAsB,gBAAmB,IAAyC;AAEhF,KAAI,CADW,MAAM,UAAU,CAE7B,QAAO;AAGT,KAAI;AACF,SAAO,MAAM,IAAI;SACX;AACN,SAAO;;;;;;;;;ACEX,IAAa,iBAAb,MAAa,eAAe;CAC1B,SAAyD,EAAE;CAC3D,cAAc;AACZ,SAAO;;CAGT,IAAI,QAA6B;AAC/B,SAAO,MAAKC,MAAO,MAAM;;CAG3B,IAAI,MAAkH;AACpH,MAAI,CAAC,KACH,QAAO;AAGT,MAAI,MAAM,QAAQ,KAAK,EAAE;AACvB,QAAK,OAAO,QAAQ,CAAC,SAAS,OAAO;AACnC,UAAKA,MAAO,KAAK,GAAG;KACpB;AACF,UAAO;;AAET,QAAKA,MAAO,KAAK,KAAK;AAEtB,SAAO;;CAET,QAAOC,WAAY,OAAuD;AACxE,sCACE,MAAM,OAAO,QAAQ,EACrB,EACG,MAAM;AACL,OAAI,MAAM,QAAQ,EAAE,CAClB;AAEF,UAAO,CAAC,EAAE;MAEX,MAAM;AACL,OAAI,MAAM,QAAQ,EAAE,CAClB;AAEF,UAAO,EAAE,YAAY;IAExB,EACD,CAAC,QAAQ,OAAO,CACjB;;CAGH,QAAOC,UAAW,KAAe,MAAyB;EACxD,MAAM,EAAE,UAAU,MAAM,MAAM,MAAM,WAAW,MAAM,GAAG,SAAS;AAEjE,MAAI,CAAC,QACH,QAAO;AAGT,MAAI,CAAC,MAAM;AAET,OAAI,KAAK,GAAG,OAAO,KAAK,UAAU,MAAM,KAAK,YAAY,KAAK;AAE9D,UAAO;;EAGT,MAAM,gBAAgB,KAAK,WAAW,IAAI,GAAG,OAAOC,+BAAU,KAAK;AAEnE,MAAI,KACF,KAAI,SACF,KAAI,KAAK,GAAG,cAAc,IAAI,OAAO,KAAK,UAAU,MAAM,KAAK,YAAY,KAAK;MAEhF,KAAI,KAAK,GAAG,cAAc,KAAK,OAAO;MAGxC,KAAI,KAAK,GAAG,gBAAgB;AAG9B,SAAO;;CAGT,OAAO,SAAS,OAA+C;EAC7D,IAAI,OAAiB,EAAE;EACvB,IAAI,OAAiB,EAAE;EAEvB,MAAM,UAAU,MAAM,OAAO,SAAS,KAAK,QAAQ,GAAG,MAAM,GAAG,EAAE,EAAE,UAAU;EAC7E,MAAM,WAAW,MAAM,OAAO,SAAS,KAAK,SAAS,IAAI;AAEzD,QAAM,SAAS,SAAS;AACtB,UAAO,gBAAeD,UAAW,MAAM;IAAE,GAAG;IAAM,MAAM;IAAW,CAAC;AACpE,OAAI,MAAM,MAAM,WAASE,OAAK,KAAK,CACjC,QAAO,gBAAeF,UAAW,MAAM,KAAK;IAE9C;AAEF,SAAO;GACL,MAAM,KAAK,KAAK,KAAK,KAAK,CAAC;GAC3B,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM;GAC/C;GACA;GACD;;CAGH,WAA8B;EAC5B,MAAM,QAAQ,gBAAeD,WAAY,MAAKD,MAAO,CAAC,MAAM;AAE5D,SAAO,eAAe,SAAS,MAAM;;CAGvC,OAAO,SAAS,OAA4D;AAG1E,SAFmB,gBAAeC,WAAY,MAAM,CAGjD,QAAQ,KAAK,SAAS;AACrB,OAAI,MAAM,QAAQ,KAAK,EAAE;AACvB,QAAI,KAAK,UAAU,EACjB,QAAO;IAET,MAAM,WAAW,gBAAeA,WAAY,KAAK;IACjD,MAAM,aAAa,eAAe,SAAS,SAAS;AAEpD,WAAO,gBAAeC,UAAW,KAAK,WAAW;;AAGnD,UAAO,gBAAeA,UAAW,KAAK,KAAK;KAC1C,EAAE,CAAa,CACjB,KAAK,KAAK;;CAGf,WAAmB;EACjB,MAAM,QAAQ,gBAAeD,WAAY,MAAKD,MAAO;AAErD,SAAO,eAAe,SAAS,MAAM;;;;;;ACnKzC,MAAa,aAAa;CACxB,UAAU;EACR,SAAS;EACT,OAAO,eAAuB;GAAC;GAAoB;GAAW;GAAW;EACzE,cAAc;EACf;CACD,OAAO;EACL,SAAS;EACT,OAAO,eAAuB;GAAC;GAAU;GAAW;GAAW;EAC/D,cAAc;EACf;CACD,OAAO;EACL,SAAS;EACT,OAAO,eAAuB,CAAC,WAAW;EAC1C,cAAc;EACf;CACF;;;;;;;;;;;AAcD,eAAe,qBAAqB,WAAwC;AAC1E,KAAI;AAEF,gCAAmB,GAAG,UAAU,aAAa,EAAE,OAAO,UAAU,CAAC;AACjE,SAAO;SACD;AACN,SAAO;;;;;;;;;;;;;;;;;;;;;;;AAwBX,eAAsB,kBAAkD;AAGtE,MAAK,MAAM,aAFqB;EAAC;EAAS;EAAS;EAAW,CAG5D,KAAI,MAAM,qBAAqB,UAAU,CACvC,QAAO;;;;;ACjEb,SAAS,cAAc,SAAgC;AACrD,QAAO,CAAC,CAAE,SAAiB,MAAM,WAAgB;AAC/C,SAAO,MAAM,QAAQ,OAAO,IAAI,OAAO,QAAQ,GAAG,EAAE,KAAK;GACzD;;AAGJ,SAAS,gBAAgB,SAAgD;AACvE,QAAO,mBAAmB,UAAU,CAAC,MAAM,QAAQ,QAAQ;;AAG7D,SAAgB,WAAW,SAAgE;AACzF,KAAI,gBAAgB,QAAQ,CAC1B,OAAM,IAAI,MAAM,uGAAuG;AAGzH,KAAI,cAAc,QAAQ,CACxB,OAAM,IAAI,MAAM,qGAAqG;AAGvH,QAAO,QAAQ,QAAQ,QAAQ;;;;;ACnBjC,SAAgB,UAAa,QAAkD;AAC7E,QAAO,CAAC,CAAC,UAAU,OAAQ,QAA6B,SAAS;;AAGnE,SAAgB,yBAAsC,QAA4E;AAChI,QAAO,OAAO,WAAW;;AAG3B,SAAgB,wBAA2B,QAAwG;AACjJ,QAAO,OAAO,WAAW;;;;;;;;ACH3B,eAAsB,WAAW,QAAsD,MAA0C;CAC/H,IAAI,iBAAiB,QAAQ,QAAQ,OAAO;AAG5C,KAAI,OAAO,WAAW,YAAY;EAChC,MAAM,kBAAkB,OAAO,KAAmB;AAClD,MAAI,UAAU,gBAAgB,CAC5B,kBAAiB;AAEnB,mBAAiB,QAAQ,QAAQ,gBAAgB;;CAGnD,IAAI,aAAa,MAAM;AAEvB,KAAI,CAAC,MAAM,QAAQ,WAAW,CAC5B,cAAa,CAAC,WAAW;CAG3B,MAAM,UAAyB,EAAE;AAEjC,MAAK,MAAM,QAAQ,YAAY;EAC7B,MAAM,UAAU,KAAK,UAAU,MAAM,WAAW,KAAK,QAAQ,GAAG;AAEhE,UAAQ,KAAK;GACX,GAAG;GACH;GACD,CAAW;;AAGd,QAAO;;;;;;;;;;;;;;;;;;;;;;;ACnBT,SAAgB,kBAAkB,OAA0B,UAAsC;CAChG,MAAM,QAAQ,MAAM,QAAQ,MAAM,GAAG,QAAQ,MAAM,MAAM,IAAI;AAC7D,KAAI,MAAM,WAAW,KAAM,MAAM,WAAW,KAAK,MAAM,OAAO,GAC5D;AAEF,QAAO,MAAM,QAAQ,KAAK,SAAS,GAAG,IAAI,MAAM,KAAK,KAAK,SAAS;;;;;ACrBrE,MAAa,UAAU;CACrB,QAAQ;EACN,SAAS;EACT,OAAO,eAAuB,CAAC,YAAY,QAAQ;EACnD,cAAc;EACf;CACD,OAAO;EACL,SAAS;EACT,OAAO,eAAuB;GAAC;GAAQ;GAAS;GAAW;EAC3D,cAAc;EACf;CACD,QAAQ;EACN,SAAS;EACT,OAAO,eAAuB,CAAC,SAAS,WAAW;EACnD,cAAc;EACf;CACF;AAID,eAAe,kBAAkB,QAAkC;AACjE,KAAI;AACF,gCAAmB,GAAG,OAAO,aAAa,EAAE,OAAO,UAAU,CAAC;AAC9D,SAAO;SACD;AACN,SAAO;;;AAIX,eAAsB,eAA4C;AAGhE,MAAK,MAAM,UAFe;EAAC;EAAS;EAAU;EAAS,CAGrD,KAAI,MAAM,kBAAkB,OAAO,CACjC,QAAO;;;;;ACpCb,SAAgB,eAAgF,UAAkB,OAA0B,QAAmB;AAC7J,KAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC,OAC9B,QAAO,SAAS,QAAQ,cAAc,GAAG;AAK3C,QAFgB,SAAS,MAAM,aAAa,EAGjC,QAAQ,MAAM,SAAS;EAC9B,MAAM,QAAQ,KAAK,MAAM,QAAQ,CAAC,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC5D,MAAI,UAAU,OACZ,QAAO;EAET,MAAM,QAAQ,KAAK;AAEnB,MAAI,UAAU,OACZ,QAAO;AAGT,SAAO,KACJ,QAAQ,YAAY;AACnB,OAAI,OAAO,UAAU,UACnB,QAAO,GAAG,MAAM,UAAU,MAAM;AAGlC,UAAQ,SAAoB;IAC5B,CACD,MAAM;IACR,SAAS,IAAI;;;;;;;;;ACxBpB,SAAgB,uBAAuB,SAA2B;AAChE,KAAI,YAAY,QAAQ,YAAY,OAClC,QAAO,EAAE;AAEX,KAAI,OAAO,YAAY,SACrB,QAAO;AAET,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QAAQ,IAAI,uBAAuB;CAG5C,MAAM,aAAsC,EAAE;AAC9C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;AAClD,MAAI,OAAO,UAAU,cAAc,OAAO,UAAU,YAAY,UAAU,OACxE;AAEF,MAAI,OAAO,UAAU,YAAY,UAAU,KACzC,YAAW,OAAO,uBAAuB,MAAM;MAE/C,YAAW,OAAO;;AAGtB,QAAO;;;;;AC1BT,eAAsB,QAAQ,IAA8B;AAC1D,QAAO,IAAI,SAAS,YAAY;EAC9B,MAAMK,YAAU,iBAAiB;AAC/B,WAAQA,UAAQ;KACf,GAAG;GACN,CAAC,MAAM,cAAY;AACnB,eAAaA,UAA0B;AAEvC,SAAO;GACP"}
1
+ {"version":3,"file":"utils.cjs","names":["#buffer","dns","#items","#orderItems","#addParams","camelCase"],"sources":["../src/utils/buildJSDoc.ts","../src/utils/Cache.ts","../src/utils/checkOnlineStatus.ts","../src/utils/FunctionParams.ts","../src/utils/formatters.ts","../src/utils/getPlugins.ts","../src/utils/promise.ts","../src/utils/getConfigs.ts","../src/utils/getNestedAccessor.ts","../src/utils/linters.ts","../src/utils/renderTemplate.ts","../src/utils/serializePluginOptions.ts","../src/utils/timeout.ts","../src/utils/tokenize.ts"],"sourcesContent":["/**\n * Builds a JSDoc comment block with custom indentation.\n * @param comments - Array of comment strings to include in the JSDoc block\n * @param options - Configuration options for formatting\n * @returns Formatted JSDoc string or fallback string if no comments\n */\nexport function buildJSDoc(\n comments: Array<string>,\n options: {\n /**\n * String to use for indenting each line of the JSDoc comment\n * @default ' * ' (3 spaces + asterisk + space)\n */\n indent?: string\n /**\n * String to append after the closing JSDoc tag\n * @default '\\n ' (newline + 2 spaces)\n */\n suffix?: string\n /**\n * String to return when there are no comments\n * @default ' ' (2 spaces)\n */\n fallback?: string\n } = {},\n): string {\n const { indent = ' * ', suffix = '\\n ', fallback = ' ' } = options\n\n if (comments.length === 0) {\n return fallback\n }\n\n return `/**\\n${comments.map((c) => `${indent}${c}`).join('\\n')}\\n */${suffix}`\n}\n","export class Cache<T> {\n #buffer = new Map<string, T>()\n\n async get(key: string): Promise<T | null> {\n return this.#buffer.get(key) ?? null\n }\n\n async set(key: string, value: T): Promise<void> {\n this.#buffer.set(key, value)\n }\n\n async delete(key: string): Promise<void> {\n this.#buffer.delete(key)\n }\n\n async clear(): Promise<void> {\n this.#buffer.clear()\n }\n\n async keys(): Promise<string[]> {\n return [...this.#buffer.keys()]\n }\n\n async values(): Promise<T[]> {\n return [...this.#buffer.values()]\n }\n\n async flush(): Promise<void> {\n // No-op for base cache\n }\n}\n","import dns from 'node:dns'\n\n/**\n * Check if the system has internet connectivity\n * Uses DNS lookup to well-known stable domains as a lightweight connectivity test\n */\nexport async function isOnline(): Promise<boolean> {\n const testDomains = [\n 'dns.google.com', // Google Public DNS\n 'cloudflare.com', // Cloudflare\n 'one.one.one.one', // Cloudflare DNS\n ]\n\n for (const domain of testDomains) {\n try {\n await dns.promises.resolve(domain)\n return true\n } catch {\n // Try next domain\n }\n }\n\n return false\n}\n\n/**\n * Execute a function only if online, otherwise silently skip\n */\nexport async function executeIfOnline<T>(fn: () => Promise<T>): Promise<T | null> {\n const online = await isOnline()\n if (!online) {\n return null\n }\n\n try {\n return await fn()\n } catch {\n return null\n }\n}\n","import { sortBy } from 'remeda'\nimport { camelCase } from '../transformers/casing.ts'\n\ntype FunctionParamsASTWithoutType = {\n name?: string\n type?: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n\ntype FunctionParamsASTWithType = {\n name?: never\n type: string\n /**\n * @default true\n */\n required?: boolean\n /**\n * @default true\n */\n enabled?: boolean\n default?: string\n}\n/**\n * @deprecated\n */\nexport type FunctionParamsAST = FunctionParamsASTWithoutType | FunctionParamsASTWithType\n\n/**\n * @deprecated\n */\nexport class FunctionParams {\n #items: Array<FunctionParamsAST | FunctionParamsAST[]> = []\n constructor() {\n return this\n }\n\n get items(): FunctionParamsAST[] {\n return this.#items.flat()\n }\n\n add(item: FunctionParamsAST | Array<FunctionParamsAST | FunctionParamsAST[] | undefined> | undefined): FunctionParams {\n if (!item) {\n return this\n }\n\n if (Array.isArray(item)) {\n item.filter(Boolean).forEach((it) => {\n this.#items.push(it)\n })\n return this\n }\n this.#items.push(item)\n\n return this\n }\n static #orderItems(items: Array<FunctionParamsAST | FunctionParamsAST[]>) {\n return sortBy(\n items.filter(Boolean),\n [(item) => Array.isArray(item), 'desc'], // arrays (rest params) first\n [(item) => !Array.isArray(item) && (item as FunctionParamsAST).default !== undefined, 'asc'], // no-default before has-default\n [(item) => Array.isArray(item) || ((item as FunctionParamsAST).required ?? true), 'desc'], // required before optional\n )\n }\n\n static #addParams(acc: string[], item: FunctionParamsAST) {\n const { enabled = true, name, type, required = true, ...rest } = item\n\n if (!enabled) {\n return acc\n }\n\n if (!name) {\n // when name is not se we uses TypeScript generics\n acc.push(`${type}${rest.default ? ` = ${rest.default}` : ''}`)\n\n return acc\n }\n // TODO check whey we still need the camelcase here\n const parameterName = name.startsWith('{') ? name : camelCase(name)\n\n if (type) {\n if (required) {\n acc.push(`${parameterName}: ${type}${rest.default ? ` = ${rest.default}` : ''}`)\n } else {\n acc.push(`${parameterName}?: ${type}`)\n }\n } else {\n acc.push(`${parameterName}`)\n }\n\n return acc\n }\n\n static toObject(items: FunctionParamsAST[]): FunctionParamsAST {\n let type: string[] = []\n let name: string[] = []\n\n const enabled = items.every((item) => item.enabled) ? items.at(0)?.enabled : true\n const required = items.every((item) => item.required) ?? true\n\n items.forEach((item) => {\n name = FunctionParams.#addParams(name, { ...item, type: undefined })\n if (items.some((item) => item.type)) {\n type = FunctionParams.#addParams(type, item)\n }\n })\n\n return {\n name: `{ ${name.join(', ')} }`,\n type: type.length ? `{ ${type.join('; ')} }` : undefined,\n enabled,\n required,\n }\n }\n\n toObject(): FunctionParamsAST {\n const items = FunctionParams.#orderItems(this.#items).flat()\n\n return FunctionParams.toObject(items)\n }\n\n static toString(items: (FunctionParamsAST | FunctionParamsAST[])[]): string {\n const sortedData = FunctionParams.#orderItems(items)\n\n return sortedData\n .reduce((acc, item) => {\n if (Array.isArray(item)) {\n if (item.length <= 0) {\n return acc\n }\n const subItems = FunctionParams.#orderItems(item) as FunctionParamsAST[]\n const objectItem = FunctionParams.toObject(subItems)\n\n return FunctionParams.#addParams(acc, objectItem)\n }\n\n return FunctionParams.#addParams(acc, item)\n }, [] as string[])\n .join(', ')\n }\n\n toString(): string {\n const items = FunctionParams.#orderItems(this.#items)\n\n return FunctionParams.toString(items)\n }\n}\n","import { x } from 'tinyexec'\n\nexport const formatters = {\n prettier: {\n command: 'prettier',\n args: (outputPath: string) => ['--ignore-unknown', '--write', outputPath],\n errorMessage: 'Prettier not found',\n },\n biome: {\n command: 'biome',\n args: (outputPath: string) => ['format', '--write', outputPath],\n errorMessage: 'Biome not found',\n },\n oxfmt: {\n command: 'oxfmt',\n args: (outputPath: string) => [outputPath],\n errorMessage: 'Oxfmt not found',\n },\n} as const\n\ntype Formatter = keyof typeof formatters\n\n/**\n * Check if a formatter command is available in the system.\n *\n * @param formatter - The formatter to check ('biome', 'prettier', or 'oxfmt')\n * @returns Promise that resolves to true if the formatter is available, false otherwise\n *\n * @remarks\n * This function checks availability by running `<formatter> --version` command.\n * All supported formatters (biome, prettier, oxfmt) implement the --version flag.\n */\nasync function isFormatterAvailable(formatter: Formatter): Promise<boolean> {\n try {\n // Try to get the version of the formatter to check if it's installed\n await x(formatter, ['--version'], { nodeOptions: { stdio: 'ignore' } })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Detect which formatter is available in the system.\n *\n * @returns Promise that resolves to the first available formatter or undefined if none are found\n *\n * @remarks\n * Checks in order of preference: biome, oxfmt, prettier.\n * Uses the `--version` flag to detect if each formatter command is available.\n * This is a reliable method as all supported formatters implement this flag.\n *\n * @example\n * ```typescript\n * const formatter = await detectFormatter()\n * if (formatter) {\n * console.log(`Using ${formatter} for formatting`)\n * } else {\n * console.log('No formatter found')\n * }\n * ```\n */\nexport async function detectFormatter(): Promise<Formatter | undefined> {\n const formatters: Formatter[] = ['biome', 'oxfmt', 'prettier']\n\n for (const formatter of formatters) {\n if (await isFormatterAvailable(formatter)) {\n return formatter\n }\n }\n\n return undefined\n}\n","import type { UserConfig } from '../types.ts'\n\nfunction isJSONPlugins(plugins: UserConfig['plugins']) {\n return !!(plugins as any)?.some((plugin: any) => {\n return Array.isArray(plugin) && typeof plugin?.at(0) === 'string'\n })\n}\n\nfunction isObjectPlugins(plugins: UserConfig['plugins']): plugins is any {\n return plugins instanceof Object && !Array.isArray(plugins)\n}\n\nexport function getPlugins(plugins: UserConfig['plugins']): Promise<UserConfig['plugins']> {\n if (isObjectPlugins(plugins)) {\n throw new Error('Object plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n }\n\n if (isJSONPlugins(plugins)) {\n throw new Error('JSON plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n }\n\n return Promise.resolve(plugins)\n}\n","import type { PossiblePromise } from './types.ts'\n\nexport function isPromise<T>(result: PossiblePromise<T>): result is Promise<T> {\n return !!result && typeof (result as Promise<unknown>)?.then === 'function'\n}\n\nexport function isPromiseFulfilledResult<T = unknown>(result: PromiseSettledResult<unknown>): result is PromiseFulfilledResult<T> {\n return result.status === 'fulfilled'\n}\n\nexport function isPromiseRejectedResult<T>(result: PromiseSettledResult<unknown>): result is Omit<PromiseRejectedResult, 'reason'> & { reason: T } {\n return result.status === 'rejected'\n}\n","import type { CLIOptions, defineConfig } from '../config.ts'\nimport type { Config, UserConfig } from '../types.ts'\nimport { getPlugins } from './getPlugins.ts'\nimport { isPromise } from './promise.ts'\n\n/**\n * Converting UserConfig to Config Array without a change in the object beside the JSON convert.\n */\nexport async function getConfigs(config: ReturnType<typeof defineConfig> | UserConfig, args: CLIOptions): Promise<Array<Config>> {\n let kubbUserConfig = Promise.resolve(config) as Promise<UserConfig | Array<UserConfig>>\n\n // for ts or js files\n if (typeof config === 'function') {\n const possiblePromise = config(args as CLIOptions)\n if (isPromise(possiblePromise)) {\n kubbUserConfig = possiblePromise\n }\n kubbUserConfig = Promise.resolve(possiblePromise)\n }\n\n let JSONConfig = await kubbUserConfig\n\n if (!Array.isArray(JSONConfig)) {\n JSONConfig = [JSONConfig]\n }\n\n const results: Array<Config> = []\n\n for (const item of JSONConfig) {\n const plugins = item.plugins ? await getPlugins(item.plugins) : undefined\n\n results.push({\n ...item,\n plugins,\n } as Config)\n }\n\n return results\n}\n","/**\n * Converts a param path (string with dot notation or array of strings) to a JavaScript accessor expression.\n * @param param - The param path, e.g., 'pagination.next.id' or ['pagination', 'next', 'id']\n * @param accessor - The base accessor, e.g., 'lastPage' or 'firstPage'\n * @returns A JavaScript accessor expression, e.g., \"lastPage?.['pagination']?.['next']?.['id']\", or undefined if param is empty\n *\n * @example\n * ```ts\n * getNestedAccessor('pagination.next.id', 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor(['pagination', 'next', 'id'], 'lastPage')\n * // returns: \"lastPage?.['pagination']?.['next']?.['id']\"\n *\n * getNestedAccessor('', 'lastPage')\n * // returns: undefined\n * ```\n */\nexport function getNestedAccessor(param: string | string[], accessor: string): string | undefined {\n const parts = Array.isArray(param) ? param : param.split('.')\n if (parts.length === 0 || (parts.length === 1 && parts[0] === '')) {\n return undefined\n }\n return parts.reduce((acc, part) => `${acc}?.['${part}']`, accessor)\n}\n","import { x } from 'tinyexec'\n\nexport const linters = {\n eslint: {\n command: 'eslint',\n args: (outputPath: string) => [outputPath, '--fix'],\n errorMessage: 'Eslint not found',\n },\n biome: {\n command: 'biome',\n args: (outputPath: string) => ['lint', '--fix', outputPath],\n errorMessage: 'Biome not found',\n },\n oxlint: {\n command: 'oxlint',\n args: (outputPath: string) => ['--fix', outputPath],\n errorMessage: 'Oxlint not found',\n },\n} as const\n\ntype Linter = keyof typeof linters\n\nasync function isLinterAvailable(linter: Linter): Promise<boolean> {\n try {\n await x(linter, ['--version'], { nodeOptions: { stdio: 'ignore' } })\n return true\n } catch {\n return false\n }\n}\n\nexport async function detectLinter(): Promise<Linter | undefined> {\n const linters: Linter[] = ['biome', 'oxlint', 'eslint']\n\n for (const linter of linters) {\n if (await isLinterAvailable(linter)) {\n return linter\n }\n }\n\n return undefined\n}\n","export function renderTemplate<TData extends Record<string, unknown> = Record<string, unknown>>(template: string, data: TData | undefined = undefined): string {\n if (!data || !Object.keys(data).length) {\n return template.replace(/{{(.*?)}}/g, '')\n }\n\n const matches = template.match(/{{(.*?)}}/g)\n\n return (\n matches?.reduce((prev, curr) => {\n const index = curr.split(/{{|}}/).filter(Boolean)[0]?.trim()\n if (index === undefined) {\n return prev\n }\n const value = data[index]\n\n if (value === undefined) {\n return prev\n }\n\n return prev\n .replace(curr, () => {\n if (typeof value === 'boolean') {\n return `${value.toString()}` || 'false'\n }\n\n return (value as string) || ''\n })\n .trim()\n }, template) || ''\n )\n}\n","/**\n * Serialize plugin options for safe JSON transport.\n * Strips functions, symbols, and undefined values recursively.\n */\nexport function serializePluginOptions(options: unknown): unknown {\n if (options === null || options === undefined) {\n return {}\n }\n if (typeof options !== 'object') {\n return options\n }\n if (Array.isArray(options)) {\n return options.map(serializePluginOptions)\n }\n\n const serialized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (typeof value === 'function' || typeof value === 'symbol' || value === undefined) {\n continue\n }\n if (typeof value === 'object' && value !== null) {\n serialized[key] = serializePluginOptions(value)\n } else {\n serialized[key] = value\n }\n }\n return serialized\n}\n","export async function timeout(ms: number): Promise<unknown> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(timeout)\n }, ms)\n }).then((timeout) => {\n clearTimeout(timeout as NodeJS.Timeout)\n\n return true\n })\n}\n","/** Shell-like tokenizer: splits a command string respecting single/double quotes. */\nexport function tokenize(command: string): string[] {\n const args: string[] = []\n let current = ''\n let quote = ''\n for (const ch of command) {\n if (quote) {\n if (ch === quote) quote = ''\n else current += ch\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch\n } else if (ch === ' ' || ch === '\\t') {\n if (current) {\n args.push(current)\n current = ''\n }\n } else {\n current += ch\n }\n }\n if (current) args.push(current)\n return args\n}\n"],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import { t as __name } from "./chunk-iVr_oF3V.js";
2
- import { A as AsyncEventEmitter, E as PossiblePromise, S as UserConfig, n as Config } from "./types-Cn3Gwsf3.js";
3
- import { i as defineConfig, n as getBarrelFiles, r as CLIOptions } from "./getBarrelFiles-CHL9_Obd.js";
1
+ import { t as __name } from "./chunk-cy2TeOE5.cjs";
2
+ import { A as AsyncEventEmitter, E as PossiblePromise, S as UserConfig, n as Config } from "./types-Ciz0gIX7.js";
3
+ import { i as defineConfig, n as getBarrelFiles, r as CLIOptions } from "./getBarrelFiles-C7gz90HF.js";
4
4
 
5
5
  //#region src/utils/buildJSDoc.d.ts
6
-
7
6
  /**
8
7
  * Builds a JSDoc comment block with custom indentation.
9
8
  * @param comments - Array of comment strings to include in the JSDoc block
@@ -221,6 +220,10 @@ declare function serializePluginOptions(options: unknown): unknown;
221
220
  //#region src/utils/timeout.d.ts
222
221
  declare function timeout(ms: number): Promise<unknown>;
223
222
  //#endregion
223
+ //#region src/utils/tokenize.d.ts
224
+ /** Shell-like tokenizer: splits a command string respecting single/double quotes. */
225
+ declare function tokenize(command: string): string[];
226
+ //#endregion
224
227
  //#region src/utils/URLPath.d.ts
225
228
  type URLObject = {
226
229
  url: string;
@@ -283,5 +286,5 @@ declare class URLPath {
283
286
  declare function getUniqueName(originalName: string, data: Record<string, number>): string;
284
287
  declare function setUniqueName(originalName: string, data: Record<string, number>): string;
285
288
  //#endregion
286
- export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, detectFormatter, detectLinter, executeIfOnline, formatHrtime, formatMs, formatters, getBarrelFiles, getConfigs, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, linters, renderTemplate, serializePluginOptions, setUniqueName, timeout };
289
+ export { AsyncEventEmitter, Cache, FunctionParams, type FunctionParamsAST, type URLObject, URLPath, buildJSDoc, detectFormatter, detectLinter, executeIfOnline, formatHrtime, formatMs, formatters, getBarrelFiles, getConfigs, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, linters, renderTemplate, serializePluginOptions, setUniqueName, timeout, tokenize };
287
290
  //# sourceMappingURL=utils.d.ts.map
package/dist/utils.js CHANGED
@@ -1,9 +1,9 @@
1
- import { t as __name } from "./chunk-iVr_oF3V.js";
2
- import { a as getElapsedMs, i as formatMs, l as getUniqueName, n as URLPath, o as AsyncEventEmitter, r as formatHrtime, t as getBarrelFiles, u as setUniqueName } from "./getBarrelFiles-gRyVPFBP.js";
3
- import { m as camelCase } from "./transformers-8ju9ixkG.js";
4
- import { orderBy } from "natural-orderby";
1
+ import { t as __name } from "./chunk-DKWOrOAv.js";
2
+ import { a as getElapsedMs, i as formatMs, l as getUniqueName, n as URLPath, o as AsyncEventEmitter, r as formatHrtime, t as getBarrelFiles, u as setUniqueName } from "./getBarrelFiles-BBDOJ2lV.js";
3
+ import { d as camelCase } from "./toRegExp-DdJ1Kgbf.js";
5
4
  import dns from "node:dns";
6
- import { execaCommand } from "execa";
5
+ import { sortBy } from "remeda";
6
+ import { x } from "tinyexec";
7
7
 
8
8
  //#region src/utils/buildJSDoc.ts
9
9
  /**
@@ -97,13 +97,7 @@ var FunctionParams = class FunctionParams {
97
97
  return this;
98
98
  }
99
99
  static #orderItems(items) {
100
- return orderBy(items.filter(Boolean), [(v) => {
101
- if (Array.isArray(v)) return;
102
- return !v.default;
103
- }, (v) => {
104
- if (Array.isArray(v)) return;
105
- return v.required ?? true;
106
- }], ["desc", "desc"]);
100
+ return sortBy(items.filter(Boolean), [(item) => Array.isArray(item), "desc"], [(item) => !Array.isArray(item) && item.default !== void 0, "asc"], [(item) => Array.isArray(item) || (item.required ?? true), "desc"]);
107
101
  }
108
102
  static #addParams(acc, item) {
109
103
  const { enabled = true, name, type, required = true, ...rest } = item;
@@ -128,7 +122,7 @@ var FunctionParams = class FunctionParams {
128
122
  ...item,
129
123
  type: void 0
130
124
  });
131
- if (items.some((item$1) => item$1.type)) type = FunctionParams.#addParams(type, item);
125
+ if (items.some((item) => item.type)) type = FunctionParams.#addParams(type, item);
132
126
  });
133
127
  return {
134
128
  name: `{ ${name.join(", ")} }`,
@@ -197,7 +191,7 @@ const formatters = {
197
191
  */
198
192
  async function isFormatterAvailable(formatter) {
199
193
  try {
200
- await execaCommand(`${formatter} --version`, { stdio: "ignore" });
194
+ await x(formatter, ["--version"], { nodeOptions: { stdio: "ignore" } });
201
195
  return true;
202
196
  } catch {
203
197
  return false;
@@ -335,7 +329,7 @@ const linters = {
335
329
  };
336
330
  async function isLinterAvailable(linter) {
337
331
  try {
338
- await execaCommand(`${linter} --version`, { stdio: "ignore" });
332
+ await x(linter, ["--version"], { nodeOptions: { stdio: "ignore" } });
339
333
  return true;
340
334
  } catch {
341
335
  return false;
@@ -388,15 +382,35 @@ function serializePluginOptions(options) {
388
382
  //#region src/utils/timeout.ts
389
383
  async function timeout(ms) {
390
384
  return new Promise((resolve) => {
391
- const timeout$1 = setTimeout(() => {
392
- resolve(timeout$1);
385
+ const timeout = setTimeout(() => {
386
+ resolve(timeout);
393
387
  }, ms);
394
- }).then((timeout$1) => {
395
- clearTimeout(timeout$1);
388
+ }).then((timeout) => {
389
+ clearTimeout(timeout);
396
390
  return true;
397
391
  });
398
392
  }
399
393
 
400
394
  //#endregion
401
- export { AsyncEventEmitter, Cache, FunctionParams, URLPath, buildJSDoc, detectFormatter, detectLinter, executeIfOnline, formatHrtime, formatMs, formatters, getBarrelFiles, getConfigs, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, linters, renderTemplate, serializePluginOptions, setUniqueName, timeout };
395
+ //#region src/utils/tokenize.ts
396
+ /** Shell-like tokenizer: splits a command string respecting single/double quotes. */
397
+ function tokenize(command) {
398
+ const args = [];
399
+ let current = "";
400
+ let quote = "";
401
+ for (const ch of command) if (quote) if (ch === quote) quote = "";
402
+ else current += ch;
403
+ else if (ch === "\"" || ch === "'") quote = ch;
404
+ else if (ch === " " || ch === " ") {
405
+ if (current) {
406
+ args.push(current);
407
+ current = "";
408
+ }
409
+ } else current += ch;
410
+ if (current) args.push(current);
411
+ return args;
412
+ }
413
+
414
+ //#endregion
415
+ export { AsyncEventEmitter, Cache, FunctionParams, URLPath, buildJSDoc, detectFormatter, detectLinter, executeIfOnline, formatHrtime, formatMs, formatters, getBarrelFiles, getConfigs, getElapsedMs, getNestedAccessor, getUniqueName, isOnline, isPromise, isPromiseFulfilledResult, isPromiseRejectedResult, linters, renderTemplate, serializePluginOptions, setUniqueName, timeout, tokenize };
402
416
  //# sourceMappingURL=utils.js.map